From c719386e732a4dbc2191f42e2404b412591bdc97 Mon Sep 17 00:00:00 2001 From: Min Qian Lu <59981815+minqianlu@users.noreply.github.com> Date: Sun, 17 Sep 2023 01:05:13 -0400 Subject: [PATCH 1/9] adding versioning --- config-typedoc-core.js | 14 +- config-typedoc-selector.js | 14 +- docusaurus.config.js | 45 +- src/pages/index.md | 28 +- src/theme/DocVersionBanner/index.js | 148 + versioned_docs/version-1.1/nothing-page.md | 0 versioned_docs/version-1.2.1/nothing-page.md | 0 versioned_docs/version-1.2/nothing-page.md | 0 .../GithubReadme/Introduction/Introduction.md | 58 + .../GithubReadme/Introduction/our-solution.md | 18 + .../TypesOfDrops/customization-homepage.md | 57 + .../TypesOfDrops/drop-customization.md | 70 + .../GithubReadme/TypesOfDrops/fc-drops.md | 224 ++ .../GithubReadme/TypesOfDrops/ft-drops.md | 92 + .../GithubReadme/TypesOfDrops/introduction.md | 63 + .../GithubReadme/TypesOfDrops/nft-drops.md | 64 + .../TypesOfDrops/sale-customization.md | 158 + .../GithubReadme/TypesOfDrops/simple-drops.md | 37 + .../TypesOfDrops/time-customization.md | 109 + .../TypesOfDrops/usage-customization.md | 85 + .../KeypomProtocol/GithubReadme/contribute.md | 18 + .../KeypomProtocol/GithubReadme/costs.md | 62 + .../KeypomProtocol/GithubReadme/licenses.md | 16 + .../GithubReadme/password-protect.md | 242 ++ .../KeypomProtocol/GithubReadme/querying.md | 64 + .../KeypomProtocol/GithubReadme/testing.md | 30 + .../Concepts/KeypomProtocol/balances.md | 77 + .../Concepts/KeypomProtocol/overview.md | 74 + .../LinkdropsAndAccessKeys/linkdrop-basics.md | 28 + .../near-access-keys.md | 13 + .../version-2.0/Concepts/welcome.md | 106 + .../version-2.0/Cookbook/balances.md | 75 + .../version-2.0/Cookbook/drops/NEAR.md | 109 + .../drops/customizations/dropConfig.md | 81 + .../Cookbook/drops/customizations/password.md | 142 + .../drops/customizations/saleConfig.md | 226 ++ .../drops/customizations/timeConfig.md | 131 + .../drops/customizations/usageConfig.md | 210 ++ .../version-2.0/Cookbook/drops/fc.md | 390 ++ .../version-2.0/Cookbook/drops/ft.md | 78 + .../version-2.0/Cookbook/drops/nft.md | 81 + .../version-2.0/Cookbook/drops/trial.md | 96 + versioned_docs/version-2.0/Cookbook/keys.md | 184 + .../version-2.0/Cookbook/utilities.md | 84 + .../version-2.0/Cookbook/welcome.md | 22 + .../TrialAccounts/Creation/drop-creation.md | 81 + .../TrialAccounts/Creation/getting-started.md | 40 + .../TrialAccounts/Creation/integration.md | 175 + .../Creation/understanding-trial-accounts.md | 134 + .../version-2.0/TrialAccounts/introduction.md | 61 + .../version-2.0/TrialAccounts/offboarding.md | 238 ++ .../Advanced/AccessKeyMarketplace/concept.md | 4 + .../Advanced/AccessKeyMarketplace/final.md | 4 + .../Advanced/AccessKeyMarketplace/skeleton.md | 4 + .../Advanced/CustomizedOnboarding/final.md | 4 + .../CustomizedOnboarding/introduction.md | 25 + .../Advanced/CustomizedOnboarding/skeleton.md | 4 + .../Advanced/ReceiverContracts/concept.md | 4 + .../Advanced/ReceiverContracts/final.md | 4 + .../Advanced/ReceiverContracts/skeleton.md | 4 + .../Advanced/RewardGating/concept.md | 4 + .../Tutorials/Advanced/RewardGating/final.md | 4 + .../Advanced/RewardGating/skeleton.md | 4 + .../Tutorials/Advanced/daos/architecture.md | 99 + .../Advanced/daos/daobot-flow.drawio | 56 + .../Tutorials/Advanced/daos/daobot-flow.png | Bin 0 -> 29026 bytes .../Tutorials/Advanced/daos/daobot-flow.svg | 1 + .../Tutorials/Advanced/daos/daobot-fns.drawio | 31 + .../Tutorials/Advanced/daos/daobot.md | 105 + .../Tutorials/Advanced/daos/drop.md | 267 ++ .../Tutorials/Advanced/daos/final.md | 178 + .../Tutorials/Advanced/daos/introduction.md | 77 + .../Tutorials/Advanced/daos/security.md | 331 ++ .../Tutorials/Advanced/homepage.md | 6 + .../Tutorials/Advanced/multi-sig/concept.md | 4 + .../Tutorials/Advanced/multi-sig/final.md | 4 + .../Tutorials/Advanced/multi-sig/skeleton.md | 4 + .../Tutorials/Advanced/subscriptions/final.md | 4 + .../Advanced/subscriptions/introduction.md | 18 + .../Advanced/subscriptions/skeleton.md | 4 + .../Tutorials/Advanced/ticketing/analytics.md | 80 + .../Advanced/ticketing/architecture.md | 69 + .../Tutorials/Advanced/ticketing/bos-tool.md | 61 + .../Tutorials/Advanced/ticketing/drop-test.md | 266 ++ .../Tutorials/Advanced/ticketing/drop.md | 320 ++ .../Tutorials/Advanced/ticketing/final.md | 151 + .../Advanced/ticketing/introduction.md | 87 + .../Advanced/ticketing/react-outline.md | 80 + .../Advanced/ticketing/scanner-code.md | 144 + .../Tutorials/Advanced/ticketing/user-code.md | 138 + .../version-2.0/Tutorials/BOS/welcome.md | 42 + .../version-2.0/Tutorials/Basics/fc-drops.md | 425 +++ .../version-2.0/Tutorials/Basics/ft-drops.md | 447 +++ .../Tutorials/Basics/getting-started.md | 43 + .../version-2.0/Tutorials/Basics/nft-drops.md | 429 +++ .../Tutorials/Basics/simple-drops.md | 371 ++ .../version-2.0/Tutorials/Misc/sign-txn.md | 6 + .../version-2.0/Tutorials/welcome.md | 94 + versioned_docs/version-2.0/exec-summary.md | 119 + .../keypom-sdk/Core/_category_.yml | 3 + .../Core/interfaces/BasicTransaction.md | 37 + .../Core/interfaces/ContractSourceMetadata.md | 34 + .../Core/interfaces/CreateDropProtocolArgs.md | 117 + .../Core/interfaces/CreateOrAddReturn.md | 69 + .../keypom-sdk/Core/interfaces/Drop.md | 153 + .../keypom-sdk/Core/interfaces/DropConfig.md | 71 + .../keypom-sdk/Core/interfaces/EnvVars.md | 223 ++ .../keypom-sdk/Core/interfaces/FCData.md | 22 + .../keypom-sdk/Core/interfaces/FTData.md | 59 + .../keypom-sdk/Core/interfaces/Funder.md | 75 + .../Core/interfaces/FungibleTokenMetadata.md | 96 + .../Core/interfaces/GeneratedKeyPairs.md | 46 + .../keypom-sdk/Core/interfaces/KeyInfo.md | 93 + .../keypom-sdk/Core/interfaces/Method.md | 153 + .../keypom-sdk/Core/interfaces/NFTData.md | 47 + .../interfaces/NonFungibleTokenMetadata.md | 153 + .../Core/interfaces/PasswordPerUse.md | 33 + .../Core/interfaces/ProtocolReturnedDrop.md | 166 + .../interfaces/ProtocolReturnedDropConfig.md | 70 + .../Core/interfaces/ProtocolReturnedFCData.md | 23 + .../Core/interfaces/ProtocolReturnedFTData.md | 47 + .../interfaces/ProtocolReturnedKeyInfo.md | 94 + .../Core/interfaces/ProtocolReturnedMethod.md | 153 + .../interfaces/ProtocolReturnedNFTData.md | 34 + ...rotocolReturnedNonFungibleTokenMetadata.md | 153 + .../ProtocolReturnedNonFungibleTokenObject.md | 69 + .../ProtocolReturnedPublicSaleConfig.md | 97 + .../interfaces/ProtocolReturnedSimpleData.md | 17 + .../interfaces/ProtocolReturnedTimeConfig.md | 63 + .../interfaces/ProtocolReturnedUsageConfig.md | 80 + .../Core/interfaces/PublicSaleConfig.md | 107 + .../keypom-sdk/Core/interfaces/SimpleData.md | 21 + .../keypom-sdk/Core/interfaces/TimeConfig.md | 62 + .../keypom-sdk/Core/interfaces/UsageConfig.md | 79 + .../keypom-sdk/Core/interfaces/_category_.yml | 2 + .../version-2.0/keypom-sdk/Core/modules.md | 3290 +++++++++++++++++ .../version-2.0/keypom-sdk/Core/welcome.md | 216 ++ .../keypom-sdk/Selector/_category_.yml | 3 + .../Selector/classes/KeypomWallet.md | 465 +++ .../Selector/classes/_category_.yml | 2 + .../Selector/interfaces/BasicTransaction.md | 37 + .../interfaces/ContractSourceMetadata.md | 34 + .../interfaces/CreateDropProtocolArgs.md | 117 + .../Selector/interfaces/CreateOrAddReturn.md | 69 + .../keypom-sdk/Selector/interfaces/Drop.md | 153 + .../Selector/interfaces/DropConfig.md | 71 + .../keypom-sdk/Selector/interfaces/EnvVars.md | 223 ++ .../keypom-sdk/Selector/interfaces/FCData.md | 22 + .../keypom-sdk/Selector/interfaces/FTData.md | 59 + .../keypom-sdk/Selector/interfaces/Funder.md | 75 + .../interfaces/FungibleTokenMetadata.md | 96 + .../Selector/interfaces/GeneratedKeyPairs.md | 46 + .../keypom-sdk/Selector/interfaces/KeyInfo.md | 93 + .../keypom-sdk/Selector/interfaces/Method.md | 153 + .../keypom-sdk/Selector/interfaces/NFTData.md | 47 + .../interfaces/NonFungibleTokenMetadata.md | 153 + .../Selector/interfaces/PasswordPerUse.md | 33 + .../interfaces/ProtocolReturnedDrop.md | 166 + .../interfaces/ProtocolReturnedDropConfig.md | 70 + .../interfaces/ProtocolReturnedFCData.md | 23 + .../interfaces/ProtocolReturnedFTData.md | 47 + .../interfaces/ProtocolReturnedKeyInfo.md | 94 + .../interfaces/ProtocolReturnedMethod.md | 153 + .../interfaces/ProtocolReturnedNFTData.md | 34 + ...rotocolReturnedNonFungibleTokenMetadata.md | 153 + .../ProtocolReturnedNonFungibleTokenObject.md | 69 + .../ProtocolReturnedPublicSaleConfig.md | 97 + .../interfaces/ProtocolReturnedSimpleData.md | 17 + .../interfaces/ProtocolReturnedTimeConfig.md | 63 + .../interfaces/ProtocolReturnedUsageConfig.md | 80 + .../Selector/interfaces/PublicSaleConfig.md | 107 + .../Selector/interfaces/SimpleData.md | 21 + .../Selector/interfaces/TimeConfig.md | 62 + .../Selector/interfaces/UsageConfig.md | 79 + .../Selector/interfaces/_category_.yml | 2 + .../keypom-sdk/Selector/modules.md | 31 + .../keypom-sdk/Selector/welcome.md | 407 ++ versioned_sidebars/version-1.1-sidebars.json | 8 - versioned_sidebars/version-1.2-sidebars.json | 8 - .../version-1.2.1-sidebars.json | 8 - versioned_sidebars/version-2.0-sidebars.json | 180 + versions.json | 4 +- 182 files changed, 19469 insertions(+), 74 deletions(-) create mode 100644 src/theme/DocVersionBanner/index.js delete mode 100644 versioned_docs/version-1.1/nothing-page.md delete mode 100644 versioned_docs/version-1.2.1/nothing-page.md delete mode 100644 versioned_docs/version-1.2/nothing-page.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/Introduction/Introduction.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/Introduction/our-solution.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/customization-homepage.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/drop-customization.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/ft-drops.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/introduction.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/nft-drops.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/sale-customization.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/simple-drops.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/time-customization.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/usage-customization.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/contribute.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/costs.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/licenses.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/password-protect.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/querying.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/testing.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/balances.md create mode 100644 versioned_docs/version-2.0/Concepts/KeypomProtocol/overview.md create mode 100644 versioned_docs/version-2.0/Concepts/LinkdropsAndAccessKeys/linkdrop-basics.md create mode 100644 versioned_docs/version-2.0/Concepts/LinkdropsAndAccessKeys/near-access-keys.md create mode 100644 versioned_docs/version-2.0/Concepts/welcome.md create mode 100644 versioned_docs/version-2.0/Cookbook/balances.md create mode 100644 versioned_docs/version-2.0/Cookbook/drops/NEAR.md create mode 100644 versioned_docs/version-2.0/Cookbook/drops/customizations/dropConfig.md create mode 100644 versioned_docs/version-2.0/Cookbook/drops/customizations/password.md create mode 100644 versioned_docs/version-2.0/Cookbook/drops/customizations/saleConfig.md create mode 100644 versioned_docs/version-2.0/Cookbook/drops/customizations/timeConfig.md create mode 100644 versioned_docs/version-2.0/Cookbook/drops/customizations/usageConfig.md create mode 100644 versioned_docs/version-2.0/Cookbook/drops/fc.md create mode 100644 versioned_docs/version-2.0/Cookbook/drops/ft.md create mode 100644 versioned_docs/version-2.0/Cookbook/drops/nft.md create mode 100644 versioned_docs/version-2.0/Cookbook/drops/trial.md create mode 100644 versioned_docs/version-2.0/Cookbook/keys.md create mode 100644 versioned_docs/version-2.0/Cookbook/utilities.md create mode 100644 versioned_docs/version-2.0/Cookbook/welcome.md create mode 100644 versioned_docs/version-2.0/TrialAccounts/Creation/drop-creation.md create mode 100644 versioned_docs/version-2.0/TrialAccounts/Creation/getting-started.md create mode 100644 versioned_docs/version-2.0/TrialAccounts/Creation/integration.md create mode 100644 versioned_docs/version-2.0/TrialAccounts/Creation/understanding-trial-accounts.md create mode 100644 versioned_docs/version-2.0/TrialAccounts/introduction.md create mode 100644 versioned_docs/version-2.0/TrialAccounts/offboarding.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/AccessKeyMarketplace/concept.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/AccessKeyMarketplace/final.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/AccessKeyMarketplace/skeleton.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/CustomizedOnboarding/final.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/CustomizedOnboarding/introduction.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/CustomizedOnboarding/skeleton.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/ReceiverContracts/concept.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/ReceiverContracts/final.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/ReceiverContracts/skeleton.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/RewardGating/concept.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/RewardGating/final.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/RewardGating/skeleton.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/daos/architecture.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot-flow.drawio create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot-flow.png create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot-flow.svg create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot-fns.drawio create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/daos/drop.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/daos/final.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/daos/introduction.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/daos/security.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/homepage.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/concept.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/final.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/skeleton.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/final.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/introduction.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/skeleton.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/ticketing/analytics.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/ticketing/architecture.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/ticketing/bos-tool.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop-test.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/ticketing/final.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/ticketing/introduction.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/ticketing/react-outline.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/ticketing/scanner-code.md create mode 100644 versioned_docs/version-2.0/Tutorials/Advanced/ticketing/user-code.md create mode 100644 versioned_docs/version-2.0/Tutorials/BOS/welcome.md create mode 100644 versioned_docs/version-2.0/Tutorials/Basics/fc-drops.md create mode 100644 versioned_docs/version-2.0/Tutorials/Basics/ft-drops.md create mode 100644 versioned_docs/version-2.0/Tutorials/Basics/getting-started.md create mode 100644 versioned_docs/version-2.0/Tutorials/Basics/nft-drops.md create mode 100644 versioned_docs/version-2.0/Tutorials/Basics/simple-drops.md create mode 100644 versioned_docs/version-2.0/Tutorials/Misc/sign-txn.md create mode 100644 versioned_docs/version-2.0/Tutorials/welcome.md create mode 100644 versioned_docs/version-2.0/exec-summary.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/_category_.yml create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/BasicTransaction.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ContractSourceMetadata.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateDropProtocolArgs.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateOrAddReturn.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Drop.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/DropConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/EnvVars.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FCData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FTData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Funder.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FungibleTokenMetadata.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/GeneratedKeyPairs.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/KeyInfo.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Method.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NFTData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NonFungibleTokenMetadata.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PasswordPerUse.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDrop.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDropConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFCData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFTData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedKeyInfo.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedMethod.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNFTData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenObject.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedPublicSaleConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedSimpleData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedTimeConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedUsageConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PublicSaleConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/SimpleData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/TimeConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/UsageConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/interfaces/_category_.yml create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/modules.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Core/welcome.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/_category_.yml create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/classes/KeypomWallet.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/classes/_category_.yml create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/BasicTransaction.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ContractSourceMetadata.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateDropProtocolArgs.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateOrAddReturn.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Drop.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/DropConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/EnvVars.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FCData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FTData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Funder.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FungibleTokenMetadata.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/GeneratedKeyPairs.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/KeyInfo.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Method.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NFTData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NonFungibleTokenMetadata.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PasswordPerUse.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDrop.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDropConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFCData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFTData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedKeyInfo.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedMethod.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNFTData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenObject.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedPublicSaleConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedSimpleData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedTimeConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedUsageConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PublicSaleConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/SimpleData.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/TimeConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/UsageConfig.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/_category_.yml create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/modules.md create mode 100644 versioned_docs/version-2.0/keypom-sdk/Selector/welcome.md delete mode 100644 versioned_sidebars/version-1.1-sidebars.json delete mode 100644 versioned_sidebars/version-1.2-sidebars.json delete mode 100644 versioned_sidebars/version-1.2.1-sidebars.json create mode 100644 versioned_sidebars/version-2.0-sidebars.json diff --git a/config-typedoc-core.js b/config-typedoc-core.js index cb4fa420..aec1f77c 100644 --- a/config-typedoc-core.js +++ b/config-typedoc-core.js @@ -74,22 +74,22 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); }, items: [ { - to: "docs/next/Concepts/welcome", + to: "docs/2.0/Concepts/welcome", label: "πŸ“– Concepts", position: "left", }, { - to: "docs/next/Tutorials/welcome", + to: "docs/2.0/Tutorials/welcome", label: "πŸ“š Tutorials", position: "left", }, { - to: "docs/next/KeypomV2/welcome", + to: "docs/2.0/KeypomV2/welcome", label: "πŸ€– Keypom V2", position: "left", }, { - to: "docs/next/keypom-sdk/welcome", + to: "docs/2.0/keypom-sdk/welcome", label: "πŸ’» SDK TypeDocs", position: "left", }, @@ -120,15 +120,15 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); items: [ { label: 'πŸ“–Concepts', - to: 'docs/next/Concepts/welcome', + to: 'docs/2.0/Concepts/welcome', }, { label: 'πŸ“šTutorials', - to: 'docs/next/Tutorials/welcome', + to: 'docs/2.0/Tutorials/welcome', }, { label: "πŸ€–Keypom V2", - to: "docs/next/KeypomV2/welcome", + to: "docs/2.0/KeypomV2/welcome", }, ], }, diff --git a/config-typedoc-selector.js b/config-typedoc-selector.js index f9d0e9f9..b9ad909d 100644 --- a/config-typedoc-selector.js +++ b/config-typedoc-selector.js @@ -74,22 +74,22 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); }, items: [ { - to: "docs/next/Concepts/welcome", + to: "docs/2.0/Concepts/welcome", label: "πŸ“– Concepts", position: "left", }, { - to: "docs/next/Tutorials/welcome", + to: "docs/2.0/Tutorials/welcome", label: "πŸ“š Tutorials", position: "left", }, { - to: "docs/next/KeypomV2/welcome", + to: "docs/2.0/KeypomV2/welcome", label: "πŸ€– Keypom V2", position: "left", }, { - to: "docs/next/keypom-sdk/welcome", + to: "docs/2.0/keypom-sdk/welcome", label: "πŸ’» SDK TypeDocs", position: "left", }, @@ -120,15 +120,15 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); items: [ { label: 'πŸ“–Concepts', - to: 'docs/next/Concepts/welcome', + to: 'docs/2.0/Concepts/welcome', }, { label: 'πŸ“šTutorials', - to: 'docs/next/Tutorials/welcome', + to: 'docs/2.0/Tutorials/welcome', }, { label: "πŸ€–Keypom V2", - to: "docs/next/KeypomV2/welcome", + to: "docs/2.0/KeypomV2/welcome", }, ], }, diff --git a/docusaurus.config.js b/docusaurus.config.js index 4184be45..3be22cd4 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -19,7 +19,7 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); ({ hashed: true, language: ["en"], - ignoreFiles: ["docs/1.1/nothing-page", "docs/nothing-page", "docs/1.2/nothing-page", "docs/next/Tutorials/Misc/sign-txn"] + ignoreFiles: ["docs/1.1/nothing-page", "docs/nothing-page", "docs/1.2/nothing-page", "docs/Tutorials/Misc/sign-txn"] }), ], ], @@ -42,9 +42,16 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); // ], // Please change this to your repo. editUrl: 'https://github.com/keypom/keypom-docs/tree/main/', + // versions: { + // current: { + // banner: 'none', + // }, + // }, + lastVersion: 'current', versions: { current: { - banner: 'none', + label: '3.0', + badge: true }, }, @@ -72,36 +79,36 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); }, items: [ { - to: "docs/next/Concepts/welcome", + to: "docs/Concepts/welcome", label: "πŸ“– Concepts", position: "left", }, { - to: "docs/next/Tutorials/welcome", + to: "docs/Tutorials/welcome", label: "πŸ’» Tutorials", position: "left", }, // { - // to: "docs/next/KeypomV2/welcome", + // to: "docs/KeypomV2/welcome", // label: "πŸ€– Keypom V2", // position: "left", // }, { - to: "docs/next/TrialAccounts/introduction", + to: "docs/TrialAccounts/introduction", label: "🎁 Trial Accounts", position: "left", }, { label: 'πŸš€ BOS', - to: 'docs/next/Tutorials/BOS/welcome', + to: 'docs/Tutorials/BOS/welcome', }, { - to: "docs/next/keypom-sdk/Core/welcome", + to: "docs/keypom-sdk/Core/welcome", label: "πŸ“š SDK TypeDocs", position: "left", }, { - to: "docs/next/Cookbook/welcome", + to: "docs/Cookbook/welcome", label: "πŸ§‘β€πŸ³ Cookbook", position: "left", }, @@ -110,9 +117,9 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); label: 'GitHub', position: 'right', }, - // { - // type: 'docsVersionDropdown', - // }, + { + type: 'docsVersionDropdown', + }, ], }, footer: { @@ -125,32 +132,32 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); items: [ { label: 'πŸ“– Concepts', - to: 'docs/next/Concepts/welcome', + to: 'docs/Concepts/welcome', }, { label: 'πŸ’» Tutorials', - to: 'docs/next/Tutorials/welcome', + to: 'docs/Tutorials/welcome', }, { - to: "docs/next/TrialAccounts/introduction", + to: "docs/TrialAccounts/introduction", label: "🎁 Trial Accounts", position: "left", }, { label: 'πŸš€ BOS', - to: 'docs/next/Tutorials/BOS/welcome', + to: 'docs/Tutorials/BOS/welcome', }, { label: "πŸ“š SDK TypeDocs", - to: "docs/next/keypom-sdk/Core/welcome", + to: "docs/keypom-sdk/Core/welcome", }, { label: "πŸ§‘β€πŸ³ Cookbook", - to: "docs/next/Cookbook/welcome", + to: "docs/Cookbook/welcome", } // { // label: "πŸ€–Keypom V2", - // to: "docs/next/KeypomV2/welcome", + // to: "docs/KeypomV2/welcome", // }, ], }, diff --git a/src/pages/index.md b/src/pages/index.md index 9e26a95e..bcd3a355 100644 --- a/src/pages/index.md +++ b/src/pages/index.md @@ -20,7 +20,7 @@ import {FeatureList, Column, Feature} from "../components/featurelist.js"
- +
- +
Examples and Tutorials @@ -55,28 +55,28 @@ import {FeatureList, Column, Feature} from "../components/featurelist.js" - - - + + + - - - - + + + + - - - - + + + + - + diff --git a/src/theme/DocVersionBanner/index.js b/src/theme/DocVersionBanner/index.js new file mode 100644 index 00000000..3658e716 --- /dev/null +++ b/src/theme/DocVersionBanner/index.js @@ -0,0 +1,148 @@ +import React from 'react'; +import clsx from 'clsx'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Link from '@docusaurus/Link'; +import Translate from '@docusaurus/Translate'; +import { + useActivePlugin, + useDocVersionSuggestions, +} from '@docusaurus/plugin-content-docs/client'; +import {ThemeClassNames} from '@docusaurus/theme-common'; +import { + useDocsPreferredVersion, + useDocsVersion, +} from '@docusaurus/theme-common/internal'; +function UnreleasedVersionLabel({siteTitle, versionMetadata, latestVersion, to, onClick}) { + return ( + {versionMetadata.label}, + latestVersionLink: ( + + + + {latestVersion} + + + + ), + }}> + { + 'This is unreleased Keypom documentation for v{versionLabel}. For the lastest, select v{latestVersionLink} from the dropdown' + } + + ); +} +function UnmaintainedVersionLabel({siteTitle, versionMetadata, latestVersion, to, onClick}) { + return ( + {versionMetadata.label}, + latestVersionLink: ( + + + + {latestVersion} + + + + ), + }}> + { + 'You are viewing documentation for Keypom v{versionLabel}. For the lastest, select v{latestVersionLink} from the dropdown' + } + + ); +} +const BannerLabelComponents = { + unreleased: UnreleasedVersionLabel, + unmaintained: UnmaintainedVersionLabel, +}; +function BannerLabel(props) { + const BannerLabelComponent = + BannerLabelComponents[props.versionMetadata.banner]; + return ; +} +function LatestVersionSuggestionLabel({versionLabel, to, onClick}) { + return ( + + + + here + + + + ), + }}> + { + 'For the lastest documentation, see {latestVersionLink}.' + } + + ); +} +function DocVersionBannerEnabled({className, versionMetadata}) { + const { + siteConfig: {title: siteTitle}, + } = useDocusaurusContext(); + const {pluginId} = useActivePlugin({failfast: true}); + const getVersionMainDoc = (version) => + version.docs.find((doc) => doc.id === version.mainDocId); + const {savePreferredVersionName} = useDocsPreferredVersion(pluginId); + const {latestDocSuggestion, latestVersionSuggestion} = + useDocVersionSuggestions(pluginId); + // Try to link to same doc in latest version (not always possible), falling + // back to main doc of latest version + const latestVersionSuggestedDoc = + latestDocSuggestion ?? getVersionMainDoc(latestVersionSuggestion); + return ( +
+
+ savePreferredVersionName(latestVersionSuggestion.name) } /> +
+ {/*
+ savePreferredVersionName(latestVersionSuggestion.name)} + /> +
*/} +
+ ); +} +export default function DocVersionBanner({className}) { + const versionMetadata = useDocsVersion(); + if (versionMetadata.banner) { + return ( + + ); + } + return null; +} diff --git a/versioned_docs/version-1.1/nothing-page.md b/versioned_docs/version-1.1/nothing-page.md deleted file mode 100644 index e69de29b..00000000 diff --git a/versioned_docs/version-1.2.1/nothing-page.md b/versioned_docs/version-1.2.1/nothing-page.md deleted file mode 100644 index e69de29b..00000000 diff --git a/versioned_docs/version-1.2/nothing-page.md b/versioned_docs/version-1.2/nothing-page.md deleted file mode 100644 index e69de29b..00000000 diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/Introduction/Introduction.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/Introduction/Introduction.md new file mode 100644 index 00000000..ae12f19c --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/Introduction/Introduction.md @@ -0,0 +1,58 @@ +--- +sidebar_label: 'Introduction to Keypom' +sidebar_position: 1 +--- +> To view our debut talk at NEARCON 2022, click [here](https://www.youtube.com/watch?v=J-BOnfhHV50). + +Keypom is an access key factory created as a result of 3 common problems that arose in the ecosystem. + +1. People want a *cheap, customizable, and unique* onboarding experience for users. +2. Companies don't want to expose **full access keys** in their backend servers. +3. dApps want a *smooth UX* with zero barrier to entry onboarding. + +The contract was initially created as a way to handle the 1 $NEAR minimum deposit required for creating linkdrops using the [regular linkdrop contract](https://github.com/near/near-linkdrop/blob/f24f2608e1558db773f2408a28849d330abb3881/src/lib.rs#L18). + +If users wanted to create linkdrops, they needed to attach a **minimum** of 1 $NEAR. This made it costly and unscalable for projects that wanted to mass onboard onto NEAR. Keypom, on the other hand, has been highly optimized to allow for the lowest possible costs. + +## Problem + +Blockchain technology comes with many benefits such as sovereign ownership, digital rights, privacy, freedom, +peer to peer coordination and much more. The problem with this technology, however, is that there is an extremely +high barrier to entry for an everyday individual. None of it matters if nobody can onboard. + +It’s confusing to create and fund a crypto wallet. People are unfamiliar with the process, technical jargon, +and the general flow. NEAR’s account model is powerful, but extremely underutilized because it’s complex for +developers to take full advantage of. Keypom wraps this up in a single API call. + +With NEAR’s goal of onboarding 1 billion users to Web3, there needs to be a solution to this high barrier to +entry for developers building on NEAR and users onboarding to their apps and the NEAR ecosystem. + +Below is a table outlining the minimum costs to onboard a new user onto NEAR with a named account. + +| | 1 Account | 1,000 Accounts | 1,000,000 Accounts | +|----------------------|-----------------|-----------------|--------------------| +| Traditional Linkdrop | ~1 NEAR | ~1,003 NEAR | ~1,002,840 NEAR | +| Keypom | ~0.0035 NEAR | ~3.5 NEAR | ~3,500 NEAR | +| | ~99.65% Cheaper | ~99.65% Cheaper | ~99.65% Cheaper | + +Keypom allows anyone to create highly customizable onboarding experiences for their users. These experiences +can be both for new, or existing users. If someone already has a wallet, they can still use a Keypom link to +experience an app, and then transfer the assets later. + +## Comparable Solutions + +| | **Keypom** | **NEAR Drop** | **Satori** | +|----------------------------------------------|------------|---------------|------------| +| NEAR Drop | βœ… | βœ… | ❌ | +| FT Drop | βœ… | ❌ | ❌ | +| NFT Drop | βœ… | ❌ | βœ… | +| Function Call Drop | βœ… | ❌ | ❌ | +| Embeddable in Dapps | βœ… | ❌ | ❌ | +| Wallet Selector Integration | βœ… | ❌ | ❌ | +| No Fee | βœ… | Maybe? | ❌ | +| No Backend / 3rd Party | βœ… | βœ… | ❌ | +| Campaigns | βœ… | βœ… | βœ… | +| Multi-Step e.g. Tickets click > scan > claim | βœ… | ❌ | ❌ | +| Password Protected Drops | βœ… | ❌ | ❌ | +| Timed Drops e.g. recurring payments | βœ… | ❌ | ❌ | +| Custom Names e.g. user.myapp.near | βœ… | ❌ | ❌ | diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/Introduction/our-solution.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/Introduction/our-solution.md new file mode 100644 index 00000000..602e84f3 --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/Introduction/our-solution.md @@ -0,0 +1,18 @@ +--- +sidebar_label: 'Keypom Solution' +sidebar_position: 2 +--- +# Our Solution + +Keypom allows for the creation of highly customizable access keys. These keys can be thought of as having their +own *smart contracts*. Each access key derives from what's known as a *drop*. These drops outline the different +functionalities and behaviors the key will have. A drop can be thought of as a bucket that access keys belong to. +You can create many different buckets and fill them each with their own keys. Each key will act in accordance to the +drop, or bucket, it belongs to. + +A drop can be one of four different types: + +1. Simple drop. +2. Non Fungible Token drop. +3. Fungible Token drop. +4. Function Call drop. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/customization-homepage.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/customization-homepage.md new file mode 100644 index 00000000..f958c920 --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/customization-homepage.md @@ -0,0 +1,57 @@ +--- +sidebar_label: 'What are Drop Configurations?' +--- +# What are Drop Configurations? + +What sets Keypom apart from the basic [NEAR Linkdrop](https://github.com/near/near-linkdrop)? One major aspect is that Keypom allows for LOADS of customization! + +This can allow for your to create linkdrops where the keys can become multi-use and controlled by start time, time between uses and much more! With these tools and Keypom's 4 drop types, you can create everything from unique onboardings to [tiered and exclusive tickets](../../../../Tutorials/Advanced/ticketing/introduction.md). + +/Users/min/Documents/NEAR_Stuff/keypom-docs/docs/Tutorials/Advanced/ticketing/introduction.md + +This is all done through **Drop Configurations**. + +:::info +The three objects used to customize your drops are **DropConfig**, **TimeConfig**, and **UsageConfig**. + +Any customization will apply to ALL keys in that drop. +::: + +[**DropConfig**](drop-customization.md) - Top level configurations, dictates major parameters such as number of uses per key. + +[**TimeConfig**](time-customization.md) - All configurations related to time, such as time between uses. + +[**UsageConfig**](usage-customization.md) - Administrative configurations, such as whether to delete the drop when all keys are used. + +[**PublicSaleConfig**](sale-customization.md) - Configurations that allow the funder to create a public sale. Public sales are done by allowing users to add keys to the drop at a fee. + +The structure for all the configurations can be seen in the tree below. + +## Drop Configuration Structure +``` bash +DropConfig +β”œβ”€β”€ uses_per_key +β”‚ +β”œβ”€β”€ TimeConfig +β”‚ └── start +β”‚ └── end +β”‚ └── throttle +β”‚ └── interval +β”‚ +β”œβ”€β”€ UsageConfig +β”‚ └── permissions +β”‚ └── refund_deposit +β”‚ └── auto_delete_drop +β”‚ └── auto_withdraw +β”‚ +β”œβ”€β”€ PublicSaleConfig +β”‚ └── max_num_keys +β”‚ └── price_per_key +β”‚ └── allowlist +β”‚ └── blocklist +β”‚ └── auto_withdraw_funds +β”‚ └── start +β”‚ └── end +β”‚ +β”œβ”€β”€ root_account_id +``` \ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/drop-customization.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/drop-customization.md new file mode 100644 index 00000000..53db7592 --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/drop-customization.md @@ -0,0 +1,70 @@ +--- +sidebar_label: 'Drop Configurations' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Drop Configurations +Drop Customizations via the `DropConfig` object passed into `create_drop` can help adjust the properties and behaviors of a drop to achieve specific use-cases. + +From changing the amount of times a key can be used before it's deleted to setting a public sale and making profit from keys being added to your drop, understanding the power of the `DropConfig` is crucial to making the most of Keypom! + +:::tip +A configuration applies to **ALL KEYS** across a drop. + +This means that if you want keys with different configurations, you must create multiple drops with their respective configurations. +::: + +# Understanding `DropConfig` + + + +```ts reference +https://github.com/keypom/keypom-js/blob/29c10f949f02f673d4a3cecc21b0f74bca600075/src/lib/types/drops.ts#L64-L82 +``` + + + + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/models/json_types.rs#L56-L73 +``` + + + + +For now, the focus will be `uses_per_key` and `root_account_id`. [`TimeConfig`](time-customization.md), [`UsageConfig`](usage-customization.md), and [`PublicSaleConfig`](sale-customization.md) are covered later. + +--- + +## Uses per Key +*Default: 1* + +This parameter allows you to set the number of times a user can claim a key before it is deleted. + +### Use cases +This parameter is incredibly versatile and can be used in numerous ways. Some excellent examples are: + +1. Rewards that progressively increase in value. For example, you could incentivize people to show up to all your talks at a conference. A link would be given out that needed to be physically scanned at your talk to unlock rewards. If you showed up to all the events, a jackpot prize could be claimed. +2. A set number of [Recurring Payments](../../GithubReadme/TypesOfDrops/simple-drops.md#recurring-payments) for subscriptions or contracted/freelanced work. +3. A method to accurately track retention, such as [Event Turnout](../../GithubReadme/TypesOfDrops/fc-drops.md#nft-ticketing) + + +When used with [function call drops](fc-drops.md), some more complex use cases can be created, such as Customizable Multi-Phase Onboarding and [Auto DAO-Registration](../../../../Tutorials/Advanced/daos/introduction.md) + +--- + +## Root Account ID +*Default: `near` or `testnet`* + +The `root_account_id` parameter determines which account the newly-created claiming account will be a sub-account of. For example, the default is `near` so all accounts would end in `.near` such as `benji.near`. Changing the `root_account_id` parameter will change the root of all the accounts that users create through `create_account_and_claim` when using your drop. + +### Use cases +Let's say you have an organization called Moonpom (secretly run by our beloved Pomeranian, Moon) and you want your users want to proudly represent Moonpom! + +You set `root_account_id = "moonpom.near"` and now any account created using your linkdrops will take on the form `${YOUR_USERNAME}.moonpom.near` + +:::caution Important +the `root_account_id` **must** have a contract deployed to it that exposes a method `create_account` to create the sub-account. A sample contract can be found [here](https://github.com/near/near-linkdrop) +::: + diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md new file mode 100644 index 00000000..c3eb906a --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md @@ -0,0 +1,224 @@ +--- +sidebar_label: 'Function Call Drops' +sidebar_position: 5 +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Function Call Drops + +Function call drops are by far the most powerful feature that Keypom provides. FC drops allow **any** method on **any** +contract to be executed (with some exceptions). In addition, there are a huge variety of customizations and features you can choose from when +defining the drop that come on top of the global options. The possibilities are almost endless. State of the art NFT ticketing, +lazy minting NFTs, auto registration into DAOs, analytics for marketing at events and much more. + +## How does it work? + +Unlike NFT and FT drops, the function calls must have everything paid for **upfront**. There is no two step process +so the creation is similar to Simple drops. Once the drop is created and keys are added, you can immediately start using it. + +### Function Call Config + +When creating the drop, you have quite a lot of customization available. At the top level, there is a FC drop global +config similar to how the *general* config works. + + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de977945/src/lib/types/fc.ts#L68-L74 +``` + + + + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/models/fc_model.rs#L53-L58 +``` + + + + + +### `Method`/`MethodData` + +In addition to the global config, the user can specify a set of what's known as `Method`. This represents the +information for the function being called. Within this data, there are also a few optional configurations you can use +to extend your use cases. You'll see how powerful these can be in the use cases [section](#use-cases). + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de977945/src/lib/types/fc.ts#L7-L63 +``` + + + + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/models/fc_model.rs#L18-L48 +``` + + + + + +`Method`/`MethodData` keeps track of the method being called, receiver, arguments, and attached deposit. In addition, there are +some optional fields that can be used to extend the use cases. If you have a contract that requires some more context from +Keypom such as the drop ID, key ID, or account ID that used the key, these can all be specified. + +We've kept it generic such that you can specify the actual argument name that these will be passed in as. For example, if you +had a contract that would lazy mint an NFT and it required the account to be passed in as `receiver_id`, you could specify +an `account_id_field` set to `receiver_id` such that Keypom will automatically pass in the account ID that used the key under the +field `receiver_id`. + +This logic extends to the drop ID, and key Id as well. + +### Key Uses + +For **every key use**, you can specify a *vector* of `Method`/`MethodData` which allows you to execute multiple function calls each +time a key is used. These calls are scheduled 1 by 1 using a simple for loop. This means that most of the time, the function +calls will be executed in the order specified in the vector but it is not *guaranteed*. + +It's important to note that the Gas available is split evenly between *all* the function calls and if there are too many, +you might run into issues with not having enough Gas. You're responsible for ensuring that this doesn't happen. + +The vector of `Method`/`MethodData` is *optional* for each key use. If a key use has `null` rather than `Some(Vector)` or `Maybe>`, +it will decrement the uses and work as normal such that the `throttle_timestamp, `start_timestamp` etc. are enforced. The only +difference is that after the key uses are decremented and these checks are performed, the execution **finishes early**. The null +case does **not** create an account or send *any* funds. It doesn't invoke any function calls and simply *returns once the +checks are done*. This makes the null case act as a "burner" where you disregard any logic. This has many uses which will +be explored in the use cases [section](#use-cases). + +If a key has more than 1 use, you can specify a *different vector* of `Method`/`MethodData` for **each use**. As an example, you could +specify that the first use will result in a null case and the second use will result in a lazy minting function being called. +If you have multiple uses but want them all to do the same thing, you don't have to repeat the same data. Passing in only 1 +vector of `Method`/`MethodData` will result in **all the uses** inheriting that data. + +## Security + +Since all FC drops will be signed by the Keypom contract, there are a few restrictions in place to avoid malicious behaviors. +To avoid users from stealing registered assets from other drops, the following methods cannot be called via FC Drops: + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/lib.rs#L926-L934 +``` + +In addition, the Keypom contract cannot be the receiver of any function call. This is to avoid people +from calling private methods through FC Drops. + +### Keypom Arguments + +When a key is used and a function is called, there is a data structure that is **automatically** attached to the arguments. +This is known as the `keypom_args`. It contains the information that the drop creator specified in the `Method`/`MethodData`. + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/stage1/function_call.rs#L17-L22 +``` + +#### Motivation + +Let's say there was an exclusive NFT contract that allowed the Keypom contract to mint NFTs as part of an FC drop. Only Keypom +was given access to mint the NFTs so they could be given out as linkdrops. The organizer only wanted links that were part of their +drop to be valid. For this reason, the NFT contract would only mint if Keypom called the `nft_mint` function and there was a field +`series` passed in and it was equal to the drop ID created by the organizer. + +Let's say the owner created an exclusive drop that happened to have a drop ID of 5. They could then go to the NFT contract +and restrict NFTs to only be minted if: +- `series` had a value of 5. +- The Keypom contract was the one calling the function. + +In order for this to work, when creating the drop, the owner would need to specify that the`drop_id_field` was set to a value of `series` +such that the drop ID is correctly passed into the function. + +The problem with this approach is that the NFT contract has no way of knowing which arguments were sent by the **user** when the drop +was created as part of the MethodData `args` and which arguments are automatically populated by the Keypom contract. There is nothing +stopping a malicious user from creating a new drop that has an ID of 6 but hard-coding in the actual arguments that `series` should have +a value of 5. In this case, the malicious drop would have *no* `drop_id_field` and the NFT contract would have no way of knowing that the +`series` value is malicious. + +This can be prevented if a new field is introduced representing what was automatically injected by the Keypom contract itself. At the +end of the day, Keypom will **always** send correct information to the receiving contracts. If those contracts have a way to know what has +been sent by Keypom and what has been manually set by users, the problem is solved. In the above scenario, the NFT contract would simply add +an assertion that the `keypom_args` had the `account_id_field` set to `Some(series)` meaning that the incoming `series` field was set by Keypom +and not by a malicious user. + +## Use Cases + +Function call drops are the bread and butter of the Keypom contract. They are the most powerful and complex drops that can currently be created. +With this complexity, there are an almost infinite number of use-cases that arise. + +### Proof of Attendance Protocols + +A very common use case in the space is what's known as Proof of Attendance. Often times when people go to events, they want a way to prove +that they were there. Some traditional approaches would be to submit your wallet address and you would be sent an NFT or some other form of +proof at a later date. The problem with this is that it has a very high barrier to entry. Not everyone has a wallet. + +With Keypom, you can create a function call drop that allows people to onboard onto NEAR if they don't have a wallet or if they do, they can +simply use that. As part of the onboarding / claiming process, they would receive some sort of proof of attendance such as an NFT. This can +be lazy minted on-demand such that storage isn't paid up-front for all the tokens. + +At this point, the event organizers or the funder can distribute links to people that attend the event in-person. These links would then be +claimed by users and they would receive the proof of attendance. + +### Auto Registration into DAOs + +DAOs are a raging topic in crypto. The problem with DAOs, however, is there is a barrier to entry for users that aren't familiar with the +specific chain they're built on top of. Users might not have wallets or understand how to interact with contracts. On the contrary, they +might be very well versed or immersed in the DAO's topics. They shouldn't be required to create a wallet and learn the onboarding process. + +With Keypom, you can create a function call drop with the main purpose of registering users into a DAO. For people that have a wallet, +this will act as an easy way of registering them with the click of a link. For users that don't have a wallet and are unfamiliar with +NEAR, they can be onboarded and registered into the DAO with the same click of a link. + +### Multisig Contracts + +Another amazing use-case for Keypom is allowing multisig contracts to have ZERO barrier to entry. Often times when using a multisig contract, +you will entrust a key to a trusted party. This party might have no idea what NEAR is or how to interact with your contract. With Keypom, +you can create a drop that will allow them to sign their transaction with a click of a link. No NEAR wallet is needed and no knowledge of the +chain is required. + +At the end of the day, from the users perspective, they are given a link and when they click it, their portion of the multisig transaction is +signed. The action is only performed on the multisig contract once all links have been clicked. This is an extremely powerful way of doing +accomplishing multisig transactions with zero barrier to entry. + +The users don't even need to create a new account. They can simply call `claim` when the link is clicked which will fire the cross-contract call +to the multisig contract and pass in the keypom arguments that will be cross-checked by that contract. + +### NFT Ticketing + +The problem with current NFT ticketing systems is that they require users to have a wallet. This is a huge barrier to entry for people that +are attending events but don't have wallets. In addition, there is often no proof of attendance for the event as the NFT is burned in order +to get into the event which requires an internet connection. + +Keypom aims to solve these problems by having a ticketing system that has the following features. +* Users are not required to have a wallet to enter the event. +* Each ticket is unique and can only be used by one person. +* Attendees are not required to have wifi to gain entry to the event. +* Attendees that did not have a NEAR wallet can get one for free. +* Attendees can choose to receive an NFT proving their attendance at the event. This is commonly known as a [POAP](https://academy.binance.com/en/glossary/proof-of-attendance-protocol-poap). + +In addition, some way to provide analytics to event organizers that contains information such as links that were: +- Given out but not clicked at all. +- Clicked but not attended. +- Partially claimed indicating the number of people that attended but did not onboard or receive a POAP. +- Fully claimed indicating the number of people that attended and received a POAP. + +In order to accomplish this, you can create a drop that has 3 uses per key. These uses would be: +1. Array(`null`) +2. Array(`null`) +3. Array(function call to POAP contract to lazy mint an NFT) + +The event organizer would create the links and distribute them to people however they see fit. When a user receives the link, the first +claim is automatically fired. This is a `null` case so nothing happens except for the fact that the key uses are decremented. At this point, +the organizer knows that the user has clicked the link since the uses have been decremented. + +The next claim happens **only** when the user is at the door. Keypom would expose a QR code that can only be scanned by the host's phone. +This QR code would appear once the first link is clicked and contains the private key for the link. At the event, they wouldn't need any wifi +to get in as they only need to show the host the QR code. Once the host scans it, the site would ensure that they have exactly 2 out of +the 3 uses left. If they don't, they're not let in. At that point, a use is decremented from the key and the next time they visit the +ticket page (when they have internet), they would be able to claim the final use and be onboarded / receive a POAP. + +

ticketing

\ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/ft-drops.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/ft-drops.md new file mode 100644 index 00000000..1c3613b9 --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/ft-drops.md @@ -0,0 +1,92 @@ +--- +sidebar_label: 'Fungible Token Drops' +sidebar_position: 4 +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Fungible Token Drops + +A Fungible Token drop is also a light wrapper around the simple drop. It works very similarly to how its NFT +counterpart does. First, you'll need to create the drop and then you can fund it with assets and register +key uses. + +You can preload a drop with as many FTs as you'd like even if you don't have the keys yet. This will spike the +`registered_uses` and then you can create keys and slowly eat away from this "total supply" overtime. If the +drop runs out, you can send it more FTs to top up. All the keys in the FT drop will share from this supply +and every time a key is used, the `registered_uses` will decrement and the "total supply" will get smaller. + +## How does it work? + +As mentioned in the NFT section, every drop has a field known as `registered_uses`. This tells the contract +how many uses the drop has across all its keys. For simple drops, this field doesn't matter since all the uses +are paid for up-front when the drop is created or when keys are added. With FT drops, however, +there is a 2 step process: +- Firstly, the drop is created and all the $NEAR required is pre-paid for. This is the same as +simple drops, however, the `registered_uses` are set to 0. +- Once the drop is created, the owner must send the contract the FTs in order for keys to be +usable. This process is done through the `ft_transfer_call` workflow baked into the FT standards. +It's up to the owner to facilitate this process. + +## FT Config + +Along with the default global configurations for drops, if you'd like to create a FT drop, +you must specify the following pieces of information when the drop is created. + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de977945/src/lib/types/ft.ts#L4-L23 +``` + + + + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/models/json_types.rs#L119-L123 +``` + + + + + +By specifying this information, the drop is locked into only accepting FTs coming from the sender and contract. While +you can send as many FTs as you'd like and can over-pay, you *must* send at **least** enough FTs in one call to cover +1 use. As an example, if a drop is created such that 10 FTs will be sent when a key is used, you must send **at least 10** +and cannot break it up into separate calls where you send 5 one time and 5 another. + +## Use Cases + +FT drops have some awesome flexibility due to the fact that they support all the functionalities of the Simple drops, just with +more use-cases and possibilities. Let's look at some use cases to see how fungible token drops can be used. + +### Recurring Payments + +Recurring payments are quite a common situation. Let's say you need to send someone $50 USDC every week. You +could create a key with 5 claims that has a claim_interval` of 1 week. You would then pre-load maybe the +first week's deposit of $50 USDC and register 1 use or you could send $500 USDC for the first 10 weeks. At that +point, you would simply hand over the key to the user and they can claim once a week. + +### Backend Servers + +Taking the recurring payments problem to another level, imagine that instead of leaving the claims up to the +contractor, you wanted to automatically pay them through a backend server. They would give you their NEAR account +and you would send them FTs. The problem is that you don't want to expose your full access key in the server. +By creating a FT drop, you can store **only the function call access key** created by Keypom in the server. +Your backend would them use the key to call the `claim` function and pass in the user's account ID to send +them the FTs. + +### Creating a Wallet with FTs + +Another awesome use-case is to allow users to be onboarded onto NEAR and **also** receive FTs. As an example, +You could do a promotion where you're giving away $10 USDC to the first 100 users that sign up to your mailing +list. You can also give away QR codes at events that contain a new fungible token that you're launching. You can +simply create a FT drop and pre-load it with the FT of your choice. In addition, you can give it 0.02 $NEAR for +new wallets that are created. + +You can pair this with setting the `on_claim_refund_deposit` flag to true which would make it so that if anyone claims +the fungible tokens and they *already have a wallet*, it will automatically refund you the 0.02 $NEAR. That money should +only be used for the creation of new wallets. Since your focus is on the fungible tokens, you don't want to **force users** +to create a new wallet if they have one already by specifying the claim permission to be `CreateAccountAndClaim` but instead, +you want to be refunded in case they do. diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/introduction.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/introduction.md new file mode 100644 index 00000000..9ceb2c7c --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/introduction.md @@ -0,0 +1,63 @@ +--- +sidebar_label: "Overview" +--- +# Types of Drops +There are **four** types of drops, each with different types of assets. These drops can be claimed either with a brand new NEAR account or an existing one. + + +| Drop Type Assets | +| ------------------------------------------ | ------------------------------------------ | +| [Simple Drop](simple-drops.md) | $NEAR | +| [Non-Fungible Token Drop](nft-drops.md) | NFT and optionally $NEAR | +| [Fungible Token Drop](ft-drops.md) | Fungible Tokens and optionally $NEAR | +| [Function Call Drop](fc-drops.md) | Set of function-calls and optionally $NEAR | + +Continue your learning journey with any of the pages below + +
+

diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/nft-drops.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/nft-drops.md new file mode 100644 index 00000000..3e9cb72f --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/nft-drops.md @@ -0,0 +1,64 @@ +--- +sidebar_label: 'Non Fungible Token Drops' +sidebar_position: 3 +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Non-Fungible Token Drops + +Non-Fungible Token drops are a special type that allows users to "preload" the drop with NFTs. +These tokens will then be *automatically* sent to the **claiming user**. The claiming flow +is fairly similar to simple drops in that users can either create an account or claim to an +existing one. + +NFT drops are essentially a wrapper around simple drops. All the functionalities that simple +drops have are carried over but now, users can receive an NFT as well as $NEAR. This brings +introduces some customization and uniqueness to the use-cases. + +## How does it work? + +Every drop has a field known as `registered_uses`. This tells the contract how many uses the +drop has across all its keys. For simple drops, this field doesn't matter since all the uses +are paid for up-front when the drop is created or when keys are added. With NFT drops, however, +there is a 2 step process: +- Firstly, the drop is created and all the $NEAR required is pre-paid for. This is the same as +simple drops, however, the `registered_uses` are set to 0. +- Once the drop is created, the owner must send the contract the NFTs in order for keys to be +usable. This process is done through the `nft_transfer_call` workflow baked into the NFT standards. +It's up to the owner to facilitate this process. + +Whenever the contract receives tokens, it will push the ID to a vector. These IDs are **popped** off +whenever a key is used. A user will receive the most recent token sent to the contract as the +vector is acting like a *stack*. + +## NFT Config + +Along with the default global configurations for drops, if you'd like to create an NFT drop, +you must specify the following pieces of information when the drop is created. + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de977945/src/lib/types/nft.ts#L4-L15 +``` + + + + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/models/json_types.rs#L78-L81 +``` + + + + +By specifying this information, the drop is locked into only accepting NFTs from the sender and contract. + +## Use Cases + +NFT drops work really well for when you want to send a *pre-existing* NFT to a user along with +some $NEAR. Since NFT drops are a light wrapper around simple drops, most of the use-cases are +the same although people can now get NFTs as well. This means you can onboard a user with some +$NEAR **and** they *get an NFT* too. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/sale-customization.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/sale-customization.md new file mode 100644 index 00000000..0d0f94f2 --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/sale-customization.md @@ -0,0 +1,158 @@ +--- +sidebar_label: 'Public Sale Configurations' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Public Sale Configurations +The public sale configuration gives the funder the ability to sell access keys in their drop with a variety of configurable behaviors such as the price, or a dedicated allowlist. + +## Use cases +Public sales of access keys allow for a wide range of easier to create and more interactive events. This is done by letting you: +* Set up an extremely cheap, exclusive event. This event can host an infinite amount of people and the cost of ticketing would be ~0.05 $NEAR. +* Sell access to gated function calls. For example, you can have an exclusive guest-book contract where users that signed it gained access to a VIP meet and greet with a famous artist. +* Introduce FIAT payments for your users when they purchase an access key; opening up your tickets, onboardings, and NFT drops to a whole new audience. + + +The sale configurations are outlined below. + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/29c10f949f02f673d4a3cecc21b0f74bca600075/src/lib/types/drops.ts#L159-L187 +``` + + + + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/models/json_types.rs#L86-L113 +``` + + + + +--- + +## Maximum Number of Keys +*Default: None* + +The `max_num_keys` parameter dictates the maximum number of keys that can be added to a drop. By default, there is no limit. Using this can help create scarcity, or abide by venue capacities. + +### Use case +Pretend you are hosting an exclusive talk for your dApp and want to limit the attendance 1000 people. + +In this scenario, you could configure the drop to have `max_num_keys = 1000` in order to ensure any keys beyond 1000 cannot be bought and added to the drop. + +--- + +## Price per Key +*Default: None, the keys are free* + +This `price_per_key` parameter defines the price for purchasing a key. + +### Use case +This parameter can be changed based on your needs. For example, if you are running a charity event and want to bring in as many attendees as possible, you would leave both `price_per_key = 0` and `max_num_keys` undefined. This would mean there is no limit on the number of *free* keys that can be added to the drop. + +Alternatively, if you are looking to earn money with your event, you can choose to set `price_per_key` to whatever you see fit. This value is expressed in yoctoNEAR. + +--- + +## Allowlist +*Default: None, anyone can add keys to the drop* + +`Allowlist` specifies a group of users that can add keys to the drop using their `accountID`. For example, if `allowlist = [benji.testnet, minqi.testnet]`, then only `benji.testnet` and `minqi.testnet` can add keys to the drop. + +If left undefined, anybody can add keys to the drop. + +### Use case +In this example, pretend you are running a concert for only your closest friends. To do this, you would set `allowlist` to be a vector of their NEAR `accountID`'s. This way, you can take comfort in knowing that your friends will be the only ones with tickets to the event. + +--- + +## Blocklist +*Default: None, nobody is blocked* + +Contrary to the `allowlist`, the `blocklist` specifies those that are blocked from adding keys to the drop. This is empty by default, meaning nobody is blocked. + +Note that the `blocklist` takes precedent over the `allowlist`. This means that if you are on both lists, you will be blocked. + +### Use case +Lets pretend that you are running a concert but there are known ticket scalpers in the community. To prevent keys from being scalped and ensure your true fans get tickets to your concert, you can add the NEAR `accountID`'s of the scalpers to the `blocklist` vector. + +--- + +## Auto-Withdraw Funds +*Default: False, revenues go to funder's Keypom Balance* + +The `auto_withdraw_funds` parameter dictates where revenue from key sales will go. Every time a key is sold, the revenue will automatically be sent to one of two places: + +1. the funder's Keypom balance +2. the funder's NEAR wallet + +By default, the revenue will go to the funder's Keypom balance. If `auto_withdraw_funds = true`, the revenue generated will be sent to the funder's NEAR wallet. + +### Use case +Let's say you are an event promoter who is new to NEAR. You realize that you are only going to use Keypom for a single event. + +In this scenario, rather than sending revenues to your Keypom balance and then needing to manually withdraw it once the event is over, you can set `auto_withdraw_funds = true` while creating the drop in order to guarantee that the revenues will go to your NEAR wallet automatically. + +--- + +## Start +*Default: None, keys can be added immediately* + +The `start` parameter dictates when keys can be purchased and added to the drop. Similar to [time configurations](time-customization.md), this is measured in non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. A sample configuration is made available below. + +### Use case +Pretend you are an event coordinator for a popular event and have a limited capacity. To ensure fairness, you set a date and time for the sale to begin and let all your users know. + +To do this, you can configure the `start` parameter. + +--- + +## End +*Default: None, keys can be added indefinitely* + +The `end` parameter defines when keys can no longer be purchased and added to the drop. + +### Use case +For an upcoming event, you want to create a pre-sale of tickets for dedicated fans. To do this you can create a drop, separate from the main ticket sale, that begins early and ends before the general admission tickets go on sale. + +To do this, you can configure the `end` parameter. + +--- + + +## Example Public Sale Configuration + +```ts +const ONE_SECOND_NS = 1e9; + +pub_sale: { + // Maximum of 100 Keys + max_num_key: 100, + + // 1 $NEAR per key + price_per_key: parseNearAmount("1"), + + // only allow benji.testnet and minqi.testnet to add keys + allowlist: ["benji.testnet", "minqi.testnet"], + + // don't allow boogieman.testnet to add keys + blocklist: ["boogieman.testnet"], + + // send revenue back to funder's NEAR wallet + auto_withdraw_funds: true, + + // start 5 minutes from now + start: (Date.now() * 1000000) + ONE_SECOND_NS * 300, + + // end 15 minutes from now + end: (Date.now() * 1000000) + ONE_SECOND_NS * 900 +} + +``` + + diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/simple-drops.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/simple-drops.md new file mode 100644 index 00000000..9272132d --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/simple-drops.md @@ -0,0 +1,37 @@ +--- +sidebar_label: 'Simple Drops' +sidebar_position: 2 +--- + +# Simple Drops + +The most basic type of drop is the simple kind. Any keys that are part of a simple drop can +only be used for 1 thing: **transferring $NEAR**. Once the key is claimed, the claiming account +will receive the $NEAR specified in the `deposit_per_use`. Simple drops are a great way to send $NEAR to claiming accounts while not storing a lot +of information on the contract. Below are a couple use cases. + +## Backend Servers + +Let's say you have a backend server that should send 10 $NEAR to the first 3 +people that redeem an NFT. Rather than exposing your full access key in the backend server, +you could create a simple drop that either has 3 keys or 1 key that is claimable 3 times. +In the drop, you'd specify that each time the key is claimed, the specified account would +receive 10 $NEAR. + +## Recurring Payments + +Recurring payments are quite a common situation. If you need to send someone 10 $NEAR once a +month for 6 months, you could create a simple drop that has a `claim_interval` of 1 month with +a `start_timestamp` of next week. Every time the key is used, 10 $NEAR is sent to the account. If +the contractor missed a month's payment, they can claim the key late but can never use the key more +than what is intended. + +

recurring payments

+ +## Quick Onboarding + +If you need to quickly onboard users onto NEAR, you could create a simple drop with a +small amount of $NEAR (enough to create a wallet) and set the claim permission to be +`CreateAccountAndClaim`. This means that the key can only be used to create accounts. +You can then add keys as you wish to the drop and give them out to users so they can create +accounts and be onboarded onto NEAR. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/time-customization.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/time-customization.md new file mode 100644 index 00000000..aeb8a79d --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/time-customization.md @@ -0,0 +1,109 @@ +--- +sidebar_label: 'Time Configurations' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Time Configurations +Time configurations are particularly useful in defining limits on ***when*** a key may be used. This can have a wide range of applications from [Subscriptions](../../../../Tutorials/Advanced/subscriptions/introduction.md) to [Ticketing](../../../../Tutorials/Advanced/ticketing/introduction.md). + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/29c10f949f02f673d4a3cecc21b0f74bca600075/src/lib/types/drops.ts#L87-L112 +``` + + + + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/models/drop_model.rs#L89-L108 +``` + + + +:::tip +All these time parameters are measured in non-leap-nanoseconds and can be tricky to work with. An example struct has been provided [below](time-customization.md). +::: + + +--- + +## Start +*Default: none, Keys can be used anytime* + +`Start` time is useful for any drops where you intend to restrict access until a certain time. Setting a `start` time effectively sets an activation time; a time where the keys become usable afterwards. Before a `start` time is reached, if a user tries to `claim` the key or use `create_account_and_claim`, it will not work. + +### Use case +Let's say you are running a concert, and you want to give fans exclusive access using preferred and general admission tickets. Those with preferred admission tickets can enter anytime, even when the band is setting up. General admission, on the other hand, may only enter once the band is set up. + +In this case, you would hand out general admission tickets with a start time in the time configurations and another set of preferred admission tickets with an earlier start time in the time configurations. + +To do this, you would need to create two drops, one for preferred admission and another for general admission. This is because, as covered in the [Drop Configurations Introduction](customization-homepage.md), one set of configurations will apply to **all** keys in that drop. + +--- + +## End +*Default: none, Keys can be used anytime* + +The end parameter acts as a deactivation time. This means that once the end time is reached, all the keys in the drop will be deactivated and can no longer be used. + +### Use case +Let's pretend that you are at NEARCON representing an NFT marketplace looking to onboard users onto your platform. Your strategy is to offer an exclusive NFT to users that sign up during NEARCON. + +To do this, you hand out QR codes with an NFT drop embedded in the QR code during the event. To ensure that the users sign up *during* NEARCON, you set the drop configuration's `end` parameter to be the end of NEARCON. + +--- + +## Throttle +*Default: none, Keys can be used anytime* + +The `throttle` parameter controls how much time must pass between key uses. This works great if you want to control how frequently somebody is able to claim their assets. + +### Use case +Pretend you are running an NFT raffle for your latest creation, the MoonNFT. For this raffle, the 20th person claiming their key will be the winner and will receive their own personalized MoonNFT. + +To protect again spam and ensure a fair playing field, you can configure the drop to have a 5 minute cooldown using the `throttle` parameter. This way, a contestant cannot spam claim the key to increase their odds of winning. + +--- + +## Interval +*Default: none, Keys can be used anytime* + +The `interval` parameter is similar to the `throttle` parameter but uses the `start` time as a constant reference. This means if `interval` is every week, the key will become useable on the same day every week, regardless of when the last key use was. + +### Use case +Pretend you have a subscription to Moon's **weekly** dog biscuit delivery service that charges you every Monday. Due to all the horror stories of data breaches and identity theft, you now no longer give out your credit card information. For this reason, you wish to pay with $NEAR but the current linkdrop standard does not allow for a subscription model. + +With Keypom, you can give Moon a multi-use simple drop with a `throttle` parameter set to 2 weeks. This way, Moon will only be able to claim every week, making it a subscription. This is also beneficial in giving a sense of security to Moon, as they can claim later than Monday and know that they will be able to claim again next Monday. + +If, for one week, Moon forgets to claim, he would be able to claim twice the next week. + + +The massive benefit here is that you can have a subscription service in the NEAR ecosystem and never need to expose any of your private information. + + +--- + +## Example Time Configuration + +```ts +const ONE_SECOND_NS = 1e9; + +time: { + // Start time is 30 seconds from now + start: (Date.now() * 1000000) + ONE_SECOND_NS * 30, + + // End time is 5 minutes from start time + end: (Date.now() * 1000000) + ONE_SECOND_NS * 330, + + // Time between use is 15 seconds + throttle: ONE_SECOND_NS * 15, + + // Time after start for first use is 15 seconds + interval: ONE_SECOND_NS * 15, +} +``` + + diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/usage-customization.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/usage-customization.md new file mode 100644 index 00000000..28a0beca --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/usage-customization.md @@ -0,0 +1,85 @@ +--- +sidebar_label: 'Usage Configurations' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Usage Configurations +Usage configurations control behaviors surrounding *how* a key can be used. For example, dictating whether a key can be used to call only `claim`, or `create_account_and_claim`. + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/29c10f949f02f673d4a3cecc21b0f74bca600075/src/lib/types/drops.ts#L117-L154 +``` + + + + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/models/drop_model.rs#L142-L154 +``` + + + + +--- + +## Permissions +*Default: `claim` AND `create_account_and_claim`* + +The `permissions` parameter assigns which claim methods the user can call with the key you give them. They can either call both, or just one. + +### Use case +Pretend you are hosting a talk about your NEAR dApp: `Kramerly`. Your only goal is to onboard as many *new* users from the audience as possible. If the user already has a NEAR wallet, they shouldn't be able to claim assets and onboard. This is similar to free-trials in Web2 whereby only new users are able to participate. + +To do this, you can set the `permissions` parameter to `create_account_and_claim`. + +--- + +## Refund Deposit +*Default: False* + +This `refund_deposit` parameter defines whether or not the `deposit_for_use` amount should be refunded to the drop owner if `claim` is called rather than `create_account_and_claim`. + +Part of funding a drop is *optionally* covering the cost for creating a new named account. Sometimes, you might want to sponsor a small amount of $NEAR to cover that cost but it should only be used for account creation. If an account is *not* being created (through calling `create_account_and_claim`, the `deposit_per_use` should be sent back to the funder. + +### Use case +This parameter is usually a helpful mechanism when onboarding large numbers of users onto NEAR. Pretend you are onboarding 100,000 new users. Since they are new, you factor in the storage deposit needed to create the new wallets into your funding costs. After the event, however, it turns out half of the users had existing wallets. + +If `refund_deposit` was true, you would be refunded the `deposit_per_use` that normally would have been sent to the existing NEAR wallets. + +--- + +## Auto-Delete Drop +*Default: False* + +If `auto_delete_drop` is set to `true`, the drop will be deleted once all the keys have been used and deleted. + +### Use case +A great use case is for one-off drops where you don't plan on adding more keys to. By setting `auto_delete_drop` to true, the drop will automatically be deleted once all the keys are used. + +--- + +## Auto-Withdraw +*Default: False* + +This parameter is used to automatically withdraw your Keypom balance once you delete your last drop. + +### Use case +This parameter is useful for users that create 1-off drops and don't want to worry about deleting their drop once it's used or having to manually withdraw their Keypom balance. + +A funder could create a drop and give out keys without ever needing to return back to Keypom. Once the drop is exhausted, it is deleted and the funder's balance is automatically withdrawn. + +Note that this must be used together with `auto_delete_drop`. + +## Account Creation Fields +*Default: None* + +The `account_creation_fields` allows you to specify any arguments to be passed in to `create_account` when creating your account + +### Use case +Pretend you are looking to use Keypom to onboard users and give them custom subaccounts. To ensure that only the people using your drop can create a subaccount, you can add a secret `account_creation_fields` argument to your drop. + +This way, if someone outside of the drop were to try to call `create_account` on your contract, they would need to pass in the secret `account_creation_field` that they would not know. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/contribute.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/contribute.md new file mode 100644 index 00000000..2564aa7d --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/contribute.md @@ -0,0 +1,18 @@ +--- +sidebar_label: 'Contributing' +sidebar_position: 9 +--- +# 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. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/costs.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/costs.md new file mode 100644 index 00000000..c513cafc --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/costs.md @@ -0,0 +1,62 @@ +--- +sidebar_label: 'Costs' +sidebar_position: 4 +--- +# Costs + +It is important to note that the Keypom contract is 100% **FEE FREE** and will remain that way for the *foreseeable future*. This contract is a public good and is 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. + +## Deleting Keys and Drops + +Creators have the ability to delete drops and keys at any time. In this case, **all** the initial costs they incurred for the remaining keys will be refunded to them (minus Gas fees of course). + +## Automatic Refunds When Keys are Used + +One way that Keypom optimizes the fee structure is by performing automatic refunds for some of the initial costs that creators pay for when keys are used. All the storage that is freed along with any unused allowance is automatically sent back to the creator whenever a key is used. This model drastically reduces the overall costs of creating drops and creates incentives for the keys to be used. + +## Account Balances for Smooth UX + +In order to make the UX of using Keypom seamless, the contract introduces a debiting account model. All costs and refunds 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 `add_to_balance()` and `withdraw_from_balance()` functions. + +This account balance is not *required*, however. You can create a drop by attaching a deposit to the call. Keep in mind that this will create an account balance for you behind the scenes, however. + + +## Built With + +- [near-sdk-rs](https://github.com/near/near-sdk-rs) +- [near-api-js](https://github.com/near/near-api-js) \ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/licenses.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/licenses.md new file mode 100644 index 00000000..5a641956 --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/licenses.md @@ -0,0 +1,16 @@ +--- +sidebar_label: 'License and Acknowledgments' +sidebar_position: 10 +--- + +# License + +This project is licensed under the **GPL License**. + +# Acknowledgments + +Thanks for these awesome resources that were used during the development of the **Keypom Contract**: + +- +- +- \ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/password-protect.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/password-protect.md new file mode 100644 index 00000000..17505d2d --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/password-protect.md @@ -0,0 +1,242 @@ +--- +sidebar_label: 'Password Protected Keys' +sidebar_position: 3 +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Password Protected Keys + +Password protecting key uses is an extremely powerful feature that can unlock many use-cases. Keypom has baked flexibility and customization +into the contract such that almost all use-cases involving password protection can be accomplished. Whenever a key is added to a drop, it can +have a unique password for each individual use, or it can one password for all uses in general. + +## How Does It Work? + +The Keypom implementation has been carefully designed so that users can't look at the NEAR Explorer to view what was passed into the contract +either when the drop was created or when a key was used to try and copy those passwords. We also want passwords to be unique across keys so that +if you know the password for 1 key, it doesn't work on a different key. In order to accomplish this, we use the concept of hashing. + +Imagine you have a drop with 2 keys and you want to password protect each key. Rather than forcing the drop funder to input a unique password for +each key and having them remember each one, we can have them input a single **base password** and derive unique passwords from it that are paired +with the key's public key. + +This is the most scalable option as it allows the drop funder to only need to remember 1 password and they can derive all the other ones using the +hashing algorithm and public key. + +In the above scenario, let's say the funder inputs the base password as `mypassword1`. If a user wanted to claim the first key, they would need to input +into the contract: + +`hash("mypassword1" + key1_public_key)` + +The funder would need to give the user this hash somehow (such as embedding it into the link or having an app that can derive it). It's important to note +that the funder should probably **NOT** give them the base password otherwise the user could derive the passwords for all other keys (assuming those keys have +the same base password). + +## What is Stored On-Chain? + +How does Keypom verify that the user passed in the correct password? If the funder were to simply pass in `hash("mypassword1" + key1_public_key)` into the +contract as an argument when the key is created, users could just look at the NEAR Explorer and copy that value. + +Instead, the funder needs to pass in a double hash when the key is created: `hash(hash("mypassword1" + key1_public_key))`. + +This is the value that is stored on-chain and when the user tries to claim the key, they would pass in just the single hash: `hash("mypassword1" + key1_public_key)`. +The contract would then compute `hash(hash("mypassword1" + key1_public_key))` and compare it to the value stored on-chain. If they match, the key is claimed. + +Using this method, the base password is not exposed to the user, nobody can look on-chain or at the NEAR explorer and derive the password, and the password is unique +across multiple keys. + +# Passwords Per Key Use + +Unlike the passwords per key which is the same for all uses of a key, the drop creator can specify a password for each individual key use. This password follows +the same pattern as the passwords per key in that the funder inputs a `hash(hash(SOMETHING))` and then the user would input `hash(SOMETHING)` and the contract +would hash this and compare it to the value stored on-chain. + +The difference is that each individual key use can have a different value stored on-chain such that the user can be forced to input a different hash each time. +This `SOMETHING` that is hashed can be similar to the global password per key example but this time, the desired key use is added: `hash("mypassword1" + key1_public_key + use_number)` + +In order to pass in the passwords per use, a new data structure is introduced so you only need to pass in passwords for the uses that have them. This is known as the +`JsonPasswordForUse` and is as follows: + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/29c10f949f02f673d4a3cecc21b0f74bca600075/src/lib/types/drops.ts#L193-L198 +``` + + + + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/models/json_types.rs#L152-L157 +``` + + + + +## Adding Your First Password + +Whenever keys are added to Keypom, if there's passwords involved, they must be passed in using the following format. + +```rust +passwords_per_use: Option>>>, +passwords_per_key: Option>>, +``` + +Each key that is being added either has a password, or doesn't. This is through the `Vec`. This vector **MUST** be the same length as the number of keys created.This doesn't +mean that every key needs a password, but the Vector must be the same length as the keys. + +As an example, if you wanted to add 3 keys to a drop and wanted only the first and last key to have a password_per_key, you would pass in: +```rust +passwords_per_key: Some(vec![Some(hash(hash(STUFF))), None, Some(hash(hash(STUFF2)))]) +``` + +# Complex Example + +To help solidify the concept of password protected keys, let's go through a complex example. Imagine Alice created a drop with a `uses_per_key` of 3. +She wants to create 4 keys: +- Key A: No password protection. +- Key B: Password for uses 1 and 2. +- Key C: Password for use 1 only. +- Key D: Password that doesn't depend on the use. + +In this case, for Keys B and C, they will have the same base password but Alice wants to switch things up and have a different base password for Key D. +When these keys are added on-chain, the `passwords_per_key` will be passed in as such: + +```rust +passwords_per_key: Some(vec![ + None, // Key A + None, // Key B + None, // Key C + // Key D + Some( + hash(hash("key_d_base_password" + key_d_public_key)) + ), +]), +``` +The passwords for Key B and Key C will be passed in as such: + +```rust +passwords_per_key: Some(vec![ + None, // Key A + + // Key B + vec![ + { + pw: hash(hash("keys_bc_base_password" + key_b_public_key + "0")), + key_use: 0 + }, + { + pw: hash(hash("keys_bc_base_password" + key_b_public_key + "1")), + key_use: 1 + } + ] + + // Key C + vec![ + { + pw: hash(hash("keys_bc_base_password" + key_c_public_key + "0")), + key_use: 0 + } + ] + + None // Key D +]), +``` + +The drop funder would then give the keys out to people: + +## Key A +Alice gives Bob Key A and he would be able to claim it 3 times with no password required. + +## Key D +Alice gives Charlie Key D and he would be able to claim it 3 times with the hashed global key password: `hash("key_d_base_password" + key_d_public_key)`. +When Charlie claims the key, he would input the password `hash("key_d_base_password" + key_d_public_key)` and the contract would hash that and check to see +if it matches what is stored on-chain (which it does). + +If anyone tried to look at what Charlie passes in through the explorer, it wouldn't work since his hash contains the public key for key D and as such it is only +valid for Key D. + +Similarly, if Charlie tried to look at the explorer when Alice created the keys and attempted to pass in `hash(hash("key_d_base_password" + key_d_public_key))`, +the contract would attempt to hash this and it would NOT match up with what's in the storage. + +## Key B +Alice gives Eve Key B and she would need a password for claim 1 and 2. For the first claim, she needs to pass in: `hash("keys_bc_base_password" + key_b_public_key + "0")`. +The contract would then check and see if the hashed version of this matches up with what's stored on-chain for that use. + +The second time Eve uses the key, she needs to pass in hash("keys_bc_base_password" + key_b_public_key + "1") and the same check is done. + +If Eve tries to pass in `hash("keys_bc_base_password" + key_b_public_key + "0")` for the second key use, the contract would hash it and check: + +hash(hash("keys_bc_base_password" + key_b_public_key + "0")) == hash(hash("keys_bc_base_password" + key_b_public_key + "1")) + +Which is incorrect and the key would not be claimed. + +Once Eve claims the key 2 times, the last claim is not password protected and she's free to claim it. + +Key C is similar to Key B except that it only has 1 password for the first use. + +# Use-Cases + +Password protecting key uses is a true game changer for a lot of use-cases spanning from ticketing to simple marketing and engagement. + +### Ticketing and POAPs + +Imagine you had an event and wanted to give out exclusive POAPs to people that came. You didn't want to force users to: +- Have a NEAR wallet +- Have wifi at the door. +- Burn NFTs or tokens to get into the event. + +The important thing to note is that by using password protected key uses, you can **GUARANTEE** that anyone that received a POAP had to +**PHYSICALLY** show up to the event. This is because the POAP would be guarded by a password. + +You could create a ticketing event using Keypom as outlined in the [Ticketing](#nft-ticketing) section and have a key with 2 uses. The first use +would be password protected and the second use is not. The first use will get you through the door and into the event and the second +contains the exclusive POAP and can onboard you. This means that anyone with the ticket, or key, can only receive the POAP if they know the password. + +You can have a scanner app that would scan people's tickets (tickets are just the private key). In this scanner app, the *base password* is stored and +whenever the ticket is scanned, the public key is taken and the following hash is created: + +`hash(base password + public key)` + +This hash is then used to claim a use of the key and you will be let into the party. The scanner app can deterministically generate all the +necessary hashes for all the tickets by simply scanning the QR code (which has the private key exposed). The tickets are worthless unless +you actually show up to the event and are scanned. + +Once you're scanned, you can refresh your ticket page and the use the second key claim which is not password protected. This use contains the +exclusive POAP and you can onboard onto NEAR. + +### Marketing and Engagement + +Let's say that you're at an event and want people to show up to your talks and learn about your project. You can have a scanner app similar to the +one mentioned in the ticketing scenario that derives the password for any use on any key. + +At the beginning of the event, you can give out a bunch of keys that have progressively increasing rewards gated by a password. At the end, the last +key use contains a special reward that is only unlocked if the user has claimed all the previous key uses. + +In order for these uses to be unlocked, People must show up to your talks and get scanned. The scanner will derive the necessary password and unlock +the rewards. Users will only get the exclusive reward if they come to ALL your talks. + +This idea can be further expanded outside the physical realm to boost engagement on your websites as an example: + +You want users to interact with new features of your site or join your mailing list. + +You can have links where uses are ONLY unlocked if the user interacts with special parts of your site such as buying a new NFT or joining your mailing list +or clicking an easter egg button on your site etc. + +## dApp Free Trials for Users + +In the upcoming Keypom V2.0, dApps will be able to integrate the Keypom wallet selector plugging to allow for free trials for their users. One of the biggest pain-points with Web3 at the moment is the fact that users need to fund wallets *before* they interact with a dApp. + +In Web2, a user can find value in an application by using it before they go through the messy onboarding process. Why can't Web3 be the same? + +Keypom will allow apps to create links that will automatically sign users into their applications and give them a free trial of the app. The user will be able to interact with things, spend $NEAR, sign transactions and gather assets through the trial. A unique feature of this is that the user will *never be redirected to the NEAR wallet* to approve transactions. + +Keypom will provide a seamless user experience where users can find value in applications. Once the free trial is over and users have collected assets / $NEAR through interacting with the dApp, they can *THEN* choose to onboard. + +With Keypom's technology, users will be locked into only interacting with the dApp specified in the link. Users can't rug the application and steal the $NEAR embedded in the link. The funds are allocated for 1 thing and 1 thing only: free trials of that one specific dApp. + +

+ trial accounts +

diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/querying.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/querying.md new file mode 100644 index 00000000..8fcebdc8 --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/querying.md @@ -0,0 +1,64 @@ +--- +sidebar_label: 'Querying Information from Keypom' +sidebar_position: 7 +--- +# Query Information From Keypom + +Keypom allows users to query a suite of different information from the contract. This information can be broken down into two separate objects that are returned. JsonDrops and JsonKeys. +```rs +pub struct JsonDrop { + // Drop ID for this drop + pub drop_id: DropId, + // owner of this specific drop + pub owner_id: AccountId, + // Balance for all keys of this drop. Can be 0 if specified. + pub deposit_per_use: U128, + // Every drop must have a type + pub drop_type: JsonDropType, + // The drop as a whole can have a config as well + pub config: Option, + // Metadata for the drop + pub metadata: Option, + // How many claims + pub registered_uses: u64, + // Ensure this drop can only be used when the function has the required gas to attach + pub required_gas: Gas, + // Keep track of the next nonce to give out to a key + pub next_key_id: u64, +} + +pub struct JsonKeyInfo { + // Drop ID for the specific drop + pub drop_id: DropId, + pub pk: PublicKey, + // How many uses this key has left. Once 0 is reached, the key is deleted + pub remaining_uses: u64, + // When was the last time the key was used + pub last_used: u64, + // How much allowance does the key have left. When the key is deleted, this is refunded to the funder's balance. + pub allowance: u128, + // Nonce for the current key. + pub key_id: u64, +} +``` + +## Key Specific +- **`get_key_balance(key: PublicKey)`**: Returns the $NEAR that will be sent to the claiming account when the key is used +- **`get_key_total_supply()`**: Returns the total number of keys currently on the contract +- **`get_keys(from_index: Option, limit: Option)`**: Paginate through all keys on the contract and return a vector of key info +- **`get_key_information(key: PublicKey)`**: Return the key info for a specific key +- **`get_key_information_batch(keys: Vec)`**: Return a vector of key info for a set of public keys + +## Drop Specific +- **`get_drop_information(drop_id: Option, key: Option)`**: Return the drop info for a specific drop. This can be queried for by either passing in the drop ID or a public key. +- **`get_key_supply_for_drop(drop_id: DropId)`**: Return the total number of keys for a specific drop +- **`get_keys_for_drop(drop_id: DropId, from_index: Option, limit: Option)`**: Paginate through all keys for a specific drop and return a vector of key info +- **`get_drop_supply_for_owner(account_id: AccountId)`**: Return the total number of drops for a specific account +- **`get_drops_for_owner(account_id: AccountId, from_index: Option, limit: Option)`**: Paginate through all drops for a specific account and return a vector of drop info +- **`get_nft_supply_for_drop(drop_id: DropId)`**: Get the total number of NFTs registered for a given drop. +- **`get_nft_token_ids_for_drop(drop_id: DropId, from_index: Option, limit: Option)`**: Paginate through token IDs for a given drop +- **`get_next_drop_id()`**: Get the next drop ID that will be used for a new drop + +### Utility +- **`get_root_account()`**: Get the global root account that all created accounts with be based off. +- **`get_user_balance()`**: Get the current user balance for a specific account. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/testing.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/testing.md new file mode 100644 index 00000000..6864a165 --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/GithubReadme/testing.md @@ -0,0 +1,30 @@ +--- +sidebar_label: 'Keypom Tests' +sidebar_position: 8 +--- +# Running the Keypom Tests + +We have put together a suite of test cases that can be found in the `__tests__` folder. These range anywhere from simple config tests all the way to full blown ticketing and POAPs. + +In the `__tests__` folder, there are sub-folders with each type of test. Some of these sub-folders contain a `utils` folder with some utility functions used. + +All the tests use `workspaces-js`. In order to run all the tests, run the following command. + +```bash +yarn && yarn test +``` + +This will run through each test 1 by 1. If you wish to only run a set of specific tests, the full list of commands can be found below. + +```bash +"test:internals" +"test:stage1" +"test:stage1:simple" +"test:ticketing" +"test:poaps" +"test:configs" +"test:nft-drops" +"test:ft-drops" +"test:profiling" +"test:passwords" +``` \ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/balances.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/balances.md new file mode 100644 index 00000000..01ebbe78 --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/balances.md @@ -0,0 +1,77 @@ +--- +sidebar_label: 'Keypom Balances' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Keypom Balances +## What is a Keypom Balance? +Let's put on our imagination caps for a second; pretend you're an event host and you are in charge of ticketing for numerous events. You deduce that for the sake of organization, the best approach would be to create separate drops for separate events. + +Being the busy event organizer that you are, sometimes you need to create these drops and keys while on the road. As we can see in the [basic tutorials](../../Tutorials/Basics/simple-drops.md), you need to attach a deposit to every one of your function calls: every time you create a drop, add keys, delete keys etc. This can be a real headache for a busy event organizer! + +This is where the concept of a **Keypom Balance** comes in real handy! + +Every account that uses Keypom carries an internal balance (in $NEAR) on the Keypom contract. Effectively, the Keypom balance is similar to a debit card. You can overload your balance and sip from it as you interact with the contract. + +Let's go back to your event organizer persona; this Keypom Balance allows you to simply preload your "debit card" with loads of $NEAR and then go about your business without needing to worry about transferring $NEAR for ever function call! +## Interacting with Balances +There are a few functions that you can use to interact with your Keypom balance. Let's quickly run through their meanings, and then show some examples! + + + + +```ts +// Deposit some amount of $NEAR or yoctoNEAR$ into the Keypom contract. This amount can then be used to create drops or add keys without having to explicitly attach a deposit every time. It can be thought of like a bank account. +export const addToBalance{ + /** Account object that if passed in, will be used to sign the txn instead of the funder account. */ + account?: Account, + /** If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. */ + wallet?: AnyWallet, + /** Amount of tokens to add but considering the decimal amount (non human-readable). + Transferring one $NEAR should be passed in as "1000000000000000000000000" and NOT "1" */ + amountYocto?: string + /** Human readable format for the amount of tokens to add. + Transferring one $NEAR should be passed in as "1" and NOT "1000000000000000000000000" */ + amountNear?: 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. */ + successUrl?: string +} + +// Withdraw your balance back into your wallet. +export const withdrawBalance { + /** Account object that if passed in, will be used to sign the txn instead of the funder account. */ + account?: Account, + /** If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. */ + wallet?: AnyWallet, +} + +//This allows you to view your own or other people's Keypom balance. This can be useful to determine +//if you need to top up if you are on the verge of creating a large drop +export const getUserBalance{ + accountId: string +} +``` + + + + +```rust +// Deposit some amount of $NEAR or yoctoNEAR$ into the Keypom contract. This amount can then be used to create drops or add keys without having to explicitly attach a deposit every time. It can be thought of like a bank account. +pub fn add_to_balance(&mut self) + +// Allows users to withdraw their balance +pub fn withdraw_from_balance(&mut self) + +// Return the current balance for a given account +pub fn get_user_balance(&self, account_id: AccountId) -> U128 +``` + + + + + + +For example, Alice wants to add 10 $NEAR to her Keypom balance. She will do this by calling `addToBalance` and transferring 10 $NEAR to the Keypom contract. Then, if Alice wants to create a drop that costs her 5 $NEAR, she can simply create the drop and Keypom will automatically deduct from her internal Keypom balance rather than needing to transfer 5 $NEAR to the contract. + +Once she has created the drop, she can check her balance using `getUserBalance`, which will return 5 $NEAR. Then, she can withdraw this 5 $NEAR into her NEAR wallet; this will cause her Keypom balance to go down to 0 $NEAR. diff --git a/versioned_docs/version-2.0/Concepts/KeypomProtocol/overview.md b/versioned_docs/version-2.0/Concepts/KeypomProtocol/overview.md new file mode 100644 index 00000000..522ad55c --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/KeypomProtocol/overview.md @@ -0,0 +1,74 @@ +--- +sidebar_label: 'Introduction to Keypom' +sidebar_position: 1 +--- +# Introduction to Keypom +> To view our debut talk at NEARCON 2022, click [here](https://www.youtube.com/watch?v=J-BOnfhHV50). + +Keypom is an access key factory created as a result of 3 common problems that arose in the ecosystem. + +1. People want a *cheap, customizable, and unique* onboarding experience for users. +2. Companies don't want to expose **full access keys** in their backend servers. +3. dApps want a *smooth UX* with zero barrier to entry onboarding. + +The contract was initially created as a way to handle the 1 $NEAR minimum deposit required for creating linkdrops using the [regular linkdrop contract](https://github.com/near/near-linkdrop/blob/f24f2608e1558db773f2408a28849d330abb3881/src/lib.rs#L18). + +If users wanted to create linkdrops, they needed to attach a **minimum** of 1 $NEAR. This made it costly and unscalable for projects that wanted to mass onboard onto NEAR. Keypom, on the other hand, has been highly optimized to allow for the lowest possible costs. + +## Problem + +Blockchain technology comes with many benefits such as sovereign ownership, digital rights, privacy, freedom, +peer to peer coordination and much more. The problem with this technology, however, is that there is an extremely +high barrier to entry for an everyday individual. None of it matters if nobody can onboard. + +It’s confusing to create and fund a crypto wallet. People are unfamiliar with the process, technical jargon, +and the general flow. NEAR’s account model is powerful, but extremely underutilized because it’s complex for +developers to take full advantage of. Keypom wraps this up in a single API call. + +With NEAR’s goal of onboarding 1 billion users to Web3, there needs to be a solution to this high barrier to +entry for developers building on NEAR and users onboarding to their apps and the NEAR ecosystem. + +Below is a table outlining the minimum costs to onboard a new user onto NEAR with a named account. + +| | 1 Account | 1,000 Accounts | 1,000,000 Accounts | +|----------------------|-----------------|-----------------|--------------------| +| Traditional Linkdrop | ~1 NEAR | ~1,003 NEAR | ~1,002,840 NEAR | +| Keypom | ~0.0035 NEAR | ~3.5 NEAR | ~3,500 NEAR | +| | ~99.65% Cheaper | ~99.65% Cheaper | ~99.65% Cheaper | + +Keypom allows anyone to create highly customizable onboarding experiences for their users. These experiences +can be both for new, or existing users. If someone already has a wallet, they can still use a Keypom link to +experience an app, and then transfer the assets later. + +## Comparable Solutions + +| | **Keypom** | **NEAR Drop** | **Satori** | +|----------------------------------------------|------------|---------------|------------| +| NEAR Drop | βœ… | βœ… | ❌ | +| FT Drop | βœ… | ❌ | ❌ | +| NFT Drop | βœ… | ❌ | βœ… | +| Function Call Drop | βœ… | ❌ | ❌ | +| Embeddable in Dapps | βœ… | ❌ | ❌ | +| Wallet Selector Integration | βœ… | ❌ | ❌ | +| No Fee | βœ… | Maybe? | ❌ | +| No Backend / 3rd Party | βœ… | βœ… | ❌ | +| Campaigns | βœ… | βœ… | βœ… | +| Multi-Step e.g. Tickets click > scan > claim | βœ… | ❌ | ❌ | +| Password Protected Drops | βœ… | ❌ | ❌ | +| Timed Drops e.g. recurring payments | βœ… | ❌ | ❌ | +| Custom Names e.g. user.myapp.near | βœ… | ❌ | ❌ | + +# Our Solution + +Keypom allows for the creation of highly customizable access keys. These keys can be thought of as having their +own *smart contracts*. Each access key derives from what's known as a *drop*. These drops outline the different +functionalities and behaviors the key will have. A drop can be thought of as a bucket that access keys belong to. +You can create many different buckets and fill them each with their own keys. Each key will act in accordance to the +drop, or bucket, it belongs to. + +A drop can be one of four different types: + +1. Simple drop. +2. Non Fungible Token drop. +3. Fungible Token drop. +4. Function Call drop. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/LinkdropsAndAccessKeys/linkdrop-basics.md b/versioned_docs/version-2.0/Concepts/LinkdropsAndAccessKeys/linkdrop-basics.md new file mode 100644 index 00000000..6a4bda67 --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/LinkdropsAndAccessKeys/linkdrop-basics.md @@ -0,0 +1,28 @@ +--- +sidebar_label: 'Linkdrop Basics' +sidebar_position: 5 +--- +# 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. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/LinkdropsAndAccessKeys/near-access-keys.md b/versioned_docs/version-2.0/Concepts/LinkdropsAndAccessKeys/near-access-keys.md new file mode 100644 index 00000000..086310ef --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/LinkdropsAndAccessKeys/near-access-keys.md @@ -0,0 +1,13 @@ +--- +sidebar_label: 'NEAR Access Key Model' +sidebar_position: 1 +--- +# NEAR Access Key Model + +A Keypair is generated locally and the pubkey is add to your account. + +Access keys with numerous types are unique to NEAR. There are Full Access (similar to traditional keypairs) and Function Call Access Keys. These Function Call Access Keys can only call specified accounts and methods. It cannot be used to send any NEAR, deploy a contract, create an account etc. + +This means the Function Call Access key can be used as a throwaway key. + +Your account can have any number of Access Keys, including ZERO. If there are zero, the account cannot deploy or withdraw funds (rugging). This is done as a form of trust for users. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Concepts/welcome.md b/versioned_docs/version-2.0/Concepts/welcome.md new file mode 100644 index 00000000..6c662dbf --- /dev/null +++ b/versioned_docs/version-2.0/Concepts/welcome.md @@ -0,0 +1,106 @@ +--- +sidebar_label: 'Home' +--- +# Concepts +Welcome to the concepts section of Keypom's developer documentation. Here you'll learn all about Keypom. + +## Major Concepts + + +

+ +## Other Resources + +Here are some additional resources, and references. These may help you deepen your understanding or clarify any issues. + + \ No newline at end of file diff --git a/versioned_docs/version-2.0/Cookbook/balances.md b/versioned_docs/version-2.0/Cookbook/balances.md new file mode 100644 index 00000000..8ee7cd73 --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/balances.md @@ -0,0 +1,75 @@ +--- +sidebar_label: 'Balances' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Balances +This part of the cookbook contains everything related to Keypom balances. This balance acts like a debit card, where you deposit $NEAR up front and create drop and interact with Keypom without needing to attach deposits to everything you do. For more on balances, see [here](../Concepts/KeypomProtocol/balances.md). +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +:::info note +Ensure that you have initialized Keypom using the `initKeypom` function prior to running any of the SDK examples. For more info on this, see the [introduction page](welcome.md#connection-to-near-and-initializing-the-sdk) +::: + +## Viewing User Keypom Balances +To view your Keypom balance, you can use the following. This will allow you to decipher if you need to add more $NEAR to your balance before creating a drop. + + + + +```js +// Query for the drop information for a specific drop +const userBal = await getUserBalance({ + accountId: "benjiman.testnet", +}) + +console.log('userBal: ', userBal) +``` + + + + + +___ +## Adding to Keypom Balances +If you don't have sufficient funds to create your drop, you may add more $NEAR to your balance using the following. When specifying the amount to add, you can use `amountNear` or `amountYocto` to add in NEAR or yoctoNEAR respectively. + + + + +```js +await addToBalance({ + account: fundingAccount, + amountNear: "5" +}); +``` + + + + + +___ + +## Withdrawing from Keypom Balance +If you are confident you no longer need Keypom or simply wish to withdraw your Keypom balance back into your NEAR wallet, you can use the following: + + + + +```js +await withdrawBalance({ + account: fundingAccount +}) +``` + + + + + +___ + diff --git a/versioned_docs/version-2.0/Cookbook/drops/NEAR.md b/versioned_docs/version-2.0/Cookbook/drops/NEAR.md new file mode 100644 index 00000000..7ec4112c --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/drops/NEAR.md @@ -0,0 +1,109 @@ +--- +sidebar_label: 'Simple NEAR Drops' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Simple NEAR Drops +This part of the cookbook contains a quick guide on the simple NEAR drop. +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +:::info note +These scripts will not run without the proper setup shown in the [introduction page](../welcome.md#connection-to-near-and-initializing-the-sdk). +::: + +## Creating a Simple Drop +A drop is the fundamental building block of Keypom. It is a collection of access keys that all share the same properties. A simple drop allows you to send $NEAR by sharing those access keys in the form of a linkdrop. + + + + +```js +// Creating drop with 2 single use keys +const {keys} = await createDrop({ + account: fundingAccount, + numKeys: 2, + depositPerUseNEAR: "0.1", +}); + +console.log(keys) +``` + + + + +:::caution +`createDrop` is limited to adding 50 password protected keys or 100 non-protected keys at a time. To add more keys, see the [large drops](#creating-a-large-drop) example below. +::: + +___ + +## Creating a Large Drop +Adding keys, either using `createDrop` or `addKeys` is limited to 50 password protected or 100 non-protected keys. To bypass this, the drop can be created first and then the keys can be added by looping `addKeys`. + + + + +```js +// Creating drop with 0 single use keys +let {dropId} = await createDrop({ + account: fundingAccount, + depositPerUseNEAR: "0.001", +}); + +let numKeys = 200 +let keysAdded = 0; +let allSecretKeys = []; +while (keysAdded < numKeys) { + const keysToAdd = Math.min(50, numKeys - keysAdded); + const {secretKeys, publicKeys} = await generateKeys({ + numKeys: keysToAdd, + }); + await addKeys({ + account: fundingAccount, + dropId, + publicKeys + }); + keysAdded += keysToAdd; + allSecretKeys = allSecretKeys.concat(secretKeys); +} +``` + + + + + +___ + +## Delete Drop +A drop can be deleted manually at any time using `deleteDrops`. This will refund all unclaimed key balances back to the drop funder's Keypom balance. + + + + +```js +// Get all the drops for a given user +let drops = await getDrops({accountId: "minqi.testnet"}); + +// Delete all the drops currently funded by `minqi.testnet` +await deleteDrops({ + account: fundingAccount, + drops +}) + +// Delete 2 seperate drops given their IDs +await deleteDrops({ + account: fundingAccount, + dropIds: ["123123123123123", "12391238012380123"] +}) +``` + + + + + +___ diff --git a/versioned_docs/version-2.0/Cookbook/drops/customizations/dropConfig.md b/versioned_docs/version-2.0/Cookbook/drops/customizations/dropConfig.md new file mode 100644 index 00000000..32ecafd0 --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/drops/customizations/dropConfig.md @@ -0,0 +1,81 @@ +--- +sidebar_label: 'Drop Configurations' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Drop Configurations +This part of the cookbook contains everything related to drop configurations, including multi-use drops, and creating custom subaccounts. +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +:::info note +These scripts will not run without the proper setup shown in the [introduction page](../../welcome.md#connection-to-near-and-initializing-the-sdk). +::: + +## Creating a Multi-Use Simple Drop +To make all the keys in the drop multi-use, you can specify `usesPerKey` in the dropConfig parameter `config`. In this example, each of the 2 keys created will have 5 uses. + + + + +```js +// Creating drop with 2 keys with 5 uses each +const {keys} = await createDrop({ + account: fundingAccount, + numKeys: 2, + config:{ + usesPerKey: 5 + }, + depositPerUseNEAR: "0.1", +}); + +console.log(keys) +``` + + + + + +:::caution +`createDrop` is limited to adding 50 password protected keys or 100 non-protected keys at a time. To add more keys, see the [large drops](#creating-a-large-drop) example. +::: + +___ + +## Creating Custom Subaccounts +By specifying a custom `dropRoot`, all new accounts created using your drop will be a subaccount of the specified account. For example, all accounts created with the drop below will follow the form of `${YOUR_USERNAME}.moonpom.near`. + + + + +```js +// Creating drop with 2 keys with 5 uses each +const {keys} = await createDrop({ + account: fundingAccount, + numKeys: 2, + config:{ + dropRoot: "mint-brigade.testnet" + }, + depositPerUseNEAR: "0.1", +}); + +console.log(keys) +``` + + + + + +:::caution +the `dropRoot` account **must** have a contract deployed to it that exposes a method `create_account` to create the sub-account. A sample contract can be found [here](https://github.com/near/near-linkdrop) + +In addition, it is wise to [`gatekeep account creation`](usageConfig.md#gatekeeping-account-creation) to ensure that not anyone can create subaccounts of your account. + +For this reason, the above code **will not work** out of the box. +::: + +___ diff --git a/versioned_docs/version-2.0/Cookbook/drops/customizations/password.md b/versioned_docs/version-2.0/Cookbook/drops/customizations/password.md new file mode 100644 index 00000000..84a75712 --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/drops/customizations/password.md @@ -0,0 +1,142 @@ +--- +sidebar_label: 'Password Protection' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Password Protection +This part of the cookbook contains everything related password protecting your drops. +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +:::info note +These scripts will not run without the proper setup shown in the [introduction page](../../welcome.md#connection-to-near-and-initializing-the-sdk). +::: + +## Password Protecting your Entire Drop +Password protecting your drop prevents unauthorized people from claiming keys in your drop. A claim will fail if the [*actual password*](#claiming-a-password-protected-key) (base password is NOT the claiming password) is not included in the claim transaction. + + + + +```js +// Create drop with 1 single use password protected key +let {keys, dropId} = await createDrop({ + account: fundingAccount, + numKeys: 1, + depositPerUseNEAR: "0.1", + basePassword: "base-password" +}) + +console.log(keys) +``` + + + + + +___ + +## Claiming a Password-Protected Key +When claiming a password protected key, the password is not actually the base password. The base password is just one component that is universal for all keys across the entire drop. The actual password for each claim is different but follows the following format format: + +``` +hash(basePassword + publicKey + current_key_use) +``` + + + + +```js +let base_password = "base-password" + +// Create drop with 1 password protected key +let {keys, dropId} = await createDrop({ + account: fundingAccount, + numKeys: 1, + depositPerUseNEAR: "0.1", + basePassword: base_password +}) + +// Create password using base + pubkey + key use as string +const keyInfo1 = await getKeyInformation({ + publicKey: keys.publicKeys[0] +}) +let passwordForClaim = await hashPassword(base_password + keys.publicKeys[0] + keyInfo1.cur_key_use.toString()) + +// Claim with created password +await claim({ + accountId: "minqianlu.testnet", + secretKey: keys.secretKeys[0], + password: passwordForClaim +}) +``` + + + + + +___ + +## Password Protecting a Specific Key Use +Rather than password protecting your entire drop, you may only want to protect certain key uses. A great use case of this is for [ticketing](../../../Tutorials/Advanced/ticketing/architecture.md#attendance-required-for-poap), when a bouncer would scan your ticket to claim your key and admit you into the event but only they know the password. This would prevent people admitting themselves into the event and gaining access to any POAPs and goodies available only to those who physically attend. + +To specify key uses to password protect, simply add it to the `passwordProtectedUses` array. + + + + +```js +// Create drop with 10 password protected keys and 5 key uses each +let {keys, dropId} = await createDrop({ + account: fundingAccount, + numKeys: 10, + config:{ + usesPerKey: 5 + }, + depositPerUseNEAR: "0.1", + basePassword: "base-password", + // Password protect the first, third and fourth key uses + passwordProtectedUses: [1, 3, 4], +}) + +console.log(keys) +``` + + + + + +___ + +## Delete Drop +A drop can be deleted manually at any time using `deleteDrops`. This will refund all unclaimed key balances back to the drop funder's Keypom balance. + + + + +```js +// Get all the drops for a given user +let drops = await getDrops({accountId: "minqi.testnet"}); + +// Delete all the drops currently funded by `minqi.testnet` +await deleteDrops({ + account: fundingAccount, + drops +}) + +// Delete 2 seperate drops given their IDs +await deleteDrops({ + account: fundingAccount, + dropIds: ["123123123123123", "12391238012380123"] +}) +``` + + + + + +___ diff --git a/versioned_docs/version-2.0/Cookbook/drops/customizations/saleConfig.md b/versioned_docs/version-2.0/Cookbook/drops/customizations/saleConfig.md new file mode 100644 index 00000000..24c49bb7 --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/drops/customizations/saleConfig.md @@ -0,0 +1,226 @@ +--- +sidebar_label: 'Access Key Marketplace' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Sale Configurations +This part of the cookbook contains everything related to drops, including creating a drop, password protecting it, and utilizing Keypom arguments. +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +:::info note +These scripts will not run without the proper setup shown in the [introduction page](../../welcome.md#connection-to-near-and-initializing-the-sdk). +::: + +## Public Sale Drop +A public sale drop is one where you can sell the access keys from a drop to other users. These keys will all have the same properties and can be bought by anyone. The maximum number of keys in the drop can be set using `maxNumKeys`. + + + + +```js +// Create drop with a maximum of 10 keys that can be added by anyone +const { keys, dropId } = await createDrop({ + account: fundingAccount, + depositPerUseNEAR: 0.1, + config: { + sale: { + maxNumKeys: 10, + pricePerKeyNEAR: 1 + } + } +}); + +console.log(keys) +``` + + + + + +___ + +## Allowing Only Certain Users to Buy Keys +A public sale drop can be turned into a more private sale by only allowing certain accounts to purchase keys from the drop. This is done by using the `allowlist` argument. Any `accountId` specified here will be able to buy keys from your drop. If someone not on the list tries to buy from your drop, they will be rejected. + +By default, if no `allowlist` is included, then anybody can purchase a key. + + + + +```js +// Create drop with a maximum of 10 keys that can be added by benji and min +const { keys, dropId } = await createDrop({ + account: fundingAccount, + depositPerUseNEAR: 0.1, + config: { + sale: { + maxNumKeys: 10, + pricePerKeyNEAR: 1 + allowlist: ["benji.testnet", "minqi.testnet"] + } + } +}); + +console.log(keys) +``` + + + + + +___ + +## Blocking People from a Public Sale +To protect your public sale, you may also choose to block certain accounts from purchasing keys. This can be done by using the `blocklist` argument. This prohibits select accounts from purchasing keys from your drop. + +:::note +here that since no `allowlist` is specified, anybody can purchase keys. However, since `evil-moon.testnet` is on the blocklist, they will not be allowed to do so. This means that everybody except for `evil-moon.testnet` has permission to purchase a key. +::: + + + + +```js +// Create drop with a maximum of 10 keys that can be added anyone but evil-moon +const { keys, dropId } = await createDrop({ + account: fundingAccount, + depositPerUseNEAR: 0.1, + config: { + sale: { + maxNumKeys: 10, + pricePerKeyNEAR: 1 + blocklist: ["evil-moon.testnet"] + } + } +}); + +console.log(keys) +``` + + + + + +___ + +## Buying Keys from a Public Sale +If you are allowed to buy tickets from a public sale, you can simply create a new key and call `addKeys` on the public sale drop with the ticket price attached to the `extraDepositNEAR` argument. + + + + +```js +// 10 $NEAR ticket price +const TICKET_PRICE = "10" +// Desired sale's dropId +const SALE_DROP_ID = "1684876169052" + +// Generate a random key +const {publicKeys} = await generateKeys({ + numKeys: 1 +}); + +await addKeys({ + account: fundingAccount, + publicKeys, + dropId: SALE_DROP_ID, + extraDepositNEAR: TICKET_PRICE +}) +``` + + + + + +:::note +In its the example above, anybody can buy as many tickets as they'd like within the limits of the drop. For further customization, you could build a "public sale bot" contract. + +This contract would act as an entry point that users interface with and buy tickets from; allowing you to restrict the number of tickets and add further customization. To facilitate this, you would need to [create an `allowlist`](#allowing-only-certain-users-to-buy-keys) containing the bot contract. +::: + +___ + +## Modifying Sale `allowlist` +After your public sale drop has been created, you can modify the `allowlist` by adding or removing users from it using `addToSaleAllowlist` and `removeFromSaleAllowlist`. + + + + +```js +const {dropId} = await createDrop({ + numKeys: 0, + depositPerUseNEAR: 0.1, + config: { + sale: { + maxNumKeys: 2, + pricePerKeyNEAR: 1, + allowlist: ["evil-moon.testnet"] + } + } +}); + +// Remove evil-moon from allowlist +await removeFromSaleAllowlist({ + account: fundingAccount, + dropId, + accountIds: ["evil-moon.testnet"] +}); + +// Add benji and minqi to allowlist +await addToSaleAllowlist({ + account: fundingAccount, + dropId, + accountIds: ["benji.testnet", "minqi.testnet"] +}); +``` + + + + + +___ + +## Modifying Sale `blocklist` +After your public sale drop has been created, you can modify the `blocklist` by adding or removing users from it using `addToSaleBlocklist` and `removeFromSaleBlocklist`. + + + + +```js +const {dropId} = await createDrop({ + numKeys: 0, + depositPerUseNEAR: 0.1, + config: { + sale: { + maxNumKeys: 2, + pricePerKeyNEAR: 1, + blocklist: ["minqi.testnet", "benji.testnet"] + } + } +}); + +// Remove evil-moon benji and minqi from blocklist +await removeFromSaleBlocklist({ + account: fundingAccount, + dropId, + accountIds: ["benji.testnet", "minqi.testnet"] +}); + +// Add evil-moon to blocklist +await addToSaleBlocklist({ + account: fundingAccount, + dropId, + accountIds: ["evil-moon.testnet"] +}); +``` + + + + + +___ \ No newline at end of file diff --git a/versioned_docs/version-2.0/Cookbook/drops/customizations/timeConfig.md b/versioned_docs/version-2.0/Cookbook/drops/customizations/timeConfig.md new file mode 100644 index 00000000..f691c21e --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/drops/customizations/timeConfig.md @@ -0,0 +1,131 @@ +--- +sidebar_label: 'Time Configurations' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Time Configurations +This part of the cookbook contains everything related to time configurations, including start and end times, a time throttled drop, and using it to create a recurring payment tool. +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +:::info note +These scripts will not run without the proper setup shown in the [introduction page](../../welcome.md#connection-to-near-and-initializing-the-sdk). +::: + +:::tip +All time values are measured in Unix Time (non-leap-nanoseconds since January 1, 1970 0:00:00 UTC). +::: + +## Drop with a Start and End Time +The drop below is only active for 1.5 minutes, starting 15 seconds after the drop is created. Any claims before or after that window will fail. + + + + +```js +const ONE_SECOND_NS = 1e9; + +// Creating timed drop with 1 double use keys +const {keys, dropId} = await createDrop({ + account: fundingAccount, + numKeys: 1, + config:{ + time: { + // Start time is 15 seconds from now + start: (Date.now() * 1000000) + ONE_SECOND_NS * 15, + // End time is 90 seconds from start time + end: (Date.now() * 1000000) + ONE_SECOND_NS * 105, + }, + }, + depositPerUseNEAR: "0.1", +}); + +console.log(keys) +``` + + + + + +___ + +## Time Throttled Drop +A drop with a define time throttle will not allow consecutive `claims` on the same key within the indicated time. With the drop below, users can only claim their key every 15 seconds. If they try to `claim` twice in ten seconds, the second `claim` will fail as 15 seconds has not elapsed since the first `claim`. + + + + +```js +const ONE_SECOND_NS = 1e9; + +// Creating time throttled drop with a double use keys +const {keys} = await createDrop({ + account: fundingAccount, + numKeys: 1, + config:{ + usesPerKey: 2, + time: { + // Time between use is 15 seconds + throttle: ONE_SECOND_NS * 30, + }, + }, + depositPerUseNEAR: "0.1", +}); + +console.log(keys) +``` + + + + + +___ + +## Creating Recurring Payments +Recurring payments are quite a common situation. Say you need to send a contractor 50 $NEAR every week for 4 weeks. With Web2, they would need to provide a payment method and trust the you with this sensitive information. + +By leveraging a time configuration, you can eliminate this risk by sending them a key with limited funds attached. You could create a drop where there is one key with 4 uses, usable once a week. + +First is the `start` and `end` time. These define a period time for which the drop is active and can be used by the contractor, in this case 30 days after the drop is created. + +Next, the `interval` parameter is specified. This is set to 1 week, meaning each week after the start time, a new `claim` is made available for the contractor. This is different from the `throttle` parameter as that uses the previous claim as a reference. + +**This allows the contractor to `claim` multiple times if they miss one week rather than being forced to wait a week after each claim and potentially get pushed out of the drop's 30 day validity and lose out on funds they are entitled to.** + + + + +```js +const ONE_SECOND_NS = 1e9; + +// Creating timed drop with 1 key with 4 uses +const {keys} = await createDrop({ + account: fundingAccount, + numKeys: 1, + config:{ + usesPerKey: 4, + time: { + // Start time is now + 5s + start: (Date.now() * 1000000) + ONE_SECOND_NS * 5, + // End time is 30 day after start time + end: (Date.now() * 1000000) + ONE_SECOND_NS * 2592000, + // Time after start for first use is 1 week + interval: ONE_SECOND_NS * 604800, + }, + }, + depositPerUseNEAR: "50", +}); + +console.log(keys) +``` + + + + + +___ + diff --git a/versioned_docs/version-2.0/Cookbook/drops/customizations/usageConfig.md b/versioned_docs/version-2.0/Cookbook/drops/customizations/usageConfig.md new file mode 100644 index 00000000..0059455f --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/drops/customizations/usageConfig.md @@ -0,0 +1,210 @@ +--- +sidebar_label: 'Claiming Behavior' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Usage Configurations +This part of the cookbook contains everything related to claiming behavior and usage configurations. These will range from permissions for different types of claims, to automatically deleting the drop once all the keys have been used. +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +:::info note +These scripts will not run without the proper setup shown in the [introduction page](../../welcome.md#connection-to-near-and-initializing-the-sdk). +::: + +## Only New Accounts can Claim +Using `permissions` in the `usage` config, you can specify whether an account can call `claim`, `create_account_and_claim` or both. Here, the claimer must create a new account as they may only call `create_account_and_claim`. + +If no `permissions` are specified, the claimer can use either function. + + + + +```js +const { keys } = await createDrop({ + account: fundingAccount, + numKeys: 1, + depositPerUseNEAR: "1", + config: { + usage:{ + permissions: `create_account_and_claim` + } + } +}); + +console.log(keys) +``` + + + + + +___ + +## Only Existing Accounts can Claim +Using `permissions` in the `usage` config, you can specify whether an account can call `claim`, `create_account_and_claim` or both. Here, the claimer must have an existing account as they may only call `claim`. + +If no `permissions` are specified, the claimer can use either function. + + + + +```js +const { keys } = await createDrop({ + account: fundingAccount, + numKeys: 1, + depositPerUseNEAR: "1", + config: { + usage:{ + permissions: `claim` + } + } +}); + +console.log(keys) +``` + + + + + +___ +## Refunding Deposit when `Claim` is Called +When creating keys for your drop, each is loaded with enough $NEAR to cover the cost of creating an account for each claim. If a user claims with an existing account, this deposit is lost and transferred to the user. If you wish to retain those deposits whenever `claim` is called instead of `create_account_and_claim`, you can use the following. + + + + +```js +const { keys } = await createDrop({ + account: fundingAccount, + numKeys: 1, + depositPerUseNEAR: "1", + config: { + usage:{ + refundDeposit: true + } + } +}); + +console.log(keys) +``` + + + + + +___ + +## Automatically Deleting Drop when Empty +By default, depleted drops are not deleted unless you manually delete them. To delete them automatically, include the following. + + + + +```js +const { keys } = await createDrop({ + account: fundingAccount, + numKeys: 1, + depositPerUseNEAR: "1", + config: { + usage:{ + autoDeleteDrop: true + } + } +}); + +console.log(keys) +``` + + + + + +___ + +## Automatically Withdrawing your Balance +By default, withdrawing your Keypom balance back into your wallet is only done when call `withdrawBalance`. If you wish to withdraw it once all your drops have been depleted, you can turn on `autoDeleteDrop` and `autoWithdraw`. + +This will ensure that once this drop is empty it is automatically deleted and, assuming it is the final drop on your account, will automatically withdraw your Keypom balance. + +:::note +This will only automatically withdraw your balance if and only if the last drop you have. If you empty a this drop but it is not the last drop on your account, you will need to manually withdraw your balance. +::: + + + + +```js +const { keys } = await createDrop({ + account: fundingAccount, + numKeys: 1, + depositPerUseNEAR: "1", + config: { + usage:{ + autoDeleteDrop: true, + autoWithdraw: true + } + } +}); + +console.log(keys) +``` + + + + + +___ + +## Gatekeeping Account Creation +When accounts are created with drops using a custom [`dropRoot`](dropConfig.md#using-a-custom-drop-root), they will be subaccounts of the `dropRoot`. + +If you wish to make these subaccounts exclusive, you can gatekeep this process by using `accountCreationFields` to check if the claiming account is coming from your drop. Note that the `dropRoot` account would need to expose a `create_account` function that looks similar to the following: + +```rust +#[payable] +pub fn create_account(&mut self, new_account_id: AccountId, new_public_key: PublicKey, funder: String, keypomArgs: keypom_args) -> Promise { + assert!(keypomArgs.funderIdField == "funder_id","Call must come from valid Keypom drop"); + assert!(funder == EXPECTED_FUNDER == "funder_id","Funder must be approved"); + ... +} +``` + +The following shows a drop where users can only claim with a new account, and only those using your drop can create subaccounts of `moonpom.near` + + + + +```js +// Creating FC drop that injects accountId into function call arguments +let {keys, dropId} = await createDrop({ + account: fundingAccount, + numKeys: 1, + config: { + usage:{ + permissions: `create_account_and_claim`, + accountCreationFields: { + funderIdField: "funder_id" + } + }, + dropRoot: "mint-brigade.testnet" + }, + depositPerUseNEAR: "1", +}) + +console.log(keys) +``` + + + + + +For more info on injected `keypom_args`, see the [`keypom_args`](../fc.md#using-and-verifying-injected-keypom-arguments) section. + + +___ diff --git a/versioned_docs/version-2.0/Cookbook/drops/fc.md b/versioned_docs/version-2.0/Cookbook/drops/fc.md new file mode 100644 index 00000000..c8d9c2fe --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/drops/fc.md @@ -0,0 +1,390 @@ +--- +sidebar_label: 'Function Call Drops' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Function Call Drops +This part of the cookbook contains a quick overview on how to create an assortment of function call drops, using Keypom injected arguments, and attaching NFTs to your FC drop by lazy minting them. +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +:::info note +These scripts will not run without the proper setup shown in the [introduction page](../welcome.md#connection-to-near-and-initializing-the-sdk). +::: + +## Creating a Single Method, Single Use Function Call Drop +A Function Call Drop allows the user to call almost any function on any NEAR smart contract when claiming. An example is shown below where the method `mint` is called on `MY_CONTRACT` with the specified `memo` and `metadata` arguments. + + + + +```js +MY_CONTRACT = "guest-book.examples.keypom.testnet" + +// Creating a single key single use FC drop +let {keys} = await createDrop({ + account: fundingAccount, + numKeys: 1, + depositPerUseNEAR: "0.1", + fcData: { + methods: [ + // First key use + [ + { + receiverId: MY_CONTRACT, + methodName: "add_message", + args: JSON.stringify({ + text: "first" + }), + attachedDeposit: parseNearAmount("0.001"), + }, + ], + ] + } +}) + +console.log(keys) +``` + + + + + +___ + +## Single Method, Multi-Use Drop +To further expand the FC drop, you have the ability to call a different method for each claim. This is shown below, where the first use calls `mint`, the second call does nothing, and the third calls `sell`. + + + + +```js +MY_CONTRACT = "guest-book.examples.keypom.testnet" + +// Creating a single key single use FC drop +let {keys} = await createDrop({ + account: fundingAccount, + numKeys: 1, + config: { + usesPerKey: 3 + }, + depositPerUseNEAR: "0.1", + fcData: { + methods: [ + // First key use + [ + { + receiverId: MY_CONTRACT, + methodName: "add_message", + args: JSON.stringify({ + text: "first" + }), + attachedDeposit: parseNearAmount("0.001"), + }, + ], + // Second key use + null, + // Third key use + [ + { + receiverId: MY_CONTRACT, + methodName: "add_message", + args: JSON.stringify({ + text: "first-point-five" + }), + attachedDeposit: parseNearAmount("0.001"), + } + ], + ] + } +}) + +console.log(keys) +``` + + + + + +___ + +## Multi-Method, Single Use Key Drop +With each `claim`, you can also call multiple functions. Note this would call each function in succession after the previous one is resolved. In the example below, the `mint`, `null` case, and `sell` functions are called during the first `claim`. + + + + +```js +MY_CONTRACT = "guest-book.examples.keypom.testnet" + +// Creating a single key single use FC drop +let {keys} = await createDrop({ + account: fundingAccount, + numKeys: 1, + depositPerUseNEAR: "0.1", + fcData: { + methods: [ + // First key use + [ + { + receiverId: MY_CONTRACT, + methodName: "add_message", + args: JSON.stringify({ + text: "first" + }), + attachedDeposit: parseNearAmount("0.001"), + }, + null + { + receiverId: MY_CONTRACT, + methodName: "add_message", + args: JSON.stringify({ + text: "second" + }), + attachedDeposit: parseNearAmount("0.001"), + }, + ], + ] + } +}) + +console.log(keys) +``` + + + + + +___ + +## Multi-Method, Multi-Use Drop +By combining the [multi-claim](#creating-a-multi-claim-function-call-drop) and [multi-function call](#creating-a-multi-function-call-drop) drops together, you can call multiple number of functions for multiple claims. As an example, a key with 3 uses can be seen: + +1. `add_message` +2. `null` +3. `nft_mint`, `add_message`, `nft_transfer` + +The drop for this would look like the following + + + + + +```js +MY_CONTRACT = "guest-book.examples.keypom.testnet" + +// Creating a single key single use FC drop +let {keys: key4} = await createDrop({ + account: fundingAccount, + numKeys: 1, + config: { + usesPerKey: 3 + }, + depositPerUseNEAR: "0.1", + fcData: { + methods: [ + // First key use + [ + { + receiverId: MY_CONTRACT, + methodName: "add_message", + args: JSON.stringify({ + text: "first" + }), + attachedDeposit: parseNearAmount("0.001"), + } + ], + // Second key use + null, + // Third key use + [ + { + receiverId: NFT_CONTRACT, + methodName: "nft_mint", + args: JSON.stringify({ + token_id: "keypom-cookbook-1", + receiver_id: "minqi.testnet", + metadata: { + title: "My Test Keypom NFT", + description: "NFT from my first NFT Drop!", + media: "https://bafybeiftczwrtyr3k7a2k4vutd3amkwsmaqyhrdzlhvpt33dyjivufqusq.ipfs.dweb.link/goteam-gif.gif", + }, + }), + attachedDeposit: parseNearAmount("0.001"), + }, + { + receiverId: MY_CONTRACT, + methodName: "add_message", + args: JSON.stringify({ + text: "second" + }), + attachedDeposit: parseNearAmount("0.001"), + }, + { + receiverId: NFT_CONTRACT, + methodName: "nft_transfer", + args: JSON.stringify({ + receiver_id: "benjiman.testnet + token_id: "keypom-cookbook-1" + }), + attachedDeposit: parseNearAmount("0.001"), + }, + ], + ] + } +}) + +console.log(keys) +``` + + + + + +___ + +## Using and Verifying Injected Keypom Arguments +Keypom Args are important pieces of information injected automatically by Keypom when a key is claimed. The pieces of information can include: + +- Drop ID that the access key belongs to +- Funder's `accountId` of the drop +- The claiming account's `accountId` +- The current access key's `keyId` + +The information is injected into the `args`, but their specific location depends on the field specified. In the example below, the `funderId` is being injected into an `originalOwner` field in the `args`, and the claiming account's `accountId` is being injected into the `metadata` object under the field `newOwner`. + + + + +```js +// Creating FC drop that injects accountId into function call arguments +let {keys, dropId} = await createDrop({ + account: fundingAccount, + numKeys: 1, + depositPerUseNEAR: "0.1", + fcData: { + methods: [ + [ + { + receiverId: MY_NFT_CONTRACT, + methodName: "mint", + args: JSON.stringify({ + mint_id: MINT_ID, + metadata: { + description: "my new NFT" + } + }), + // Injecting claiming account ID into the metadata object as originalOwner + accountIdField: "metadata.newOwner", + funderIdField: "originalOwner", + } + ], + ] + } +}) + +console.log(keys) +``` + + + + + +### Verifying Injected Arguments +In addition to the injected arguments, Keypom will also automatically send an object called `keypom_args`. This object is meant for your use to validate that certain arguments were indeed injected by Keypom. This object cannot be spoofed, and any attempt to do so will cause the claim to fail. + +:::info +To validate the injected argument the receiving `mint` function should look like this. + +```rust +#[payable] +pub fn mint(&mut self, mint_id: String, originalOwner: String, metadata: data, keypomArgs: keypom_args) -> Promise { + assert!(originalOwner == DROP_FUNDER_ID && keypomArgs.funderIdField == "originalOwner", "Call must come from valid Keypom drop"); + // Optionally can also validate that keypomArgs.accountIdField == "metadata.newOwner" if you want to ensure newOwner was not hardcoded. + ... +} +``` +::: + +___ + +## Attaching NFTs to your FC Drop +As part of your FC drop, you can send the user an NFT. The best way to do this would be to lazy-mint them, as to not waste funds minting NFTs belonging to keys that are ultimately not claimed. + +To do this, you must create an NFT series, and then include a `nft_mint` call as one of the key's function calls. The Keypom NFT contracts, `nft-v2.keypom.testnet` and `nft-v2.keypom.near`, have the functionality to create a series and then mint the NFT using just the `dropId`. + + + + +```js +// Create drop with 10 keys and 2 key uses each +let {keys, dropId} = await createDrop({ + account: fundingAccount, + numKeys: 30, + depositPerUseNEAR: "0.1", + fcData: { + methods: [ + [ + { + receiverId: `nft-v2.keypom.${NETWORK_ID}`, + methodName: "nft_mint", + args: "", + dropIdField: "mint_id", + accountIdField: "receiver_id", + attachedDeposit: parseNearAmount("0.1") + } + ], + ] + } +}) + +await createNFTSeries({ + account: fundingAccount, + dropId, + metadata: { + title: "Moon NFT Ticket!", + description: "A cool NFT POAP for the best dog in the world.", + media: "bafybeibwhlfvlytmttpcofahkukuzh24ckcamklia3vimzd4vkgnydy7nq", + copies: 30 + } +}); +``` + + + + + +___ + +## Delete Drop +A drop can be deleted manually at any time using `deleteDrops`. This will refund all unclaimed key balances back to the drop funder's Keypom balance. + + + + +```js +// Get all the drops for a given user +let drops = await getDrops({accountId: "minqi.testnet"}); + +// Delete all the drops currently funded by `minqi.testnet` +await deleteDrops({ + account: fundingAccount, + drops +}) + +// Delete 2 seperate drops given their IDs +await deleteDrops({ + account: fundingAccount, + dropIds: ["123123123123123", "12391238012380123"] +}) +``` + + + + + +___ diff --git a/versioned_docs/version-2.0/Cookbook/drops/ft.md b/versioned_docs/version-2.0/Cookbook/drops/ft.md new file mode 100644 index 00000000..23231822 --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/drops/ft.md @@ -0,0 +1,78 @@ +--- +sidebar_label: 'Fungible Token Drops' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Fungible Token Drops +This part of the cookbook contains a quick overview on how to create an FT drop. +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +:::info note +These scripts will not run without the proper setup shown in the [introduction page](../welcome.md#connection-to-near-and-initializing-the-sdk). +::: + +## Creating a Fungible Token Drop +The process of creating an FT drop starts by checking if the funder has sufficient fungible tokens to actually create the drop. The `amountToTransfer` represents the total amount of FT to transfer for the entire drop. If you want to transfer 1 FT for 50 keys, `amountToTransfer` will be 50 fungible tokens. Next, this amount is compared to the funder's FT balance. Once that check is complete, then the FT drop can be created by including the `ftData` argument in `createDrop`. + + + + +```js +// Note that drop funder must have enough FTs to fund drop. +// If amount is "3" and there are 4 keys, Funder FT balance must be more than 12 +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 + }, +}); + +console.log(keys) +``` + + + + + +___ + +## Delete Drop +A drop can be deleted manually at any time using `deleteDrops`. This will refund all unclaimed key balances back to the drop funder's Keypom balance. + + + + +```js +// Get all the drops for a given user +let drops = await getDrops({accountId: "minqi.testnet"}); + +// Delete all the drops currently funded by `minqi.testnet` +await deleteDrops({ + account: fundingAccount, + drops +}) + +// Delete 2 seperate drops given their IDs +await deleteDrops({ + account: fundingAccount, + dropIds: ["123123123123123", "12391238012380123"] +}) +``` + + + + + +___ diff --git a/versioned_docs/version-2.0/Cookbook/drops/nft.md b/versioned_docs/version-2.0/Cookbook/drops/nft.md new file mode 100644 index 00000000..02309f30 --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/drops/nft.md @@ -0,0 +1,81 @@ +--- +sidebar_label: 'Non-Fungible Token Drops' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Non-Fungible Token Drops +This part of the cookbook contains a quick overview on how to create an NFT drop. +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +:::info note +These scripts will not run without the proper setup shown in the [introduction page](../welcome.md#connection-to-near-and-initializing-the-sdk). +::: + +## Creating a Non-Fungible Token Drop +An NFT drop is created by first minting the NFTs to be sent, and then including the `token_ids` in the `nftData` argument. This examples shows a single NFT, with a one single-use key. For a larger distribution, consider using an [FC to lazy mint NFTs](fc.md#attaching-nfts-to-your-fc-drop). + + + + +```js +// The funding account `minqi.testnet` has the token `token_123` on the contract `nft.examples.testnet` +const NFT_CONTRACT = `nft.examples.testnet`; +const NFT_TOKEN_ID = `token_123`; +const SENDING_ACCOUNT = `minqi.testnet`; + +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: SENDING_ACCOUNT, + // List of tokenIDs + tokenIds: [NFT_TOKEN_ID] + } +}); + +console.log(keys) +``` + + + + + +___ + +## Delete Drop +A drop can be deleted manually at any time using `deleteDrops`. This will refund all unclaimed key balances back to the drop funder's Keypom balance. + + + + +```js +// Get all the drops for a given user +let drops = await getDrops({accountId: "minqi.testnet"}); + +// Delete all the drops currently funded by `minqi.testnet` +await deleteDrops({ + account: fundingAccount, + drops +}) + +// Delete 2 seperate drops given their IDs +await deleteDrops({ + account: fundingAccount, + dropIds: ["123123123123123", "12391238012380123"] +}) +``` + + + + + +___ diff --git a/versioned_docs/version-2.0/Cookbook/drops/trial.md b/versioned_docs/version-2.0/Cookbook/drops/trial.md new file mode 100644 index 00000000..865b8a32 --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/drops/trial.md @@ -0,0 +1,96 @@ +--- +sidebar_label: 'Trial Account Drops' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Trial Account Drops +This part of the cookbook contains a quick overview on how to create a trial account drop. +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +:::info note +These scripts will not run without the proper setup shown in the [introduction page](../welcome.md#connection-to-near-and-initializing-the-sdk). +::: + +## Creating a Trial Account Drop +When creating a trial account drop, there are 3 main parameters to define. The first is `callableContracts`, indicating what contracts the trial account can call. This will prevent rugging from the funder's perspective. Next is `maxAttachableNearPerContract` which just outlines how much $NEAR can be attached to any function call on any of the aforementioned contracts. The order of this is the same as the order defined in `callableContracts`. Lastly is the `callableMethods` parameter, which defines what methods the trial account is allowed to call on the allowed contracts. A `*` indicated any contract is callable. + +When creating the drop, the trial account's balance is then defined by its starting balance and ending balance, known as the `startingBalanceNEAR` and `trialEndFloorNEAR` respectively. + + + + +```js +// What contracts can the trial account call? +const callableContracts = [ + 'guest-book.examples.keypom.testnet', + 'v1.social08.testnet' +] +// What is the maximum amount of $NEAR that can be attached to a call for each callable contract? +// 1 NEAR for guestbook, 2 NEAR for NEAR social +const maxAttachableNEARPerContract = [ + '1', + '2' +] +// What methods can the trial account call? +// Any function can be called on either contracts. +const callableMethods = [ + ['*'], + ['*'] +] + +const wasmDirectory = `${require('path').resolve(__dirname, '..')}/trial-accounts/ext-wasm/trial-accounts.wasm` +const {keys} = await createTrialAccountDrop({ + account: fundingAccount, + numKeys: 1, + contractBytes: [...readFileSync(wasmDirectory)], + // How much $NEAR should be made available to the trial account when it's created? + startingBalanceNEAR: 2.5, + callableContracts, + callableMethods, + maxAttachableNEARPerContract, + // Once the trial account has spent this much $NEAR, the trial will be over. + trialEndFloorNEAR: 1.25 +}) + +console.log(keys) +``` + + + + + +___ + +## Delete Drop +A drop can be deleted manually at any time using `deleteDrops`. This will refund all unclaimed key balances back to the drop funder's Keypom balance. + + + + +```js +// Get all the drops for a given user +let drops = await getDrops({accountId: "minqi.testnet"}); + +// Delete all the drops currently funded by `minqi.testnet` +await deleteDrops({ + account: fundingAccount, + drops +}) + +// Delete 2 seperate drops given their IDs +await deleteDrops({ + account: fundingAccount, + dropIds: ["123123123123123", "12391238012380123"] +}) +``` + + + + + +___ diff --git a/versioned_docs/version-2.0/Cookbook/keys.md b/versioned_docs/version-2.0/Cookbook/keys.md new file mode 100644 index 00000000..8f0a3a41 --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/keys.md @@ -0,0 +1,184 @@ +--- +sidebar_label: 'Keys' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Keys +This part of the cookbook contains everything related to keys in a drop, including adding keys to a drop, checking key usage and getting the number of active keys in a drop. +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +:::info note +Ensure that you have initialized Keypom using the `initKeypom` function prior to running any of the SDK examples. For more info on this, see the [introduction page](welcome.md#connection-to-near-and-initializing-the-sdk) +::: + + +## Adding Keys to a Drop +Additional keys may be added to a drop using the `addKeys` function. This is particularly helpful when you want to [create a large drop](drops/NEAR.md#creating-a-large-drop). + + + + +```js +// Create an empty simple drop with no keys. +const {dropId} = await createDrop({ + account: fundingAccount, + depositPerUseNEAR: 1, +}); + +// Add 10 completely random keys. The return value `keys` contains information about the generated keys +const {keys} = await addKeys({ + account: fundingAccount, + dropId, + numKeys: 10 +}) +``` + + + + + +:::caution +`addKeys` is limited to adding 50 password protected keys or 100 non-protected keys at a time. To add more keys, see the [example below](#adding-lots-of-keys). +::: + +___ + +## Adding Lots of Keys +Adding keys, either using `createDrop` or `addKeys` is limited to 50 password protected or 100 non-protected keys. To bypass this, the drop can be created first and then the keys can be added by looping `addKeys`. + + + + +```js +// Creating drop with 0 single use keys +let {dropId} = await createDrop({ + account: fundingAccount, + depositPerUseNEAR: "0.001", +}); + +// Loop to add 200 keys +let numKeys = 200 +let keysAdded = 0; +let allSecretKeys = []; +while (keysAdded < numKeys) { + const keysToAdd = Math.min(50, numKeys - keysAdded); + const {secretKeys, publicKeys} = await generateKeys({ + numKeys: keysToAdd, + }); + await addKeys({ + account: fundingAccount, + dropId, + publicKeys + }); + keysAdded += keysToAdd; + allSecretKeys = allSecretKeys.concat(secretKeys); +} +``` + + + + + +___ + +## Removing Keys from a Drop +Just as keys can be added to a drop retroactively, they can also be removed. The following shows that process. + + + + +```js +// Create drop with 5 keys +const {keys, dropId} = await createDrop({ + account: fundingAccount, + numKeys: 5, + depositPerUseNEAR: 1, +}); + +// Delete first key from drop +await deleteKeys({ + account: fundingAccount, + dropId, + publicKeys: keys.publicKeys[0] // Can be wrapped in an array as well +}) +``` + + + + + +___ + +## Checking Key Usage +A good use case for checking key usage is when you want to track the progress/retention of the keys in your drop. An excellent example is the [ticketing tutorial](../Tutorials/Advanced/ticketing/architecture.md#keypom-solution) where each key use represented a different phase of the ticketing experience. To do this, you can get and parse the [`keyInfo`](../keypom-sdk/Core/interfaces/KeyInfo.md) object by calling `getKeysForDrop`. + + + + +```js +// Query for the key supply for the drop that was created +const keyInfos = await getKeysForDrop({ + dropId +}) + +// Check key usage of first key +const keyUsage = keyInfos[0].remaining_uses + +console.log(keyUsage) +``` + + + + + +___ + +## Checking Key Balance +Similar to how checking a key usage is done, you can parse the [`keyInfo`](../keypom-sdk/Core/interfaces/KeyInfo.md) object to see a key's remaining allowance. + + + + +```js +// Query for the key supply for the drop that was created +const keyInfos = await getKeysForDrop({ + dropId +}) + +// Check key usage of first key +const keyBalance = keyInfos[0].allowance + +console.log(keyBalance) +``` + + + + + +___ + +## Check Number of Keys Remaining in a Drop +When a key is fully depleted, it is deleted from the drop. To check the number of remaining keys, and thus the amount of keys to still be claimed, you can use `getKeySupplyForDrop`. + + + + +```js +// Query for the key supply for a drop +const keySupply = await getKeySupplyForDrop({ + dropId +}) + +console.log(keySupply) +``` + + + + + +___ diff --git a/versioned_docs/version-2.0/Cookbook/utilities.md b/versioned_docs/version-2.0/Cookbook/utilities.md new file mode 100644 index 00000000..707f14e4 --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/utilities.md @@ -0,0 +1,84 @@ +--- +sidebar_label: 'Utilities' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Utilities +This part of the cookbook contains utilities and miscellaneous common Keypom use cases. This includes creating NFT series, using the DAO bot and more. +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +:::info note +Ensure that you have initialized Keypom using the `initKeypom` function prior to running any of the SDK examples. For more info on this, see the [introduction page](welcome.md#connection-to-near-and-initializing-the-sdk) +::: + + +### Create NFT Series + + + + +```js +const {keys} = await createDrop({ + account: fundingAccount, + numKeys: 2, + config:{ + usesPerKey: 1 + }, + depositPerUseNEAR: "0.1", +}); +``` + + + + + +___ + +### Utilize DAO Bot + + + + +```js +const {keys} = await createDrop({ + account: fundingAccount, + numKeys: 2, + config:{ + usesPerKey: 1 + }, + depositPerUseNEAR: "0.1", +}); +``` + + + + + +___ + +### Create Recurring Payments + + + + +```js +const {keys} = await createDrop({ + account: fundingAccount, + numKeys: 2, + config:{ + usesPerKey: 1 + }, + depositPerUseNEAR: "0.1", +}); +``` + + + + + +___ diff --git a/versioned_docs/version-2.0/Cookbook/welcome.md b/versioned_docs/version-2.0/Cookbook/welcome.md new file mode 100644 index 00000000..76ad813a --- /dev/null +++ b/versioned_docs/version-2.0/Cookbook/welcome.md @@ -0,0 +1,22 @@ +--- +sidebar_label: 'Introduction' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Introduction +Welcome to the Keypom cookbook! Here you can explore Keypom's building blocks that help create awesome onboarding experiences. The idea of these pages is for them to act as a quick reference for common use cases when using the Keypom protocol. Every use case will have a corresponding code snippet using the Keypom JS SDK. +## Getting Started +For the cookbook, you will need the following installed. +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + + +## Connection to NEAR and Initializing the SDK +When working with the SDK, you will always need to connect to NEAR and initiate Keypom using the `initKeypom` function. This will always be the first function you call to interact with the SDK. + +`initKeypom` initializes the SDK to allow for interactions with the Keypom smart contracts. Without it, none of the other SDK functions would work as expected. [More info](../keypom-sdk/Core/modules.md#initkeypom) on the `initKeypom` function. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/simple-drop/simple-example.js#L10-L35 +``` diff --git a/versioned_docs/version-2.0/TrialAccounts/Creation/drop-creation.md b/versioned_docs/version-2.0/TrialAccounts/Creation/drop-creation.md new file mode 100644 index 00000000..f8657072 --- /dev/null +++ b/versioned_docs/version-2.0/TrialAccounts/Creation/drop-creation.md @@ -0,0 +1,81 @@ +--- +sidebar_label: 'Create Your First Drop' +--- + +# Introduction + +Up until this point, you should have installed the Keypom SDK and its dependencies and should have a basic understanding of how trial accounts work and what is needed to create one. In this tutorial, you'll go through the process of creating the trial account drop that will be used to onboard users into the guest-book app. + +## Creating the Script + +Starting at the `keypom-docs-example` directory, navigate to the `advanced-tutorials/trial-accounts` folder and open the `create-trial-drop.js` file. + +```bash +cd advanced-tutorials/trial-accounts +``` + +There, you will see the code that is used to create the trial account drop. + +--- + +## Connecting to NEAR +The first step to creating the drop is connecting to the NEAR network. + +This is done with `NEAR-API-JS` and consists of: + +* Selecting which network to connect to (testnet or mainnet). + +* Specifying the location where the keys are stored for the drop funder's account. This location is commonly in the `~/.near-credentials` folder on your local machine. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/trial-accounts/create-trial-drop.js#L11-L29 +``` + +--- + +## Initializing the SDK + +The process for creating a drop always starts with calling the `initKeypom` function. + +`initKeypom` initializes the SDK to allow for interactions with the Keypom smart contracts. Without it, none of the other SDK functions would work as expected. + +```js +// Change this to your account ID +const FUNDER_ACCOUNT_ID = "minqi.testnet"; +const NETWORK_ID = "testnet" +async function createTrialAccount() { + // Initiate connection to the NEAR blockchain. + const CREDENTIALS_DIR = ".near-credentials"; + const credentialsPath = path.join(homedir, CREDENTIALS_DIR); + ... + ... + let near = await connect(nearConfig); + + // Initialize the SDK and point it to the custom NEAR object that was created. + await initKeypom({ + near, + network: NETWORK_ID + }); +} +``` + +## Creating the Trial Drop + +Now that both the SDK and NEAR connections have been established, it's time to create the drop itself. This is done using the `createTrialAccountDrop` function. You'll start by defining the restrictions that the trial account will have. You'll want the trial account to only call methods on the guest book contract and attach up to 1 $NEAR per method. In this case, the guest book contract is deployed to the `guest-book.examples.keypom.testnet` account. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/trial-accounts/create-trial-drop.js#L37-L51 +``` + +:::note +Note that a `*` was passed in for the callable methods. This means that the trial account can call any method as long as it's on the guest book contract. +::: + +Once this is finished, you can create the drop itself. The account will start with `2.5 $NEAR` and will reach the floor once `1.25 $NEAR` has been spent on attached deposits and burnt gas. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/trial-accounts/create-trial-drop.js#L53-L67 +``` + +In the above example, you only created 1 drop but you can create as many as you want for your users. It's super simple and the Keypom SDK has abstracted all the complexities away from you. In the next tutorial, you'll run the script and instantly sign into the guest-book app. + diff --git a/versioned_docs/version-2.0/TrialAccounts/Creation/getting-started.md b/versioned_docs/version-2.0/TrialAccounts/Creation/getting-started.md new file mode 100644 index 00000000..79509987 --- /dev/null +++ b/versioned_docs/version-2.0/TrialAccounts/Creation/getting-started.md @@ -0,0 +1,40 @@ +--- +sidebar_label: 'Before You Begin' +--- +# Introduction +In the following tutorials, you'll learn how Trial Accounts work behind the scenes and how to create a basic drop that can be used to instantly sign a user into the guest-book app. You'll also learn about the underlying flow for the official Keypom wallet selector plugin and how it's used to create instant sign-in experiences for users. + +--- + +## Prerequisites + +In order to successfully complete the tutorials, you'll need to have the following: + +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + +--- + +## Project Structure + +In this section, you'll prepare the project structure that will be used in the following tutorials. The core of the project is found in the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repository. + +First, you'll want to clone the repo: + +```bash +git clone https://github.com/keypom/keypom-docs-examples.git && cd keypom-docs-examples +``` + +Second, install the dependencies for the SDK: + +``` +yarn install +``` + +At this point, all the dependencies should be installed and you're ready to move on to the next step which is creating the trial drop. + + + + + + diff --git a/versioned_docs/version-2.0/TrialAccounts/Creation/integration.md b/versioned_docs/version-2.0/TrialAccounts/Creation/integration.md new file mode 100644 index 00000000..dda5e0db --- /dev/null +++ b/versioned_docs/version-2.0/TrialAccounts/Creation/integration.md @@ -0,0 +1,175 @@ +--- +sidebar_label: 'Integrating Into Your Apps' +--- + +# Introduction + +In the previous tutorial, you looked at the script necessary to create the trial account drop and how simple it was. In this tutorial, you'll start a local version of the guest-book app and see how easy it is to integrate and support trial accounts. + +:::warning +The UI for trial accounts while in the guest-book app in this tutorial are NOT finalized. Benji sucks at UI design and we're getting a designer to help us out. This is just a placeholder for now and is meant to be a proof of concept. +::: + +## Starting the Guest Book + +Starting at the `keypom-docs-examples` directory, navigate to the `advanced-tutorials/trial-accounts/guest-book` folder and install the dependencies. + +```bash +cd advanced-tutorials/trial-accounts/guest-book && yarn install +``` + +Once the dependencies have been installed, you can start the app. + +```bash +yarn start +``` + +This should open the guest-book app in your browser and you should see the following: + +

+ ticketing +

+ +:::note +If you're signed in already, it's because you've used the same port for another application that was left signed in. Simply sign out or open the link in a new incognito window. +::: + +--- + +## Creating the Trial Account + +Now that the guest-book is running, it's time to run the trial creation script. Open a new terminal and navigate to the `keypom-docs-examples` directory. Navigate to the `advanced-tutorials/trial-accounts` folder and open the `create-trial-drop.js` file. + +```bash +cd advanced-tutorials/trial-accounts +``` + +From here, make sure you change the account ID that is being used to sign transactions to an account that you're currently signed in with: + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/f1f634a629808f0d0943e508c2be6576622d32b1/advanced-tutorials/trial-accounts/create-trial-drop.js#L11 +``` + +In addition, change the `guestBookInstance` to whichever URL your app is running on: + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/f1f634a629808f0d0943e508c2be6576622d32b1/advanced-tutorials/trial-accounts/create-trial-drop.js#L70 +``` + +Once this is finished, you can run the following command to create the trial account drop. + +```bash +node create-trial-drop +``` + +This should output the following: + +```bash +Receipts: GCQ5qw2DYfnH4otYww94sJeVT2hEaEXj58Ky3J8FKdCS, FRCyeeVGgGq1YRRkxFRApjGpDdWyxZn4LQJTDoc22SV1 +Log [v2.keypom.testnet]: Warning: Balance is less than absolute minimum for creating an account: 2840000000000000000000 +Log [v2.keypom.testnet]: Current Block Timestamp: 1680902177371759044 +Log [v2.keypom.testnet]: 31 calls with 155000000000000 attached GAS. Pow outcome: 2.5000782. Required Allowance: 39626233977241600000000 +Log [v2.keypom.testnet]: Total required storage Yocto 837110000000000000000000 +Log [v2.keypom.testnet]: Current balance: 8.0866179, + Required Deposit: 3.6777362, + total_required_storage: 0.83711, + Drop Fee: 0, + Key Fee: 0 Total Key Fee: 0, + allowance: 0.0396262 total allowance: 0.0396262, + access key storage: 0.001 total access key storage: 0.001, + deposits less none FCs: 0 total deposits: 0 lazy registration: false, + deposits for FCs: 2.8 total deposits for FCs: 2.8, + uses per key: 1 + None FCs: 0, + length: 1 + GAS to attach: 150000000000000 +Log [v2.keypom.testnet]: New user balance 4.4088817 +Log [v2.keypom.testnet]: Fees collected 0 + + + Guest-Book App: +http://localhost:1234/trial-url#v2.keypom.testnet/3HbgYBvVMSfTBpXQ4fSecbPzwup2YkJPipNmT7e2iyw5MfzfMN3rHccsPddWcTGFTehCux7AbmtJiRqd78x4F57g + +Good Luck! +``` + +## Using the Guest Book + +Now that the drop is created, it's time to create a brand new account! Open the URL and you should see the following screen: + +

+ ticketing +

+ +Enter a valid username and click Create. This will start the claiming process. + +

+ ticketing +

+ +The claiming process should take a few seconds and then you should see the following screen: + +

+ ticketing +

+ +Once you click the button, you should be instantly signed into the guest-book app. + +### Signing Your First Transaction + +Now that you're signed in, you can instantly begin using the guest-book app. Try signing a message with `0.01 $NEAR` and see what happens! + +

+ ticketing +

+ +After a few seconds, the transaction should go through and your message should show up at the bottom of the messages list! Notice how there was no redirects to the NEAR wallet for approval and no sign in. + +### Invalid Actions + +Recall that the trial account cannot attach more than 1 $NEAR to a given transaction. Try signing a message with `1.1 $NEAR` and you should be greeted with the following modal: + +

+ ticketing +

+ +If you then sign the message with `1 $NEAR` or less, it should go through properly. + +### Trial Over + +After you've spent `1.25 $NEAR` on the app and you try to sign another message, you should see the following trial over modal: + +

+ ticketing +

+ +In this case, since FastAuth isn't complete, clicking the button will send you somewhere special. + +### Losing Access to Local Storage + +If the account were to lose access of the local storage or their computer blew up, all they would need is the original trial account link to gain access to their account again. To test this behavior, close the app and open a brand new incognito window. Paste the original link and you should immediately be signed back into the app. + +## Behind the Scenes + +In order for the guest-book app to be fully compatible with trial accounts, it only needs to add the SDK's wallet selector plugin. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/28444a492c513b8244e25ccaf067ca54f305b090/advanced-tutorials/trial-accounts/guest-book/near-wallet.js#L45-L55 +``` + +You'll notice that there are a couple of parameters that are passed into the `setupKeypom` function. You need to specify: + +- `trialAccountSpecs.url` and `instantSignInSpecs.url`: The URL format that must be met in order to trigger the sign-in flow. + - You may notice the `ACCOUNT_ID` and `SECRET_KEY` markers in the URLs. These define where the account ID and secret key will go for the links you plan to distribute. For more information, see the [TypeDocs](../../keypom-sdk/Selector/welcome.md#trial-account-specs). +- `signInContractId`: The contract ID that regular users create access keys for when signing in. +- [`trialAccountSpecs.modalOptions`](../../keypom-sdk/Selector/welcome.md#modal-options): Information that you can specify that will customize the modals that are shown to the user while on your app. Here, `KEYPOM_OPTIONS` from `./keypom-data` are imported and used. + +### Customizing the Modals + +By default, the modals that are shown to the user can be heavily customized to match the look and feel of your website. If you brand the regular wallet selector modal, the CSS will **automatically be applied** to the trial account modals. + +In addition, you can specify a suite of titles and descriptions. These will be covered further in a different tutorial. + +## Conclusion + +In this tutorial, you learned how to create a link that will allow users to experience your app through a trial account. You then created a new testnet account, instantly signed into the guest-book app and went through different scenarios that a user might encounter while using your app. \ No newline at end of file diff --git a/versioned_docs/version-2.0/TrialAccounts/Creation/understanding-trial-accounts.md b/versioned_docs/version-2.0/TrialAccounts/Creation/understanding-trial-accounts.md new file mode 100644 index 00000000..3a25ce6a --- /dev/null +++ b/versioned_docs/version-2.0/TrialAccounts/Creation/understanding-trial-accounts.md @@ -0,0 +1,134 @@ +--- +sidebar_label: 'Understanding Trial Accounts' +--- + +# Basis of Trial Accounts + +A Trial Account is simply an account on NEAR that has a set of pre-defined restrictions that limit the methods that it can call. This is achieved by deploying a very small no-std Rust smart contract on it (~25 kb or 0.25 $NEAR) that acts as a proxy, or middleman, for any outbound calls it makes. + +The contract deployed to the account exposes a method `execute` that takes a set of actions as arguments, checks whether the actions are allowed, and then executes them. To achieve this middleman behavior, the Trial Account cannot have any full access keys (otherwise it could bypass the `execute` method, and in turn, the restrictions). The account should *only* have one limited access key that can call the `execute` method on its own contract. + +Whenever a Trial Account wants to call a method on an external contract, say `nft_mint` on the `nft.examples.testnet` account, it needs to call `execute` and pass in the desired function call as arguments. The contract will then check whether those actions are allowed and if they are, it will execute the desired behavior. + +To help illustrate this behavior, the follow diagram shows the above scenario. + +

+ ticketing +

+ +## Keypom Drops + +From the above, a Trial Account can be created by deployed a valid contract to an account that only has a limited access key on it with the correct permissions. This can all be achieved with a [Function Call drop](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md). + +In order to create accounts ending with `.near` or `.testnet`, you'll need the `near` and `testnet` accounts to create sub-accounts. This is done by calling the `create_account` function on their contracts (the code is found [here](https://github.com/near/near-linkdrop/blob/49279e529c254fa7736465b4a39d05cb8f1e5443/src/lib.rs#L130)). This is exactly how regular linkdrops work, including [Keypom](https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/stage3/claim.rs#L129). + +By calling `create_account`, a new sub-account is created with a full access key. This is close to the behavior we want for Trial Accounts but not exactly. In order to create a new account that has a limited access key and a contract deployed, you can call the `create_account_advanced` function instead of `create_account`, code found [here](https://github.com/near/near-linkdrop/blob/49279e529c254fa7736465b4a39d05cb8f1e5443/src/lib.rs#L156). This function can accept `wasm` for a contract, and limited access key arguments. + +A Keypom function call drop can then be programmed to: +- Call the `create_account_advanced` function. +- Pass in user provided args for the new account ID. +- Pass in the `wasm` for the contract to be deployed. +- Pass in the limited access key arguments to create a key that can call `execute` on the newly created account. +- Once the account is created, Keypom will automatically call a setup method on the new account that will set the restrictions. + +Keypom has abstracted away all these complexities using a simple ready-made function [createTrialAccountDrop](../../keypom-sdk/Core/modules.md#createtrialaccountdrop). + +## Understanding Trial Restrictions + +There are 3 different restrictions that can be applied to a Trial Account: +- Callable contracts +- Callable methods +- Attached Deposits + +### Callable Contracts + +As a trial funder, you have complete control over exactly which contracts a trial account can call. This can be any number of contracts and should be passed in using an array. For example, if you wanted the trial to only call methods on the `v2.keypom.testnet` and `nft.examples.testnet` contracts, you would pass in the following: + +```js +const callableContracts = [ + "v2.keypom.testnet", + "nft.examples.testnet" +] +``` + +### Callable Methods + +Not only do you have full control over the contracts that a trial account can call, but you can also specify individual methods on a per-contract basis. In the above example, if you wanted the account to be able to call any method on the `v2.keypom.testnet` contract, but only the `nft_mint` and `nft_transfer` methods on the `nft.examples.testnet` contract, you would pass in the following: + +```js +const callableMethods = [ + ["*"], + ["nft_mint", "nft_transfer"] +] +``` + +:::note +The `*` symbol is used to represent no restrictions on methods for a given contract. +::: + +### Max Attachable Deposit + +The last restriction that you can set on a given trial account is the maximum amount of $NEAR that can be attached to function calls for a given contract. In the above scenario, say you wanted to limit an account to the following restrictions: +- Attaching up to 5 $NEAR to any method on the `v2.keypom.testnet` contract. +- Only attaching 1 yoctoNEAR to methods on the `nft.examples.testnet` contract. + +You would pass in the following: + +```js +const maxAttachableDeposit = [ + "5000000000000000000000000", + "1" +] +``` + +## Exit Conditions + +The final thing to understand about trial accounts is how they can be exited. While the account is in the trial state, it has restrictions and isn't usable in the wider ecosystem. As a funder, you can specify conditions that need to be met in order for the account to exit the trial state. + +### Trial Over Floor + +The main condition that dictates how long an account will be in the trial state before it must exit is the trial floor. This is an amount of $NEAR that must be spent before the account is eligible to exit. The amount consists of both gas burnt as well as deposits to successful function calls. + +For example, if an account attached 1 $NEAR to a function call and also burnt 75 TGas, it would be `1.0075 $NEAR` closer to the floor. Overtime, as an account executes more and more transactions, it will come closer to the floor. Once the floor has been reached, the account will be eligible to exit. + +:::note +It's important to note that once the floor has been met, the account can continue to execute transactions. Reaching the floor simply means that the account *can* exit the trial state (assuming all other conditions have been met). +::: + +### Repay Conditions + +If the funder chooses to, they can also specify a repay condition. This is an amount of $NEAR that must be paid back to them in order for the account to exit the trial state. + +This process happens automatically when the exit method is called but it will throw an error if the account doesn't possess enough funds to repay the funder. This amount can be 0 $NEAR meaning that once the account reaches the floor, it can immediately exit without needing to repay. + +The $NEAR needed to repay the funder can be gained in one of three ways: +1. Gained during the trial (e.g selling an NFT you minted, winning an on-chain lottery etc.). +3. Sent by another account. +2. Sent with an on-ramp (similar to how accounts are funded currently). + +While there is still friction in the last case, the user has **experienced your application first** and the onboarding is pushed until after their trial is over. Currently, people need to go through the complicated onboarding process first and only experience the app afterwards. + +As an example, let's say you're building a roulette app and you want to give users a trial account to experience what you're building in the hope that they will continue to use it afterwards. You give someone 10 $NEAR and set a repay condition of 5 $NEAR. During their trial, they could have won 20 $NEAR from the roulette app by putting all their money on red. + +This would satisfy the repay condition and they would be able to keep the rest of the $NEAR that they won. + +### What Happens On Exit? + +When regular accounts are created on NEAR, they start with a full access key and don't have any smart contract deployed to them. This behavior should be the same for trial accounts except they keep any assets they had during the trial state. When the account exits, the following will happen: + +- The limited access key is removed from the account. +- The trial contract is removed from the account. +- Any state that was set on the trial contract is removed. +- The full access key is added to the account. +- Any repay conditions are paid out. +- Any $NEAR that was *not* gained during the trial is returned to the funder. This includes the bytes freed from deleting the contract and is meant to be a way to resist Sybil attacks. + +This means that the account will act as a fresh NEAR account with a set of starting assets such as NFTs or FTs that it gained during the trial. If the account wanted to, it could deploy a contract such as multi-sig, nETH etc. + +When a trial account exits, it will be given a full access key and the restrictions will be removed. This means that the account will be able to call any method on any contract and attach any amount of $NEAR to function calls. + +## Conclusion + +In this tutorial, you learnt the basics of how trial accounts operate and what is needed to create them. You also learnt about the different restrictions that can be applied to trial accounts, how they can be exited and what happens when they exit. + +In the next tutorial, you'll learn how to create a simple trial account drop that will be used to instantly sign a user into the guest-book application. \ No newline at end of file diff --git a/versioned_docs/version-2.0/TrialAccounts/introduction.md b/versioned_docs/version-2.0/TrialAccounts/introduction.md new file mode 100644 index 00000000..116896bb --- /dev/null +++ b/versioned_docs/version-2.0/TrialAccounts/introduction.md @@ -0,0 +1,61 @@ +--- +sidebar_label: 'Getting Started' +--- +# Keypom Trial Accounts + +Keypom Trial Accounts are an exciting new opportunity for Web3 apps to seamlessly onboard users whether they’re completely new to crypto or seasoned veterans. With the click of a link, users require no software, wallet setup, wallet connection, and are **instantly signed into apps** with their trial account, ready to make on-chain transactions. + + +

+ ticketing +

+ +:::info +Check out this slick [demo of Keypom Trial Accounts (4min)](https://www.youtube.com/watch?v=rQf_wlA5eEw). +::: + +## Benefits + +The key benefit of using trial accounts is that the app developers, also referred to as the funders of the trial accounts, have granular control over the smart contracts, methods and amounts of NEAR tokens used during the trial. These rules are specified when the trial account is created and ensure that the funder **cannot be rugged by the user**. + +Traditionally on NEAR, [linkdrops](../Concepts/LinkdropsAndAccessKeys/linkdrop-basics.md) have been used to create accounts containing $NEAR. Since this $NEAR is unlocked, users could simply take it and spend it *anywhere in the ecosystem*, exactly like giving someone cash. This defeated the purpose for app developers to provide users with a small amount of $NEAR to trial their applications. + +With trial accounts, $NEAR is placed inside a smart contract deployed to the user's account along with rules specified by the app developer when the account is created. This means that giving away a trial account is not like giving cash, but instead **a gift card**. + +Trial Accounts support all types of NEAR FunctionCall actions, including those with attached deposits e.g. 1 yocto for FT and NFT transfers, making them the ideal choice as a first touch point for new users to NEAR applications. + +Our vision is for trial accounts to be the point of entry for onboarding onto any NEAR application. Once the trial is over, the user can exit to a full and unrestricted NEAR Account, retaining any assets they received during the trial period. The exit process happens through any external onboarding mechanism that supports the linkdrop standard such as FastAuth, MyNEARWallet etc. + +## Getting Started + +To learn how to create trial accounts and integrate them into your app, there are a few basic tutorials to get you started. + +:::note +Trial Accounts are still in early stage development and are not meant to be used for production. The Keypom team is working on finalizing the contract and getting it audited as soon as possible. +::: + + +

\ No newline at end of file diff --git a/versioned_docs/version-2.0/TrialAccounts/offboarding.md b/versioned_docs/version-2.0/TrialAccounts/offboarding.md new file mode 100644 index 00000000..0b73e1cd --- /dev/null +++ b/versioned_docs/version-2.0/TrialAccounts/offboarding.md @@ -0,0 +1,238 @@ +--- +sidebar_label: 'Offboarding Trial Accounts' +--- +# Introduction + +In this tutorial, you'll learn how to support trial accounts exiting into your wallet. + +Trial Accounts are a great way to onboard new users to applications with the click of a link. The in-app experience is seamless but at some point, the trial must end. This process should remove all restrictions from the user's account and allow them to interact with the any app on NEAR. This process is known as offboarding and is a critical part of the user's journey. + +As part of the offboarding process, a full access key will be added to the account and this should be stored somewhere safe. For this reason, we wanted to make sure trial accounts could be exited into any wallet or app that supports the official linkdrop standard (e.g MyNEARWallet / FastAuth). + +The desired user experience is as follows: +1. Click a link or scan a QR code. +2. Enter a username. +3. Immediately get signed into the app and start using it. +4. Once your trial is over, a modal pops up with options for onboarding. +5. Click the desired option (such as MyNEARWallet) and get redirected. +6. Offboard with the app and get a new private key based on the option you chose (seedphrase, biometrics etc.) +7. The trial account has now been converted into a full, unrestricted NEAR account that can interact with the rest of the ecosystem. + +

+ ticketing +

+ +## Utilizing Linkdrops + +Most wallets support linkdrop claiming since it leads to more opportunities for them to gain new users. This can be used to our advantage if the trial account offboarding process is treated as a regular linkdrop, then the account can be offboarded into almost every wallet. Before learning how this is accomplished, you should first understand the basics of claiming linkdrops. + +### Claiming + +As per the official linkdrop standard, there are 3 methods that are important for claiming linkdrops: + +```ts +/// Returns the KeyInfo associated with a given public key +/// Panics if the key does not exist +function get_key_information(key: string) -> KeyInfo + +/// Transfer assets linked to a given public key to an `account_id`. +/// +/// Arguments: +/// * `account_id` the account that should receive the linkdrop assets. +/// +/// Returns `true` if the claim was successful meaning all assets were sent to +/// the `account_id`. +function claim(account_id: string) -> Promise + +/// Creates a new NEAR account and transfers all assets linked to a given public +/// key to the *newly created account*. +/// +/// Arguments: +/// * `new_account_id`: the valid NEAR account which is being created and should +/// receive the linkdrop assets +/// * `new_public_key`: the valid public key that should be used for the access +// key added to the newly created account. +/// +/// Returns `true` if the claim was successful meaning the `new_account_id` was +/// created and all assets were sent to it. +function create_account_and_claim(new_account_id: string, new_public_key: string) -> Promise +``` + +For an arbitrary linkdrop (a URL containing the contract and secret key), the flow is as follows: +1. The user clicks a link or scans a QR code representing the linkdrop. +2. The app calls `get_key_information` to check what's in the linkdrop. + - If the linkdrop was already claimed (or doesn't exist), the call will panic and the frontend should indicate that the drop is invalid. +3. Depending on what is returned from the call, the app should display what assets the user is about to claim (e.g NFTs, FTs, $NEAR etc.) +4. The frontend exposes a form field and the user either inputs a new account or an existing one. +5. If a new account is created, the frontend will call `create_account_and_claim` and pass in the new account ID and an access key that will have full access permission over the account. + - This key is generated based on what the app allows. For example, MyNEARWallet generates the key using a seedphrase while FastAuth generates it using biometrics. +6. The linkdrop is claimed and the assets are sent to the user's account. + +### Trial Account Linkdrops + +Now that the basics of linkdrop claiming have been covered, you'll look at how trial accounts can be treated as a linkdrop. From above, there are a few requirements that need to be met: +- The URL should contain a contract and secret key +- The trial contract should implement the `get_key_information` method so that frontends know when a drop is valid. +- The trial contract should implement the `create_account_and_claim` method for claiming. + +Recall that for claiming assets to a new account, linkdrop contracts will create the account and add the public key as a full access key to the account. This access key is generated on a per-app basis. For example, MyNEARWallet generates the key using a seedphrase while FastAuth generates it using biometrics. + +In the case of the trial account contract, the exact same flow can happen except the account creation is *already done*. When calling `create_account_and_claim`, the contract should accept the new public key and do the following (assuming the account can exit): +1. Delete the existing limited access key used during the trial. +2. Create a new access key with the `new_public_key` and give it full access to the account. +3. Repay the funder for any required $NEAR. +4. Delete any state that is being used by the contract. +5. Delete the trial contract and free up all the storage. + +Notice that the only parameter that was *actually* used was `new_public_key` but in the official linkdrop standard, the `create_account_and_claim` function takes two parameters: + +```ts +function create_account_and_claim(new_account_id: string, new_public_key: string) +``` + +The `new_account_id` field is disregarded by the trial account contract since the account already exists. You can pass in any value for this field and it will be ignored. + +For example, the following code could be used to completely offboard a trial account using `near-api-js`. The pseudo code is: +1. Initialize the NEAR connection. +2. Set the trial account key in the keystore. +3. Get the key information and check if the account can exit the trial. +4. Generate a random keypair that will be used as the account's new full access key. +5. Call `create_account_and_claim` with the new public key and the required gas coming from the call to get key information. + +```ts +const NETWORK_ID = 'testnet'; +// Generate a new keystore and connect to the NEAR network +let keyStore = new keyStores.InMemoryKeyStore(); + +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 = await connect(nearConfig); + +// Account ID of the trial account +const trialAccountId = "benji-demo-12345.testnet"; + +// Trial Account Secret Key +const trialAccountSecretKey = "5XorwuVXhTpscqddyyrRB9QVZDTn3mut9Zeu7drtdxexurhgf2V4WHJ8RyLoJppmHagMg6gcdAQrG8gJf9JA2XB" +const keyPair = KeyPair.fromString(trialAccountSecretKey); +await keyStore.setKey(NETWORK_ID, trialAccountId, keyPair); + +// Create the account object for the trial +const trialAccountObj = new Account(near.connection, trialAccountId); + +// Check if the trial account is able to exit +const keyInfo = await trialAccountObj.viewFunction(trialAccountId, 'get_key_information', {key: keyPair.getPublicKey().toString()}); +if (keyInfo.trial_data?.exit == true) { + // This will be the full access key for the new account + const newKeyPair = KeyPair.fromRandom('ed25519'); + + // How much gas should be attached to the create account call + const requiredGas = keyInfo.required_gas; + + // If the account can exit, generate a new random access key which will be used for the full access key + await trialAccountObj.functionCall({ + contractId: trialAccountId, + methodName: 'create_account_and_claim', + args: { + new_account_id: "", + new_public_key: newKeyPair.getPublicKey().toString() + }, + attachedDeposit: 0, + gas: requiredGas + }); +} +``` + +### Rendering Linkdrops + +Wallets and apps that support the claiming of linkdrops should render their claim pages differently depending on what assets are contained in the linkdrop. For example, if the linkdrop contains $NEAR, the page could look like this: + +

+ ticketing +

+ +If the linkdrop contains NFTs, the page could look like this: + +

+ ticketing +

+ +This is done using the `get_key_information` method and rendering the page depending on the result. In the official linkdrop standard, the return value is an object `KeyInfo` that looks as follows: + +```ts +/// Information about a specific public key. +type KeyInfo = { + /// How much Gas should be attached when the key is used to call `claim` or `create_account_and_claim`. + /// It is up to the smart contract developer to calculate the required gas (which can be done either automatically on the contract or on the client-side). + required_gas: string, + + /// yoctoNEAR$ amount that will be sent to the account that claims the linkdrop (either new or existing) + /// when the key is successfully used. + yoctoNEAR: string, + + /// If using the NFT standard extension, a set of NFTData can be linked to the public key + /// indicating that all those assets will be sent to the account that claims the linkdrop (either new or + /// existing) when the key is successfully used. + nft_data: NFTData[] | null, + + /// If using the FT standard extension, a set of FTData can be linked to the public key + /// indicating that all those assets will be sent to the account that claims the linkdrop (either new or + /// existing) when the key is successfully used. + ft_data: FTData[] | null + + /// ... other types can be introduced and the standard is easily extendable. +} +``` + +The frontend can check what's contained and render the page accordingly. + +## Supporting Trial Account Offboarding + +This idea of conditional rendering is the key to supporting trial account offboarding. In general, when a frontend renders the page for users that will call `create_account_and_claim`, the flow is as follows: +1. Show the user what assets they've received +2. Prompt the user for a new username +3. Give the user their private key (biometrics, seedphrase, etc.) +4. Call `create_account_and_claim` with the new username and the generated public key + +While this approach *could* work with trial accounts, it is not ideal as there's no need to ask for a username since the account already exists. + +### Rendering Trial Account Linkdrops + +A better flow for offboarding trial accounts would be to skip the new username prompt mentioned above. This means that the user's journey would look like this: + +1. Show the user a screen indicating that they're about to exit the trial account +3. Give the user their private key (biometrics, seedphrase, etc.) +4. Call `create_account_and_claim` with an empty username and the generated public key + +In order to support this flow, the frontend should check if the linkdrop contains a trial account. This can be done by checking the information returned from `get_key_information`. The trial accounts will return the following object: + +```ts +/// Information about a specific public key. +type KeyInfo = { + /// How much Gas should be attached when calling `create_account_and_claim` in order to exit the account + required_gas: string, + + /// This will always be zero for trial accounts since the linkdrop doesn't contain $NEAR and instead contains the actual account + yoctoNEAR: '0', + + /// Specific data that is used to determine whether or not a linkdrop is a trial account + trial_data: { + /// If the trial account can exit, this will be true. + exit: boolean + } +} +``` + +If the `trial_data` field is present, the frontend can assume that the linkdrop is a trial account and render the page accordingly. + +### In Summary + +Frontends that support the official linkdrop standard should be able to ingest an arbitrary linkdrop and render their claim page based on the assets contained in the drop. While the standard officially supports only 3 types of drops: $NEAR, NFTs, and FTs, it is easily extendable to support other types of assets. + +In the case of trial accounts, the key information will return a new field `trial_data` that will indicate whether or not the account can exit. If the exit boolean is set to true, the frontend should skip the prompt for a new username and directly call `create_account_and_claim` while passing in an empty username and the corresponding public key that should be added as full access. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/AccessKeyMarketplace/concept.md b/versioned_docs/version-2.0/Tutorials/Advanced/AccessKeyMarketplace/concept.md new file mode 100644 index 00000000..07faeccd --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/AccessKeyMarketplace/concept.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Concept' +--- +# Concept \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/AccessKeyMarketplace/final.md b/versioned_docs/version-2.0/Tutorials/Advanced/AccessKeyMarketplace/final.md new file mode 100644 index 00000000..d90001ba --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/AccessKeyMarketplace/final.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Final Product' +--- +# Final Product \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/AccessKeyMarketplace/skeleton.md b/versioned_docs/version-2.0/Tutorials/Advanced/AccessKeyMarketplace/skeleton.md new file mode 100644 index 00000000..d5e552ef --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/AccessKeyMarketplace/skeleton.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Skeleton Code' +--- +# Skeleton Code \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/CustomizedOnboarding/final.md b/versioned_docs/version-2.0/Tutorials/Advanced/CustomizedOnboarding/final.md new file mode 100644 index 00000000..d90001ba --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/CustomizedOnboarding/final.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Final Product' +--- +# Final Product \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/CustomizedOnboarding/introduction.md b/versioned_docs/version-2.0/Tutorials/Advanced/CustomizedOnboarding/introduction.md new file mode 100644 index 00000000..b20757bd --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/CustomizedOnboarding/introduction.md @@ -0,0 +1,25 @@ +--- +sidebar_label: 'Introduction' +--- +# Introduction + +One of the biggest pain-points with Web3 is that users need to fund wallets before they interact with a dApp. In Web2, a user can find value in an application by using it before they go through the messy onboarding process. + +**Keypom will allow apps to create links that will automatically sign users into their applications and give them a free trial. ** + +This can be thought of as giving someone a gift card that only works at your store. This concept is extremely powerful and has been around the Web2 world for a long time. As an example, a casino might give out 10$ vouchers so that people come and play. Once the voucher runs out, people can either leave or top-up their balance and stay longer. The import thing to note with this is that users are only pulling out their credit cards once they’ve actually experienced the casino. + +With Keypom’s limited access accounts, people will be able to interact, spend $NEAR, sign transactions and gather assets with the simple click of a link. Once the free trial is over and users have collected value through interacting with the dApp, they can then choose to upgrade their account and onboard. + +Much like the gift-card analogy, users will be locked into only interacting with the dApp specified in the link. They can't take the funds embedded in the β€œvoucher” and leave. The funds are allocated for only 1 purpose: free trials of a specific application. + +

+ ticketing +

+ + +In this tutorial, you'll learn how to create your very own customized onboarding. + +:::info +🚧 Full tutorial coming soon... 🚧 +::: \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/CustomizedOnboarding/skeleton.md b/versioned_docs/version-2.0/Tutorials/Advanced/CustomizedOnboarding/skeleton.md new file mode 100644 index 00000000..d5e552ef --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/CustomizedOnboarding/skeleton.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Skeleton Code' +--- +# Skeleton Code \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ReceiverContracts/concept.md b/versioned_docs/version-2.0/Tutorials/Advanced/ReceiverContracts/concept.md new file mode 100644 index 00000000..07faeccd --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/ReceiverContracts/concept.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Concept' +--- +# Concept \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ReceiverContracts/final.md b/versioned_docs/version-2.0/Tutorials/Advanced/ReceiverContracts/final.md new file mode 100644 index 00000000..d90001ba --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/ReceiverContracts/final.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Final Product' +--- +# Final Product \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ReceiverContracts/skeleton.md b/versioned_docs/version-2.0/Tutorials/Advanced/ReceiverContracts/skeleton.md new file mode 100644 index 00000000..d5e552ef --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/ReceiverContracts/skeleton.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Skeleton Code' +--- +# Skeleton Code \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/RewardGating/concept.md b/versioned_docs/version-2.0/Tutorials/Advanced/RewardGating/concept.md new file mode 100644 index 00000000..07faeccd --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/RewardGating/concept.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Concept' +--- +# Concept \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/RewardGating/final.md b/versioned_docs/version-2.0/Tutorials/Advanced/RewardGating/final.md new file mode 100644 index 00000000..d90001ba --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/RewardGating/final.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Final Product' +--- +# Final Product \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/RewardGating/skeleton.md b/versioned_docs/version-2.0/Tutorials/Advanced/RewardGating/skeleton.md new file mode 100644 index 00000000..d5e552ef --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/RewardGating/skeleton.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Skeleton Code' +--- +# Skeleton Code \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/daos/architecture.md b/versioned_docs/version-2.0/Tutorials/Advanced/daos/architecture.md new file mode 100644 index 00000000..ccdce9ea --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/daos/architecture.md @@ -0,0 +1,99 @@ +--- +sidebar_label: 'Solution Architecture' +--- +# Solution Architecture +In this section, you'll break down the requirements for the onboarding experience in order to create a solution architecture. This means translating the features from the [introduction](introduction.md) into tangible goals for the specific Keypom drop and its configurations. + +The two major requirements for the auto-registration experience are: +- Members don't need an existing wallet to join the DAO. +- The invitations do not require a 2 step process where a council votes and reaches a quorum for every registration. + +## Seamless Wallet Creation + +Since each user will be given a Keypom linkdrop, the wallet creation is handled by whatever claim platform they choose (MyNEARWallet, Meteor, FastAuth etc.). This means that there is no funding required from the user's perspective, eliminating KYC, credit cards, exchanges and other barriers. + +The end user experience is to simply enter an account name and secure the wallet with whatever method they choose (iOS app, seedphrase, biometrics etc.). + +## Single Step Registration + +DAOs require a 2 step process for members to join. The first step is to create a proposal for adding them to the DAO and the second is to vote on that proposal and reach a quorum. This means that the DAO must constantly monitor for incoming proposals, leading to long wait times for new users. + +If DAOs want to mass register members, this process is very inefficient. From a technical stand-point, what happens is: + +1. An [`AddMemberToRole`](https://github.com/near-daos/sputnik-dao-contract#proposal-types) proposal is created. +2. A quorum of voting members, such as the DAO's council, must be reached to approve this proposal. + +### Optimizing the Approach + +In order for this process to be streamlined and completed automatically, Keypom must be able to first add a proposal and then **also** approve it as **part of the linkdrop claiming process**. + +First, Keypom must be given a role that is capable of creating and approving proposals for adding new members. + +Second, Keypom must be given a role that automatically reaches quorum whenever it votes. For this tutorial, that role will only have 1 member so that whenever Keypom votes to accept the `AddMemberToRole` proposal, 100% of the members will have voted and it will be automatically accepted. + +To combine both these features into one step, a FunctionCall drop can be created that first calls [`add_proposal`](https://github.com/near-daos/sputnik-dao-contract#add-proposal) and then [`act_proposal`](https://github.com/near-daos/sputnik-dao-contract#approve-proposal) to vote on and approve the new member joining the DAO. + +While this works in theory, unfortunately, the `act_proposal` function requires a `proposal_id` that is returned from the `add_proposal` function. This is an issue for the following reasons: +1. With Keypom FC drops, there is no way to get a return value and use it to call another function. +2. SputnikV2 does not support custom `proposal_id`'s, meaning there is no way to hard code the `proposal_id` or inject the Keypom `drop_id` as the `proposal_id` ahead of time. + +### Middleman Solution + +Up until this point, the general flow for auto registering users is clear. An FC drop must be made that somehow invokes the `add_proposal` and `act_proposal` functions one after another. The problem with relying entirely on Keypom is that the return value for `add_proposal` must be known and used. + +This can be fixed by introducing a middleman contract. Rather than calling `add_proposal` and `act_proposal` directly through the FC drop, you can instead call **a single function on the middleman contract**. Once invoked, this middleman contract will then call `add_proposal`, parse the return value and call `act_proposal` in succession. + +While Keypom is extremely versatile, there are cases where custom behavior will be needed. By introducing a middleman, you can customize exactly what will happen when a key is used. + +In summary, rather than having the FC drop look as follows: + +``` +add_proposal + -> DAO Contract + -> Returns proposal ID +act_proposal (I need proposal ID somehow) + -> DAO Contract +``` + +The FC drop will instead do the following: +``` +Call middleman contract + add_proposal + -> DAO Contract + -> Returns proposal ID + Parse return value and get proposal ID + act_proposal + -> DAO Contract +``` + +--- + +## Full Solution Architecture +From above, here are the key features that need to be implemented. +### Keypom Solution +On the Keypom side, an FC drop will be used to call the middleman. This FC drop must: +- Only call the DAO bot once, to prevent double registration or multiple people registering with the same key. +- Send the DAO bot the `AddMemberToRole` proposal object *and* the desired DAO. +- Attach the wallet address for the account that will be onboarded to the middleman contract when auto-registering them into the DAO. + +### DAO Bot Solution + +The middleman contract that relays the add and act proposal functions can be referred to as the DAO bot. + +Recall that Keypom would need to be in its own special role. This was because Keypom was the `predecessor` for the `add_proposal` and `act_proposal` calls to the DAO contract. Now that the middleman is introduced, Keypom is no longer the predecessor. For this reason, the middleman DAO bot must have the special role instead. + +The middleman must: +- Ensure all incoming calls are made by Keypom and have a sufficient attached deposit. +- Take in a proposal object for adding a new member to a DAO (which includes the account ID of the new member). +- Take in a desired DAO contract and call `add_proposal` with the proposal object. +- Parse the return value which should be the proposal ID and then call `act_proposal` to automatically register the new member into the DAO. + +--- + +## Conclusion + +In this section, you explored and expanded on all the requirements for the auto-registration process. This started with using a Keypom linkdrop to facilitate [seamless wallet creation](#seamless-wallet-creation). Then, the onboarding process was automated and streamlined by introducing a [single-step registration](#optimizing-the-approach). This was done using a FunctionCall drop that would create and approve `AddMemberToRole` proposals as part of the linkdrop claiming process. + +However, you also saw the limitations of relying entirely on Keypom; that the `add_proposal` return value must be known and used. You solved this by introducing a [middleman contract](#middleman-solution) which would receive function calls from Keypom and execute the auto-registration. + +From this analysis, you set [concrete goals](#full-solution-architecture) for the Keypom FunctionCall drop and the middleman DAO bot contract. With these goals in mind, you can start to build out this solution! diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot-flow.drawio b/versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot-flow.drawio new file mode 100644 index 00000000..8b853273 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot-flow.drawio @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot-flow.png b/versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..9c43387fec5089aca18038ee996388bd7ee05c00 GIT binary patch literal 29026 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
Prospective
Member
Prosp...
Claim their
FC Key
Claim their...
Is drop funder a
council member?
Is drop funder a...
Did Keypom call
DAO bot?
Did Keypom call...
Keypom DAO Bot
Keypom DAO Bot
Auto-register
new member
Auto-register...
DAO
DAO
Text is not SVG - cannot display \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot-fns.drawio b/versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot-fns.drawio new file mode 100644 index 00000000..5496e3d3 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot-fns.drawio @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot.md b/versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot.md new file mode 100644 index 00000000..a2180e74 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/daos/daobot.md @@ -0,0 +1,105 @@ +--- +sidebar_label: 'Designing the DAO Bot' +--- +# The DAO Bot + +## Introduction +In this section you'll be creating the middleman DAO bot contract in order to securely facilitate auto-registration into your DAO. This bot will be tailored according to the functionality and specifications found in the [Solution Architecture](architecture.md#keypom-solution). + +## Designing the DAO Bot + +[Recall](./architecture.md#dao-bot-solution) that the DAO bot needs accomplish the following: + +1. Ensure all incoming calls are made by Keypom and have a sufficient attached deposit. +2. Take in a proposal object for adding a new member to a DAO (which includes the account ID of the new member). +3. Take in a desired DAO contract and call `add_proposal` with the proposal object. +4. Parse the return value which should be the proposal ID and then call `act_proposal` to automatically register the new member into the DAO. + +With this in mind, the aim of this tutorial will be to write a Rust smart contract that will match the above properties. This process can be broken down into two stages: +1. Adding the proposal +2. Approving the proposal + +> If you wish to simply use the DAO bot without modifying it, you can move ahead to the [Final Product](./final.md) page. + +### Accessing the Code + +For this section of the tutorial, you will need to clone a separate [DAO bot repository](https://github.com/keypom/dao-bot/tree/main). From there you can navigate to the skeleton code folder found below. + +```bash +git clone https://github.com/keypom/dao-bot.git && cd src-skeleton +``` + +This is the skeleton code and will allow you to follow along as the DAO bot is built out. If you wish to examine the completed version, that can be found in the `src` folder. + +In the expandable section below, you can see the skeleton code from the file `lib.rs`. + +
+DAO Bot Skeleton Code +

+ +```rust reference +https://github.com/keypom/dao-bot/blob/2c3a7bac8b18e1134483f0736e2ca9e2152f8509/src-skeleton/lib.rs#L1-L123 +``` + +

+
+ + +You may notice a few structs and enums predefined; these are simply present to match the structures from the [SputnikV2 contract](https://github.com/near-daos/sputnik-dao-contract/tree/main/sputnikdao2/src) and allow the contract to work with proposal inputs. + +--- + +## Adding the Proposal + +Since the middleman contracts needs to call `add_proposal` on the DAO contract, this requires the use of cross-contract calls. For a refresher on making cross contract calls, see [NEAR docs](https://docs.near.org/develop/contracts/crosscontract#snippet-sending-information). + +The first thing that needs to be checked is that the attached deposit is enough to cover the add proposal cost and Keypom is the predecessor to the call. Once that's done, the DAO bot can make a cross contract call to the dao contract and call `add_proposal`, passing in the proposal object. + +```rust reference +https://github.com/keypom/dao-bot/blob/0d8abdb2151d224763aa7808cda88d58eb31e495/src-v1/lib.rs#L103-L120 +``` + +When the `add_proposal` function finishes executing, the DAO bot can then invoke a callback method to parse the returned proposal ID and call `act_proposal`. + + +## Approving the Proposal + +In the callback after the proposal has been added, the DAO bot will first check the success of the call and then parse the return value for the proposal ID. + +Using the proposal ID, the DAO bot can then make another cross contract call to the DAO contract and call `act_proposal` to approve the proposal. + +``` rust reference +https://github.com/keypom/dao-bot/blob/0d8abdb2151d224763aa7808cda88d58eb31e495/src-v1/lib.rs#L123-L143 +``` + +:::note Recall +The DAO bot has been added to the DAO in its own role. This means that when the DAO bot votes to approve, it automatically reaches a quorum and passes the proposal +::: + +--- + +## Final Code + +Putting everything together, the final code for the DAO bot smart contract should be: + +```rust reference +https://github.com/keypom/dao-bot/blob/0d8abdb2151d224763aa7808cda88d58eb31e495/src-v1/lib.rs#L1-L153 +``` + +--- + +## Security Concerns + +So far, you've seen both the FunctionCall drop and middleman DAO bot contract be created. You've seen how they communicate with each other and how the DAO bot can verify that only Keypom can interact with it. However there is a glaring security vulnerability. + +What happens if somebody else creates an identical FunctionCall drop to manipulate your DAO through the DAO bot against your wishes? How can the DAO bot be upgraded further to put control of your DAO back into your hands? + +--- + +## Conclusion + +In this tutorial, you've created the all new DAO bot on function call at a time. This started with verifying the calls were coming from Keypom with a sufficient attached deposit. Then, this was followed up by [calling `add_proposal`](#adding-the-proposal) using the received proposal and DAO contract. Finally, you parsed the return value and [called `act_proposal` using the `proposal_id`](#approving-the-proposal). + +As hinted in the final [security section](#security-concerns), the next tutorial will involve finding the DAO bot's vulnerabilities and further improving it. + + diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/daos/drop.md b/versioned_docs/version-2.0/Tutorials/Advanced/daos/drop.md new file mode 100644 index 00000000..a43abf22 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/daos/drop.md @@ -0,0 +1,267 @@ +--- +sidebar_label: 'Creating the Drop' +--- +# Creating the Drop + +## Introduction +In this section, you'll take the first step to creating the DAO onboarding experience by designing the FC drop. This drop will be tailored according to the functionality and specifications found in the [Solution Architecture](architecture.md#keypom-solution). + +Recall that the following properties must be met: + +* A [Function Call drop](../../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md) must be used and configured so that it calls a method on the DAO bot contract. +* The middleman contract will then invoke the `add_proposal` method, parse the return value and pass the proposal ID into the `act_proposal` method to approve. + +With this in mind, the aim of this tutorial will be to create the drop matching the above properties. This process can be broken down into two stages: + +1) Connect to the NEAR blockchain. +2) Create the drop with function call data. + +Starting at the `keypom-docs-examples` directory, navigate to the `advanced-tutorial/dao-onboarding-skeleton` folder and open the `createDaoDrop.js` file. + +```bash +cd advanced-tutorials/dao-onboarding-skeleton +``` + +There, you can see the following skeleton code in the file `createDaoDrop.js`. +``` js reference +https://github.com/keypom/keypom-docs-examples/blob/3d2ebdfdfe601bc7471a62e859682abaf9afb7cf/advanced-tutorials/dao-onboarding-skeleton/createDaoDrop.js#L1-L29 +``` + +:::note +While the skeleton code allows you to follow alongside the tutorial, the completed code can be found in `advanced-tutorial/dao-onboarding`. +::: + +--- + +## Connecting to NEAR +In this section, you'll be addressing the first step which is connecting to the NEAR network. + +This is done with `NEAR-API-JS` and consists of: + +* Selecting which network to connect to (testnet or mainnet). + +* Specifying the location where the keys are stored for the drop funder's account. This location is commonly in the `~/.near-credentials` folder on your local machine. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/3d2ebdfdfe601bc7471a62e859682abaf9afb7cf/advanced-tutorials/dao-onboarding/pre-security/createDaoDrop.js#L19-L39 +``` + +--- + +## Creating the Drop +In this section, you'll create the function call drop to meet the functional requirements defined earlier. + +### Function Call Drop Basics + +#### Initializing the SDK + +This process starts with calling the `initKeypom` function to initialize the SDK. + + +```js +// Change this to your account ID +const FUNDER_ACCOUNT_ID = "minqi.testnet"; +const NETWORK_ID = "testnet" +async function createDaoDrop() { + // Initiate connection to the NEAR blockchain. + const CREDENTIALS_DIR = ".near-credentials"; + ... + ... + let near = await connect(nearConfig); + + await initKeypom({ + near, + network: NETWORK_ID, + }); +} +``` + +After `initKeypom` is called, the FC Drop can be created by calling `createDrop` and adding an `fcData` parameter. + +#### Defining the Function Call Data + +The `fcData` is an object that defines the methods that will be called for any given key use: + + +```bash +fcData +└── methods +``` + +For this Keypom drop, only a single function call will be needed which invokes a method on the middleman contract. In this tutorial, that method is called `new_auto_registration`. + +```js +methods: [ + [ + "new_auto_registration" + ] +] +``` + +In reality, each method is not simply a string as shown above. The methods require the following parameters: + +- `receiverId`: The contract receiving the function call. +- `methodName`: The function to be called on the receiver contract. +- `args`: A stringified JSON object of all the arguments to be passed into `methodName`. +- `attachedDeposit`: The yoctoNear deposit attached to the function call when the key is used. + +For more information on the `methods` parameter, please see the [TypeDocs](../../../keypom-sdk/Core/interfaces/Method.md) + +In summary, the `fcData` should look something like this: + +```js +fcData: { + methods: [ + // First key use + [ + { + receiverId: DAO_BOT, + methodName: "new_auto_registration", + args: SOME_ARGS, + attachedDeposit: SOME_DEPOSIT + } + ], + ] +} +``` + +The required arguments and attached deposits will be covered in a later section. + +### Adding Proposal and Injected Arguments + +The DAO bot will need to know what proposal to add and so that information should be passed in as arguments. From the [SputnikV2 ReadMe](https://github.com/near-daos/sputnik-dao-contract#add-proposal), it can be seen that the proposal will need the following structure. +```json +{ + "proposal": { + "description": "Auto-Registering New Member", + "kind": { + "AddMemberToRole": { + "member_id": "new-moon-dao-member-1.testnet", + "role": "new-onboardee" + } + } + } +} +``` +:::caution +The `role` in the proposal **must already exist** in the DAO. This is because the `AddMemberToRole` proposal from SputnikV2 only works with existing roles. +::: + +In order for the onboarding to perform as expected, the `member_id` field must be set to the wallet address for the account that is onboarding. To do this you can use Keypom Arguments which are important pieces of information that can be passed into specified fields when a key is used. + +The following optional Keypom arguments are exposed for each individual method in the `fcData` alongside the required receiverId, methodName, attachedDeposit etc. + +They tell Keypom where to inject certain parameters for each function call. + +- `accountIdField`: The name of the account that is claiming the linkdrop. +- `dropIdField`: The [`dropId`](../../../keypom-sdk/Core/interfaces/Drop.md#dropid) of the drop that the claim is being called on. +- `keyIdField` The unique identifier, [`keyId`](../../../keypom-sdk/Core/interfaces/KeyInfo.md#keyid), of the key that is being used to claim. +- `funderIdField` the `accountId` of the person funding the drop. + +In this case, the `accountIdField` should be set to `proposal.kind.AddMemberToRole.member_id`. This will, upon the key being claimed, tell Keypom to inject the `accountId` of the user claiming into the argument's proposal object under the `kind.AddMemberToRole.member_id` field. + +In addition to the `accountIdField`, an attached deposit must be sent to cover the cost of the DAO's [proposal bond](https://github.com/near-daos/sputnik-dao-contract/blob/2b19edb50e4542e1b8a6769023f2318c70255ee9/sputnikdao2/src/policy.rs#L153C1-L154). In this case, the bond is set to 0.1 $NEAR. + +Finally, the FC drop should pass the desired DAO contract to the middleman DAO bot into the `dao_contract` argument. + +In summary, the final `fcData` should look as follows. + +```js +fcData: { + methods: [ + [ + { + receiverId: DAO_BOT_CONTRACT, + methodName: "new_auto_registration", + args: JSON.stringify({ + dao_contract: DAO_CONTRACT, + proposal: { + description: "Auto-Registering New Member", + kind: { + AddMemberToRole:{ + role: "new-onboardee-role" + } + } + } + }), + accountIdField: "proposal.kind.AddMemberToRole.member_id", + // Attached deposit of 0.1 $NEAR, the Sputnik proposal deposit, for when the receiver makes this function call + attachedDeposit: parseNearAmount("0.1") + } + ], + ] +} +``` + +### Gas Requirements +The final consideration to make is the amount of gas needed to claim the drop. To determine this amount, you can test your drop by using `create_account_and_claim`. To maximize gas usage, it is important to use an `account_id` of maximum length (64 characters). + +By default, MyNearWallet will attach 100 [TGas](https://docs.near.org/concepts/basics/transactions/gas#thinking-in-gas) to linkdrop claims. This can be used as a starting point when testing your drop but if more gas is needed, it can be overriden manually. + +If you were to use the default 100 TGas, it would work for claims to existing wallets but would throw an error for `create_account_and_claim`. This is because the drop uses more Gas when a new account is created. This can be seen in the screenshot below. To mitigate this, you can set the required gas to be 175 TGas. + +

failed txn not enough gas

+ +:::note +For the majority of use-cases, the 100 TGas default is more than enough. With the DAO bot, however, the middleman contract is quite complex and requires more Gas +::: + +To combat this, you can add a `requiredGas` argument to your `createDrop`. This will increase the overall amount of gas available to each key in your drop. + +```js +const TERA_GAS = 1000000000000; +let {keys, dropId} = await createDrop({ + account: fundingAccount, + numKeys: 1, + ... + requiredGas: (175*TERA_GAS).toString(), + ... +}) +``` + +With this modification, the [transaction](https://explorer.testnet.near.org/transactions/AoH2PDMvtdeNqwxjMJdPE6BmVxV1TKVGhdCybL9YsyG6) shows that the drop is claimed successfully and the user is registered into the DAO. + +### Final Drop Structure + +Putting it all together, the final drop structure should look something like this: + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/3d2ebdfdfe601bc7471a62e859682abaf9afb7cf/advanced-tutorials/dao-onboarding/pre-security/createDaoDrop.js#L48-L81 +``` + +--- + +## Creating Onboarding Links +The last step in this process is to create the links themselves so that you can easily register people into your DAO. For this tutorial, you will make use of MyNEARWallet's linkdrop claim flow which has the following URL: `https://testnet.mynearwallet.com/linkdrop/CONTRACT_ID/SECRET_KEY`. + +You can utilize the `formatLinkdropUrl` function for convenience. It can take a custom URL that contains `CONTRACT_ID` and `SECRET_KEY` and it will replace them with the contract ID and secret keys passed in. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/3d2ebdfdfe601bc7471a62e859682abaf9afb7cf/advanced-tutorials/dao-onboarding/pre-security/createDaoDrop.js#L84-L89 +``` + +--- + +## Final Code + +Putting everything together, the final code for the drop should be as shown below: + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/3d2ebdfdfe601bc7471a62e859682abaf9afb7cf/advanced-tutorials/dao-onboarding/pre-security/createDaoDrop.js#L1-L105 +``` + +:::note +This drop will not work until the DAO bot is created and deployed. The full script and process will be tested in the [Final Product](./final.md) section. +::: + +--- + +## Conclusion + +So far, you've broken down the DAO auto-registration tool into functional requirements. You then used them to write a script to create the accompanying drop. + +This included [creating the proposal and using the `accountIdField`](#adding-proposal-and-injected-arguments) to attach the wallet address for the account that will be onboarded. You then finished that off by [creating the linkdrops](#creating-onboarding-links) to distribute to prospective onboardees. + +In the next tutorial, you'll be creating the DAO bot that the FC drop you just created will be interacting with. + + diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/daos/final.md b/versioned_docs/version-2.0/Tutorials/Advanced/daos/final.md new file mode 100644 index 00000000..b8d54976 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/daos/final.md @@ -0,0 +1,178 @@ +--- +sidebar_label: 'Final Product' +--- +# Final Product +Welcome to the last section of this DAO auto-registration tutorial! Here, you'll be seeing the full toolchain in action. + +## Getting Started +To follow along on your own machine, you can clone the code from the [Keypom docs examples repository](https://github.com/keypom/keypom-docs-examples) and run the following command in the root folder `keypom-docs-examples`: + +``` bash +cd advanced-tutorials/dao-onboarding && yarn +``` + +:::note +If you have been following along and wish to run your own code, run: + +``` bash +cd advanced-tutorials/dao-onboarding-skeleton && yarn +``` +::: + +## Creating and Claiming the Drop + +Before you create and claim your drop, you must ensure that the DAO bot (`dao-bot.keypom.near` or `keypom-dao-bot.testnet`) holds its own special role on your DAO. This role must have permissions to add and vote on `AddMemberToRole` proposals. + +Additionally, as highlighted in the [drop creation](./drop.md#adding-proposal-and-injected-arguments) section, the role that you are planning to auto-register new members into must already exist. + +:::info note +This demonstration will be done on mainnet using `createDaoDrop-mainnet`. This is to provide you with visuals on [BOS](https://near.org/hack.near/widget/DAO.Profile?daoId=keypom-test.sputnik-dao.near). + +

bos showcase

+ +::: + +To execute the script, run the following command in the `advanced-tutorials/dao-onboarding` folder: + +```bash +node createDaoDrop-mainnet +``` + +This should give you the following output: +```bash +Receipts: DFf4iY9S4vUiVEZJy2neq4EhcKJXFKyoQqsDb2rvZrHF, 3E7S1h6dBmRZ14BA91CatTzaTEUmj3zLxyYAMG36MZpz + Log [v2.keypom.near]: Current Block Timestamp: 1685141815019548108 + Log [v2.keypom.near]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000 + Log [v2.keypom.near]: Total required storage Yocto 13850000000000000000000 + Log [v2.keypom.near]: Current balance: 1.223441, + Required Deposit: 0.2350981, + total_required_storage: 0.01385, + Drop Fee: 0, + Key Fee: 0 Total Key Fee: 0, + allowance: 0.0202481 total allowance: 0.0202481, + access key storage: 0.001 total access key storage: 0.001, + deposits less none FCs: 0.1 total deposits: 0.1 lazy registration: false, + deposits for FCs: 0.1 total deposits for FCs: 0.1, + uses per key: 1 + None FCs: 0, + length: 1 + GAS to attach: 100000000000000 + Log [v2.keypom.near]: New user balance 0.9883428 + Log [v2.keypom.near]: Fees collected 0 + + + Auto-Registration Links: + + https://wallet.near.org/linkdrop/v2.keypom.near/5JesG9FdfuFq3b3PA7p3NPY1SpZvi1DdtPs9ANumx9VRDE5iXyUsMT4Qcn132DFiDNiwjccFyoqAYGYP46UVuTVb +``` + +## Claiming the Drop and Viewing Changes + +For this example, the drop will be claimed with [`keypom-dao-tutorial-member.near`](https://explorer.near.org/accounts/keypom-dao-tutorial-member.near). The aim will be to auto-register this account into [MoonDAO](https://near.org/hack.near/widget/DAO.Profile?daoId=keypom-test.sputnik-dao.near). + +

explorer claim

+ +After claiming, you can check the DAO policy [here](https://near.org/hack.near/widget/DAO.Profile?daoId=keypom-test.sputnik-dao.near) in the *Policy* tab. + +

bos policy

+ +πŸŽ‰ As you can see, `keypom-dao-tutorial-member.near` has automatically been registered into the DAO by simply claiming a linkdrop! πŸŽ‰ + +The transaction for this auto-registration can be found [here](https://explorer.near.org/transactions/2z9L9HcFKTJUANMcrQaSQMXsSbPihc472Lk83AgEtszH). + +### Additional Viewing Methods + +You can also view the proposal that was created and approved by the DAO bot by using the following: + +``` +near view keypom-test.sputnik-dao.near get_proposal '{"id":9}' +``` + +
+Auto-Registration Proposal +

+ +``` bash +View call: keypom-test.sputnik-dao.near.get_proposal({"id":9}) +{ + id: 9, + proposer: 'dao-bot.keypom.near', + description: 'mooooooooon', + kind: { + AddMemberToRole: { + member_id: 'keypom-dao-tutorial-member.near', + role: 'new-onboardee-role' + } + }, + status: 'Approved', + vote_counts: { 'Keypom DAO Bot': [ 1, 0, 0 ] }, + votes: { 'dao-bot.keypom.near': 'Approve' }, + submission_time: '1685145461041750017' +} +``` + +

+
+ +The DAO policy can also be checked through the command line as well: +``` +near view keypom-test.sputnik-dao.near get_policy' +``` + +
+DAO Policy +

+ +``` bash +View call: keypom-test.sputnik-dao.near.get_policy() +{ + roles: [ + { name: 'all', kind: 'Everyone', permissions: [], vote_policy: {} }, + { + name: 'new-onboardee-role', + kind:{ + Group: [ + 'keypom-dao-tutorial-member.near', + 'minlu.near', + 'mintlu.near' + ] + }, + }, + ... + ... + ], + default_vote_policy: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }, + proposal_bond: '100000000000000000000000', + proposal_period: '604800000000000', + bounty_bond: '100000000000000000000000', + bounty_forgiveness_period: '604800000000000' +} +``` + +

+
+ + + +## How You Can Use DAO Bot +This DAO bot contract you just made has been deployed to the account `keypom-dao-bot.testnet` and `dao-bot.keypom.near` and is open for you to use! You can create your own [FC drops](drop.md#final-code) to interface and experiment with it. + +:::caution +Prior to using the DAO Bot, ensure that it is given a role in your DAO capable of creating and approving `AddMemberToRole` proposals. For more info, see the [solution architecture](architecture.md#optimizing-the-approach) +::: + +If you wish to make modifications to the DAO bot, the source code is found [here](https://github.com/keypom/dao-bot). You can modify to your liking and deploy the contract as you see fit. + +:::note +The following functions have been included in the DAO bot in case you created a drop using older versions of the Keypom contract, such as `v1-4.keypom.near`. Note that you will need to deploy the DAO bot and modify these values yourself. +``` rust +pub fn change_keypom_contract(&mut self, new_contract: AccountId) +pub fn view_keypom_contract(&self) -> AccountId +``` +::: + +## Conclusion + +In this tutorial, you learned how you can use a [Keypom FC drop](drop.md) and a newly created [DAO bot](daobot.md) to automatically register new users into your DAO and get the onboarding process started right away. You also learned how to [use `keypom_args` to validate authenticity](security.md) of incoming calls from Keypom drops. + +This allows new members to focus on topics and discussions that are DAO specific rather than needing to worry about creating an account and learning the technical jargon of the NEAR blockchain. This onboarding flow also frees up the voting members to focus on the DAOs actual tasks rather than voting to approve new members. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/daos/introduction.md b/versioned_docs/version-2.0/Tutorials/Advanced/daos/introduction.md new file mode 100644 index 00000000..aba5f340 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/daos/introduction.md @@ -0,0 +1,77 @@ +--- +sidebar_label: 'Introduction' +--- +# Introduction +In this tutorial, you'll learn how to create a seamless DAO registration experience that allows you to onboard anyone directly into your DAO with the click of a link! + +--- + +## Background +DAOs are a popular topic in crypto and offer powerful on-chain governance features. They work very well in most cases but there are 2 key issues that Keypom will solve. + +1. There is a **high barrier to entry** for an everyday user who might not have a crypto wallet. +2. Being enrolled into the DAO is a **2 step process**. First, a proposal must be made and then it needs to be approved by an existing quorum of voting members. + +Both of these act as bottlenecks in attracting and onboarding new members. + +This is where Keypom can help. Using a [function call drop](../../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md), Keypom can automatically register users into your DAO **as part of the wallet creation process**. Not only does this eliminate the need for a wallet, but it also bypasses the 2 step approval process. + +> **NOTE** If someone has a wallet already, they can skip account creation and register their existing wallet into the DAO. + + +## Success Criteria + +This tutorial will cover the following requirements to achieve a seamless onboarding experience for new users. + +- Members don't need an existing wallet to join the DAO. +- The invitations do not require a 2 step process where a council votes and reaches a quorum for every single registration. +- The drop cannot be used for malicious purposes. + +With these requirements met, you will be able to seamlessly and automatically register new members into your DAO while maintaining the integrity of your DAO's members. + +:::info +This tutorial will have members registered into the MoonDAO, a [Sputnik V2](https://github.com/near-daos/sputnik-dao-contract) compatible DAO. + +

ticketing

+::: + +--- + +## Prerequisites + +For the this tutorial series, you can choose to follow along on your own machine. To do so, you must have the following: + +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [Keypom Core SDK](https://github.com/keypom/keypom-js/tree/main/packages/core#installation) + + +> **NOTE** If you want to reference the finished tutorial code, it can be found [here](https://github.com/keypom/keypom-docs-examples/tree/main/advanced-tutorials/dao-onboarding). + +--- + +## Creating your Project +In this section, you'll install the skeleton project and get familiar with the codebase. + +First, you'll want to clone the repo: + +```bash +git clone https://github.com/keypom/keypom-docs-examples.git && cd advanced-tutorials +``` + +Second, install all the dependencies + +``` +yarn install && cd advanced-tutorials/dao-onboarding-skeleton && yarn +``` + +At this point, all the dependencies should be installed and you should be in the `advanced-tutorials/dao-onboarding-skeleton` folder. Here you'll find the following files required to build out your app. + +```bash +/dao-onboarding-skeleton +└── configurations.js +└── createDaoOnboarding.js +└── package.json +└── view-roles.js +``` + +With this setup complete, you are ready to begin building the onboarding experience, starting by expanding upon the success criteria and breaking down the problem further. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/daos/security.md b/versioned_docs/version-2.0/Tutorials/Advanced/daos/security.md new file mode 100644 index 00000000..fa1bfb29 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/daos/security.md @@ -0,0 +1,331 @@ +--- +sidebar_label: 'DAO Bot Security Concerns' +--- +# DAO Bot Exploit Solution + +Up to this point, the DAO bot has a **major** security exploit. In this section, you'll learn about the exploit, how to fix it and how you can prevent similar exploits when writing Keypom compatible contracts in the future. + +--- + +## Breaking Down the Problem +To illustrate the exploit, a quick example can be analyzed: + +Min is a council member on MoonDAO. Since he has run onboarding campaigns through Keypom before, the DAO bot has its own role in MoonDAO. + +Ben is a malicious user and is jealous because he was never allowed to join MoonDAO. He intends on adding himself to MoonDAO without Min's consent. + +To do this, he creates an identical FunctionCall drop, exactly like the one Min used. This FunctionCall drop will invoke `new_auto_registration` on the DAO bot. + +[Recall](daobot.md#adding-the-proposal) that the DAO bot currently checks 2 things before performing the auto-registration: +1. The function call is coming from Keypom. +2. There is enough attached deposit to cover the proposal bond. + +Ben could create the an FC drop with the following method data, which would pass the first check. As part of the FC data, Ben would add an attached deposit of 0.1 $NEAR, which would pass the second check. + +At that point, when claimed, the checks would pass and the DAO bot would take the proposal object and pass it into the call to `add_proposal` on the MoonDAO contract. + +Since the DAO bot has the special role, it would automatically approve the proposal and Ben would be added to MoonDAO. + +In order to fix this, there needs to be a check in place to ensure that the FC drop originated from a trusted funder. + +
+Ben's Malicious Drop +

+ +```js +{ + receiverId: DAO_BOT_CONTRACT, + methodName: "new_auto_registration", + args: JSON.stringify({ + dao_contract: MOON_DAO, // Points to MOON DAO + proposal: { + description: "Auto-Registering New Member", + kind: { + AddMemberToRole:{ + member_id: BEN, // Ben is adding himself! + role: "new-onboardee-role" + } + } + } + }), + attachedDeposit: parseNearAmount("0.1") +} +``` + +

+
+ +:::warning +To summarize, since the DAO bot has the role to approve members *and* Keypom allows anyone to interact with the DAO bot through their own FC drops, a malicious drop could be created to add *anyone to any DAO*. + +To fix this, the DAO bot needs to check that the FC drop is coming from a trusted funder. +::: + +## Receiving the Drop Funder + +Since the DAO bot will need to check if the funder is trusted, the function interface for `new_auto_registration` should be updated to include a new argument, `funder`. + +```rs +new_auto_registration(dao_contract: AccountId, funder: AccountId, proposal: ProposalInput) +``` + +In order for this funder to be passed in, the FC drop will need to be modified. [Recall](drop.md#adding-proposal-and-injected-arguments) that Keypom can optionally inject important data into the outgoing arguments. This data can either be the: +- Drop ID +- Key ID +- Claiming account ID +- Drop funder ID + +In this case, the drop's funder ID can be injected into the `new_auto_registration` `funder` argument if the `funderIdField` is set to `funder`. Therefore, the FC drop should be modified accordingly: + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/3d2ebdfdfe601bc7471a62e859682abaf9afb7cf/advanced-tutorials/dao-onboarding/createDaoDrop.js#L57-L81 +``` + +This works great, but there is just one slight problem. Ben could hardcode the arguments to the method `new_auto_registration` and specify that the `funder` is Min, even though Ben created the drop. + +## Validating Keypom Args + +Validating what arguments came from Keypom, and what arguments were hardcoded by the funder is an extremely important topic to ensure the security of your smart contracts. Every time an FC drop is claimed, Keypom will *always* attach an extra parameter to the arguments of the function. This argument is `keypom_args` and is an object containing information about what was injected by Keypom. The `keypom_args` are created by Keypom and cannot be impersonated with any arguments. They are the canonical source of truth for what Keypom injected. + +```js +KeypomArgs { + account_id_field: String | undefined + drop_id_field: String | undefined + key_id_field: String | undefined + funder_id_field: String | undefined +} +``` + +This object is sent along any method call that Keypom makes and can be used to perform the validation. If the DAO bot contract took in the keypom args, and did an assertion that the `funder_id_field` was set to `funder`, then the exploit would be fixed. There would be *no* way for Ben to impersonate Min as the funder of the drop in order to gain access to MoonDAO. + +```rs +new_auto_registration(dao_contract: AccountId, funder: AccountId, proposal: ProposalInput, keypom_args: KeypomArgs) { + require!(keypom_args.funder_id_field == Some("funder".to_string()), "BEN IS MALICIOUS! Funder is not Min!"); +} +``` + +--- + + +## Checking If the Funder is Trusted +At this point, the DAO bot knows the funder's account ID and has validated that they created the drop. The next step is to check if the funder holds a trusted role within the DAO. + +While the definition of "trusted role" can change between DAOs, for this tutorial, this role will be `council`. + +![Example banner](./daobot-flow.svg) + +:::note +If your DAO wishes to change the definition of a "trusted role", you are free to modify and deploy your own DAO bot contract as you see fit. +::: + +### Approach + +If the DAO bot was able to query for the policy information, then it could filter through the roles and find `council`. At this point, it could simply check if the funder is a member of `council` and then initiate the auto-registration flow + +By looking at the [SputnikV2 contract](https://github.com/near-daos/sputnik-dao-contract/blob/main/sputnikdao2/src/policy.rs), you can see that each DAO's `Policy` has a `roles` vector. +```rust +pub struct Policy { + /// List of roles and permissions for them in the current policy. + pub roles: Vec, + ... +} +``` + +This vector contains each role their members. +```rust +pub struct RolePermission { + /// Name of the role to display to the user. + pub name: String, + /// Kind of the role: defines which users this permissions apply. + pub kind: RoleKind, + ... +} + +pub enum RoleKind { + /// Matches everyone, who is not matched by other roles. + Everyone, + /// Member greater or equal than given balance. Can use `1` as non-zero balance. + Member(U128), + /// Set of accounts. + Group(HashSet), +} +``` + +A sample DAO policy can be seen below: + +
+Sample DAO policy +

+ +``` bash +View call: moondao.sputnikv2.testnet.get_policy() +{ + roles: [ + { name: 'all', kind: 'Everyone', permissions: [], vote_policy: {} }, + { + name: 'council', + kind: { Group: [ 'minqi.testnet' ] }, + permissions: [ + 'add_member_to_role:VoteRemove', + 'upgrade_self:VoteRemove', + 'policy:VoteReject', + 'bounty_done:AddProposal', + 'policy:VoteRemove', + 'set_vote_token:VoteReject', + 'upgrade_remote:AddProposal', + 'remove_member_from_role:VoteApprove', + 'add_bounty:VoteRemove', + 'vote:VoteApprove', + '*:Finalize', + 'bounty_done:VoteApprove', + 'transfer:VoteRemove', + 'add_bounty:VoteReject', + 'add_member_to_role:VoteReject', + 'set_vote_token:VoteRemove', + 'transfer:VoteApprove', + 'transfer:VoteReject', + 'config:VoteReject', + 'call:VoteReject', + 'remove_member_from_role:VoteReject', + 'policy:AddProposal', + 'bounty_done:VoteRemove', + 'set_vote_token:AddProposal', + 'upgrade_self:AddProposal', + 'set_vote_token:VoteApprove', + 'config:VoteApprove', + 'policy:VoteApprove', + 'add_bounty:VoteApprove', + 'remove_member_from_role:VoteRemove', + 'transfer:AddProposal', + 'upgrade_remote:VoteReject', + 'call:VoteApprove', + 'add_member_to_role:AddProposal', + 'call:AddProposal', + 'call:VoteRemove', + 'config:AddProposal', + 'remove_member_from_role:AddProposal', + 'upgrade_remote:VoteApprove', + 'upgrade_remote:VoteRemove', + 'upgrade_self:VoteApprove', + 'upgrade_self:VoteReject', + 'vote:VoteReject', + 'vote:VoteRemove', + 'vote:AddProposal', + 'add_member_to_role:VoteApprove', + 'config:VoteRemove', + 'add_bounty:AddProposal', + 'bounty_done:VoteReject' + ], + vote_policy: { + add_member_to_role: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }, + policy: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }, + vote: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }, + set_vote_token: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }, + remove_member_from_role: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }, + transfer: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }, + add_bounty: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }, + upgrade_self: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }, + bounty_done: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }, + call: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }, + config: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }, + upgrade_remote: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] } + } + }, + { + name: 'Keypom DAO Bot', + kind: { Group: [ 'keypom-dao-bot.testnet' ] }, + permissions: [ + 'add_member_to_role:VoteApprove', + 'add_member_to_role:VoteRemove', + 'add_member_to_role:VoteReject', + 'add_member_to_role:AddProposal' + ], + vote_policy: { + transfer: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] }, + upgrade_self: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] }, + remove_member_from_role: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] }, + set_vote_token: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] }, + bounty_done: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] }, + policy: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] }, + add_member_to_role: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] }, + call: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] }, + config: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] }, + upgrade_remote: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] }, + vote: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] }, + add_bounty: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 1 ] } + } + } + ], + default_vote_policy: { weight_kind: 'RoleWeight', quorum: '0', threshold: [ 1, 2 ] }, + proposal_bond: '100000000000000000000000', + proposal_period: '604800000000000', + bounty_bond: '100000000000000000000000', + bounty_forgiveness_period: '604800000000000' +} +``` + +

+
+ +### Verifying Funder and Getting DAO Policy + +The first step is to call `get_policy` on the DAO contract. After `get_policy` is called, a callback function is invoked to receive and parse the policy. + +``` rust reference +https://github.com/keypom/dao-bot/blob/2c3a7bac8b18e1134483f0736e2ca9e2152f8509/src/lib.rs#L103-L119 +``` + +### Ensuring Funder is Council +After the policy is received, the council role is found using a filter. The role's hashset is then searched to see if the funder exists in that set. If yes, then the auto-registration continues and `add_proposal` is called. + +```rust reference +https://github.com/keypom/dao-bot/blob/2c3a7bac8b18e1134483f0736e2ca9e2152f8509/src/lib.rs#L122-L164 +``` + +--- + +## Human Gating the DAO Bot (Mainnet Only) +With the introduction of the [SoulBound Token Standard](https://github.com/robert-zaremba/NEPs/blob/robert/nep-sbt/neps/nep-0393.md), a proof-of-humanity protocol was implemented on NEAR, known as [I-Am-Human](https://i-am-human.app/). With this came the ability to human-gate certain actions, such as self-nominating or participating in governance. + +As DAOs are critical in governance and community, the need to human-gate these automatic DAO registrations became a high priority. By leveraging the I-Am-Human Registry's [`is_human`](https://github.com/near-ndc/i-am-human#additional-queries) human checker, you can open up the option for you DAO auto-registrations to be human-gated using the following code to parse the `is_human` response. + +``` rust reference +https://github.com/keypom/dao-bot/blob/a19a2d29b42514a1e9d5f11c993b79f207c4a00f/src/lib.rs#L158-L180 +``` + +:::info +This check will only be performed **if specified in the drop**! By default, human-gating is turned **off**. + +Below is an example of a drop that is human-gated. Notice the `human_only` parameter! +::: + +``` js reference +https://github.com/keypom/keypom-docs-examples/blob/290cbce2c939573dbc8cb2b03598c2b2af5f91c2/advanced-tutorials/dao-onboarding/createDaoDrop-mainnet.js#L48-L84 +``` + + +--- + +## Full Code +The code for this can be seen below: + +```rust reference +https://github.com/keypom/dao-bot/blob/2c3a7bac8b18e1134483f0736e2ca9e2152f8509/src/lib.rs#L103-L164 +``` + +:::info +The full code for the completed DAO bot can be found [here](https://github.com/keypom/dao-bot/blob/main/src/lib.rs). +::: + +--- + + +## Conclusion + +In this tutorial, you learned how people can use [malicious drops](#breaking-down-the-problem) to exploit your DAO. You then saw how you can protect yourself, by checking the incoming call's drop funder and their roles in your DAO. This started with [receiving the drop funder](#receiving-the-drop-funder) by using `keypom_args`, then [verifying injected arguments](#checking-the-drop-funder) and finally parsing the DAO policy and [checking the funder's roles](#ensuring-funder-is-council) in the DAO. + +All of this work ensures that only approved members (such as Council) can use Keypom FC drops to create auto-registration campaigns for your DAO. This helps ensure the integrity of your DAO as you bring on more new members. + +This concept and approach can be used any time where important assets or processes are gated only by arguments such as a DAO contract or NFT series ID. It is important to ensure that the incoming drop is coming from a trusted source and that the arguments are validated as having been injected by Keypom. This will protect you from malicious actors creating identical Keypom drops to exploit your products. + +In the next section, you'll be reviewing all of your work so far by testing the whole auto-registration system. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/homepage.md b/versioned_docs/version-2.0/Tutorials/Advanced/homepage.md new file mode 100644 index 00000000..4d8ecddb --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/homepage.md @@ -0,0 +1,6 @@ +--- +sidebar_label: 'Coming Soon...' +--- +# Advanced Tutorials + +Advanced Tutorials are in progress! \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/concept.md b/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/concept.md new file mode 100644 index 00000000..07faeccd --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/concept.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Concept' +--- +# Concept \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/final.md b/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/final.md new file mode 100644 index 00000000..d90001ba --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/final.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Final Product' +--- +# Final Product \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/skeleton.md b/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/skeleton.md new file mode 100644 index 00000000..d5e552ef --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/multi-sig/skeleton.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Skeleton Code' +--- +# Skeleton Code \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/final.md b/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/final.md new file mode 100644 index 00000000..d90001ba --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/final.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Final Product' +--- +# Final Product \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/introduction.md b/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/introduction.md new file mode 100644 index 00000000..a7982f0e --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/introduction.md @@ -0,0 +1,18 @@ +--- +sidebar_label: 'Introduction' +--- +# Introduction + +Recurring payments are quite a common situation. Let’s say you need to send a contractor $50 USDC every week for 10 weeks. With Web2, you would need to provide a payment method and trust the end user with this sensitive information. + +Using Keypom, you can eliminate this risk by sending them a key with limited funds attached. Instead of exposing your private information, you could create a key with 10 uses, usable once a week. You can then pre-load $500 USDC for the 10 weeks, or $50 USDC for the first week and fund the rest as the work continues. At that point, you would simply hand over the key to the user and they can claim once a week. + +

+ ticketing +

+ +In this tutorial, you'll learn how to utilize Keypom to create Web3 recurring payments. + +:::info +🚧 Full tutorial coming soon... 🚧 +::: \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/skeleton.md b/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/skeleton.md new file mode 100644 index 00000000..d5e552ef --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/subscriptions/skeleton.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Skeleton Code' +--- +# Skeleton Code \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/analytics.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/analytics.md new file mode 100644 index 00000000..ea0d32c3 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/analytics.md @@ -0,0 +1,80 @@ +--- +sidebar_label: 'View Event Analytics' +--- +# View Event Analytics +## Introduction +In this section you'll learn how to track your event's analytics, such as number of attendees that showed up, those that claimed POAPs and more! This can be broken down into two approaches: + +1) Creating a script. +2) Using existing BOS tools. + +The focus for now will be the script. The next tutorial section will showcase the existing BOS tools. + +Starting at the `keypom-docs-examples` directory, navigate to the `ticket-app-skeleton/others` folder and open the `event-analytics.js` file. + +```bash +cd advanced-tutorials/ticket-app-skeleton/others +``` + +There, you can see the following skeleton code in the file `event-analytics.js`. +``` js reference +https://github.com/keypom/keypom-docs-examples/blob/449992de80888934dcbccfadefd88601d9d6638d/advanced-tutorials/ticket-app-skeleton/others/event-analytics.js#L1-L31 +``` + +--- + +## Connecting to NEAR +Connecting to the NEAR network is done with `NEAR-API-JS` and consists of: + +* Selecting which network to connect to (testnet or mainnet). + +* Specifying the location where the keys are stored for the drop funder's account. This location is commonly in the `~/.near-credentials` folder on your local machine. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/449992de80888934dcbccfadefd88601d9d6638d/advanced-tutorials/ticket-app/others/event-analytics.js#L21-L38 +``` + +--- + +## Getting Drop and Keys +Here, you want to make sure you get the proper drop that represents your event. To do this, you want to use the drop's `dropId`. In order to include the keys in the returned data, ensure that `withKeys` is true. + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/449992de80888934dcbccfadefd88601d9d6638d/advanced-tutorials/ticket-app/others/event-analytics.js#L42-L55 +``` +:::note +If you don't have your `dropId`, you can use a key from the drop as well. This is done by passing in either `publicKey` or `secretKey` into `getDropInformation` +::: + +The total number of tickets can also be found by using the drop's `next_key_id`. This will be helpful to determine how many keys have been fully claimed + +--- + +## Compiling Data +From the original [design of the ticket drop](architecture.md#keypom-solution), you know the following. + +* The first key use indicates when an attendee is scanned into the event. +* The second key use sends the attendee a POAP, after which the key is deleted + +From this, you can derive the following about a key's [remaining uses](../../../keypom-sdk/Core/interfaces/ProtocolReturnedKeyInfo.md#remaining_uses). + +* `remaining_uses == 2`: the ticket has not yet been scanned, hence the ticket holder did not attend. +* `remaining_uses == 1`: the attendee was scanned in and thus attended + +Notice how there is no case for when `remaining_uses` = 0. This is because when keys are fully used, they are deleted. This is when collecting the total number of keys above becomes helpful. The number of fully used keys can be found by subtracting the number of found keys from the total. + +* `drop.next_key_id - keys.length` = number of fully used keys. + +All this can be put into the following code block. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/449992de80888934dcbccfadefd88601d9d6638d/advanced-tutorials/ticket-app/others/event-analytics.js#L57-L73 +``` + +--- + +## Conclusion +In this short bonus section, you saw how to get analytics for your events. This consisted of getting the keys from your drop and keeping track of the number of remaining uses for each key. + +In the following section, you'll see some pre-built BOS tooling for a no-code solution! \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/architecture.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/architecture.md new file mode 100644 index 00000000..590d1839 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/architecture.md @@ -0,0 +1,69 @@ +--- +sidebar_label: 'Solution Architecture' +--- +# Solution Architecture +In this section, you'll break down the requirements of the ticketing system in order to better understand how to create a solution architecture. This means translating the features from the [ticketing introduction](introduction.md) into tangible goals for the specific Keypom drop and its configurations. + +## Breaking Down the Problem +Recall from earlier, the following features are needed: + +### No wallet is needed to enter + +With traditional events, you would need to burn an NFT in order to gain entry to the event. This model requires the attendee to have a valid wallet with enough $NEAR to cover transaction costs. + +With a Keypom access key, all you need is the private key to gain entrance. This can be turned into a simple QR code that is scanned at the door to gain entrance. + +### Each ticket is unique and cannot be passed-back + +In order to satisfy the requirement that each ticket must be unique and can only be scanned once, the key should be used to sign a simple transaction when it's scanned. This will prevent ticket pass-backs since the host can check the on-chain status of each key. If it's been used already, the host can deny entry. + +When the host scans the QR code and signs the transaction using the key, it should simply modify some state on the contract reflecting that the key has been used. It shouldn't transfer $NEAR to anyone or create any accounts and should be a lightweight transaction on-chain. + +By default, every key has a counter of how many uses it has left before being deleted. In the above scenario, you could create a key with 1 use and once it has been scanned, it will be deleted. If the same QR code would be given to multiple people, the host would realize that the key no longer exists and deny entry. + +To make this transaction extremely lightweight, Keypom allows keys to have `null` function calls whose entire purpose is to decrement the key use counter to prove that the key has been used. These special types of function calls use up a very small amount of gas and are extremely cheap to execute. + +### Attendees are not required to have wifi at the door. + +If the ticket is just a private key in the form of a QR code, the attendee only needs to keep a screenshot or the webpage open on their phone to gain entry to the event. In addition, Apple users can add it to their Apple Wallets as well. This eliminates the need for everyone to have wifi as only the hosts that are scanning and making transactions need wifi to admit attendees. + +### Attendees can setup a new NEAR wallet + +Up until this point, tickets are single-use function calls that execute a `null` method on Keypom. In order for attendees to receive a NEAR wallet after the event for free, the key can be set with 2 uses instead of 1. The first is the `null` method and the second is pre-loaded with a small amount of $NEAR. This $NEAR will cover costs for account creation and sponsor their first couple transactions. + +### NFT POAP available for attendees + +In order to send the attendees a POAP, the second key use will need to not only contain a small amount of $NEAR but also mint an NFT to their new or existing NEAR wallet. This can be done by call a minting function on an existing NFT contract that will create an NFT and send it to the account. + +### Attendance required for POAP + +Currently, anyone with a ticket could manually claim the key (sign transactions) using the Keypom SDK. This means that people could first claim the `null` case and then claim the key again to receive the NFT without physically showing up. + +To solve this, the first key use can be protected with a [password](../../../Concepts/KeypomProtocol/GithubReadme/password-protect.md) that only the host knows. This password will be provided when the QR code is scanned. By password protected the uses, the only way to receive the NFT even if you have the ticket, is to be physically scanned by the host. + + +## Keypom Solution + +From above, the drop must have the following properties to function as intended: + +* A [Function Call drop](../../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md) must be used and configured so that each key has 2 uses. +* The first key use is password protected and `null` (for when the host scans attendees into the event). +* The second key use will have a small amount of $NEAR to cover account creation costs and sponsor the first few transactions. +* The second key use will also call `nft_mint` on an NFT contract which will send the new or existing account a POAP. + +:::tip +The first key use being `null` will allow for a lightweight transaction on-chain to reflect the key use decrement without needing to transfer any $NEAR to anyone or create any accounts. +::: + +A flow chart of this process can be seen below. + +

+ ticketing +

+ +--- + +## Conclusion +In this section, you learned the solutions that would help meet the required features outlined in the introduction. These included using an access key as a ticket to remove the need for attendees to have both a wallet and an internet connection at the door. You also saw how using a multi-use function call drop could allow you to add a Proof-of-Attendance NFT to gift attendees who show up to your event. + +In the next section, you'll be taking the Keypom drop architecture you just created and using it to create the drop. diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/bos-tool.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/bos-tool.md new file mode 100644 index 00000000..f64f87c3 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/bos-tool.md @@ -0,0 +1,61 @@ +--- +sidebar_label: 'πŸš€ BOS Version' +--- +# BOS Version +During the [ETHGlobal Waterloo Hackathon](https://ethglobal.com/showcase/keypom-x-bos-event-ticketing-pow2e), a chunk of this tutorial was ported over to BOS. This section is a quick guide on how to use it. + +> If you run into any bugs or issues, don't hesitate to reach out to [Min on Telegram](https://t.me/minlu00)! + +## Using the BOS Tool +The BOS version of the ticket app is located [here](https://near.org/mintlu.near/widget/kp-ticket-homepage). On this page, you can view your previous tickets, as well as create a new ticket drop. + +

+ BOS ticketing +

+ +:::note +**All** your drops will appear in the viewer, not just the ticket drops. +::: + +### Creating Ticket Drops +This section of the tool allows you to create a standard ticket drop. These drops use the following structure: +- 2 Key uses + - First is null and password protected. + - Second mints the POAP +- A customizable password and POAP. The POAP is minted as part of a series on `nft-v2.keypom.near` + +

+ create ticketing drop +

+ +When using the tool, there are a few tips to keep in mind: +- **Save your POAP information before creating the drop** + - This is **very** important, if you do not, the drop will be created without the POAP 😒 +- The name of the event will automatically be hyphenated and lowercased +- When creating the drop, the password will not appear in the transaction information. This will populate after you press "Confirm" +

+ bad ticketing password +

+ +--- + +## Using the Scanner +To open the scanner on your own machine, you can clone the code from the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repository and run the following command in the root folder `keypom-docs-examples/`: + +``` bash +cd advanced-tutorials/ticket-app-mainnet && yarn && yarn start +``` + +This should bring you to the following page at `localhost:1234` + +

+ ticketing +

+ +From there, you can navigate to the following URL: +``` +http://localhost:1234/v2.keypom.near/scanner +``` + +It will immediately prompt you for a password. This is the password you set in the [creating tickets section](#creating-ticket-drops). If you enter it incorrectly, you can refresh the page and re-enter the password. From there, you can begin presenting tickets and allowing people into your event! + diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop-test.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop-test.md new file mode 100644 index 00000000..06cb9911 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop-test.md @@ -0,0 +1,266 @@ +--- +sidebar_label: 'Testing the Drop' +--- +# Testing the Drop + +## Introduction +In the last section you designed and created a drop according to the specifications you learned about in the [Solution Architecture](architecture.md#keypom-solution). + +In this tutorial, you'll create a generalized method that will determine whether or not to allow someone entry into the event. It will be used to both test the drop logic and power the core functionality of the ticketing app. + +Starting at the `keypom-docs-examples` directory, navigate to `advanced-tutorials/ticket-app-skeleton/utils` folder and open the `allowEntry.js` file. + +```bash +cd advanced-tutorials/ticket-app-skeleton/utils +``` + +This should show the following skeleton code. + +``` js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app-skeleton/utils/allowEntry.js#L1-L14 +``` + +--- + +## Host Claiming Code + +In order to test the drop logic, a utility function will be created to emulate the host scanning tickets at the door and will be used by the frontend. + +The primary purpose of this function is to ingest a private key and password, and determine whether or not a ticket is valid. This means it will check for a few conditions before returning a success value. + +* The ticket is valid and has not been scanned yet. +* The password entered by the host was correct and the claim was successful + +The `allowEntry` utility function takes in a private key, and a `basePassword`. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/utils/allowEntry.js#L9-L49 +``` + +## Testing Logic + +Now that the utility function has been created, it can be used to test the drop logic. This will be done in a new file called `testTickDrop.js` that will live in the same util directory. It will contain two different test functions: + +* `wrongPasswordCheck` - This will test the case where the wrong password is used to claim the ticket. +* `doubleClaimCheck` - This is meant to check for invalid tickets. In this case, it will try to claim the same ticket twice in a row. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app-skeleton/utils/testTickDrop.js#L1-L26 +``` + +With both the drop created utility function defined, some code can be written to test the actual logic to ensure that the ticket claiming process works as expected. This will be broken down into phases, similar to the actual ticketing experience. + +### Wrong Password Check + +The first phase of the ticketing experience can be labelled as `pre-entry`, when the attendee is looking to enter the event. Here, you want to ensure that only the host can allow them in, meaning the first key use must only be claimable with the correct password. + +The following code can be used to test this logic, following the drop creation. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/utils/testTickDrop.js#L5-L30 +``` + +It's expected that after claiming with the incorrect password, `allowEntry` will return `false` since the key use remains at 1. However, once the correct password is provided, the `allowEntry` function should return `true`. In the tests, an `assert` function is used to ensure the proper behavior. + +### Preventing Multiple Entries + +Once an attendee has been scanned into the event, they may try to give their ticket to someone else. To test and prevent this, `allowEntry` can be called multiple times on the same ticket. It is expected that the first call should return `true` but once it scans the same ticket again, `false` should be returned. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/utils/testTickDrop.js#L32-L57 +``` + +With the drop functionality tested, you can be confident in the logic behind the scenes and focus on the app behavior. + +--- + + +## Full Code +Now that everything has been put together, the final code can be seen below. + +
+Full Testing Code +

+ +```js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/utils/testTickDrop.js#L1-L75 +``` +

+
+ + +--- + +## Running the Script +Here, you'll learn how to run the code that was just covered, and what to expect. It's assumed that you have already cloned the code from the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repo. + +:::caution +Prior to running these scripts, ensure you replace all instances of `minqi.testnet` with an account found in your `~/.near-credentials` folder +::: + +To run the script, run the following command inside the `keypom-docs-examples/advanced-tutorials/ticket-app-skeleton` directory: + +```bash +yarn test-ticket-drop +``` + +:::note +If you'd like to run the already completed code found in the `ticket-app` directory instead of the skeleton code, run the same `yarn test-ticket-drop` command but inside of the `keypom-docs-examples/advanced-tutorials/ticket-app` directory instead. +::: + +This should return a successful test after outputting logs: + +```bash +Password Test Responses: +Expected false, got: false +Expected true, got: true + +Double Claim Test Responses: +Expected true, got: true +Expected false, got: false +``` + +
+Full Script Output +

+ +```bash +Retrying transaction v2.keypom.testnet:2JdTtqWLNqLUjBL9CYJ1qkdUtYpDLXydvnCfHiW3LG3S with new nonce. +Receipts: DL3AwUHW22wqEvJ24Soh39Zgsa8iQhyNNKsqzfUggDCn, Dt1yEoGZ36avyKqwF82GL54emJkfmUx2AM3fUtkhC1Vv + Log [v2.keypom.testnet]: Current Block Timestamp: 1680294425065581261 + Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000 + Log [v2.keypom.testnet]: Total required storage Yocto 16330000000000000000000 + Log [v2.keypom.testnet]: Current balance: 3.5921299, + Required Deposit: 0.2578263, + total_required_storage: 0.01633, + Drop Fee: 0, + Key Fee: 0 Total Key Fee: 0, + allowance: 0.0404963 total allowance: 0.0404963, + access key storage: 0.001 total access key storage: 0.001, + deposits less none FCs: 0.1 total deposits: 0.1 lazy registration: false, + deposits for FCs: 0.1 total deposits for FCs: 0.1, + uses per key: 2 + None FCs: 1, + length: 1 + GAS to attach: 100000000000000 + Log [v2.keypom.testnet]: New user balance 3.3343036 + Log [v2.keypom.testnet]: Fees collected 0 +Retrying transaction nft-v2.keypom.testnet:2iHrE9ooY2N4kUn9eqsScAyNjXkRkUBiQdzxYsXwFawm with new nonce. +Receipts: 6jzxKRXmGjrtSKP9V38puWLZPcDHaVYRrohtj29rsMxR, FCmjrSPxuyKEXdghJAkrz8H8AH3GaCPnceoZKuHazmrN + Log [v2.keypom.testnet]: Current Block Timestamp: 1680294427597789158 + Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000 + Log [v2.keypom.testnet]: Total required storage Yocto 16330000000000000000000 + Log [v2.keypom.testnet]: Current balance: 3.6040689, + Required Deposit: 0.2578263, + total_required_storage: 0.01633, + Drop Fee: 0, + Key Fee: 0 Total Key Fee: 0, + allowance: 0.0404963 total allowance: 0.0404963, + access key storage: 0.001 total access key storage: 0.001, + deposits less none FCs: 0.1 total deposits: 0.1 lazy registration: false, + deposits for FCs: 0.1 total deposits for FCs: 0.1, + uses per key: 2 + None FCs: 1, + length: 1 + GAS to attach: 100000000000000 + Log [v2.keypom.testnet]: New user balance 3.3462426 + Log [v2.keypom.testnet]: Fees collected 0 +Retrying transaction nft-v2.keypom.testnet:CysD3CnodxvarnxUpQKKWWV1x9uhjEkCbWosy1DuDo7D with new nonce. + + + Ticket Links: + + http://localhost:1234/v2.keypom.testnet/3aJq6s8pNYFGbuUVG5fj7nJ9bpfKZD7iH4oak27yZnjQytcyCAFMioJEZrVJBf3itMgrs3gm8U1UszewfhXbfKUH + + + + + Ticket Links: + + http://localhost:1234/v2.keypom.testnet/2KxZarBh9hWy7JZGDvsJhdzP8Q3JtCy7ocZ4hvohHKEsSNjxTx3LWd8EDpHNfD2du8MQVftCNJKRCp99At1qigQU + + +Claiming with wrong password... +Receipt: BHH2ENLdWLpYDQDD8SmgbAXzVFGi9odnGwhgHxg6ifCR + Log [v2.keypom.testnet]: Beginning of process claim used gas: 479192976105 prepaid gas: 100000000000000 + Log [v2.keypom.testnet]: passed global check + Log [v2.keypom.testnet]: hashed password: [97, 68, 238, 197, 167, 108, 73, 163, 74, 105, 140, 127, 22, 87, 3, 98, 76, 179, 110, 208, 118, 51, 58, 3, 88, 44, 22, 240, 45, 89, 85, 65] + Log [v2.keypom.testnet]: actualPass password: [61, 214, 44, 95, 159, 234, 2, 185, 182, 48, 134, 31, 65, 88, 184, 51, 51, 13, 201, 173, 75, 158, 56, 59, 33, 46, 185, 178, 239, 3, 44, 94] cur use: 1 + Log [v2.keypom.testnet]: Incorrect password. Decrementing allowance by 1244250690277300000000. Used GAS: 2442506902773 + Log [v2.keypom.testnet]: Allowance is now 39252063130497100000000 + Log [v2.keypom.testnet]: Invalid claim. Returning. +Claim has failed, check password +claiming with correct password... +Receipt: 4gAycg2B1jVNoJtUT3snHWDA1Ffdkxt1oPu8vH1TwoSC + Log [v2.keypom.testnet]: Beginning of process claim used gas: 479192976105 prepaid gas: 100000000000000 + Log [v2.keypom.testnet]: passed global check + Log [v2.keypom.testnet]: hashed password: [61, 214, 44, 95, 159, 234, 2, 185, 182, 48, 134, 31, 65, 88, 184, 51, 51, 13, 201, 173, 75, 158, 56, 59, 33, 46, 185, 178, 239, 3, 44, 94] + Log [v2.keypom.testnet]: actualPass password: [61, 214, 44, 95, 159, 234, 2, 185, 182, 48, 134, 31, 65, 88, 184, 51, 51, 13, 201, 173, 75, 158, 56, 59, 33, 46, 185, 178, 239, 3, 44, 94] cur use: 1 + Log [v2.keypom.testnet]: passed local check + Log [v2.keypom.testnet]: Key usage last used: 0 Num uses: 2 (before) + Log [v2.keypom.testnet]: Key has 1 uses left. Decrementing allowance by 10000000000000000000000. Allowance left: 29252063130497100000000 + Log [v2.keypom.testnet]: Total storage freed: 0. Initial storage: 33083530. Final storage: 33083530 + Log [v2.keypom.testnet]: Empty function call. Returning. +Receipts: D2TGQDXYR4um28CgTt8Z1aU1LMSABMChW9MZJPfVBcpd, 7FKbgHx6eFnfMM15B1Tw7U8wpeQe2WKwYUQG7Hbqe69L + Log [v2.keypom.testnet]: Current Block Timestamp: 1680294442058016014 + Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000 + Log [v2.keypom.testnet]: Total required storage Yocto 16330000000000000000000 + Log [v2.keypom.testnet]: Current balance: 3.6160078, + Required Deposit: 0.2578263, + total_required_storage: 0.01633, + Drop Fee: 0, + Key Fee: 0 Total Key Fee: 0, + allowance: 0.0404963 total allowance: 0.0404963, + access key storage: 0.001 total access key storage: 0.001, + deposits less none FCs: 0.1 total deposits: 0.1 lazy registration: false, + deposits for FCs: 0.1 total deposits for FCs: 0.1, + uses per key: 2 + None FCs: 1, + length: 1 + GAS to attach: 100000000000000 + Log [v2.keypom.testnet]: New user balance 3.3581815 + Log [v2.keypom.testnet]: Fees collected 0 + + + Ticket Links: + + http://localhost:1234/v2.keypom.testnet/2LNJU2adYHgvyuczoNFkvdL92vuunNCESaZiWYh6cQJXcwVSJpHqgQpGVUHsEDDee2oQrSELAkRGPeYroW6hoPaN + + +Claiming with correct password... +Receipt: G7y6MWapxNwCCmCPAQ6iRWdvT292dq8hWp8ZQAnTbXwQ + Log [v2.keypom.testnet]: Beginning of process claim used gas: 479192976105 prepaid gas: 100000000000000 + Log [v2.keypom.testnet]: passed global check + Log [v2.keypom.testnet]: hashed password: [105, 193, 27, 134, 73, 227, 30, 80, 12, 73, 201, 126, 217, 0, 80, 239, 38, 5, 216, 62, 44, 177, 19, 137, 73, 50, 159, 32, 38, 11, 59, 94] + Log [v2.keypom.testnet]: actualPass password: [105, 193, 27, 134, 73, 227, 30, 80, 12, 73, 201, 126, 217, 0, 80, 239, 38, 5, 216, 62, 44, 177, 19, 137, 73, 50, 159, 32, 38, 11, 59, 94] cur use: 1 + Log [v2.keypom.testnet]: passed local check + Log [v2.keypom.testnet]: Key usage last used: 0 Num uses: 2 (before) + Log [v2.keypom.testnet]: Key has 1 uses left. Decrementing allowance by 10000000000000000000000. Allowance left: 30496313820774400000000 + Log [v2.keypom.testnet]: Total storage freed: 0. Initial storage: 33085324. Final storage: 33085324 + Log [v2.keypom.testnet]: Empty function call. Returning. +claiming the same key twice... +Key has already been scanned. Admission denied + + Password Test Responses: + Expected false, got: false + Expected true, got: true + + Double Claim Test Responses: + Expected true, got: true + Expected false, got: false + +✨ Done in 26.50s. +``` + +

+
+ +--- + +## Conclusion + +So far, you've learned how to set up your React app, as well as break down the ticketing system into functional requirements. You then took those requirements and wrote a script to create the drop. + +In the next tutorial, the ticketing process will be broken down into stages for both the user side and event organizer side. From there, the flow of the app, and the Keypom variables that control it, can be established. + + diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop.md new file mode 100644 index 00000000..9b31a5fa --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/drop.md @@ -0,0 +1,320 @@ +--- +sidebar_label: 'Creating the Drop' +--- +# Creating the Drop + +## Introduction +In this section you'll take the first step to creating the ticketing experience by designing the drop. This drop will be tailored according to the functionality and specifications found in the [Solution Architecture](architecture.md#keypom-solution). + +Recall that the drop needs the following properties: + +* A [Function Call drop](../../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md) must be used and configured so that each key has 2 uses. +* The first key use is password protected and `null` (for when the host scans attendees into the event). +* The second key use will have a small amount of $NEAR to cover account creation costs and sponsor the first few transactions. +* The second key use will also call `nft_mint` on an NFT contract which will send the new or existing account a POAP. + +:::tip +The first key use being `null` will allow for a lightweight transaction on-chain to reflect the key use decrement without needing to transfer any $NEAR to anyone or create any accounts. +::: + + +With this in mind, the aim of this tutorial will be to write a node script that will create the drop matching the above properties. This process can be broken down into three stages: + +1) Connect to the NEAR blockchain. +2) Create the drop with function call data. +3) Create the NFT collection for the post attendance gift. + +Starting at the `keypom-docs-examples` directory, navigate to the `ticket-app-skeleton/utils` folder and open the `createTickDrop.js` file. + +```bash +cd advanced-tutorials/ticket-app-skeleton/utils +``` + +There, you can see the following skeleton code in the file `createTickDrop.js`. +``` js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app-skeleton/utils/createTickDrop.js#L1-L33 +``` + +--- + +## Connecting to NEAR +In this section, you'll be addressing the first step which is connecting to the NEAR network. + +This is done with `NEAR-API-JS` and consists of: + +* Selecting which network to connect to (testnet or mainnet). + +* Specifying the location where the keys are stored for the drop funder's account. This location is commonly in the `~/.near-credentials` folder on your local machine. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8b8e8bbf5fd89d8447e1b6b4533da3bb8673690c/advanced-tutorials/ticket-app/utils/createTickDrop.js#L22-L38 +``` + +--- + +## Creating the Drop +In this section, you'll create the function call drop to meet the functional requirements defined earlier. + +### Function Call Drop Basics + +#### Initializing the SDK + +This process starts with calling the `initKeypom` function and will always be the first function you call to interact with the Keypom SDK. + +`initKeypom` initializes the SDK to allow for interactions with the Keypom smart contracts. Without it, none of the other SDK functions would work as expected. + +After `initKeypom` is called, the FC Drop can be created by calling `createDrop` and adding an `fcData` parameter. + +```js +// Change this to your account ID +const FUNDER_ACCOUNT_ID = "minqi.testnet"; +const NETWORK_ID = "testnet" +async function createTickDrop() { + // Initiate connection to the NEAR blockchain. + const CREDENTIALS_DIR = ".near-credentials"; + const credentialsPath = path.join(homedir, CREDENTIALS_DIR); + ... + ... + let near = new Near(nearConfig); + const fundingAccount = new Account(near.connection, FUNDER_ACCOUNT_ID) + + await initKeypom({ + near, + network: NETWORK_ID + }); +} +``` + +#### Defining the Function Call Data + +One the SDK has been initialized and the NEAR connection established, it's time to create the function call drop. This is done by passing in `fcData` into create drop. It is an object that defines the methods that will be called for any given key use: + + +```bash +fcData +└── methods +``` + +For multi-use keys, each specific use can have a different set of methods that will be called. These methods are executed one by one. As an example, a key with 3 uses can be seen: + +1. `nft_mint` +2. `null` +3. `create_account_advanced` -> `setup` -> `nft_mint` + +The first time the key is used, an NFT will be minted. The second use will simply advance the key with nothing called. The third time the key is used, it will first call `create_account_advanced` followed by the `setup` method and then finally `nft_mint` all in the same transaction. + +This is represented with a 2D array, where the inner array is the set of methods per key use. The above example would be represented as: + +```js +methods: [ + [ + "nft_mint" + ], + null, + [ + "create_account_advanced", + "setup", + "nft_mint" + ] +] +``` + +In reality, each method is not simply a string as shown above. The methods require the following parameters: + +- `receiverId`: The contract receiving the function call. +- `methodName`: The function to be called on the receiver contract. +- `args`: A stringified JSON object of all the arguments to be passed into `methodName`. +- `attachedDeposit`: The yoctoNear deposit attached to the function call when the key is used. + +For more information on the `methods` parameter, please see the [TypeDocs](../../../keypom-sdk/Core/interfaces/Method.md) + +In summary, the `fcData` should look something like this, with a generic method for the POAP which you'll explore in the next section: + +```js +fcData: { + methods: [ + null, + [ + { + receiverId: SOME_NFT_CONTRACT, + methodName: "nft_mint", + args: SOME_ARGS, + attachedDeposit: SOME_DEPOSIT + } + ], + ] +} +``` + +#### POAP + +Now that the basics for creating an FC drop have been covered, it's time to define what the second key use method data should look like. + +Each NFT that is given out to participants will share the same artwork, title, description etc. They will be part of the same series and the only thing that differs between them is their unique ID. For a full tutorial about the series contract, see NEAR's [NFT tutorial.](https://docs.near.org/tutorials/nfts/series#nft-collections-and-series) + +To mint these NFTs, there is a contract deployed to `nft-v2.keypom.testnet`. When creating an FC drop, it is important to understand the interface of the receiver contract. In this case, the mint function has the following parameters: + +```rust +pub fn nft_mint( + &mut self, + mint_id: U64, + receiver_id: AccountId +) +``` +Here, the `mint_id` is needed to identify and tell the NFT contract which series an NFT should belong to. The `receiver_id` field is needed to identify which account should receive the minted NFT. + +The `mint_id` field should be set as the drop's `dropId` and the `receiver_id` should be the attendee's NEAR `accountId`. At first glance, this might seem impossible because you don't know the attendee's accounts ahead of time. To solve this, you can use what's known as Keypom Arguments which are important pieces of information that can be passed into specified fields when a key is used. + +The following optional Keypom arguments are exposed for each individual method in the `fcData` alongside the required receiverId, methodName, attachedDeposit etc. + +They tell Keypom where to inject certain parameters for each function call. + +- [`accountIdField`](../../../keypom-sdk/Core/interfaces/Method.md#accountidfield): The name of the account that is claiming the linkdrop. +- [`dropIdField`](../../../keypom-sdk/Core/interfaces/Method.md#dropidfield): The [`dropId`](../../../keypom-sdk/Core/interfaces/Drop.md#dropid) of the drop that the claim is being called on. +- [`keyIdField`](../../../keypom-sdk/Core/interfaces/Method.md#keyidfield) The unique identifier, [`keyId`](../../../keypom-sdk/Core/interfaces/KeyInfo.md#keyid), of the key that is being used to claim. +- [`funderIdField`](../../../keypom-sdk/Core/interfaces/Method.md#funderidfield) the `accountId` of the person funding the drop. + +In this case, the `dropIdField` should be set to `mint_id` and `accountIdField` set to `receiver_id`. This will result in the drop's ID being passed into the parameter `mint_id` and attendee's NEAR account passed into the `receiver_id` field. + +In summary, the final `fcData` should look as follows. + +```js +fcData: { + methods: [ + null, + [ + { + receiverId: `nft-v2.keypom.testnet`, + methodName: "nft_mint", + args: "", + dropIdField: "mint_id", + accountIdField: "receiver_id", + attachedDeposit: parseNearAmount("0.1") + } + ], + ] +} +``` +:::note +If you wish to use a different NFT contract for your POAP, ensure you know the contract's interface and tailor the `methods` arguments accordingly. +::: + +#### Password Protected Keys + +To ensure each key has two uses with a password protected first use, the following `config`, `basePassword` and `passwordProtectedUses` can be added to `createDrop`. + +```js +await createDrop( + // 2 Uses per key + config: { + usesPerKey: 2 + }, + // Create base password and ensure only first key use is password protected + basePassword: "event-password", + passwordProtectedUses: [1], + fcData: { + ... + } +) +``` +As the drop creator, you have the option of creating a password and applying it to the keys in your drop. This password is unique for each key use and comprises of a master password, the drop ID and the use (1st, 2nd, 3rd etc.) + +This behavior can be applied by providing the core component, a `basePassword`, into the `createDrop` arguments. In the ticketing case, only the first use should be protected which can be achieved by passing `[1]` into the `passwordProtectedUses` parameter. + +Once a key has been password protected, you must pass in `hash(basePassword + publicKey + current_key_use)` in order to successfully claim it. + +With this model, if the host were to simply know the `basePassword`, it could deterministically generate this hash for any given ticket link. Furthermore, if the host was the only person who knew the password, nobody could claim the key without going through them first. + +For an in-depth explanation around password protected keys, see the [Typedocs](../../../keypom-sdk/Core/modules.md#createdrop). + +### Final Drop Structure + +Putting it all together, the final drop structure should look something like this: + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8b8e8bbf5fd89d8447e1b6b4533da3bb8673690c/advanced-tutorials/ticket-app/utils/createTickDrop.js#L42-L73 +``` + +--- + +## Making NFT Series + +Up until now, the drop is pointing to an NFT series that doesn't exist yet. If a key were to be claimed, the function call would throw an error. In this section, you'll be creating the series of NFTs to be used as POAPs. + +The Keypom SDK provides a function to create an NFT series specifically for function call drops, called [`createNFTSeries`](../../../keypom-sdk/Core/modules.md#createnftseries). It requires the following parameters: + +- `dropId`: The drop ID for the drop that should have the NFT series associated with it. +- `metadata`: The metadata that all minted NFTs will have. + +`metadata` is an object with these properties: +* `title`: The title for the NFTs in the series. +* `description`: Description for all NFTs in the series. +* `media`: link to the artwork in the form of an IPFS CID. +* `copies`: Number of NFTs in the series. + +The code for creating the series is shown below. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8b8e8bbf5fd89d8447e1b6b4533da3bb8673690c/advanced-tutorials/ticket-app/utils/createTickDrop.js#L75-L84 +``` + +Once both the series and drop are created, the key can be used to mint on-demand POAPs to wallets. + +--- + +## Adding More Than 50 Tickets +Due to gas restriction, `createDrop` is limited to 50 password protected keys (tickets). Rather than create multiple drops for the same event, you can simply add more keys to a single drop. This allows you to track your event metrics using a single `dropId`. + +To do this, you can use the following code: + +```js +// Loop to add 200 keys +let numKeys = 200 +let keysAdded = 0; +let allSecretKeys = []; +while (keysAdded < numKeys) { + const keysToAdd = Math.min(50, numKeys - keysAdded); + const {secretKeys, publicKeys} = await generateKeys({ + numKeys: keysToAdd, + }); + await addKeys({ + account: fundingAccount, + dropId, + publicKeys + }); + keysAdded += keysToAdd; + allSecretKeys = allSecretKeys.concat(secretKeys); +} +``` + +For more, see [this example](../../../Cookbook/drops/NEAR.md#creating-a-large-drop) or + +--- + +## Creating Ticket Links +The last step in this process is to create the links themselves so that you can easily distribute the tickets to people. You can control the format of the URL, for now `localhost:1234` will be used. + +You can utilize the `formatLinkdropUrl` function for convenience. It can take a custom URL that contains `CONTRACT_ID` and `SECRET_KEY` and it will replace them with the contract ID and secret keys passed in. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8b8e8bbf5fd89d8447e1b6b4533da3bb8673690c/advanced-tutorials/ticket-app/utils/createTickDrop.js#L86-L91 +``` + +--- + +## Final Code + +Putting everything together, the final code for the drop should be: + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8b8e8bbf5fd89d8447e1b6b4533da3bb8673690c/advanced-tutorials/ticket-app/utils/createTickDrop.js#L1-L107 +``` + + +## Conclusion + +So far, you've broken down the ticketing system into functional requirements and used them to write a script to create the drop. + +In the next tutorial, you'll be testing the drop you just created, starting with creating a script to emulate the host scanning a ticket. + + diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/final.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/final.md new file mode 100644 index 00000000..ce7623d4 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/final.md @@ -0,0 +1,151 @@ +--- +sidebar_label: 'Final Product' +--- +# Final Product +Welcome to the last section of this ticketing app tutorial! Here, you'll be seeing the full app in action! + +:::note +To run this app on your local machine, you will need a computer with working camera. +::: + +## Getting Started +To follow along with the app on your own machine, you can clone the code from the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repository and run the following command in the root folder `keypom-docs-examples/`: + +``` bash +cd advanced-tutorials/ticket-app-skeleton && yarn && yarn start +``` + +:::note +If you'd like to run the already completed code found in the `ticket-app` directory instead of the skeleton code, run: + +``` bash +cd advanced-tutorials/ticket-app && yarn && yarn start +``` +::: + +This should bring you to the following page at `localhost:1234` + +

+ ticketing +

+ +--- + +## Starting the Claim and Scanner Pages + +To begin the app, first you'll need to run the create drop script: + +```bash +yarn create-ticket-drop +``` + +This will return a link: + +```bash +Ticket Links: + +http://localhost:1234/v2.keypom.testnet/3pGPvPGiXUiMfW6TME1EPWGWHzx1FrLSLgu68UADpyjg6c9DPix1v2bxUWuY5K7ChWE5G5BNszMNTPmecTz7C15w +``` + +This should bring you to the following page. Feel free to take a picture of your QR code with another device, you will need to hold this QR code up to your computer's camera later. + +

+ ticketing +

+ +From there, you can duplicate this window and modify the URL to be: +``` +http://localhost:1234/v2.keypom.testnet/scanner +``` +It will immediately prompt you for a password. By default, the `createTickDrop` script you ran earlier has a password set to `event-password` but for now enter an incorrect password: +``` +wrong-password +``` + +Once you enter this password, the scanner should appear, shown below. + +

+ ticketing +

+ +--- + +## Scanning and Claiming +### Incorrect Password Claim + +Now, you can begin testing the scanner by holding the photo of the QR code up to the camera of your computer. Ensure it has a clear unobstructed view of the code. Once the data is read in, the scanner's frame should change to yellow as it tries to claim. + +

+ ticketing +

+ +This should promptly return a failed claim, shown below. + +

+ ticketing +

+ +If you right click and inspect the page and go to the console, you should see the following error indicating an incorrect password. + +

+ ticketing +

+ +### Correct Password Claim +To enter the correct password, simply refresh the scanner page. This should prompt you for the password again. You can now enter the correct password for your private key. By default, the `createTickDrop` script you ran earlier has a password of `event-password`. + +``` +event-password +``` + +Once the correct password has been entered, you can repeat the same steps as before and try to claim your ticket by holding the QR code up to the scanner. This time around after the yellow claiming frame, you will see the following successful claim page. + +

+ ticketing +

+ +### Double Scanning +Now that the ticket has been successfully scanned and claimed, you can try to double scan the ticket. Recall that, if the second scan succeeds the attendee loses the opportunity to claim their POAP. + +Same as before, hold up the QR code up to your computer camera. Once the scanner reads the data and tries to claim, you should see this resultant page. + +

+ ticketing +

+ +--- + +## Claiming POAP +Now, after the ticket has been claimed **once**, if you go back and refresh your ticket page the QR code should now disappear and in its place is a button to claim your POAP. + +

+ ticketing +

+ +Clicking this should bring you to a MyNearWallet claim page. Once you claim, either to a new or existing NEAR account, you should be able to see our mascot, Moon, as an NFT in your collectibles tab! + +

+ ticketing +

+ +--- + +## Claiming Deleted Keys +Now that you've claimed the POAP, the private key is now deleted. If you go back to the ticket page and refresh it again, you should see the following page; indicating your key is depleted. + +

+ ticketing +

+ +If you try to holding up the screenshot of your QR code up to the QR reader, you will be greeted with the following failed claim page. + +

+ ticketing +

+ +--- + +## Conclusion +In this tutorial, you learned how you can use Keypom to create a seamless and powerful ticketing experience. You started from a few simple goals, translated those to tangible customizations to make to your Keypom function call drop, and then built a React app around the drop leveraging Keypom values to make it all run. + +In the next advanced tutorial, you will learn how you can auto-register people into a DAO with a simple link. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/introduction.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/introduction.md new file mode 100644 index 00000000..983a82b6 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/introduction.md @@ -0,0 +1,87 @@ +--- +sidebar_label: 'Introduction' +--- +# Introduction +In this tutorial, you'll learn how to create a seamless ticketing experience that is cheaper than alternative methods and can also handle very large audiences. +## Background +The most popular ticketing solutions in Web3 utilize NFT technologies. This approach, however, requires attendees to own a crypto wallet and sign transactions. This is a massive barrier to entry, particularly for users that are new to Web3. + +Keypom aims to solve these problems by empowering you to create a seamless ticketing system that has the following features. + +* Users are not required to have a wallet to enter the event. +* Each ticket is unique and can only be used by one person. +* Attendees are not required to have wifi to gain entry to the event. +* Attendees that did not have a NEAR wallet can get one for free. +* Attendees can choose to receive an NFT proving their attendance at the event. This is commonly known as a [POAP](https://academy.binance.com/en/glossary/proof-of-attendance-protocol-poap). +* The post-attendance gifts can **only** be given to people that physically showed up to the event. You can't receive the NFT if you didn't show up. + +These features open the door to an entirely new class of non-technical attendees and create a smoother experience compared to existing NFT ticketing solutions. + +In this tutorial, you'll be creating a ticketing system with those features, and incorporating a POAP to further reward your community members that come out to your events. + +:::info note +The NFT POAP is optional to include as the event organizer. You can choose to keep it, or replace it with a different attendance gift such as Fungible Tokens. +::: + +--- + +## Prerequisites + +For the this tutorial, you can choose to run the scripts on your own machine. To do so, you must have the following: + +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [NEAR-API-JS](https://docs.near.org/tools/near-api-js/quick-reference#install) +3. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + +If you want to reference the finished code, that can be found [here](https://github.com/keypom/keypom-js/tree/min/ticketing-tutorial/docs-advanced-tutorials/ticket-app). To follow along and build out this ticketing app, see the steps below. + +--- + +## Creating your Project +In this section, you'll prepare to create the ticketing app using the skeleton code made available to you at the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repo. + +First, you'll want to clone the repo: + +```bash +git clone https://github.com/keypom/keypom-docs-examples.git && cd keypom-docs-examples +``` + +Second, install all dependencies for the ticketing app skeleton code using the following: + +``` +yarn ticketing:init-skeleton && cd advanced-tutorials/ticket-app-skeleton +``` + +:::note +To install all dependencies for the completed ticketing app, run the following: +``` +yarn ticketing:init-complete && cd advanced-tutorials/ticket-app +``` +::: + + + +At this point, all the dependencies should be installed and you should be in the `advanced-tutorials/ticket-app-skeleton` folder. Here you'll find the following files required to build out your app. + +```bash +/ticket-app-skeleton +└── components +β”‚ └── scanner.js +β”‚ └── qrcode.js +└── state +β”‚ └── App.js +β”‚ └── keyInfo.js +└── utils +β”‚ └── allowEntry.js +β”‚ └── createTickDrop.js +β”‚ └── testTickDrop.js +└── package.json +``` + +With this setup complete, you are ready to begin building out the ticket app, starting by breaking down the problem into its functional requirements. + + + + + + diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/react-outline.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/react-outline.md new file mode 100644 index 00000000..0746d765 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/react-outline.md @@ -0,0 +1,80 @@ +--- +sidebar_label: 'App Design' +--- +# App Design + +## Introduction +In the previous sections, you've created the foundation for the ticketing system by breaking it down to its functional requirements and designing a drop accordingly. Here, you'll be learning the flow and design of the React app, to create a seamless ticketing experience for *both* the organizers and the attendees. + +With this tutorial, a React app with separate scanner and claim pages will be created. Although the attendees can access the scanner, it will be useless to them unless they know the drop password. + +--- + +## Attendee Ticket Page Flow +This page is for the attendees and will only consist of 3 stages. + +

+ ticketing +

+ +* **Stage 1, Pre-entry:** Page showing a unique QR code, corresponding to the private key from their ticket. +* **Stage 2, Post-entry:** After the QR code has been scanned by the host, the user can choose to onboard to NEAR and receive a POAP. +* **Stage 3, Post-gift:** If the user chooses to claim their POAP, the third stage will show a page of **your** choice. You can choose to leave it empty or customize it with additional resources or a redirect to your own website. + +To trigger a transition from Pre-entry to Post-entry and Post-entry and Post-gift, the following events must occur: +1. **Pre-entry → Post-entry**: The host must scan the QR code and call `allowEntry` with the event password and private key. +2. **Post-entry → Post-gift**: The user chooses to `claim` their POAP. Once that `claim` is complete and the POAP is in their wallet, the page will transition to post-gift. + +--- + +## Host Scanner Page Flow + +The scanner page is for the host and consists of 3 stages that repeat in a loop. + +

+ ticketing +

+ +The event password will only be prompted once on app mount. If the host wishes to enter a different password once scanning starts, they can simply refresh the page and be prompted again. + +* **Stage 1, Pre-claim:** A page with the camera viewport open, constantly scanning for QR codes. +* **Stage 2, Claiming:** Once a QR code is detected and information is scanned in, the app attempts to derive the private key from the QR code and calls `allowEntry` using the event password. During this time, the app will indicate it is in the process of claiming. +* **Stage 3, Post-claim:** After the claim is processed, the page will indicate whether or not to admit the attendee depending on the return value of `allowEntry`. + +After post-claim, the entire cycle will loop back to pre-claim after three seconds. This time interval was set so the host could read any error messages that may appear. You can modify this time by changing the values passed into `timeout()`. + +--- + +## Keypom Information + +There are a few key pieces of information needed from Keypom in order to allow the pages to perform as expected. + +### Claim Page +The major parameter that controls what React will render is `cur_key_use` for the given private key. This value represents the key's current use number (1st use, 2nd use etc.) and will be stored in a React state variable called `curUse`. + +**Pre-entry → Post-entry:** To change between these two stages, the key's current use must be changed from 1 to 2. This is done when the QR code is scanned by the host. + +**Post-entry → Post-gift:** To change between these two stages, the key must be deleted and fully claimed. This happens when they claim the post attendance gifts. + +The following variables are needed to allow these state changes: + +* `curUse`, obtained from accessing the `cur_key_use` from calling [`getKeyInformation`](../../../keypom-sdk/Core/modules.md#getkeyinformation) with `pubKey`. +* `pubKey`, derived from `privKey` using the SDK's [`getPubFromSecret`](../../../keypom-sdk/Core/modules.md#getpubfromsecret) method. +* `privKey`, stored in the user's app link. + +### Scanner Page +As the scanner page exclusively scans QR codes and admits people using the `allowEntry` utility function, the app itself does not store any Keypom parameters apart from the event password, which the host will manually enter on app mount. + +The scanner app obtains the `privKey` by scanning the QR code and parsing the obtained string. It then calls `allowEntry` and passes in the event password and the `privKey`. + +The following list of variables are used in the scanner app: +* `privKey`, read in from the QR code. +* `password`, set by the host on app mount. + +--- + +## Conclusion +In this section, you broke down the app's flow of logic for both the user claim page, and the scanner page. You then took that information and found Keypom information that can be used to facilitate that flow. + +In the following sections, you'll be applying what you just learned by going through the actual code for the claim and scanner pages. + diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/scanner-code.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/scanner-code.md new file mode 100644 index 00000000..9ced629a --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/scanner-code.md @@ -0,0 +1,144 @@ +--- +sidebar_label: 'Scanner Code' +--- +# Scanner Code + +## Introduction +In the previous sections, you designed the structure and components needed to meet the requirements of the ticket app and saw the code to create the user claim page. Building on that, this tutorial will guide you through the code to create the scanner app for your seamless ticketing system. + +:::note +The focus of this section will be on the Keypom aspects of each script, such as getting key information and using it. + +The full code for each script will be shown, with highlights. For React resources, see [here](https://reactjs.org/docs/hello-world.html) as a starting point. +::: + +Recall, from the [introduction](introduction.md) that your code had the following outline. + +```bash +/ticket-app-skeleton +└── components +β”‚ └── scanner.js +β”‚ └── qrcode.js +└── state +β”‚ └── App.js +β”‚ └── keyInfo.js +└── utils +β”‚ └── allowEntry.js +β”‚ └── createTickDrop.js +β”‚ └── testTickDrop.js +└── package.json +``` + +This tutorial will be covering the code in `scanner.js`. + +--- + +## Scanner App - `Scanner.js` +### Breaking Down the Problem +As a brief reminder, the host scanner page will have the following stages, best outlined with the diagram below. + +

+ ticketing +

+ +* **Stage 1, Pre-claim:** A page with the camera viewport open, constantly scanning for QR codes. +* **Stage 2, Claiming:** Once a QR code is detected and information is scanned in, the app attempts to derive the private key from the QR code and calls `allowEntry` using the event password. During this time, the app will indicate it is in the process of claiming. +* **Stage 3, Post-claim:** After the claim is processed, the page will indicate whether or not to admit the attendee depending on the return value of `allowEntry`. + +After post-claim, the entire cycle will loop back to pre-claim after three seconds. This time interval was set so the host could read any error messages that may appear. You can modify this time by changing the values passed into `timeout()`. + + +In post-claim, a `allowEntry` might have returned false for a few reasons. +* Incorrect password/key +* A ticket may already be fully claimed and not exist when the host attempts to claim it. +* The ticket has already been scanned by the host. This means the key's current use is 2. + +### `masterStatus` State Variable +In order to track all these stages and possible outcomes, a set of enums will be defined. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/components/scanner.js#L10-L22 +``` + +All these stages will be stored in a `masterStatus` state variable object. + + +|**`masterStatus.stage`**| **Description** | +|------------------------|-----------------------------------------------------------------------------------------| +| `Stages.preClaim` | *Pre-claim:* Host scanner page is scanning, waiting to read in data | +| `Stages.claiming` | *Claiming:* Data has been read, scanner is trying to claim | +| `Stages.sucessClaim` | *Post-claim:* Successful claim (`true` returned from `allowEntry`) | +| `Stages.failClaim` | *Post-claim:* Failed to claim (`false` returned from `allowEntry`) | +| `default` | *Unknow State:* Display error message | + + +| **`masterStatus.data`** | **Description** | +|-------------------------|---------------------------------------------------| +| `Data.empty` | No data has been read, cannot call `claim` | +| `Data.captured` | Data has been read, scanner can now try to claim | + +### Initialization and Scanning +Upon app mount, the host scanner page will immediately do the following. + +1) Prompt the host for the base password. +2) Begin scanning. + +These features can be seen in the code snippet below. +```js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/components/scanner.js#L9-L53 +``` + +### Claiming +The claiming process can be controlled using a React `useEffect` hook, that runs every time the data status, `masterStatus.data`, is updated, indicating that data was read by the scanner. + +The primary task of the claim process is to determine if a claim is: + +* Successful - `masterStatus.stage == Stages.successClaim` +* Unsuccessful - `masterStatus.stage == Stages.failClaim` + +This is accomplished using the `allowEntry` function that you created earlier. If it returns `true`, the master status stage should be set to `Stages.successClaim`. Otherwise, it should be set to `Stages.failClaim`. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/components/scanner.js#L55-L92 +``` + +### Rendering + +The rendering part of the scanner app is relatively simple, as all the logic for states was taken care of during the claim process. The following table outlines what the page should render based on the value of `masterStatus.stage`, as outlined [above](scanner-code.md#masterstatus-state-variable). + +The focus of the renders is on the scanner frame (coloured square) and the text below it. The QR code visible is a code on a phone screen held up to the camera. + +| **Condition and Description** | **Render** | +|----------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `masterStatus.stage` == `Stages.preClaim`, *Pre-claim:* Host scanner page is scanning, waiting to read in data |

ticketing

| +| `masterStatus.stage` == `Stages.claiming`, *Claiming:* Data has been read, scanner is trying to claim |

ticketing

| +| `masterStatus.stage` == `Stages.successClaim`, *Post-claim:* Successful `claim` |

ticketing

| +| `masterStatus.stage` == `Stages.failClaim`, *Post-claim:* Invalid password, key invalid/scanned already etc. |

ticketing

| +| `default`, *Unknown State:* Display error message |

ticketing

| + +The following expandable section contains code for rendering. + +
+Full scanner.js rendering code +

+ +```jsx reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/components/scanner.js#L94-L147 +``` + +

+
+ +### Full Code +The full code, including the set up, claiming, and the rendering, can be seen below. + +``` jsx reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/components/scanner.js#L1-L148 +``` + +--- + +## Conclusion +In this section, you learned about the `scanner.js` component. Its primary role is to handle the data read in from the QR code reader, and `claim` the private key embedded within the QR code. It is also designed to handle different kinds of errors, such as deleted keys, and tickets that have already been scanned. + +In the next section, you'll be seeing the final product of what you just built! \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/user-code.md b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/user-code.md new file mode 100644 index 00000000..5e1614af --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Advanced/ticketing/user-code.md @@ -0,0 +1,138 @@ +--- +sidebar_label: 'Attendee Ticket Page Code' +--- +# Attendee Ticket Page Code + +## Introduction +In the previous section, you broke down the flow and logic of the ticket app. You also learned what Keypom information is needed in order to render the pages properly. + +In this tutorial, you'll learn about the actual code needed to create the attendee ticket page for your seamless ticketing system. + +:::note +The focus of this section will be on the Keypom aspects of each script, such as getting key information and using it. + +The full code for each script will be shown, with highlights. For React resources, see [here](https://reactjs.org/docs/hello-world.html) as a starting point. +::: + +Recall, from the [introduction](introduction.md) that your code had the following outline. + +```bash +/ticket-app-skeleton +└── components +β”‚ └── scanner.js +β”‚ └── qrcode.js +└── state +β”‚ └── App.js +β”‚ └── keyInfo.js +└── utils +β”‚ └── allowEntry.js +β”‚ └── createTickDrop.js +β”‚ └── testTickDrop.js +└── package.json +``` + +This tutorial will be covering the code in `App.js`, `KeyInfo.js`, and `qrcode.js`. + +--- + +## `App.js` +### Setting Up +The primary purpose of `App.js` is to display the different states of the attendee ticket page. This will involve getting the current key uses, and then rendering based on the value returned. + +The first step is to initialize a connection to NEAR and setup all the state variables that will be needed to render the page. + +```jsx reference showLineNumbers +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/state/App.js#L13-L57 +``` + +When the page is loaded, the function `setup` is called and the URL is parsed for `contractId` and `privateKey`. These will be stored in their own respective state variables for further use. + +Once the URL has been parsed and the resulting values stored, `connectNear` is called. This function handles the NEAR connection, as well as the Keypom connection. + +:::note +When connecting to NEAR, a `BrowserLocalStorageKeyStore` is used rather than an `UnencryptedFileSystemKeyStore`. This will create a key store in the user's browser for future use. For more on key stores, see [here](https://docs.near.org/tools/near-api-js/quick-reference#key-store) +::: + +With the NEAR connection established, your browser can now talk to the NEAR blockchain. The next step, is to call `initKeypom`. This initializes the SDK to allow for interactions with the Keypom smart contracts. + +After the Keypom initialization is complete, the QR code information can be created following the format `${contractId}/${privKey}`. + +### Rendering + +The process of rendering is simple: retrieve the key's current use number, and render the page differently based on the stages outlined in the [App Design](react-outline.md). + +The information is passed into both a QR code component and a KeyInfo component. The `KeyInfo` component takes in both the Keypom contract and private key. It then calls `getKeyInformation` and updates the `curUse` state variable accordingly. `QRCode` uses the `qrcode.react` library to display a QR code based on a string input. + +The following table outlines what the page should render based on a set of conditions including the current key use. + +| **Condition and Description** | **Render** | +|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **`curUse` is 1**: The attendee ticket page should show a QR code representing the ticket data (contract and secret key). The `QrCode` component is rendered by passing in the `link` state variable created earlier. |

ticketing

| +| **`curUse` is 2**: The first claim was done by the host, and thus should give the user the option to claim their POAP. This is done with the same linkdrop link. |

ticketing

| +| **`curUse` is 0**: The second claim was used, and thus the key was depleted and deleted. Here, the user will be given resources to continue learning about NEAR. You can choose to show anything here. |

ticketing

| +| This should act as a landing page for your event and will be shown if any URL is invalid. In this case, `curUse` is 0 **and** splitRes[3] is '' or undefined |

ticketing

| + +The code to render can be found in the exandable section below. + +
+app.js rendering code +

+ +```jsx reference showLineNumbers +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/state/App.js#L54-L134 +``` + +

+
+ + +### Full Code +The full code, including the set up and the rendering, can be seen below. +
+Full app.js code +

+ +``` jsx reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/state/App.js#L1-L136 +``` + +

+
+ +--- + +## `Qrcode.js` + +`Qrcode.js` is a simple component that returns a QR code based on the string passed in. On the attendee ticket page, this is the linkdrop URL for the host to scan. + +The full code can be seen below. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/components/qrcode.js#L1-L22 +``` + +--- + +## `Keyinfo.js` + +`Keyinfo.js` is responsible for updating Keypom related state variables, `pubKey`, and `curUse`. + +When `curUse` is 1 and the QR code is being rendered, the public key and use number is shown for educational purposes. + +A `useEffect` hook is used to update the needed Keypom state variables whenever the `KeyInfo` component is rendered. To do this, two SDK functions are used: [`getPubFromSecret`](../../../keypom-sdk/Core/modules.md#getpubfromsecret) to get the public key and [`getKeyInformation`](../../../keypom-sdk/Core/modules.md#getkeyinformation) to get the current key use. This can be seen below. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/4c8f86dab842c16e9c2bc6ad6f22e1eee2dced9e/advanced-tutorials/ticket-app/state/keyInfo.js#L6-L42 +``` + +--- + +## Conclusion +In this section, you learned about the 3 components that make up the attendee ticket page: `App.js`, `Qrcode.js`, and `KeyInfo.js`. + +In summary, `App.js` is the "homepage" of the attendee ticket page and takes care of setting up all the state variables based on the URL and then rendering the page. `Qrcode.js` simply renders a QR code based on an input string. `KeyInfo` is in charge of updating all Keypom state variables whenever `App.js` re-renders. + +You also went through the code for each of these components and saw the expected [render results](user-code.md#rendering). + +In the next section, you'll be going through a similar process with the scanner page. + diff --git a/versioned_docs/version-2.0/Tutorials/BOS/welcome.md b/versioned_docs/version-2.0/Tutorials/BOS/welcome.md new file mode 100644 index 00000000..500b82b2 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/BOS/welcome.md @@ -0,0 +1,42 @@ +--- +sidebar_label: 'Keypom BOS Components' +--- +# Keypom BOS Components +Welcome! This a collection of useful BOS components from both Keypom and the community! +- [Event Ticketing on BOS](https://test.near.social/#/minqi.testnet/widget/kp-ticket-homepage?tab=my-ticket-drops) + - Built for [ETHGlobal Waterloo](https://ethglobal.com/showcase/keypom-x-bos-event-ticketing-pow2e) by Min + - Special thanks to [Kent - cuongdcdev](https://near.org/near/widget/ProfilePage?accountId=cuongdcdev.near) for API support, [Elliot Bream](https://near.org/near/widget/ProfilePage?accountId=elliotbraem.near&tab=apps) for gateway support, and [Kiskesis](https://near.org/near/widget/ProfilePage?accountId=kiskesis.near) for drop-viewer frontend beautification +

+ BOS ticketing +

+ + +- [My Keypom Drops Info](https://near.org/kiskesis.near/widget/Keypom-Drop-Viewer-fork) by [Kiskesis](https://near.org/near/widget/ProfilePage?accountId=kiskesis.near). + - Forked from [here](https://near.org/mintlu.near/widget/Keypom-Drop-Viewer) +

+ ticketing +

+ +- [Number of Keypom Drops per User](https://near.org/mintlu.near/widget/view-number-of-keypom-drops) +

+ ticketing +

+ + +- [All my Drops](https://near.org/mintlu.near/widget/all-my-drops) +

+ ticketing +

+ +- [Linkdrop Plus](https://near.org/cuongdcdev.near/widget/linkdrop_plus) by [Kent - cuongdcdev](https://near.org/near/widget/ProfilePage?accountId=cuongdcdev.near) +-

+ ticketing +

+ +- [Linkdrop Viewer](https://near.org/cuongdcdev.near/widget/linkdrop-viewer) by [Kent - cuongdcdev](https://near.org/near/widget/ProfilePage?accountId=cuongdcdev.near) + + +- [DAO viewer](https://near.org/hack.near/widget/DAO.Profile?daoId=keypom-test.sputnik-dao.near) +

+ dao-viewer +

\ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Basics/fc-drops.md b/versioned_docs/version-2.0/Tutorials/Basics/fc-drops.md new file mode 100644 index 00000000..95bc583e --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Basics/fc-drops.md @@ -0,0 +1,425 @@ +--- +sidebar_label: 'Function Call Drop' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Function Call Drop + +## Introduction + +In this tutorial, you are going to learn how to create a Function Call Drop from scratch. Similar to how the other drops can be claimed by both new and existing users, FC drops are a great onboarding tool. The difference, is that FC drops can invoke methods on external smart contracts when the link is claimed. This allows for a ton of flexibility and use-cases such as [auto-registering users into a DAO](../../Tutorials/Advanced/daos/introduction.md) as part of the onboarding process. + +In this tutorial, the function call will be to Lazy Mint an NFT. + +

NFT collectibles claim

+ +To learn more about what the FC drop, see the [concepts page](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md) + + +--- + +## Prerequisites +For the basic tutorials, you can choose to run the scripts on your own machine. To do so, you must have the following: + +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [NEAR-API-JS](https://docs.near.org/tools/near-api-js/quick-reference#install) +3. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + +With this tutorial, you can either create your own script by following along, or view the completed script available in the [Keypom Documentation Examples](https://github.com/keypom/keypom-docs-examples) repo. + +### Creating your Project +In this section, you're going to create your project and install the SDK to prepare for the tutorial. If you have a completed script and have installed the SDK, you can skip [forward](simple-drops.md#breaking-down-the-problem). + +First, you need to give your project a home. + +```bash +mkdir my-keypom-project && cd my-keypom-project +``` + +Next, you'll want to create a default `package.json` file using the following command. You can accept all default values. +```bash +npm init +``` + +At this point, your project structure should look like this. +```bash +/my-keypom-project +β”œβ”€β”€ package.json +``` + +If you open `package.json`, you should see this. + +
+Default package.json +

+ +``` bash +{ + "name": "my-keypom-project", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} +``` + +

+
+ +The next step is to create an empty JavaScript file. + + + +```bash +touch fc-keypom.js +``` + + + + +```bash +fsutil file createnew fc-keypom.js 0 +``` + + + + +Finally, the last step is to install the Keypom JS SDK. +```bash +npm install @keypom/core +``` + +After installing the SDK, your `package.json` file should now look slightly different. + +
+package.json after installing the SDK +

+ +```bash +{ + "name": "my-keypom-project", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + # highlight-start + "dependencies": { + "@keypom/core": "^1.0.0" + } + # highlight-end +} +``` + +

+
+ +With these steps complete, your project folder should look like this. + +```bash +/my-keypom-project +β”œβ”€β”€ fc-keypom.js +β”œβ”€β”€ package.json +β”œβ”€β”€ package-lock.json +β”œβ”€β”€ node_modules +β”‚ └── keypom-js +β”‚ └── ... +``` + +You are now ready to begin creating your drop! + +--- + + +## Breaking Down the Problem + +A Function Call Drop is Keypom's most powerful drop type. A brief breakdown of how an FC drop works is as follows: + +For every key-use, a set of functions is called in the order that they are defined. For multi-use keys, this set can vary across different key uses. + +An example scenario for a multi-use key can be seen below. + + +| Key Use | Functions called during nth Key Use | +| -----------| ---------------------------------------------- | +| Key Use 1 | `nft_mint` | +| Key Use 2 | `sign_message`, `update_message` | +| Key Use 3 | `mint_fungible_tokens` | + +:::note +In this tutorial, the key will be single use and only call `nft_mint`. +::: + +The process of creating an FC drop is similar to the other drop types: + +1) Connect to the NEAR blockchain +2) Create drop with function call data + +The following skeleton code can be used as a starting point: +``` js +// Each of the two methods to create this drop will have their own unique set of imports + +// Imports used in the Keypom SDK method: +const { initKeypom, createDrop, getEnv, formatLinkdropUrl } = require("@keypom/core"); +const { parseNearAmount } = require("@near-js/utils"); +const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node"); +const { Near } = require("@near-js/wallet-account"); +const { Account } = require("@near-js/accounts"); +const path = require("path"); +const homedir = require("os").homedir(); + +// Imports used in the NEAR-API-JS method: +const { parseNearAmount } = require("@near-js/utils"); +const { KeyPair } = require("@near-js/crypto") +const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node"); +const { Near } = require("@near-js/wallet-account"); +const { Account } = require("@near-js/accounts"); +const path = require("path"); +const homedir = require("os").homedir(); + + +async function fcDropKeypom(){ +// STEP 1: Initiate a NEAR connection. + +// STEP 2: Create the drop with function call data. +} + +fcDropKeypom() + +``` +## Getting Started +In this section, you'll be addressing the first step: connecting to NEAR. + +This is done with `NEAR-API-JS` and consists of: + +1) Create a Keystore, which stores your access keys used to sign transactions + * select a network, either `testnet` or `mainnet` + * choose a location where the keypairs live, either a folder on your local machine, or in-memory + +2) Define a NEAR configuration using the Keystore +3) Use the configuration to initialize a connection to NEAR + +More information about this process can be found [here](https://docs.near.org/tools/near-api-js/quick-reference#key-store). + +:::note +For simplicity, this tutorial will choose a file-based keystore and point to the `~/.near-credentials` folder on your local machine since this is where most of your keys are stored. For more information about KeyStores, visit NEAR's [official docs](https://docs.near.org/tools/near-api-js/quick-reference#key-store). +::: + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/function-call-drop/fc-example.js#L10-L30 +``` + +## Creating Drop with Function Call Data +In this section, you'll learn about the process of creating an FC drop using the SDK. + +This process starts with calling the `initKeypom` function and will always be the first function you call to interact with the Keypom SDK. + +`initKeypom` initializes the SDK to allow for interactions with the Keypom smart contracts. Without it, none of the other SDK functions would work as expected. If a NEAR connection is not already present, it will initialize a new one for you. More info on the `initKeypom` function can be found [here](../../keypom-sdk/Core/modules.md#initkeypom). + +After `initKeypom` is called, the FC Drop can be created by calling `createDrop` and adding an `fcData` parameter. + +:::tip +Recall that the private keys being generated using `createDrop` are used to store the assets. These keys are then embedded within a link. + +In an FC Drop, the assets consist of a set of invokable methods and optional $NEAR. +::: + +The primary task in creating the Function Call Drop is to define fcData. It is an object containing a methods field that outlines what methods should be called for a given key use: + + +```bash +fcData +└── methods +``` + +For multi-use keys, each specific use can have a different set of methods that will be called. These methods are executed sequentially and not in parallel. As an example, a key with 3 uses can be seen: + +1. `nft_mint` +2. `null` +3. `create_account_advanced`, `setup`, `nft_mint` + +The first time the key is used, an NFT will be minted. The second use will simply advance the key and nothing will be called. The third time the key is used, it will first call `create_account_advanced`. Once that's finished it will call the `setup` method and then finally `nft_mint`. + +This is represented with a 2D array, where each inner is the set of methods per key use. The above example would be represented as: + +```js +methods: [ + [ + "nft_mint" + ], + null, + [ + "create_account_advanced", + "setup", + "nft_mint" + ] +] +``` + +Every method listed represents a function call and requires the following parameters: + +- `receiverId`: The contract receiving the function call. +- `methodName`: The function to be called on the receiver contract. +- `args`: A stringified JSON object of all the arguments to be passed into `methodName`. +- `attachedDeposit`: The yoctoNear deposit attached to the function call when the key is used. + +In this tutorial only one function call will be made: `nft_mint` in order to lazy mint an NFT. + +Including the `fcData` parameter categorizes this as an FC drop. Without it, the Keypom Protocol would treat this drop as a Simple Drop. More information on the `fcData` parameter can be found [here](../../keypom-sdk/Core/interfaces/FCData.md). + +To see what the SDK is doing behind the scenes, a `NEAR-API-JS` equivalent NodeJS script has been provided. + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/function-call-drop/fc-example.js#L32-L71 +``` + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/function-call-drop/fc-near-example.js#L33-L82 +``` + + + + +--- + +## Creating Linkdrops +The last step in this process is to create the links themselves so that you can easily distribute the assets to people. This is done by embedding the private key, containing the $NEAR, into the link along with the Keypom contract ID. + +With the Keypom SDK, this is all neatly wrapped up in the function [`formatLinkdropUrl`](../../keypom-sdk/Core/modules.md#formatlinkdropurl). You just need to provide the base URL format and the private key you wish to embed. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/function-call-drop/fc-example.js#L73-L79 +``` + +--- + +## Complete Code +Now that everything has been put together, the final code can be seen below. + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/function-call-drop/fc-example.js#L1-L86 +``` + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/function-call-drop/fc-near-example.js#L1-L95 +``` + + + + +--- + +## Testing +### Running the Script +Here, you'll learn how to run the code that was just covered, and what to expect. + +To view the completed code, clone the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repository and navigate to the `basic-tutorials/fc-drop`. +``` bash +git clone https://github.com/keypom/keypom-docs-examples.git && cd keypom-docs-examples/basic-tutorials/fc-drop +``` +From there, you can and open the `fc-example.js` file. + +To run the code you just cloned, return to the `keypom-docs-examples` directory and install all the necessary packages. +```bash +cd .. && cd .. && yarn +``` + +:::caution +Prior to running these scripts, ensure you replace all instances of `keypom-docs-demo.testnet` in the script with the credentials of your account found in your `~/.near-credentials` folder +::: + +From there, you can run this FC Drop script that was made in this tutorial using the following command: +``` bash +yarn basic:fc:keypom +``` +:::note +The SDK script is being tested here; use `yarn basic:fc:naj` to test the `NEAR-API-JS` script instead. +::: +This should return a successful drop creation and console log a Public Key and Linkdrop +``` bash +Public Keys: [ 'ed25519:55FkiRc4J3c1zLgzuTYxJMebVrpraXU3P7zPymDtbssN' ] +Linkdrops: [ + 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/2BB8cx2xaKzY1ENBCoVz7bTFUgq8Gx6Ar27D5PbCv39NnZLfWxw3XqWr37HZ1xm3KdQ5uCt8hvt6ztF1eGBQC1Hi' +] +Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com +``` +To see the full console log from this drop creation, see the expandable section below. + +
+Console Log of Test +

+ +``` bash +Receipts: 4MTrVP1cvemzA1XhmX4hHErYvmcgMCgfrXydwNTeez3Y, 8LDCtYSsN5ccFY5udxbYqoVzmxyubqZBRLvMR33FUREN + Log [v2.keypom.testnet]: Current Block Timestamp: 1682352446955649219 + Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000 + Log [v2.keypom.testnet]: Total required storage Yocto 14230000000000000000000 + Log [v2.keypom.testnet]: Current balance: 9.3089748, + Required Deposit: 2.0354781, + total_required_storage: 0.01423, + Drop Fee: 0, + Key Fee: 0 Total Key Fee: 0, + allowance: 0.0202481 total allowance: 0.0202481, + access key storage: 0.001 total access key storage: 0.001, + deposits less none FCs: 1 total deposits: 1 lazy registration: false, + deposits for FCs: 1 total deposits for FCs: 1, + uses per key: 1 + None FCs: 0, + length: 1 + GAS to attach: 100000000000000 + Log [v2.keypom.testnet]: New user balance 7.2734966 + Log [v2.keypom.testnet]: Fees collected 0 +Public Keys: [ 'ed25519:55FkiRc4J3c1zLgzuTYxJMebVrpraXU3P7zPymDtbssN' ] +Linkdrops: [ + 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/2BB8cx2xaKzY1ENBCoVz7bTFUgq8Gx6Ar27D5PbCv39NnZLfWxw3XqWr37HZ1xm3KdQ5uCt8hvt6ztF1eGBQC1Hi' +] +Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com +``` + +

+
+ +### Claiming and Explorer Transactions +Once you click the link, it will take you to the following NEAR Wallet page, where you will have the choice to claim with an existing account or create a new one. +

NEAR Wallet claim

+ +To check the transactions, click the final link in the console log when you run the script. +```bash +Keypom Contract Explorer Link: https://explorer.testnet.near.org/accounts/v2.keypom.testnet +``` + +From there, you should be able to see the [`create_drop`](https://explorer.testnet.near.org/transactions/DF6awbmts4hhACBTA8oBSGdt1oJh7FNCBkv36wZboZXR) and [`claim`](https://explorer.testnet.near.org/transactions/m2LJE2Xv1TMwpbEm5SVj2VGqZxBybkQphXouupJKMg8) transactions. +

explorer transactions

+ +Within the [`claim`](https://explorer.testnet.near.org/transactions/Cgckyr9EEC3o9MDiL8E2mvs6JYPuCApYqWjpgZvy3z6U) transaction, you can also see that `nft_mint` was called on the `nft.examples.testnet` contract. +

explorer transactions

+ +This can be confirmed by visiting the "Collectibles" tab in your NEAR wallet. You should see the newly minted NFT in your wallet. +

NFT collectibles claim

+ +--- + +## Conclusion +In this tutorial, you learned the how to [create a function call drop](fc-drops.md#creating-drop-with-function-call-data) using the `fcData` parameter. Once the drop was created, you constructed a valid linkdrop using the private keys in order to claim the assets. + +Now that you've had a good introduction to creating all 4 Keypom drop types, feel free to modify the scripts created or move on to the [Advanced Tutorials](../Advanced/ticketing/introduction.md) for more challenging and practical examples. diff --git a/versioned_docs/version-2.0/Tutorials/Basics/ft-drops.md b/versioned_docs/version-2.0/Tutorials/Basics/ft-drops.md new file mode 100644 index 00000000..19197f2c --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Basics/ft-drops.md @@ -0,0 +1,447 @@ +--- +sidebar_label: 'Fungible Token Drop' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Fungible Token Drop + +## Introduction +In this tutorial, you will learn how to create a fungible token drop from scratch. This allows you onboard users both with $NEAR and a set of FTs with the click of a link. An excellent use case can be seamlessly offering in-game currency to players. + +

ft claim

+ +To learn more about the FT drop, see the [concepts page](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/ft-drops.md) + + +--- + +## Prerequisites +For the basic tutorials, you can choose to run the scripts on your own machine. To do so, you must have the following: + +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [NEAR-API-JS](https://docs.near.org/tools/near-api-js/quick-reference#install) +3. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + +With this tutorial, you can either create your own script by following along, or view the completed script available in the [Keypom Documentation Examples](https://github.com/keypom/keypom-docs-examples) repo. + +### Creating your Project +In this section, you're going to create your project and install the SDK to prepare for the tutorial. If you have a completed script and have installed the SDK, you can skip [forward](simple-drops.md#breaking-down-the-problem). + +First, you need to give your project a home. + +```bash +mkdir my-keypom-project && cd my-keypom-project +``` + +Next, you'll want to create a default `package.json` file using the following command. You can accept all default values. +```bash +npm init +``` + +At this point, your project structure should look like this. +```bash +/my-keypom-project +β”œβ”€β”€ package.json +``` + +If you open `package.json`, you should see this. + +
+Default package.json +

+ +``` bash +{ + "name": "my-keypom-project", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} +``` + +

+
+ +The next step is to create an empty JavaScript file. + + + +```bash +touch ft-keypom.js +``` + + + + +```bash +fsutil file createnew ft-keypom.js 0 +``` + + + + +Finally, the last step is to install the Keypom JS SDK. +```bash +npm install @keypom/core +``` + +After installing the SDK, your `package.json` file should now look slightly different. + +
+package.json after installing the SDK +

+ +```bash +{ + "name": "my-keypom-project", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + # highlight-start + "dependencies": { + "@keypom/core": "^1.0.0" + } + # highlight-end +} +``` + +

+
+ +With these steps complete, your project folder should look like this. + +```bash +/my-keypom-project +β”œβ”€β”€ ft-keypom.js +β”œβ”€β”€ package.json +β”œβ”€β”€ package-lock.json +β”œβ”€β”€ node_modules +β”‚ └── @keypom/core +β”‚ └── ... +``` + +You are now ready to begin creating your drop! + +--- + + +## Breaking Down the Problem + +The process of creating an FT drop can be broken down into the following steps. + +1) Connect to the NEAR blockchain. +2) Ensure the funder has enough FTs to fund the drop. +3) Create the drop. +4) Transfer Keypom the necessary Fungible Tokens. +5) Create linkdrops. + +The following skeleton code can be used as a starting point: +```js +// Each of the two methods to create this drop will have their own unique set of imports + +// Imports used in the Keypom SDK method: +const { initKeypom, createDrop, getEnv, formatLinkdropUrl } = require("@keypom/core"); +const { parseNearAmount } = require("@near-js/utils"); +const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node"); +const { Near } = require("@near-js/wallet-account"); +const { Account } = require("@near-js/accounts"); +const { BN } = require("bn.js"); +const path = require("path"); +const homedir = require("os").homedir(); + +// Imports used in the NEAR-API-JS method: +const { parseNearAmount } = require("@near-js/utils"); +const { KeyPair } = require("@near-js/crypto") +const { Near } = require("@near-js/wallet-account"); +const { Account } = require("@near-js/accounts"); +const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node"); +const { getRecentDropId } = require("../utils/general.js") +const { BN } = require("bn.js"); +const path = require("path"); +const homedir = require("os").homedir(); + + +async function FTDropKeypom(){ +// GETTING STARTED + +// STEP 1 Initialize NEAR blockchain connection. + +// STEP 2 Ensure the funder has enough FTs to fund the drop. + +// CREATING DROP AND TRANSFERRING FTs + +// STEP 3 Create the drop. + +// STEP 4 Transfer Keypom the necessary Fungible Tokens. + +// CREATING LINKDROPS + +// STEP 5 Create Linkdrops +} + +FTDropKeypom() +``` +Steps 1 and 2 will be covered in "[Getting Started](ft-drops.md#getting-Started)" and Steps 3, 4, and 5 will be under "[Creating FT drop and Transferring FTs](ft-drops.md#creating-drop-and-transferring-fts)". Step 6 will have its own section called "[Creating Linkrops](ft-drops.md#creating-linkdrops)". + +--- + +## Getting Started +In this section, you'll be addressing the first two steps: connecting to NEAR and ensuring the funder has enough FTs for the drop. + +Connecting to the NEAR blockchain will be done using `NEAR-API-JS` and consists of the following steps: + +1) Create a Keystore, which stores your access keys used to sign transactions + * select a network, either `testnet` or `mainnet` + * choose a location where the keypairs live, either a folder on your local machine, or in-memory + +2) Define a NEAR configuration using the Keystore +3) Use the configuration to initialize a connection to NEAR + +More information about this process can be found [here](https://docs.near.org/tools/near-api-js/quick-reference#key-store). + +:::note +For simplicity, this tutorial will choose a file-based keystore and point to the `~/.near-credentials` folder on your local machine since this is where most of your keys are stored. For more information about KeyStores, visit NEAR's [official docs](https://docs.near.org/tools/near-api-js/quick-reference#key-store). +::: + +To ensure the funder has enough FTs to fund the drop, a new concept is to be defined. + +:::info +`amountToTransfer` = *FT per use* * *number of keys* * *uses per key*. +::: + +Using `NEAR-API-JS`, a `viewFunction` to the FT contract can be made to call `ft_balance_of`. This will return the funder's FT balance, which can be compared with `amountToTransfer` to ensure the funder has enough FTs to fund the drop. + + + +The code for setting up the NEAR connection and ensuring sufficient funder FT balance is shown below. In the skeleton code, these are steps 1 and 2. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/fungible-token-drop/ft-example.js#L11-L45 +``` +:::note +In the code, you may notice the balances defined using `BN`. These are simply *Big Numbers* and is a library built to handle numbers beyond JavaScript's [max safe integer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER). + +The FTs in this example have a `decimal` of 24. This is the same as 1 $NEAR -> 1024 YoctoNEAR, which allows the use of [`parseNearAmount`](https://docs.near.org/tools/near-api-js/utils) to convert between the two. Read more on the decimal parameter [here](https://docs.openzeppelin.com/contracts/3.x/erc20#a-note-on-decimals). +::: + +--- + +## Creating Drop and Transferring FTs +In this section of the tutorial, you'll be creating the drop and transferring the FTs to Keypom using the Keypom SDK. + +As outlined in to introduction, there are 2 tasks to complete in this section. + +- Create the drop +- Transfer the FTs to Keypom + + +This process starts with calling the `initKeypom` function and will always be the first function you call to interact with the SDK. + +`initKeypom` initializes the SDK to allow for interactions with the Keypom smart contracts. Without it, none of the other SDK functions would work as expected. If a NEAR connection is not already present, it will initialize a new one for you. More info on the `initKeypom` function can be found [here](../../keypom-sdk/Core/modules.md#initkeypom). + +Following the `initKeypom` call, the FT Drop is created. This is done by calling `createDrop` and adding an `ftData` parameter. + +:::tip +Recall that the private keys being generated using `createDrop` are used to store the assets. These keys are then embedded within a link. + +In an FT Drop, the assets consist of FTs and optional $NEAR. +::: + + +`ftData` is an object with the following properties. +```bash +ftData +β”œβ”€β”€ contractId +β”œβ”€β”€ senderId +β”œβ”€β”€ amount +``` + + +- `contractId`: The FT contract ID +- `senderId`: The account from which the FTs will be sent to Keypom. +- `amount`: This is the human readable amount of FT, based on the [decimals value](https://docs.openzeppelin.com/contracts/3.x/erc20#a-note-on-decimals) of the token + +Including the `ftData` parameter categorizes this as an FT drop. Without it, the Keypom Protocol would treat this drop as a Simple Drop. + +More information on the `ftData` parameter can be found [here](../../keypom-sdk/Core/interfaces/FTData.md). + +:::info +So long as the funder has an adequate FT balance, all you need to do is call `createDrop` with `ftData` to create the drop. + +The SDK will **automatically** register Keypom on the FT contract and transfer the FTs to Keypom for you. +::: + +To see what the SDK is doing behind the scenes, a `NEAR-API-JS` equivalent NodeJS script has been provided. + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/fungible-token-drop/ft-example.js#L47-L70 +``` + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/fungible-token-drop/ft-near-example.js#L50-L115 +``` + + + + +--- + +## Creating Linkdrops +The last step in this process is to create the links themselves so that you can easily distribute the assets to people. This is done by embedding the private key, containing the $NEAR, into the link along with the Keypom contract ID. + +With the Keypom SDK, this is all neatly wrapped up in the function [`formatLinkdropUrl`](../../keypom-sdk/Core/modules.md#formatlinkdropurl). You just need to provide the base URL format and the private key you wish to embed. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/fungible-token-drop/ft-example.js#L72-L78 +``` + +--- + +## Full Code +Now that everything has been put together, the final code can be seen below. + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/fungible-token-drop/ft-example.js#L1-L86 +``` + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/fungible-token-drop/ft-near-example.js#L1-L127 +``` + + + + +--- + +## Testing +### Running the Script +Here, you'll learn how to run the code that was just covered, and what to expect. + +To view the completed code, clone the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repository and navigate to the `basic-tutorials/ft-drop`. +``` bash +git clone https://github.com/keypom/keypom-docs-examples.git && cd keypom-docs-examples/basic-tutorials/ft-drop +``` +From there, you can and open the `ft-example.js` file. + +To run the code you just cloned, return to the `keypom-docs-examples` directory and install all the necessary packages. +```bash +cd .. && cd .. && yarn +``` + +:::caution +Prior to running these scripts, ensure you replace all instances of `keypom-docs-demo.testnet` in the script with the credentials of your account found in your `~/.near-credentials` folder +::: + +From there, you can run this FT Drop script that was made in this tutorial using the following command: +``` bash +yarn basic:ft:keypom +``` +:::note +The SDK script is being tested here; use `yarn basic:ft:naj` to test the `NEAR-API-JS` script instead. +::: +This should return a successful drop creation and console log a Public Key and Linkdrop + +```bash +Public Keys: [ 'ed25519:DkvGVA8UuBRKtsXvBxnKkHs2aHzd221QSquinokfJ71a' ] +Linkdrops: [ + 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/2H8i9Snk4v3wBBHeTxBFuzzi1SF5DL4nFHvMUp1nDz4ARSW3tB5b8z2Xxm6Y5rMzzVS3sDppPxM4jtRhyYkHfF2Y' +] +Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com +``` + +To see the full console log from this drop creation, see the expandable section below. + +
+Console Log of Test +

+ +``` bash +Receipts: AxiAwWNkKQsyvdcAhwBr2B2Qqc5gVCBw2MLrbL7dLq6d, 6QCHm8YtpfreHYQvw9VAHU7rJXGgfVv4T1TDcuXHEtvC, 5CTcWfQ1BC1nensRK6NhcNSv5NjxdSaVSwti4j34fCa3 + Log [v2.keypom.testnet]: Current Block Timestamp: 1682352345716601116 + Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000 + Log [v2.keypom.testnet]: was_ft_registered: true + Log [v2.keypom.testnet]: Total required storage Yocto 11980000000000000000000 + Log [v2.keypom.testnet]: Current balance: 8.2955772, + Required Deposit: 1.0332281, + total_required_storage: 0.01198, + Drop Fee: 0, + Key Fee: 0 Total Key Fee: 0, + allowance: 0.0202481 total allowance: 0.0202481, + access key storage: 0.001 total access key storage: 0.001, + deposits less none FCs: 1 total deposits: 1 lazy registration: false, + deposits for FCs: 0 total deposits for FCs: 0, + uses per key: 1 + None FCs: 0, + length: 1 + GAS to attach: 100000000000000 + Log [v2.keypom.testnet]: New user balance 7.262349 + Log [v2.keypom.testnet]: Fees collected 0 + Log [v2.keypom.testnet]: Performing CCC to get storage from FT contract +Receipts: 4PPt4W1C9xYP2yc67CLVX6vvYshf1oCoDr9hBiZUniTZ, 8iSu5McdW8rvPApvYjbPhew6wGZ9raAPiR8SEA43tV86 + Log [v2.keypom.testnet]: User has enough balance to cover FT storage. Subtracting 0.0025 from user balance. User balance is now 7.259849 + Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000 + Log [v2.keypom.testnet]: FT contract already registered. Refunding user balance for 0.00125. Balance is now 7.261099 +Receipts: 9FEiXh19PMMRirF4CGDTEfopWxf6eLWxNvJmUMnrrVX8, AwJ362Sj4PZ3EbusnwLo4qoyExXRRZPAyqUUT1uZ64oi, 8KquU3a2BA3AWb9keYfwYvYpD6iD5CQG1Vn78efBex9B + Log [ft.keypom.testnet]: EVENT_JSON:{"standard":"nep141","version":"1.0.0","event":"ft_transfer","data":[{"old_owner_id":"keypom-docs-demo.testnet","new_owner_id":"v2.keypom.testnet","amount":"1"}]} +Receipt: 9Ls4K4vm8pW7HcjD6PMBbJoWSsjwN16YEq3GdCqnahPx + Log [ft.keypom.testnet]: New uses registered 1 +Public Keys: [ 'ed25519:DkvGVA8UuBRKtsXvBxnKkHs2aHzd221QSquinokfJ71a' ] +Linkdrops: [ + 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/2H8i9Snk4v3wBBHeTxBFuzzi1SF5DL4nFHvMUp1nDz4ARSW3tB5b8z2Xxm6Y5rMzzVS3sDppPxM4jtRhyYkHfF2Y' +] +Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com +``` + +

+
+ +### Claiming and Explorer Transactions +Once you click the link, it will take you to the following NEAR Wallet page, where you will have the choice to claim with an existing account or create a new one. +

NEAR Wallet claim

+ +In your NEAR wallet, you should now be able to see the FT tokens that were transferred to you. +

ft claim

+ +To check the transactions, click the final link in the console log when you run the script. +```bash +Keypom Contract Explorer Link: https://explorer.testnet.near.org/accounts/v2.keypom.testnet +``` + +From there, you should be able to see the [`create_drop`](https://explorer.testnet.near.org/transactions/6HkwpwWVA7m1tAGj75JGpF975toStWRF1y8FSRDMPPfT), [`ft_transfer_call`](https://explorer.testnet.near.org/transactions/47HmGKAHx4TDp6vNbnBAb9ifS1gTXrC58o7svFmZDYzk) and [`claim`](https://explorer.testnet.near.org/transactions/62gQiyQjx9z9WJsVQNaaa4fje9PeeTpCuHun2PZ8WjNm) transactions. +

explorer transactions

+ + +:::note +Recall that `ft_transfer_call` is never explicitly called but rather `createDrop` calls it for you; this can be seen in the explorer shown above. + +This is the SDK in action! +::: + +--- + +## Conclusion +In this tutorial, you've learned to ensure the funder has a [sufficient FT balance](ft-drops.md#getting-started) for the drop, [create an FT drop](ft-drops.md#creating-drop-and-transferring-fts) with the SDK, and to [transfer FTs](ft-drops.md#creating-drop-and-transferring-fts) to Keypom. Once the drop was created, you constructed a valid linkdrop using the private keys in order to claim the assets. + +In the next tutorial, you will learn to create a function call drop. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Basics/getting-started.md b/versioned_docs/version-2.0/Tutorials/Basics/getting-started.md new file mode 100644 index 00000000..9d0ffd2f --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Basics/getting-started.md @@ -0,0 +1,43 @@ +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Getting Started +The primary goal of a Keypom drop is to send assets to users with the click of a link regardless of whether they have a wallet or not. These assets can come in many forms which will be broken down below. + +The basic tutorials are meant as introductory guides that will help you create your first Keypom drops and understand the differences between the [types](/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/introduction.md) of Keypom drops and the assets they contain. + +There are **four** types of drops, each with different types of assets. These drops can be claimed either with a brand new NEAR account or an existing one. + + +| Drop Type | Assets | +| -------------------------------------------------------------------------------------------------- | -------------------------------------------| +| [Simple Drop](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/simple-drops.md) | $NEAR | +| [Non-Fungible Token Drop](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/nft-drops.md) | NFT and optionally $NEAR | +| [Fungible Token Drop](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/ft-drops.md) | Fungible Tokens and optionally $NEAR | +| [Function Call Drop](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md) | Set of function-calls and optionally $NEAR | + + +The [Simple Drop](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/simple-drops.md) is the most basic type of drop, it allows you to send $NEAR via a link to new or existing users. + +[NFT Drops](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/nft-drops.md) and [FT Drops](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/ft-drops.md) are extensions of the Simple drop, they allow you to send NFTs and FTs in addition to $NEAR. + +The [Function Call Drop](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops.md) is Keypom's most powerful type of drop. It allows you send a link that is capable of calling almost any function on any smart contract that you predefine. A simple example of this is auto-registering users into a DAO as part of the onboarding process. + +While there are many [drop configurations](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/customization-homepage.md) available to developers such as multi-use keys or time-based restrictions, in these basic tutorials, a single use key with no additional configurations will be created. + +Throughout each tutorial, two simple NodeJS scripts will be created that use both NEAR's native [NEAR-API-JS](https://docs.near.org/tools/near-api-js/reference) library, and Keypom's [JS-SDK](https://github.com/keypom/keypom-js). + +--- + +## Prerequisites +For the basic tutorials, you can choose to run the scripts on your own machine. To do so, you must have the following: + +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [NEAR-API-JS](https://docs.near.org/tools/near-api-js/quick-reference#install) +3. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + +At this point, you are ready to start the tutorials. + +Alternatively, if you wish to use ready-to-use scripts that can be customized to your liking in order to quickly create Keypom drops, visit the [Keypom Protocol](https://github.com/keypom/keypom#deploy-scripts). + + diff --git a/versioned_docs/version-2.0/Tutorials/Basics/nft-drops.md b/versioned_docs/version-2.0/Tutorials/Basics/nft-drops.md new file mode 100644 index 00000000..0d7bee2b --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Basics/nft-drops.md @@ -0,0 +1,429 @@ +--- +sidebar_label: 'Non Fungible Token Drop' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Non Fungible Token Drop + +## Introduction +In this tutorial, you will learn how to create a non-fungible token drop from scratch. This allows you onboard users both with $NEAR and an existing NFT with the click of a link. This is great for sending an NFT that you own to your friends without needing to worry about whether or not they have a NEAR wallet. + + +

MyNearWallet claim

+ +To learn more about the NFT drop, see the [concepts page](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/nft-drops.md) + +--- + +## Prerequisites +For the basic tutorials, you can choose to run the scripts on your own machine. To do so, you must have the following: + +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [NEAR-API-JS](https://docs.near.org/tools/near-api-js/quick-reference#install) +3. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + +With this tutorial, you can either create your own script by following along, or view the completed script available in the [Keypom Documentation Examples](https://github.com/keypom/keypom-docs-examples) repo. + +### Creating your Project +In this section, you're going to create your project and install the SDK to prepare for the tutorial. If you have a completed script and have installed the SDK, you can skip [forward](simple-drops.md#breaking-down-the-problem). + +First, you need to give your project a home. + +```bash +mkdir my-keypom-project && cd my-keypom-project +``` + +Next, you'll want to create a default `package.json` file using the following command. You can accept all default values. +```bash +npm init +``` + +At this point, your project structure should look like this. +```bash +/my-keypom-project +β”œβ”€β”€ package.json +``` + +If you open `package.json`, you should see this. + +
+Default package.json +

+ +``` bash +{ + "name": "my-keypom-project", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} +``` + +

+
+ +The next step is to create an empty JavaScript file. + + + +```bash +touch nft-keypom.js +``` + + + + +```bash +fsutil file createnew nft-keypom.js 0 +``` + + + + +Finally, the last step is to install the Keypom JS SDK. +```bash +npm install @keypom/core +``` + +After installing the SDK, your `package.json` file should now look slightly different. + +
+package.json after installing the SDK +

+ +```bash +{ + "name": "my-keypom-project", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + # highlight-start + "dependencies": { + "@keypom/core": "^1.0.0" + } + # highlight-end +} +``` + +

+
+ +With these steps complete, your project folder should look like this. + +```bash +/my-keypom-project +β”œβ”€β”€ nft-keypom.js +β”œβ”€β”€ package.json +β”œβ”€β”€ package-lock.json +β”œβ”€β”€ node_modules +β”‚ └── @keypom/core +β”‚ └── ... +``` + +You are now ready to begin creating your drop! + +--- + +## Breaking Down the Problem + +The process of creating an NFT drop can be broken down into the following steps. + +1) Establish a connection to the NEAR blockchain. +2) If you don't own the NFT, mint it using the `nft_mint` function. +3) Create the keys and the drop with the NFT information. +4) Transfer ownership of the NFTs to Keypom. +5) Create linkdrops. + +:::info +The NFT ownership must be transferred to Keypom so that it can send the NFT to the user when they claim their drop. +::: + +The following skeleton code can be used as a starting point: + +```js +// Each of the two methods to create this drop will have their own unique set of imports + +// Imports used in the Keypom SDK method: +const { initKeypom, createDrop, getEnv, formatLinkdropUrl } = require("@keypom/core"); +const { parseNearAmount } = require("@near-js/utils"); +const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node"); +const { Near } = require("@near-js/wallet-account"); +const { Account } = require("@near-js/accounts"); +const path = require("path"); +const homedir = require("os").homedir(); + +// Imports used in the NEAR-API-JS method: +const { parseNearAmount } = require("@near-js/utils"); +const { KeyPair } = require("@near-js/crypto") +const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node"); +const { Near } = require("@near-js/wallet-account"); +const { Account } = require("@near-js/accounts"); +const { getRecentDropId } = require("../utils/general.js") +const path = require("path"); +const homedir = require("os").homedir(); + + +async function NFTDropKeypom(){ +// GETTING STARTED + +// STEP 1: Initiate a NEAR connection. + +// STEP 2: Mint NFTs + +// CREATING DROP AND TRANSFERRING NFTs + +// STEP 3: Create NFT drop + +// STEP 4: Transfer NFTs to Keypom + +// CREATING LINKDROPS + +// STEP 5: Create Linkdrops +} + +NFTDropKeypom() +``` + +For this tutorial, steps 1 and 2 will be grouped under "[Getting Started](nft-drops.md#getting-started)", steps 3 and 4 will be grouped under "[Creating drop and transferring NFT](nft-drops.md#creating-drop-and-transferring-nft)", and step 5 will have its own section called "[Creating Linkrops](nft-drops.md#creating-linkdrops)". + +--- + +## Getting Started +In this section, the NEAR blockchain connection is set up and the NFTs will be minted to ensure you are transferring NFTs that *you* own. If you already own the NFTs you wish to add to the drop, there is no need to mint them here. + +Connecting to the NEAR blockchain will be done using `NEAR-API-JS` and consists of the following steps: + +1) Create a Keystore, which stores your access keys used to sign transactions + * select a network, either `testnet` or `mainnet` + * choose a location where the keypairs live, either a folder on your local machine, or in-memory + +2) Define a NEAR configuration using the Keystore +3) Use the configuration to initialize a connection to NEAR + +More information about this process can be found [here](https://docs.near.org/tools/near-api-js/quick-reference#key-store). + +:::note +For simplicity, this tutorial will choose a file-based keystore and point to the `~/.near-credentials` folder on your local machine since this is where most of your keys are stored. For more information about KeyStores, visit NEAR's [official docs](https://docs.near.org/tools/near-api-js/quick-reference#key-store). +::: + +The code for setting up the NEAR connection and minting the NFT is shown below. In the skeleton code, these are steps 1 and 2. + +``` js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/non-fungible-token-drop/nft-example.js#L11-L49 +``` + +:::note +The NFT must be minted with a `NEAR-API-JS` `functionCall` to the NFT contract. + +Function arguments for `functionCall` can be found [here](https://docs.near.org/tools/near-api-js/reference/modules/transaction#functioncall) +::: + +--- + +## Creating Drop and Transferring NFT + +In this section of the tutorial, you'll be creating the NFT drop and transferring the NFT to Keypom using the Keypom SDK. + +This process starts with calling the `initKeypom` function and will always be the first function you call to interact with the SDK. + +`initKeypom` initializes the SDK to allow for interactions with the Keypom smart contracts. Without it, none of the other SDK functions would work as expected. If a NEAR connection is not already present, it will initialize a new one for you. More info on the `initKeypom` function can be found [here](../../keypom-sdk/Core/modules.md#initkeypom). + +After calling `initKeypom`, the NFT Drop is created. This is done by calling `createDrop` and adding an `nftData` parameter. + +:::tip +Recall that the private keys being generated using `createDrop` are used to store the assets. These keys are then embedded within a link. + +In an NFT Drop, the assets consist of an NFT and optional $NEAR. +::: + +`nftData` is an object with the following properties. + +```bash +nftData +β”œβ”€β”€ contractId +β”œβ”€β”€ senderId +β”œβ”€β”€ tokenIds +``` + +- `contractId`: The contract ID where the NFTs for this drop are coming from +- `senderId`: The current owner of the NFTs that will be sent to Keypom +- `tokenIds`: A list of all the token IDs to be sent to Keypom during the NFT drop creation process. + +Including the `nftData` parameter categorizes this as an NFT drop. Without it, the Keypom Protocol would treat this drop as a Simple Drop. + +More information on the `nftData` parameter can be found [here](../../keypom-sdk/Core/interfaces/NFTData.md). + +To see what the SDK is doing behind the scenes, a `NEAR-API-JS` equivalent NodeJS script has been provided. + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/non-fungible-token-drop/nft-example.js#L51-L74 +``` + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/non-fungible-token-drop/nft-near-example.js#L52-L101 +``` + + + + +:::note +All function parameters and default values for the SDK and Keypom functions can be found in the [SDK Typedocs](../../keypom-sdk/Core/modules.md). For `NEAR-API-JS` functions, their arguments can be found [here](https://docs.near.org/tools/near-api-js/reference) +::: + +--- + +## Creating Linkdrops +The last step in this process is to create the links themselves so that you can easily distribute the assets to people. This is done by embedding the private key, containing the $NEAR, into the link along with the Keypom contract ID. + +With the Keypom SDK, this is all neatly wrapped up in the function [`formatLinkdropUrl`](../../keypom-sdk/Core/modules.md#formatlinkdropurl). You just need to provide the base URL format and the private key you wish to embed. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/non-fungible-token-drop/nft-example.js#L76-L82 +``` + +--- + +## Full Solution +Now that everything has been put together, the final code can be seen below. + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/non-fungible-token-drop/nft-example.js#L1-L89 +``` + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/non-fungible-token-drop/nft-near-example.js#L1-L114 +``` + + + + +--- + +## Testing +### Running the Script +Here, you'll learn how to run the code that was just covered, and what to expect. + +To view the completed code, clone the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repository and navigate to the `basic-tutorials/nft-drop`. +``` bash +git clone https://github.com/keypom/keypom-docs-examples.git && cd keypom-docs-examples/basic-tutorials/nft-drop +``` +From there, you can and open the `nft-example.js` file. + +To run the code you just cloned, return to the `keypom-docs-examples` directory and install all the necessary packages. +```bash +cd .. && cd .. && yarn +``` + +:::caution +Prior to running these scripts, ensure you replace all instances of `keypom-docs-demo.testnet` in the script with the credentials of your account found in your `~/.near-credentials` folder +::: + +From there, you run this NFT Drop script that was made in this tutorial using the following command: +``` bash +yarn basic:nft:keypom +``` +:::note +The SDK script is being tested here; use `yarn basic:nft:naj` to test the `NEAR-API-JS` script instead. +::: +This should return a successful drop creation and console log a Public Key and Linkdrop: +```bash +Public Keys: [ 'ed25519:Cf48tjtLrRDm5qYN5fyNvPHBTNVkSsX2mP2mfw2W2f3N' ] +Linkdrops: [ + 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/4iBKGBMhKo3BLi8wfc6qDPxUG3xrsXygDbzVwXBsh3tEvLVE2a4EGDtHreH89a7peAhC8yot1Zm5vd3nfnxxmzv4' +] +Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com +``` + +To see the full console log from this drop creation, see the expandable section below. + +
+Console Log of Test +

+ +``` bash +Receipts: 94Hxiw6dy2VbgfWWuL8scyAKutgmZ6TnyaGLuSdw8bdw, EPBCevWD8jCmVmRhH4r7nEWY5P5mHNXBzxRs8FFmjh1s + Log [nft.examples.testnet]: EVENT_JSON:{"standard":"nep171","version":"nft-1.0.0","event":"nft_mint","data":[{"owner_id":"keypom-docs-demo.testnet","token_ids":["keypom-token-1682351707371"]}]} +Receipts: 8VKpVfRZkPBJzZR42aBiytbECXFYqAvLF72jRUgaccHt, AV5tmBbWuzkV7DLNX6o4LgkeBysShJ647VmdY3ye15s + Log [v2.keypom.testnet]: Current Block Timestamp: 1682351728091701553 + Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000 + Log [v2.keypom.testnet]: Total required storage Yocto 12140000000000000000000 + Log [v2.keypom.testnet]: Current balance: 8.2333838, + Required Deposit: 1.0333881, + total_required_storage: 0.01214, + Drop Fee: 0, + Key Fee: 0 Total Key Fee: 0, + allowance: 0.0202481 total allowance: 0.0202481, + access key storage: 0.001 total access key storage: 0.001, + deposits less none FCs: 1 total deposits: 1 lazy registration: false, + deposits for FCs: 0 total deposits for FCs: 0, + uses per key: 1 + None FCs: 0, + length: 1 + GAS to attach: 100000000000000 + Log [v2.keypom.testnet]: New user balance 7.1999957 + Log [v2.keypom.testnet]: Fees collected 0 +Receipts: HwvpQcMKQdWczLsbBsvZD72UdJTpY6BTDPZBFwk7YZFy, DGs58AziaMcgkZbhki2caZBAFC6fYa83qXfziQmmwaeU, 3zs1apRpLhdfYpdRJUidgP8YJzkPr2YKaoVT8Hitau5p + Log [nft.examples.testnet]: EVENT_JSON:{"standard":"nep171","version":"nft-1.0.0","event":"nft_transfer","data":[{"old_owner_id":"keypom-docs-demo.testnet","new_owner_id":"v2.keypom.testnet","token_ids":["keypom-token-1682351707371"]}]} +Receipt: 4HJAWvH67JtsdDVQP1vsRTniFwkALWokPRpkPbMxqArY + Log [nft.examples.testnet]: drop.registered_uses 1 + Log [nft.examples.testnet]: Subtracting 1110000000000000000000 from funder to cover storage. New balance is 7198885721113380930000000 +Public Keys: [ 'ed25519:Cf48tjtLrRDm5qYN5fyNvPHBTNVkSsX2mP2mfw2W2f3N' ] +Linkdrops: [ + 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/4iBKGBMhKo3BLi8wfc6qDPxUG3xrsXygDbzVwXBsh3tEvLVE2a4EGDtHreH89a7peAhC8yot1Zm5vd3nfnxxmzv4' +] +Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com +``` + +

+
+ +### Claiming and Explorer Transactions +Once you click the link, it will take you to the following NEAR Wallet page, where you will have the choice to claim with an existing account or create a new one. +

Near Wallet claim

+ +After the claim transaction succeeds, you can view the NFT in your collectibles tab. +

NFT collectibles claim

+ +To check the transactions, click the final link in the console log when you run the script. +```bash +Keypom Contract Explorer Link: https://explorer.testnet.near.org/accounts/v2.keypom.testnet +``` + +From there, you should be able to see the [`create_drop`](https://explorer.testnet.near.org/transactions/9rR6mPjoQFKC2Euuvn5yh5e6hPv3WTrMYjwja3ppkjaD), [`nft_transfer_call`](https://explorer.testnet.near.org/transactions/A2hdnm6mHQNLupFLP1vMNZ1J8QHkxLqDLqocUnQxNC5F) and [`claim`](https://explorer.testnet.near.org/transactions/5Kx9F5nxjbWpq8qUr7rRuDun8zipvR7TFbVuPoP5qwBW) transactions. +

explorer transactions

+ +:::note +Recall that `nft_transfer_call` is never explicitly called but rather `createDrop` calls it for you; this can be seen in the explorer shown above. + +This is the SDK in action! +::: + +--- + +## Conclusion +In this NFT tutorial, you learned about the steps needed while [initializing an NFT drop](nft-drops.md#getting-started) and the process of [creating the NFT drop](nft-drops.md#creating-drop-and-transferring-nft). Once the drop was created, you constructed a valid linkdrop using the private keys in order to claim the assets. + +In the next tutorial, you will learn how to create a Fungible Token drop, which is similar to the NFT drop, but transfers FTs instead of NFTs. \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/Basics/simple-drops.md b/versioned_docs/version-2.0/Tutorials/Basics/simple-drops.md new file mode 100644 index 00000000..264624c4 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Basics/simple-drops.md @@ -0,0 +1,371 @@ +--- +sidebar_label: 'Simple Drop' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Simple Drop + +## Introduction +In this tutorial, you will learn how to create a simple $NEAR drop from scratch. By embedding $NEAR in a Web2 style link, the simple drop allows you to onboard both existing and new users. + +Being the simplest Keypom drop type, it acts as the foundation for the other 3 kinds of Keypom drops. Despite this, the simple drop opens the door to more complex use cases such as [subscription services](../../Tutorials/Advanced/subscriptions/introduction.md). + +

Near Wallet claim

+ +To learn more about the Simple Drop, see the [concepts page](../../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/simple-drops.md) + +--- + +## Prerequisites +For the basic tutorials, you can choose to run the scripts on your own machine. To do so, you must have the following: + +1. [Node JS](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +2. [NEAR-API-JS](https://docs.near.org/tools/near-api-js/quick-reference#install) +3. [Keypom JS SDK](https://github.com/keypom/keypom-js#getting-started) + +With this tutorial, you can either create your own script by following along, or view the completed script available in the [Keypom Documentation Examples](https://github.com/keypom/keypom-docs-examples) repo. + +### Creating your Project +In this section, you're going to create your project and install the SDK to prepare for the tutorial. If you have a completed script and have installed the SDK, you can skip [forward](simple-drops.md#breaking-down-the-problem). + +First, you need to give your project a home. + +```bash +mkdir my-keypom-project && cd my-keypom-project +``` + +Next, you'll want to create a default `package.json` file using the following command. You can accept all default values. +```bash +npm init +``` + +At this point, your project structure should look like this. +```bash +/my-keypom-project +β”œβ”€β”€ package.json +``` + +If you open `package.json`, you should see this. + +
+Default package.json +

+ +``` bash +{ + "name": "my-keypom-project", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} +``` + +

+
+ +The next step is to create an empty JavaScript file. + + + +```bash +touch simple-keypom.js +``` + + + + +```bash +fsutil file createnew simple-keypom.js 0 +``` + + + + +Finally, the last step is to install the Keypom JS SDK. +```bash +npm install @keypom/core +``` + +After installing the SDK, your `package.json` file should now look slightly different. + +
+package.json after installing the SDK +

+ +```bash +{ + "name": "my-keypom-project", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + # highlight-start + "dependencies": { + "@keypom/core": "^1.0.0" + } + # highlight-end +} +``` + +

+
+ +With these steps complete, your project folder should look like this. + +```bash +/my-keypom-project +β”œβ”€β”€ simple-keypom.js +β”œβ”€β”€ package.json +β”œβ”€β”€ package-lock.json +β”œβ”€β”€ node_modules +β”‚ └── @keypom/core +β”‚ └── ... +``` + +You are now ready to begin creating your drop! + +--- + +## Breaking Down the Problem + +Creating a simple drop is a four step process: + +1) Establish a connection to the NEAR blockchain. +2) Create a set of access keys where the assets will be stored. +3) Use the Keypom SDK to create the drop. +4) Create linkdrops. + +The following skeleton code can be used as a starting point: +``` js +// Each of the two methods to create this drop will have their own unique set of imports + +// Imports used in the Keypom SDK method: +const { initKeypom, createDrop, getEnv, formatLinkdropUrl } = require("@keypom/core"); +const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node"); +const { connect, Near } = require("@near-js/wallet-account"); +const path = require("path"); +const homedir = require("os").homedir(); + +// Imports used in the NEAR-API-JS method: +const { parseNearAmount } = require("@near-js/utils"); +const { KeyPair } = require("@near-js/crypto") +const { Near } = require("@near-js/wallet-account"); +const { Account } = require("@near-js/accounts"); +const { UnencryptedFileSystemKeyStore } = require("@near-js/keystores-node"); +const path = require("path"); +const homedir = require("os").homedir(); + + +async function simpleDropKeypom(){ +// STEP 1: Initiate a NEAR connection. + +// STEP 2: Create a set of access keys + +// STEP 3: Create the drop. + +// STEP 4: Create linkdrops +} + +simpleDropKeypom() + +``` + +--- + +## Getting Started - Connecting to NEAR +The first step to create a Keypom drop is connecting to the NEAR blockchain. + +This is done with `NEAR-API-JS` and consists of the following steps: + +1) Create a Keystore, which stores your access keys used to sign transactions + * select a network, either `testnet` or `mainnet` + * choose a location where the keypairs live, either a folder on your local machine, or in-memory + +2) Define a NEAR configuration using the Keystore +3) Use the configuration to initialize a connection to NEAR + +More information about this process can be found [here](https://docs.near.org/tools/near-api-js/quick-reference#key-store). + +:::note +For simplicity, this tutorial will choose a file-based keystore and point to the `~/.near-credentials` folder on your local machine since this is where most of your keys are stored. For more information about KeyStores, visit NEAR's [official docs](https://docs.near.org/tools/near-api-js/quick-reference#key-store). +::: + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/simple-drop/simple-example.js#L10-L28 +``` + +--- + +## Creating the Simple Drop +Now that the connection to the NEAR blockchain is set up, the next step is to create the Keypairs and the drop using the Keypom SDK. + + + +`initKeypom` initializes the SDK to allow for interactions with the Keypom smart contracts. Without it, none of the other SDK functions would work as expected. If a NEAR connection is not already present, it will initialize a new one for you. More info on the `initKeypom` function can be found [here](../../keypom-sdk/Core/modules.md#initkeypom). + +After `initKeypom` is called, the key generation and drop creation can be done. These two tasks are combined into one function, `createDrop`. This function can be either given a set of pre-created keypairs, **or** it can generate them automatically based on the `numKeys` parameter. + +:::tip +Recall that the private keys being generated are used to store the assets. These keys are then embedded within a link. + +In a Simple Drop, the assest is $NEAR. +::: + +To see what the SDK is doing behind the scenes, a `NEAR-API-JS` equivalent NodeJS script has been provided. + + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/simple-drop/simple-example.js#L30-L45 +``` + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/simple-drop/simple-near-example.js#L34-L59 +``` + + + + +:::note +All function parameters and default values for the SDK and Keypom functions can be found in the [SDK Typedocs](../../keypom-sdk/Core/modules.md). For `NEAR-API-JS` functions, their arguments can be found [here](https://docs.near.org/tools/near-api-js/reference) +::: + +--- + +## Creating Linkdrops +The last step in this process is to create the links themselves so that you can easily distribute the assets to people. This is done by embedding the private key, containing the $NEAR, into the link along with the Keypom contract ID. + +With the Keypom SDK, this is all neatly wrapped up in the function [`formatLinkdropUrl`](../../keypom-sdk/Core/modules.md#formatlinkdropurl). You just need to provide the base URL format and the private key you wish to embed. + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/simple-drop/simple-example.js#L47-L53 +``` + +--- + +## Full Solution +Now that everything has been put together, the final code can be seen below. + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/simple-drop/simple-example.js#L1-L61 +``` + + + + +```js reference +https://github.com/keypom/keypom-docs-examples/blob/8202f0ef88205bfca644ccf5d4d3cfb460f88f15/basic-tutorials/simple-drop/simple-near-example.js#L1-L71 +``` + + + + +--- + +## Testing +### Running the Script +Here, you'll learn how to run the code that was just covered, and what to expect. + +To view the completed code, clone the [Keypom Docs Examples](https://github.com/keypom/keypom-docs-examples) repository and navigate to the `basic-tutorials/simple-drop`. +``` bash +git clone https://github.com/keypom/keypom-docs-examples.git && cd keypom-docs-examples/basic-tutorials/simple-drop +``` +From there, you can and open the `simple-example.js` file. + +To run the code you just cloned, return to the `keypom-docs-examples` directory and install all the necessary packages. +```bash +cd .. && cd .. && yarn +``` + +:::caution +Prior to running these scripts, ensure you replace all instances of `keypom-docs-demo.testnet` in the script with the credentials of your account found in your `~/.near-credentials` folder +::: + +From there, you can run this Simple Drop script that was made in this tutorial using the following command: +``` bash +yarn basic:simple:keypom +``` +:::note +The SDK script is being tested here; use `yarn basic:simple:naj` to test the `NEAR-API-JS` script instead. +::: +This should return a successful drop creation and console log a Public Key and Linkdrop: +```bash +Public Keys: [ 'ed25519:CsTpJ3pSZUkkcfVEsA6Fqkgz6BFgmhNfCGzPuqdj24wc' ] +Linkdrops: [ + 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/CNbTQgJ83dLPvg4ibCQGH9Wi1sJhSQkh4YDXKxibXU3cn66oZP5eqLE83m5z5eTqBKxSvJzmDXH7gYTMXzMEfdk' +] +Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com +``` +To see the full console log from this drop creation, see the expandable section below. + +
+Console Log of Test +

+ +``` bash +Receipts: GZegewWCTMfpKWZ8ffpVkRb3fLYjyfnyCvqRRmwRkKSt, 3tueZ12bwu86EYEgPVaMjQJuSUNfWcwnDENQGk6jGzmo + Log [v2.keypom.testnet]: Current Block Timestamp: 1682352132162930850 + Log [v2.keypom.testnet]: 21 calls with 105000000000000 attached GAS. Pow outcome: 1.8602935. Required Allowance: 20248156910387200000000 + Log [v2.keypom.testnet]: Total required storage Yocto 11170000000000000000000 + Log [v2.keypom.testnet]: Current balance: 8.2496314, + Required Deposit: 1.0324181, + total_required_storage: 0.01117, + Drop Fee: 0, + Key Fee: 0 Total Key Fee: 0, + allowance: 0.0202481 total allowance: 0.0202481, + access key storage: 0.001 total access key storage: 0.001, + deposits less none FCs: 1 total deposits: 1 lazy registration: false, + deposits for FCs: 0 total deposits for FCs: 0, + uses per key: 1 + None FCs: 0, + length: 1 + GAS to attach: 100000000000000 + Log [v2.keypom.testnet]: New user balance 7.2172133 + Log [v2.keypom.testnet]: Fees collected 0 +Public Keys: [ 'ed25519:CsTpJ3pSZUkkcfVEsA6Fqkgz6BFgmhNfCGzPuqdj24wc' ] +Linkdrops: [ + 'https://testnet.mynearwallet.com/linkdrop/v2.keypom.testnet/CNbTQgJ83dLPvg4ibCQGH9Wi1sJhSQkh4YDXKxibXU3cn66oZP5eqLE83m5z5eTqBKxSvJzmDXH7gYTMXzMEfdk' +] +Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com +``` + +

+
+ +### Claiming and Explorer Transactions +Once you click the link, it will take you to the following NEAR Wallet page, where you will have the choice to claim with an existing account or create a new one. +

Near Wallet claim

+ +To check the transactions, click the final link in the console log when you run the script. +``` md +Keypom Contract Explorer Link: explorer.testnet.near.org/accounts/v2.keypom.testnet.com +``` + +From there, you should be able to see the [`create_drop`](https://explorer.testnet.near.org/transactions/6cQGRMJhmn16LCEDLKWYnFJrz3cAP7zSW36jhFwwk5sT) and [`claim`](https://explorer.testnet.near.org/transactions/BkNe1Dwzer22WW6vVBbCY75qHbkDitYYca7e4cjPTBsJ) transactions. +

explorer transactions

+ +--- + +## Conclusion +In this tutorial, you learned the basic steps of [creating a simple drop](simple-drops.md#introduction), steps to [initialize](simple-drops.md#getting-started---connecting-to-near) a NEAR blockchain connection, and how to [create](simple-drops.md#creating-the-simple-drop) the keys and drop. You also learned the purpose of the `initKeypom` function and when to use it. Once the drop was created, you constructed a valid linkdrop using the private keys in order to claim the assets. + +In the next tutorial, you'll be learning how to create and fund an NFT drop using the Keypom SDK. diff --git a/versioned_docs/version-2.0/Tutorials/Misc/sign-txn.md b/versioned_docs/version-2.0/Tutorials/Misc/sign-txn.md new file mode 100644 index 00000000..2875c55b --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/Misc/sign-txn.md @@ -0,0 +1,6 @@ +# Methods of Signing Transactions +Place holder page to discuss different methods of signing transactions. +1. Using funder object -> Unencrypted local keystore +2. Wallet object +3. Account object +4. Parsing/Exposing private key \ No newline at end of file diff --git a/versioned_docs/version-2.0/Tutorials/welcome.md b/versioned_docs/version-2.0/Tutorials/welcome.md new file mode 100644 index 00000000..c8be6cd5 --- /dev/null +++ b/versioned_docs/version-2.0/Tutorials/welcome.md @@ -0,0 +1,94 @@ +--- +sidebar_label: 'Home' +--- +# Examples and Tutorials +Welcome to the examples and tutorials section of Keypom's developer documentation. Here you'll learn how to use the power of Keypom to creating some awesome user onboarding experiences. + +There are several ways to get started using Keypom. + +## Basic Tutorials + +The basic tutorials are meant as introductory guides that will help you create your first Keypom drops and understand the differences between the [types](/Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/introduction.md) of drops and the assets they contain. All drops created in these tutorials skip [drop configurations](../Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/customization-homepage.md) to keep it simple.` + + +It is recommended you read through the [Getting Started](Basics/getting-started.md) guide before going into the tutorials. + + +

+ +## Advanced Tutorials + +These tutorials are meant to provide examples of real world use cases. These can range from ticketing, to seamless DAO onboarding experiences. + + +

+ +Other use cases can range from subscriptions to DAO voting. These other advanced tutorials are currently in progress, stay tuned! diff --git a/versioned_docs/version-2.0/exec-summary.md b/versioned_docs/version-2.0/exec-summary.md new file mode 100644 index 00000000..a448aa93 --- /dev/null +++ b/versioned_docs/version-2.0/exec-summary.md @@ -0,0 +1,119 @@ +# Keypom Executive Summary + +> To discover the features and details of Keypom, begin your journey [here](Concepts/welcome.md). + +Keypom provides **zero friction onboarding** and transactions for NEAR. We allow people to **experience** the value of blockchain technology *regardless of if they have a wallet or not*. + +All of the complications such as seed-phrases, private keys, transactions and other crypto jargon can be abstracted away from the end-user. We provide a means for people to use decentralized applications **without knowing they’re on-chain**. + +Our goal is to be a community driven, public good that aims to show the world what is possible when you push NEAR’s technology to its limits. For the foreseeable future, our APIs (the Keypom Protocol) will be completely **fee-free**. Our entire solution is on-chain. There are no centralized databases and everything is run using NEAR smart contracts. + +Our debut talk at NEARCON can be found [here](https://www.youtube.com/watch?v=J-BOnfhHV50&ab_channel=MattLockyer). + +## The Blockchain Problem +Blockchain technology comes with many benefits such as sovereign ownership, digital rights, privacy, freedom, peer to peer coordination and much more. The problem with this technology, however, is that there is an *extremely high barrier to entry for an everyday individual*. None of it matters if nobody can onboard. + +*It’s confusing to create and fund a crypto wallet*. People are unfamiliar with the process, technical jargon, general flow, and need to go through barriers such as KYC. *Why go through such hurdles just to experience an app?* In Web2, users can accrue value from applications without being forced to onboard first. Why can’t Web3 be the same? + +## The Keypom Solution +On other chains, a common approach to onboarding users is to send them a pre-created, pre-loaded wallet. Keypom operates on the basis of NEAR’s unique [access key model](https://docs.near.org/concepts/basics/accounts/access-keys) which allows for much more flexibility in the end user-experience. With Keypom, you give the user a special type of access key that can be turned into a wallet. This key can be embedded within a simple Web2 style link that, once clicked, will allow them to input a desired account ID to be created. + +The immediate benefit of this approach is that it allows the end-user to *customize their wallet with a name of their choosing* as opposed to being given a pre-created account. + +### Sending Assets with Keypom +One of the simplest ways to onboard a user into the NEAR ecosystem is to use the Keypom protocol to create a link and load it with $NEAR and other assets. Behind the scenes, the protocol will associate the access key (embedded within the link) to the specified amount of $NEAR. Anyone who has the link can then gain access to the funds. + +These funds can be used to either create an entirely new named account, or can be sent to an existing wallet if the user already has one. + +The concept of sending NEAR can then be expanded to allow someone to not only load a link with native $NEAR, but also with Fungible Tokens and Non-Fungible Tokens as well. + +The end user journey would be that an organization or funder deposits assets (either fungible or non-fungible) into the Keypom contract and generates a unique link. This link is then given to the user that wishes to onboard onto NEAR. When the link is clicked, the user either creates a new account or uses an existing one for the assets to be automatically sent to. + +In the NEAR ecosystem, this process is known as a linkdrop. With Keypom, a series of identical linkdrops can be created at once and is referred to as **a drop**. + +### Customizable Linkdrops +The Keypom Protocol allows for a huge variety of customizations that can be embedded into the onboarding experience. For example, as the funder, you can specify the amount of times a link can be used before it’s invalidated. Rather than someone using a link once, they can potentially use it many times and receive assets over a long period of time. + +### Function Calls with Keypom +The Keypom Protocol can also be used to execute predefined function calls on smart contracts when a link is used. For example, you could create a link that, when claimed, will automatically call a function to register the user into a DAO. This simple idea carries many powerful use-cases that, when paired with the customizable configurations and multi-use links, can create truly immersive and amazing onboarding experiences. + +Learn more about Keypom's Drop types below + + + +## Use Cases + +Here are just a few of the possibilities with Keypom + +### NFT Ticketing +The problem with current NFT ticketing systems is that they require users to have a wallet. This is a huge barrier to entry for people that are attending events but don’t have wallets. In addition, there is often no proof of attendance for the event as the NFT is burned in order to get into the event which requires an internet connection. + +Keypom aims to solve these problems by having a ticketing system that has the following features. + +* Users are not required to have a wallet to enter the event. +* Each ticket is unique and can only be used by one person. +* Attendees are not required to have wifi to gain entry to the event. +* Attendees that did not have a NEAR wallet can get one for free. +* Attendees can choose to receive an NFT proving their attendance at the event. This is commonly known as a [POAP](https://academy.binance.com/en/glossary/proof-of-attendance-protocol-poap). + + +In addition, some way to provide analytics to event organizers that contains information such as links that were: +* Given out but not clicked at all. +* Clicked but not attended. +* Partially claimed indicating the number of people that attended but did not onboard or receive a POAP. +* Fully claimed indicating the number of people that attended and received a POAP. + +### Recurring Payments/Subscriptions +Recurring payments are quite a common situation. Let’s say you need to send someone $50 USDC every week. You could create a key with 5 claims that has a throttle_timestamp of 1 week. You would then pre-load maybe the first week’s deposit of $50 USDC and register 1 use or you could send $500 USDC for the first 10 weeks. At that point, you would simply hand over the key to the user and they can claim once a week. + + +### Auto-Registration in to DAOs +DAOs are a raging topic in crypto. The problem with DAOs, however, is there is a barrier to entry for users that aren’t familiar with the specific chain they’re built on top of. Users might not have wallets or understand how to interact with contracts. On the contrary, they might be very well versed or immersed in the DAO’s topics. They shouldn’t be required to create a wallet and learn the onboarding process. + +With Keypom, you can create a function call drop with the main purpose of registering users into a DAO. For people that have a wallet, this will act as an easy way of registering them with the click of a link. For users that don’t have a wallet and are unfamiliar with NEAR, they can be onboarded and registered into the DAO with the same click of a link. + diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/_category_.yml b/versioned_docs/version-2.0/keypom-sdk/Core/_category_.yml new file mode 100644 index 00000000..5893a319 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/_category_.yml @@ -0,0 +1,3 @@ +label: "Core TypeDocs" +position: 0 +collapsed: false \ No newline at end of file diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/BasicTransaction.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/BasicTransaction.md new file mode 100644 index 00000000..b537263c --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/BasicTransaction.md @@ -0,0 +1,37 @@ +--- +id: "BasicTransaction" +title: "Interface: BasicTransaction" +sidebar_label: "BasicTransaction" +sidebar_position: 0 +custom_edit_url: null +--- + +## Properties + +### actions + + **actions**: `Action`[] + +#### Defined in + +[lib/types/general.ts:108](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L108) + +___ + +### receiverId + + **receiverId**: `string` + +#### Defined in + +[lib/types/general.ts:106](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L106) + +___ + +### signerId + + **signerId**: `string` + +#### Defined in + +[lib/types/general.ts:107](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L107) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ContractSourceMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ContractSourceMetadata.md new file mode 100644 index 00000000..0656191a --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ContractSourceMetadata.md @@ -0,0 +1,34 @@ +--- +id: "ContractSourceMetadata" +title: "Interface: ContractSourceMetadata" +sidebar_label: "ContractSourceMetadata" +sidebar_position: 0 +custom_edit_url: null +--- + +Information returned from `getContractSourceMetadata` about the deployed Keypom contract. This is part of [NEP-330](https://nomicon.io/Standards/SourceMetadata) and +can allow you to view exactly what code is deployed to the contract. + +## Properties + +### link + + **link**: `string` + +Link to the specific commit and code on GitHub that is deployed to the Keypom account + +#### Defined in + +[lib/types/general.ts:102](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L102) + +___ + +### version + + **version**: `string` + +Versioning used by the Keypom developers to indicate which version of the contract is deployed. + +#### Defined in + +[lib/types/general.ts:100](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L100) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateDropProtocolArgs.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateDropProtocolArgs.md new file mode 100644 index 00000000..46659a70 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateDropProtocolArgs.md @@ -0,0 +1,117 @@ +--- +id: "CreateDropProtocolArgs" +title: "Interface: CreateDropProtocolArgs" +sidebar_label: "CreateDropProtocolArgs" +sidebar_position: 0 +custom_edit_url: null +--- + +## Properties + +### config + + `Optional` **config**: [`ProtocolReturnedDropConfig`](ProtocolReturnedDropConfig.md) + +#### Defined in + +[lib/types/params.ts:54](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L54) + +___ + +### deposit\_per\_use + + **deposit\_per\_use**: `string` + +#### Defined in + +[lib/types/params.ts:51](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L51) + +___ + +### drop\_id + + `Optional` **drop\_id**: `string` + +#### Defined in + +[lib/types/params.ts:53](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L53) + +___ + +### fc + + `Optional` **fc**: [`ProtocolReturnedFCData`](ProtocolReturnedFCData.md) + +#### Defined in + +[lib/types/params.ts:60](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L60) + +___ + +### ft + + `Optional` **ft**: [`ProtocolReturnedFTData`](ProtocolReturnedFTData.md) + +#### Defined in + +[lib/types/params.ts:58](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L58) + +___ + +### metadata + + `Optional` **metadata**: `string` + +#### Defined in + +[lib/types/params.ts:55](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L55) + +___ + +### nft + + `Optional` **nft**: [`ProtocolReturnedNFTData`](ProtocolReturnedNFTData.md) + +#### Defined in + +[lib/types/params.ts:59](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L59) + +___ + +### passwords\_per\_use + + `Optional` **passwords\_per\_use**: [`PasswordPerUse`](PasswordPerUse.md)[][] + +#### Defined in + +[lib/types/params.ts:61](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L61) + +___ + +### public\_keys + + `Optional` **public\_keys**: `string`[] + +#### Defined in + +[lib/types/params.ts:50](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L50) + +___ + +### required\_gas + + `Optional` **required\_gas**: `string` + +#### Defined in + +[lib/types/params.ts:56](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L56) + +___ + +### simple + + `Optional` **simple**: [`ProtocolReturnedSimpleData`](ProtocolReturnedSimpleData.md) + +#### Defined in + +[lib/types/params.ts:57](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L57) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateOrAddReturn.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateOrAddReturn.md new file mode 100644 index 00000000..ae461116 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/CreateOrAddReturn.md @@ -0,0 +1,69 @@ +--- +id: "CreateOrAddReturn" +title: "Interface: CreateOrAddReturn" +sidebar_label: "CreateOrAddReturn" +sidebar_position: 0 +custom_edit_url: null +--- + +Information returned when creating a drop or adding keys via `createDrop` and `addKeys` respectively. + +## Properties + +### dropId + + **dropId**: `string` + +The drop ID for the drop that is being interacted with. + +#### Defined in + +[lib/types/params.ts:34](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L34) + +___ + +### keys + + `Optional` **keys**: [`GeneratedKeyPairs`](GeneratedKeyPairs.md) + +Any keys that were automatically generated. + +#### Defined in + +[lib/types/params.ts:32](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L32) + +___ + +### requiredDeposit + + `Optional` **requiredDeposit**: `string` + +The required deposit that should be attached to the transaction. + +#### Defined in + +[lib/types/params.ts:30](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L30) + +___ + +### responses + + `Optional` **responses**: `any` + +The responses to any transactions that were signed and sent to the network. + +#### Defined in + +[lib/types/params.ts:26](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L26) + +___ + +### transactions + + `Optional` **transactions**: `Transaction`[] + +Information about the transactions if `returnTransactions` is specified in the arguments. This will result in the information being returned instead of signed and sent. + +#### Defined in + +[lib/types/params.ts:28](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L28) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Drop.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Drop.md new file mode 100644 index 00000000..c1547b53 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Drop.md @@ -0,0 +1,153 @@ +--- +id: "Drop" +title: "Interface: Drop" +sidebar_label: "Drop" +sidebar_position: 0 +custom_edit_url: null +--- + +Information related to a specific drop. + +## Properties + +### config + + `Optional` **config**: [`DropConfig`](DropConfig.md) + +All drops regardless of their type can have a suite of configurations such as how many uses each key has or how often a key can be used. + +#### Defined in + +[lib/types/drops.ts:50](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L50) + +___ + +### depositPerUse + + **depositPerUse**: `string` + +How much $yoctoNEAR will be transferred anytime a key is used that is part of this drop. + +#### Defined in + +[lib/types/drops.ts:40](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L40) + +___ + +### dropId + + **dropId**: `string` + +Drop ID for this specific drop. + +#### Defined in + +[lib/types/drops.ts:36](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L36) + +___ + +### fc + + `Optional` **fc**: [`FCData`](FCData.md) + +For Function-Call drops, important information needs to be stored such as which methods, the attached deposit, args etc. + +#### Defined in + +[lib/types/drops.ts:48](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L48) + +___ + +### ft + + `Optional` **ft**: [`FTData`](FTData.md) + +For Fungible Token drops, important information such as the amount of tokens to transfer, or contract need to be stored. + +#### Defined in + +[lib/types/drops.ts:46](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L46) + +___ + +### metadata + + `Optional` **metadata**: `string` + +Any extra information about the drop can be stored as metadata. This is up to the drop creator and can be stringified JSON, or any other string. + +#### Defined in + +[lib/types/drops.ts:52](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L52) + +___ + +### nextKeyId + + **nextKeyId**: `number` + +What is the next unique ID that will be given to the next access key added to this drop. + +#### Defined in + +[lib/types/drops.ts:58](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L58) + +___ + +### nft + + `Optional` **nft**: [`NFTData`](NFTData.md) + +For NFT drops, important information such as the token IDs, or contract need to be stored. + +#### Defined in + +[lib/types/drops.ts:44](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L44) + +___ + +### ownerId + + **ownerId**: `string` + +Which account created this drop. + +#### Defined in + +[lib/types/drops.ts:38](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L38) + +___ + +### registeredUses + + **registeredUses**: `number` + +How many key uses are registered for this drop? This is only applicable to simple drops with lazy registrations, FT drops, and NFT drops. + +#### Defined in + +[lib/types/drops.ts:54](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L54) + +___ + +### requiredGas + + **requiredGas**: `string` + +In order to use an access key that's part of this drop, how much Gas *needs* to be attached to the call? + +#### Defined in + +[lib/types/drops.ts:56](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L56) + +___ + +### simple + + `Optional` **simple**: [`SimpleData`](SimpleData.md) + +For simple drops, there are specific, optional configurations. + +#### Defined in + +[lib/types/drops.ts:42](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L42) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/DropConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/DropConfig.md new file mode 100644 index 00000000..99aad8cd --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/DropConfig.md @@ -0,0 +1,71 @@ +--- +id: "DropConfig" +title: "Interface: DropConfig" +sidebar_label: "DropConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Configurable options for any drop regardless of type. + +## Properties + +### dropRoot + + `Optional` **dropRoot**: `string` + +Override the global root account that all created sub-accounts will have (currently `near` or `testnet`). This allows users to drops that have a custom root. +For example, Fayyr could specify a root of `fayyr.near` By which all sub-accounts will then be `ACCOUNT.fayyr.near`. +It's important to note that this root account *MUST* have a smart contract deployed that has a method `create_account`. + +#### Defined in + +[lib/types/drops.ts:81](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L81) + +___ + +### sale + + `Optional` **sale**: [`PublicSaleConfig`](PublicSaleConfig.md) + +Any information related to primary market sales for access keys added to this drop. + +#### Defined in + +[lib/types/drops.ts:75](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L75) + +___ + +### time + + `Optional` **time**: [`TimeConfig`](TimeConfig.md) + +Any information related to time-based configurations such as a starting date for keys etc. + +#### Defined in + +[lib/types/drops.ts:69](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L69) + +___ + +### usage + + `Optional` **usage**: [`UsageConfig`](UsageConfig.md) + +Any information related to how access keys are used such as which methods they can call or whether an empty drop should be automatically deleted etc. + +#### Defined in + +[lib/types/drops.ts:72](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L72) + +___ + +### usesPerKey + + `Optional` **usesPerKey**: `number` + +How many uses can each key have before it's deleted. If this isn't specified, it defaults to 1 use per key. + +#### Defined in + +[lib/types/drops.ts:66](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L66) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/EnvVars.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/EnvVars.md new file mode 100644 index 00000000..5a17a087 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/EnvVars.md @@ -0,0 +1,223 @@ +--- +id: "EnvVars" +title: "Interface: EnvVars" +sidebar_label: "EnvVars" +sidebar_position: 0 +custom_edit_url: null +--- + +Important context that is used throughout the SDK. This is generated when `initKeypom` is called and can be retrieved by calling `useKeypom`. +All parameters will start off as undefined until the Keypom SDK is initialized. + +## Properties + +### attachedGas + + `Optional` **attachedGas**: `string` + +The amount of Gas that will be attached to the `claim` and `create_account_and_claim` functions for claiming linkdrops (100 TGas). + +#### Defined in + +[lib/types/general.ts:77](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L77) + +___ + +### connection + + `Optional` **connection**: `Connection` + +The connection instance that is part of the NEAR object + +#### Defined in + +[lib/types/general.ts:59](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L59) + +___ + +### contractAccount + + `Optional` **contractAccount**: `Account` + +The NEAR Account object for the Keypom contract being used. This lets you know the account ID for the contract and can be used to sign transactions for claiming linkdrops. + +#### Defined in + +[lib/types/general.ts:69](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L69) + +___ + +### contractId + + `Optional` **contractId**: `string` + +The account ID where the Keypom contract is deployed to. + +#### Defined in + +[lib/types/general.ts:79](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L79) + +___ + +### error + + `Optional` **error**: `string` + +#### Defined in + +[lib/types/general.ts:83](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L83) + +___ + +### execute + + `Optional` **execute**: `any` + +#### Defined in + +[lib/types/general.ts:87](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L87) + +___ + +### fundingAccount + + `Optional` **fundingAccount**: `Account` + +The NEAR Account object for the Funder + +#### Defined in + +[lib/types/general.ts:65](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L65) + +___ + +### fundingAccountDetails + + `Optional` **fundingAccountDetails**: [`Funder`](Funder.md) + +The details for the funder such as any `rootEntropy` or their `secretKey` etc. + +#### Defined in + +[lib/types/general.ts:67](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L67) + +___ + +### gas + + `Optional` **gas**: `string` + +The default amount of Gas that will be attached to transactions (200 TGas). + +#### Defined in + +[lib/types/general.ts:73](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L73) + +___ + +### gas300 + + `Optional` **gas300**: `string` + +The max amount of Gas that will be attached to transactions (300 TGas). + +#### Defined in + +[lib/types/general.ts:75](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L75) + +___ + +### getAccount + + `Optional` **getAccount**: `any` + +#### Defined in + +[lib/types/general.ts:85](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L85) + +___ + +### keyStore + + `Optional` **keyStore**: `KeyStore` + +Which type of KeyStore is used when locating keys and signing transactions throughout the SDK (In Memory, Unencrypted FileStore etc.) + +#### Defined in + +[lib/types/general.ts:61](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L61) + +___ + +### near + + `Optional` **near**: `Near` + +The specific NEAR object that contains important information such as the KeyStore and connection. This is used to interact with the chain and can either be manually passed in or will be automatically created during `initKeypom` + +#### Defined in + +[lib/types/general.ts:57](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L57) + +___ + +### networkId + + `Optional` **networkId**: `string` + +What network is the SDK using (`testnet` or `mainnet`) + +#### Defined in + +[lib/types/general.ts:63](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L63) + +___ + +### receiverId + + `Optional` **receiverId**: `string` + +#### Defined in + +[lib/types/general.ts:81](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L81) + +___ + +### supportedKeypomContracts + + `Optional` **supportedKeypomContracts**: `Object` + +Object containing the supported Keypom contracts for both mainnet and testnet + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `mainnet` | {} | +| `testnet` | {} | + +#### Defined in + +[lib/types/general.ts:89](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L89) + +___ + +### viewAccount + + `Optional` **viewAccount**: `any` + +#### Defined in + +[lib/types/general.ts:71](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L71) + +___ + +### viewCall + + `Optional` **viewCall**: `any` + +Function that allows you to invoke a view method. This takes in a `receiverId`, `methodName`, and `args`. + +#### Defined in + +[lib/types/general.ts:91](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L91) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FCData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FCData.md new file mode 100644 index 00000000..82846117 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FCData.md @@ -0,0 +1,22 @@ +--- +id: "FCData" +title: "Interface: FCData" +sidebar_label: "FCData" +sidebar_position: 0 +custom_edit_url: null +--- + +Information pertaining to all Function-Call drops. This should be passed in if the drop will be a Function-Call drop. + +## Properties + +### methods + + **methods**: [`Method`](Method.md)[][] + +The top level array indicates a different set of methods that can be called for every key use. It is possible that for a given key use, no methods are called thus acting as a "free" key use whereby the use is reflected on-chain but no assets are transferred. +If a given key use does not have an undefined set of methods, when it is used, all the methods in the set will be called. + +#### Defined in + +[lib/types/fc.ts:73](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L73) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FTData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FTData.md new file mode 100644 index 00000000..e38ebbaa --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FTData.md @@ -0,0 +1,59 @@ +--- +id: "FTData" +title: "Interface: FTData" +sidebar_label: "FTData" +sidebar_position: 0 +custom_edit_url: null +--- + +Information pertaining to all Fungible-Token drops. This should be passed in if the drop will be used to transfer any fungible tokens. + +## Properties + +### absoluteAmount + + `Optional` **absoluteAmount**: `string` + +Amount of tokens to transfer but considering the decimal amount. +Example: transferring one wNEAR should be passed in as "1000000000000000000000000" and NOT "1" + +#### Defined in + +[lib/types/ft.ts:22](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L22) + +___ + +### amount + + `Optional` **amount**: `string` + +Human readable format for the amount of tokens to transfer every time the FT key is used. +Example: transferring one wNEAR should be passed in as "1" and NOT "1000000000000000000000000" + +#### Defined in + +[lib/types/ft.ts:17](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L17) + +___ + +### contractId + + **contractId**: `string` + +Which contract do the FTs belong to? + +#### Defined in + +[lib/types/ft.ts:8](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L8) + +___ + +### senderId + + `Optional` **senderId**: `string` + +By default, anyone can fund your drop with FTs. This field allows you to set a specific account ID that will be locked into sending the FTs. + +#### Defined in + +[lib/types/ft.ts:12](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L12) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Funder.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Funder.md new file mode 100644 index 00000000..a3cb4015 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Funder.md @@ -0,0 +1,75 @@ +--- +id: "Funder" +title: "Interface: Funder" +sidebar_label: "Funder" +sidebar_position: 0 +custom_edit_url: null +--- + +Outlines how the structure of the *funder* object should be passed into `initKeypom` or `updateFunder`. This contains important information such as the +secret key, account ID and any root entropy associated with the account. + +**`Throws`** + +if neither `secretKey` or `seedPhrase` are provided. One of these need to be passed in. + +## Properties + +### accountId + + **accountId**: `string` + +The account ID of the funder that will be used to sign transactions. + +#### Defined in + +[lib/types/general.ts:35](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L35) + +___ + +### fundingKeyPair + + `Optional` **fundingKeyPair**: `KeyPair` + +#### Defined in + +[lib/types/general.ts:48](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L48) + +___ + +### rootEntropy + + `Optional` **rootEntropy**: `string` + +When interacting with the SDK, there are several places where KeyPairs can be generated automatically rather than you having to pass them in. +For example, during `createDrop` and `addKeys`, if `publicKeys` isn't passed in, the SDK will generate `numKeys` number of keys automatically. +These generated keys can either be completely random or deterministically generated based off some entropy. If `rootEntropy` is provided, all the +keys that are auto-generated will be based off this entropy. + +#### Defined in + +[lib/types/general.ts:46](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L46) + +___ + +### secretKey + + `Optional` **secretKey**: `string` + +A valid private key associated with the funder's account. This can be function-call or full access (depending on what limitations and security measures are in place). + +#### Defined in + +[lib/types/general.ts:37](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L37) + +___ + +### seedPhrase + + `Optional` **seedPhrase**: `string` + +12 word seedphrase that can be used to derive the `secretKey`. If this is present, it will override the passed in `secretKey`. + +#### Defined in + +[lib/types/general.ts:39](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L39) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FungibleTokenMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FungibleTokenMetadata.md new file mode 100644 index 00000000..c69b3456 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/FungibleTokenMetadata.md @@ -0,0 +1,96 @@ +--- +id: "FungibleTokenMetadata" +title: "Interface: FungibleTokenMetadata" +sidebar_label: "FungibleTokenMetadata" +sidebar_position: 0 +custom_edit_url: null +--- + +General structure of Fungible Token Metadata as per official NEP-148 standard (https://github.com/near/NEPs/blob/master/neps/nep-0148.md). + +## Properties + +### decimals + + **decimals**: `number` + +Used in frontends to show the proper significant digits of a token. This concept is explained well in this OpenZeppelin post (https://docs.openzeppelin.com/contracts/3.x/erc20#a-note-on-decimals). + +#### Defined in + +[lib/types/ft.ts:36](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L36) + +___ + +### icon + + `Optional` **icon**: `string` + +A small image associated with this token. Must be a data URL, to help consumers display it quickly while protecting user data. +Recommendation: use optimized SVG, which can result in high-resolution images with only 100s of bytes of storage cost. +(Note that these storage costs are incurred to the token owner/deployer, but that querying these icons is a very cheap & cacheable read operation for all consumers of the contract and the RPC nodes that serve the data.) +Recommendation: create icons that will work well with both light-mode and dark-mode websites by either using middle-tone color schemes, or by embedding media queries in the SVG. + +#### Defined in + +[lib/types/ft.ts:43](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L43) + +___ + +### name + + **name**: `string` + +The human-readable name of the token. + +#### Defined in + +[lib/types/ft.ts:32](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L32) + +___ + +### reference + + `Optional` **reference**: `string` + +A link to a valid JSON file containing various keys offering supplementary details on the token. Example: /ipfs/QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm, https://example.com/token.json, etc. If the information given in this document conflicts with the on-chain attributes, the values in reference shall be considered the source of truth. + +#### Defined in + +[lib/types/ft.ts:45](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L45) + +___ + +### reference\_hash + + `Optional` **reference\_hash**: `string` + +The base64-encoded sha256 hash of the JSON file contained in the reference field. This is to guard against off-chain tampering. + +#### Defined in + +[lib/types/ft.ts:47](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L47) + +___ + +### spec + + **spec**: `string` + +A string. Should be ft-1.0.0 to indicate that a Fungible Token contract adheres to the current versions of this Metadata and the Fungible Token Core specs. This will allow consumers of the Fungible Token to know if they support the features of a given contract. + +#### Defined in + +[lib/types/ft.ts:30](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L30) + +___ + +### symbol + + **symbol**: `string` + +The abbreviation, like wETH or AMPL. + +#### Defined in + +[lib/types/ft.ts:34](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/ft.ts#L34) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/GeneratedKeyPairs.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/GeneratedKeyPairs.md new file mode 100644 index 00000000..505479f3 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/GeneratedKeyPairs.md @@ -0,0 +1,46 @@ +--- +id: "GeneratedKeyPairs" +title: "Interface: GeneratedKeyPairs" +sidebar_label: "GeneratedKeyPairs" +sidebar_position: 0 +custom_edit_url: null +--- + +For each generated KeyPair (either through `createDrop`, `addKeys` or `generateKeys`), the public and private keys are returned. +In addition, the actual KeyPair objects are returned as well. + +## Properties + +### keyPairs + + **keyPairs**: `KeyPair`[] + +Actual KeyPair objects that can be used to sign messages, verify signatures, and get the public and private keys + +#### Defined in + +[lib/types/general.ts:20](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L20) + +___ + +### publicKeys + + **publicKeys**: `string`[] + +Set of public keys that were generated + +#### Defined in + +[lib/types/general.ts:22](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L22) + +___ + +### secretKeys + + **secretKeys**: `string`[] + +Set of private keys that were generated + +#### Defined in + +[lib/types/general.ts:24](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L24) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/KeyInfo.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/KeyInfo.md new file mode 100644 index 00000000..a84ca835 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/KeyInfo.md @@ -0,0 +1,93 @@ +--- +id: "KeyInfo" +title: "Interface: KeyInfo" +sidebar_label: "KeyInfo" +sidebar_position: 0 +custom_edit_url: null +--- + +Important information returned in many view calls regarding a specific access key. + +## Properties + +### allowance + + **allowance**: `number` + +How much allowance does the key have left (measured in $yoctoNEAR). When the key is deleted, this is refunded to the funder's balance. + +#### Defined in + +[lib/types/drops.ts:25](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L25) + +___ + +### curKeyUse + + **curKeyUse**: `number` + +Which use is the key currently on? For single-use keys, this is always 1. + +#### Defined in + +[lib/types/drops.ts:16](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L16) + +___ + +### dropId + + **dropId**: `string` + +Drop ID for the specific drop that the key belongs to. + +#### Defined in + +[lib/types/drops.ts:11](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L11) + +___ + +### keyId + + **keyId**: `number` + +The unique ID associated to this key. IDs are *not* unique across drops but they are unique for any key in the drop. + +#### Defined in + +[lib/types/drops.ts:28](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L28) + +___ + +### lastUsed + + **lastUsed**: `number` + +At what timestamp was the key last used? Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:22](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L22) + +___ + +### publicKey + + **publicKey**: `string` + +Public key for this access key. + +#### Defined in + +[lib/types/drops.ts:13](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L13) + +___ + +### remainingUses + + **remainingUses**: `number` + +How many uses this key has left before it's deleted. + +#### Defined in + +[lib/types/drops.ts:19](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L19) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Method.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Method.md new file mode 100644 index 00000000..bd31581d --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/Method.md @@ -0,0 +1,153 @@ +--- +id: "Method" +title: "Interface: Method" +sidebar_label: "Method" +sidebar_position: 0 +custom_edit_url: null +--- + +Outlines the information needed for any given method as part of a Function-Call drop. +Each individual key use can have an array of Methods that can be called. + +## Properties + +### accountIdField + + `Optional` **accountIdField**: `string` + +Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the function. +As an example, if the methodName was `nft_mint` and it expected a field `receiver_id` to be passed in, indicating who should receive the token, then the `accountIdField` would be `receiver_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/fc.ts:34](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L34) + +___ + +### args + + **args**: `string` + +What arguments should be passed to the method. This should be in stringified JSON. + +#### Defined in + +[lib/types/fc.ts:19](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L19) + +___ + +### attachedDeposit + + **attachedDeposit**: `string` + +How much yoctoNEAR should be attached to the call. + +#### Defined in + +[lib/types/fc.ts:23](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L23) + +___ + +### attachedGas + + `Optional` **attachedGas**: `string` + +How much gas to attach to this method call. If none, all the gas is split between the parallel method calls in a given claim. +If this is specified, the key can ONLY be used to call `claim` and no `deposit_per_use` can be specified. This leads the key to act like a method calling proxy instead of a linkdrop. + +#### Defined in + +[lib/types/fc.ts:28](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L28) + +___ + +### dropIdField + + `Optional` **dropIdField**: `string` + +Specifies what field Keypom should auto-inject the drops ID into when calling the function. +As an example, if an NFT contract expected the Keypom drop ID to be passed in as the field `keypom_drop_id` in order to gate access to who can mint NFTs, then the `dropIdField` would be `keypom_drop_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/fc.ts:40](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L40) + +___ + +### funderIdField + + `Optional` **funderIdField**: `string` + +Specifies what field Keypom should auto-inject the drop funder's account ID into when calling the function. +As an example, if an NFT contract wanted to gate only users that had a key coming from a specific funder's drops, it could expect a field called `keypom_funder_id` and the `funderIdField` would be `keypom_funder_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/fc.ts:52](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L52) + +___ + +### keyIdField + + `Optional` **keyIdField**: `string` + +Specifies what field Keypom should auto-inject the key's ID into when calling the function. +As an example, if an NFT contract wanted to gate only users with an odd key ID to be able to mint an NFT and their parameter was called `keypom_key_id`, then the `keyIdField` would be `keypom_key_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/fc.ts:46](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L46) + +___ + +### methodName + + **methodName**: `string` + +The method that should be invoked on the `receiverId`'s contract. + +#### Defined in + +[lib/types/fc.ts:15](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L15) + +___ + +### receiverId + + **receiverId**: `string` + +The account ID that the contract is deployed to that the method will be called on. + +#### Defined in + +[lib/types/fc.ts:11](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L11) + +___ + +### receiverToClaimer + + `Optional` **receiverToClaimer**: `boolean` + +If set to true, the claiming account ID will be the receiver ID of the method call. +This receiver must be a valid account and non-malicious (cannot be set to the keypom contract) + +#### Defined in + +[lib/types/fc.ts:57](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L57) + +___ + +### userArgsRule + + `Optional` **userArgsRule**: ``"AllUser"`` \| ``"FunderPreferred"`` \| ``"UserPreferred"`` + +What permissions does the user have when providing custom arguments to the function call? +By default, the user cannot provide any custom arguments + +#### Defined in + +[lib/types/fc.ts:62](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/fc.ts#L62) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NFTData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NFTData.md new file mode 100644 index 00000000..61f9000c --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NFTData.md @@ -0,0 +1,47 @@ +--- +id: "NFTData" +title: "Interface: NFTData" +sidebar_label: "NFTData" +sidebar_position: 0 +custom_edit_url: null +--- + +General structure of a Non-Fungible Token drop. This should be passed into `createDrop` if you wish to have an NFT drop. + +## Properties + +### contractId + + **contractId**: `string` + +The account ID that the NFT contract is deployed to. This contract is where all the NFTs for the specific drop must come from. + +#### Defined in + +[lib/types/nft.ts:6](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L6) + +___ + +### senderId + + `Optional` **senderId**: `string` + +By default, anyone can fund your drop with NFTs. This field allows you to set a specific account ID that will be locked into sending the NFTs. + +#### Defined in + +[lib/types/nft.ts:8](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L8) + +___ + +### tokenIds + + `Optional` **tokenIds**: `string`[] + +If there are any token IDs that you wish to be automatically sent to the Keypom contract in order to register keys as part of `createDrop`, specify them here. +A maximum of 2 token IDs can be sent as part of the transaction. If you wish to register more keys by sending more NFTs, you must do this in a separate call by invoking +the `nftTransferCall` method separately. + +#### Defined in + +[lib/types/nft.ts:14](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L14) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NonFungibleTokenMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NonFungibleTokenMetadata.md new file mode 100644 index 00000000..fdd4d598 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/NonFungibleTokenMetadata.md @@ -0,0 +1,153 @@ +--- +id: "NonFungibleTokenMetadata" +title: "Interface: NonFungibleTokenMetadata" +sidebar_label: "NonFungibleTokenMetadata" +sidebar_position: 0 +custom_edit_url: null +--- + +General structure of Non-Fungible Token Metadata (in camelCase) as per official NEP-177 standard (https://github.com/near/NEPs/blob/master/neps/nep-0177.md). + +## Properties + +### copies + + `Optional` **copies**: `number` + +number of copies of this set of metadata in existence when token was minted. + +#### Defined in + +[lib/types/nft.ts:76](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L76) + +___ + +### description + + `Optional` **description**: `string` + +free-form description + +#### Defined in + +[lib/types/nft.ts:70](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L70) + +___ + +### expiresAt + + `Optional` **expiresAt**: `number` + +When token expires, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:80](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L80) + +___ + +### extra + + `Optional` **extra**: `string` + +anything extra the NFT wants to store on-chain. Can be stringified JSON. + +#### Defined in + +[lib/types/nft.ts:86](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L86) + +___ + +### issuedAt + + `Optional` **issuedAt**: `number` + +When token was issued or minted, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:78](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L78) + +___ + +### media + + `Optional` **media**: `string` + +URL to associated media, preferably to decentralized, content-addressed storage + +#### Defined in + +[lib/types/nft.ts:72](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L72) + +___ + +### mediaHash + + `Optional` **mediaHash**: `string` + +Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. + +#### Defined in + +[lib/types/nft.ts:74](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L74) + +___ + +### reference + + `Optional` **reference**: `string` + +URL to an off-chain JSON file with more info. + +#### Defined in + +[lib/types/nft.ts:88](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L88) + +___ + +### referenceHash + + `Optional` **referenceHash**: `string` + +Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. + +#### Defined in + +[lib/types/nft.ts:90](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L90) + +___ + +### startsAt + + `Optional` **startsAt**: `number` + +When token starts being valid, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:82](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L82) + +___ + +### title + + `Optional` **title**: `string` + +ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" + +#### Defined in + +[lib/types/nft.ts:68](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L68) + +___ + +### updatedAt + + `Optional` **updatedAt**: `number` + +When token was last updated, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:84](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L84) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PasswordPerUse.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PasswordPerUse.md new file mode 100644 index 00000000..ea683acb --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PasswordPerUse.md @@ -0,0 +1,33 @@ +--- +id: "PasswordPerUse" +title: "Interface: PasswordPerUse" +sidebar_label: "PasswordPerUse" +sidebar_position: 0 +custom_edit_url: null +--- + +Keeps track of the password for a given key use. This should be passed in as an array for each key that has passwords. + +## Properties + +### key\_use + + **key\_use**: `number` + +Which use does the password belong to? These uses are *NOT* zero-indexed so the first use corresponds to `1` not `0`. + +#### Defined in + +[lib/types/drops.ts:196](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L196) + +___ + +### pw + + **pw**: `string` + +The password for this given use + +#### Defined in + +[lib/types/drops.ts:194](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L194) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDrop.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDrop.md new file mode 100644 index 00000000..608829a3 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDrop.md @@ -0,0 +1,166 @@ +--- +id: "ProtocolReturnedDrop" +title: "Interface: ProtocolReturnedDrop" +sidebar_label: "ProtocolReturnedDrop" +sidebar_position: 0 +custom_edit_url: null +--- + +Drop information returned from the Protocol. This interface is exactly the same as the `Drop`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### config + + `Optional` **config**: [`ProtocolReturnedDropConfig`](ProtocolReturnedDropConfig.md) + +All drops regardless of their type can have a suite of configurations such as how many uses each key has or how often a key can be used. + +#### Defined in + +[lib/types/protocol.ts:49](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L49) + +___ + +### deposit\_per\_use + + **deposit\_per\_use**: `string` + +How much $yoctoNEAR will be transferred anytime a key is used that is part of this drop. + +#### Defined in + +[lib/types/protocol.ts:39](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L39) + +___ + +### drop\_id + + **drop\_id**: `string` + +Drop ID for this specific drop. + +#### Defined in + +[lib/types/protocol.ts:35](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L35) + +___ + +### fc + + `Optional` **fc**: [`ProtocolReturnedFCData`](ProtocolReturnedFCData.md) + +For Function-Call drops, important information needs to be stored such as which methods, the attached deposit, args etc. + +#### Defined in + +[lib/types/protocol.ts:47](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L47) + +___ + +### ft + + `Optional` **ft**: [`ProtocolReturnedFTData`](ProtocolReturnedFTData.md) + +For Fungible Token drops, important information such as the amount of tokens to transfer, or contract need to be stored. + +#### Defined in + +[lib/types/protocol.ts:45](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L45) + +___ + +### keys + + `Optional` **keys**: [`ProtocolReturnedKeyInfo`](ProtocolReturnedKeyInfo.md)[] + +If calling `getDrops` or `getDropInformation` and `withKeys` is passed in as true, an extra view call will be done to get a set of keys that are currently on the drop. + +#### Defined in + +[lib/types/protocol.ts:59](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L59) + +___ + +### metadata + + `Optional` **metadata**: `string` + +Any extra information about the drop can be stored as metadata. This is up to the drop creator and can be stringified JSON, or any other string. + +#### Defined in + +[lib/types/protocol.ts:51](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L51) + +___ + +### next\_key\_id + + **next\_key\_id**: `number` + +What is the next unique ID that will be given to the next access key added to this drop. + +#### Defined in + +[lib/types/protocol.ts:57](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L57) + +___ + +### nft + + `Optional` **nft**: [`ProtocolReturnedNFTData`](ProtocolReturnedNFTData.md) + +For NFT drops, important information such as the token IDs, or contract need to be stored. + +#### Defined in + +[lib/types/protocol.ts:43](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L43) + +___ + +### owner\_id + + **owner\_id**: `string` + +Which account created this drop. + +#### Defined in + +[lib/types/protocol.ts:37](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L37) + +___ + +### registered\_uses + + **registered\_uses**: `number` + +How many key uses are registered for this drop? This is only applicable to simple drops with lazy registrations, FT drops, and NFT drops. + +#### Defined in + +[lib/types/protocol.ts:53](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L53) + +___ + +### required\_gas + + **required\_gas**: `string` + +In order to use an access key that's part of this drop, how much Gas *needs* to be attached to the call? + +#### Defined in + +[lib/types/protocol.ts:55](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L55) + +___ + +### simple + + `Optional` **simple**: [`ProtocolReturnedSimpleData`](ProtocolReturnedSimpleData.md) + +For simple drops, there are specific, optional configurations. + +#### Defined in + +[lib/types/protocol.ts:41](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L41) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDropConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDropConfig.md new file mode 100644 index 00000000..a43cfbfb --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedDropConfig.md @@ -0,0 +1,70 @@ +--- +id: "ProtocolReturnedDropConfig" +title: "Interface: ProtocolReturnedDropConfig" +sidebar_label: "ProtocolReturnedDropConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Drop config returned from the Protocol. This interface is exactly the same as the `DropConfig`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### root\_account\_id + + `Optional` **root\_account\_id**: `string` + +Override the global root account that all created sub-accounts will have (currently `near` or `testnet`). This allows users to drops that have a custom root. +For example, Fayyr could specify a root of `fayyr.near` By which all sub-accounts will then be `ACCOUNT.fayyr.near`. +It's important to note that this root account *MUST* have a smart contract deployed that has a method `create_account`. + +#### Defined in + +[lib/types/protocol.ts:83](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L83) + +___ + +### sale + + `Optional` **sale**: [`ProtocolReturnedPublicSaleConfig`](ProtocolReturnedPublicSaleConfig.md) + +#### Defined in + +[lib/types/protocol.ts:76](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L76) + +___ + +### time + + `Optional` **time**: [`ProtocolReturnedTimeConfig`](ProtocolReturnedTimeConfig.md) + +Any information related to time-based configurations such as a starting date for keys etc. + +#### Defined in + +[lib/types/protocol.ts:71](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L71) + +___ + +### usage + + `Optional` **usage**: [`ProtocolReturnedUsageConfig`](ProtocolReturnedUsageConfig.md) + +Any information related to how access keys are used such as which methods they can call or whether an empty drop should be automatically deleted etc. + +#### Defined in + +[lib/types/protocol.ts:74](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L74) + +___ + +### uses\_per\_key + + `Optional` **uses\_per\_key**: `number` + +How many uses can each key have before it's deleted. If this isn't specified, it defaults to 1 use per key. + +#### Defined in + +[lib/types/protocol.ts:68](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L68) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFCData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFCData.md new file mode 100644 index 00000000..196082b7 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFCData.md @@ -0,0 +1,23 @@ +--- +id: "ProtocolReturnedFCData" +title: "Interface: ProtocolReturnedFCData" +sidebar_label: "ProtocolReturnedFCData" +sidebar_position: 0 +custom_edit_url: null +--- + +FC Data returned from the Protocol. This interface is exactly the same as the `FCData`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### methods + + **methods**: [`ProtocolReturnedMethod`](ProtocolReturnedMethod.md)[][] + +The top level array indicates a different set of methods that can be called for every key use. It is possible that for a given key use, no methods are called thus acting as a "free" key use whereby the use is reflected on-chain but no assets are transferred. +If a given key use does not have an undefined set of methods, when it is used, all the methods in the set will be called. + +#### Defined in + +[lib/types/protocol.ts:300](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L300) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFTData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFTData.md new file mode 100644 index 00000000..a83e62de --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedFTData.md @@ -0,0 +1,47 @@ +--- +id: "ProtocolReturnedFTData" +title: "Interface: ProtocolReturnedFTData" +sidebar_label: "ProtocolReturnedFTData" +sidebar_position: 0 +custom_edit_url: null +--- + +FT Data returned from the Protocol. This interface is exactly the same as the `FTData`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### balance\_per\_use + + `Optional` **balance\_per\_use**: `string` + +Amount of tokens to transfer but considering the decimal amount. +Example: transferring one wNEAR should be passed in as "1000000000000000000000000" and NOT "1" + +#### Defined in + +[lib/types/protocol.ts:226](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L226) + +___ + +### contract\_id + + **contract\_id**: `string` + +Which contract do the FTs belong to? + +#### Defined in + +[lib/types/protocol.ts:217](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L217) + +___ + +### sender\_id + + `Optional` **sender\_id**: `string` + +By default, anyone can fund your drop with FTs. This field allows you to set a specific account ID that will be locked into sending the FTs. + +#### Defined in + +[lib/types/protocol.ts:221](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L221) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedKeyInfo.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedKeyInfo.md new file mode 100644 index 00000000..17abcf50 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedKeyInfo.md @@ -0,0 +1,94 @@ +--- +id: "ProtocolReturnedKeyInfo" +title: "Interface: ProtocolReturnedKeyInfo" +sidebar_label: "ProtocolReturnedKeyInfo" +sidebar_position: 0 +custom_edit_url: null +--- + +Key information returned from the Protocol. This interface is exactly the same as the `KeyInfo`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### allowance + + **allowance**: `number` + +How much allowance does the key have left (measured in $yoctoNEAR). When the key is deleted, this is refunded to the funder's balance. + +#### Defined in + +[lib/types/protocol.ts:23](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L23) + +___ + +### cur\_key\_use + + **cur\_key\_use**: `number` + +Which use is the key currently on? For single-use keys, this is always 1. + +#### Defined in + +[lib/types/protocol.ts:14](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L14) + +___ + +### drop\_id + + **drop\_id**: `string` + +Drop ID for the specific drop that the key belongs to. + +#### Defined in + +[lib/types/protocol.ts:9](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L9) + +___ + +### key\_id + + **key\_id**: `number` + +The unique ID associated to this key. IDs are *not* unique across drops but they are unique for any key in the drop. + +#### Defined in + +[lib/types/protocol.ts:26](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L26) + +___ + +### last\_used + + **last\_used**: `number` + +At what timestamp was the key last used? Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:20](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L20) + +___ + +### public\_key + + **public\_key**: `string` + +Public key for this access key. + +#### Defined in + +[lib/types/protocol.ts:11](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L11) + +___ + +### remaining\_uses + + **remaining\_uses**: `number` + +How many uses this key has left before it's deleted. + +#### Defined in + +[lib/types/protocol.ts:17](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L17) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedMethod.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedMethod.md new file mode 100644 index 00000000..bb5a0e98 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedMethod.md @@ -0,0 +1,153 @@ +--- +id: "ProtocolReturnedMethod" +title: "Interface: ProtocolReturnedMethod" +sidebar_label: "ProtocolReturnedMethod" +sidebar_position: 0 +custom_edit_url: null +--- + +Method information returned from the Protocol. This interface is exactly the same as the `Method`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### account\_id\_field + + `Optional` **account\_id\_field**: `string` + +Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the function. +As an example, if the methodName was `nft_mint` and it expected a field `receiver_id` to be passed in, indicating who should receive the token, then the `accountIdField` would be `receiver_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/protocol.ts:260](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L260) + +___ + +### args + + **args**: `string` + +What arguments should be passed to the method. This should be in stringified JSON. + +#### Defined in + +[lib/types/protocol.ts:245](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L245) + +___ + +### attached\_deposit + + **attached\_deposit**: `string` + +How much yoctoNEAR should be attached to the call. + +#### Defined in + +[lib/types/protocol.ts:249](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L249) + +___ + +### attached\_gas + + `Optional` **attached\_gas**: `string` + +How much gas to attach to this method call. If none, all the gas is split between the parallel method calls in a given claim. +If this is specified, the key can ONLY be used to call `claim` and no `deposit_per_use` can be specified. This leads the key to act like a method calling proxy instead of a linkdrop. + +#### Defined in + +[lib/types/protocol.ts:254](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L254) + +___ + +### drop\_id\_field + + `Optional` **drop\_id\_field**: `string` + +Specifies what field Keypom should auto-inject the drops ID into when calling the function. +As an example, if an NFT contract expected the Keypom drop ID to be passed in as the field `keypom_drop_id` in order to gate access to who can mint NFTs, then the `dropIdField` would be `keypom_drop_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/protocol.ts:266](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L266) + +___ + +### funder\_id\_field + + `Optional` **funder\_id\_field**: `string` + +Specifies what field Keypom should auto-inject the funder's account ID into when calling the function. +As an example, if an NFT contract wanted to gate only users with an odd key ID to be able to mint an NFT and their parameter was called `keypom_key_id`, then the `keyIdField` would be `keypom_key_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/protocol.ts:278](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L278) + +___ + +### key\_id\_field + + `Optional` **key\_id\_field**: `string` + +Specifies what field Keypom should auto-inject the key's ID into when calling the function. +As an example, if an NFT contract wanted to gate only users with an odd key ID to be able to mint an NFT and their parameter was called `keypom_key_id`, then the `keyIdField` would be `keypom_key_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/protocol.ts:272](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L272) + +___ + +### method\_name + + **method\_name**: `string` + +The method that should be invoked on the `receiverId`'s contract. + +#### Defined in + +[lib/types/protocol.ts:241](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L241) + +___ + +### receiver\_id + + **receiver\_id**: `string` + +The account ID that the contract is deployed to that the method will be called on. + +#### Defined in + +[lib/types/protocol.ts:237](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L237) + +___ + +### receiver\_to\_claimer + + `Optional` **receiver\_to\_claimer**: `boolean` + +If set to true, the claiming account ID will be the receiver ID of the method call. +This receiver must be a valid account and non-malicious (cannot be set to the keypom contract) + +#### Defined in + +[lib/types/protocol.ts:283](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L283) + +___ + +### user\_args\_rule + + `Optional` **user\_args\_rule**: ``"AllUser"`` \| ``"FunderPreferred"`` \| ``"UserPreferred"`` + +What permissions does the user have when providing custom arguments to the function call? +By default, the user cannot provide any custom arguments + +#### Defined in + +[lib/types/protocol.ts:288](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L288) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNFTData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNFTData.md new file mode 100644 index 00000000..16051f15 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNFTData.md @@ -0,0 +1,34 @@ +--- +id: "ProtocolReturnedNFTData" +title: "Interface: ProtocolReturnedNFTData" +sidebar_label: "ProtocolReturnedNFTData" +sidebar_position: 0 +custom_edit_url: null +--- + +NFT Data information returned from the Protocol. This interface is exactly the same as the `NFTData`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### contract\_id + + **contract\_id**: `string` + +The account ID that the NFT contract is deployed to. This contract is where all the NFTs for the specific drop must come from. + +#### Defined in + +[lib/types/protocol.ts:204](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L204) + +___ + +### sender\_id + + `Optional` **sender\_id**: `string` + +By default, anyone can fund your drop with NFTs. This field allows you to set a specific account ID that will be locked into sending the NFTs. + +#### Defined in + +[lib/types/protocol.ts:206](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L206) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md new file mode 100644 index 00000000..5f65274c --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md @@ -0,0 +1,153 @@ +--- +id: "ProtocolReturnedNonFungibleTokenMetadata" +title: "Interface: ProtocolReturnedNonFungibleTokenMetadata" +sidebar_label: "ProtocolReturnedNonFungibleTokenMetadata" +sidebar_position: 0 +custom_edit_url: null +--- + +General structure of Non-Fungible Token Metadata as per official NEP-177 standard (https://github.com/near/NEPs/blob/master/neps/nep-0177.md). + +## Properties + +### copies + + `Optional` **copies**: `number` + +number of copies of this set of metadata in existence when token was minted. + +#### Defined in + +[lib/types/nft.ts:46](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L46) + +___ + +### description + + `Optional` **description**: `string` + +free-form description + +#### Defined in + +[lib/types/nft.ts:40](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L40) + +___ + +### expires\_at + + `Optional` **expires\_at**: `number` + +When token expires, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:50](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L50) + +___ + +### extra + + `Optional` **extra**: `string` + +anything extra the NFT wants to store on-chain. Can be stringified JSON. + +#### Defined in + +[lib/types/nft.ts:56](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L56) + +___ + +### issued\_at + + `Optional` **issued\_at**: `number` + +When token was issued or minted, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:48](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L48) + +___ + +### media + + `Optional` **media**: `string` + +URL to associated media, preferably to decentralized, content-addressed storage + +#### Defined in + +[lib/types/nft.ts:42](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L42) + +___ + +### media\_hash + + `Optional` **media\_hash**: `string` + +Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. + +#### Defined in + +[lib/types/nft.ts:44](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L44) + +___ + +### reference + + `Optional` **reference**: `string` + +URL to an off-chain JSON file with more info. + +#### Defined in + +[lib/types/nft.ts:58](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L58) + +___ + +### reference\_hash + + `Optional` **reference\_hash**: `string` + +Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. + +#### Defined in + +[lib/types/nft.ts:60](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L60) + +___ + +### starts\_at + + `Optional` **starts\_at**: `number` + +When token starts being valid, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:52](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L52) + +___ + +### title + + `Optional` **title**: `string` + +ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" + +#### Defined in + +[lib/types/nft.ts:38](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L38) + +___ + +### updated\_at + + `Optional` **updated\_at**: `number` + +When token was last updated, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:54](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L54) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenObject.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenObject.md new file mode 100644 index 00000000..029b8f45 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedNonFungibleTokenObject.md @@ -0,0 +1,69 @@ +--- +id: "ProtocolReturnedNonFungibleTokenObject" +title: "Interface: ProtocolReturnedNonFungibleTokenObject" +sidebar_label: "ProtocolReturnedNonFungibleTokenObject" +sidebar_position: 0 +custom_edit_url: null +--- + +General structure of a Non-Fungible Token object as per official NEP-171 standard (https://github.com/near/NEPs/blob/master/neps/nep-0171.md). + +## Properties + +### approved\_account\_ids + + `Optional` **approved\_account\_ids**: `Map`<`string`, `number`\> + +Map of account IDs to approval IDs as per official NEP-178 standard (https://github.com/near/NEPs/blob/master/neps/nep-0178.md). + +#### Defined in + +[lib/types/nft.ts:28](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L28) + +___ + +### metadata + + `Optional` **metadata**: [`ProtocolReturnedNonFungibleTokenMetadata`](ProtocolReturnedNonFungibleTokenMetadata.md) + +Metadata for the token + +#### Defined in + +[lib/types/nft.ts:26](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L26) + +___ + +### owner\_id + + **owner\_id**: `string` + +Account ID of the owner + +#### Defined in + +[lib/types/nft.ts:24](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L24) + +___ + +### royalty + + `Optional` **royalty**: `Map`<`string`, `number`\> + +A mapping of NEAR accounts to the amount each should be paid out as per official NEP-199 standard (https://github.com/near/NEPs/blob/master/neps/nep-0199.md). + +#### Defined in + +[lib/types/nft.ts:30](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L30) + +___ + +### token\_id + + **token\_id**: `string` + +String ID for the token + +#### Defined in + +[lib/types/nft.ts:22](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/nft.ts#L22) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedPublicSaleConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedPublicSaleConfig.md new file mode 100644 index 00000000..74dfde00 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedPublicSaleConfig.md @@ -0,0 +1,97 @@ +--- +id: "ProtocolReturnedPublicSaleConfig" +title: "Interface: ProtocolReturnedPublicSaleConfig" +sidebar_label: "ProtocolReturnedPublicSaleConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Within the config, there are configurable options related to how keys can be sold and a funder can potentially make a profit. + +## Properties + +### allowlist + + `Optional` **allowlist**: `string`[] + +Which accounts are allowed to add keys? If the allowlist is empty, anyone that is not in the blocklist can add keys. + +#### Defined in + +[lib/types/protocol.ts:173](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L173) + +___ + +### auto\_withdraw\_funds + + `Optional` **auto\_withdraw\_funds**: `boolean` + +Should the revenue generated be sent to the funder's account balance or +automatically withdrawn and sent to their NEAR wallet? + +#### Defined in + +[lib/types/protocol.ts:180](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L180) + +___ + +### blocklist + + `Optional` **blocklist**: `string`[] + +Which accounts are NOT allowed to add keys? + +#### Defined in + +[lib/types/protocol.ts:175](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L175) + +___ + +### end + + `Optional` **end**: `number` + +Block timestamp dictating the end of the public sale. If None, keys can be added indefinitely +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:190](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L190) + +___ + +### max\_num\_keys + + `Optional` **max\_num\_keys**: `number` + +Maximum number of keys that can be added to this drop. If None, there is no max. + +#### Defined in + +[lib/types/protocol.ts:166](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L166) + +___ + +### price\_per\_key + + `Optional` **price\_per\_key**: `string` + +Amount of $NEAR that the user needs to attach (if they are not the funder) on top of costs. This amount will be +Automatically sent to the funder's balance. If None, the keys are free to the public. + +#### Defined in + +[lib/types/protocol.ts:171](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L171) + +___ + +### start + + `Optional` **start**: `number` + +Minimum block timestamp before the public sale starts. If None, keys can be added immediately +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:185](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L185) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedSimpleData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedSimpleData.md new file mode 100644 index 00000000..92ea9441 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedSimpleData.md @@ -0,0 +1,17 @@ +--- +id: "ProtocolReturnedSimpleData" +title: "Interface: ProtocolReturnedSimpleData" +sidebar_label: "ProtocolReturnedSimpleData" +sidebar_position: 0 +custom_edit_url: null +--- + +## Properties + +### lazy\_register + + `Optional` **lazy\_register**: `boolean` + +#### Defined in + +[lib/types/protocol.ts:195](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L195) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedTimeConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedTimeConfig.md new file mode 100644 index 00000000..c9da47ff --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedTimeConfig.md @@ -0,0 +1,63 @@ +--- +id: "ProtocolReturnedTimeConfig" +title: "Interface: ProtocolReturnedTimeConfig" +sidebar_label: "ProtocolReturnedTimeConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Time Config information returned from the Protocol. This interface is exactly the same as the `TimeConfig`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### end + + `Optional` **end**: `number` + +Block timestamp that keys must be used before. If this isn't specified, keys can be used indefinitely. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:101](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L101) + +___ + +### interval + + `Optional` **interval**: `number` + +Interval of time after the `start_timestamp` that must pass before a key can be used. If multiple intervals pass, the key can be used multiple times. +This has nothing to do With the throttle timestamp. It only pertains to the start timestamp and the current timestamp. The last_used timestamp is not taken into account. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:114](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L114) + +___ + +### start + + `Optional` **start**: `number` + +Minimum block timestamp before keys can be used. If this isn't specified, keys can be used immediately. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:95](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L95) + +___ + +### throttle + + `Optional` **throttle**: `number` + +Amount of time that *must* pass in between each key use. If this isn't specified, there is no delay between key uses. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:107](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L107) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedUsageConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedUsageConfig.md new file mode 100644 index 00000000..80dbe93a --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/ProtocolReturnedUsageConfig.md @@ -0,0 +1,80 @@ +--- +id: "ProtocolReturnedUsageConfig" +title: "Interface: ProtocolReturnedUsageConfig" +sidebar_label: "ProtocolReturnedUsageConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Usage Config information returned from the Protocol. This interface is exactly the same as the `UsageConfig`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### account\_creation\_fields + + `Optional` **account\_creation\_fields**: `Object` + +When calling `create_account` on the root account, which keypom args should be attached to the payload. + +#### Type declaration + +| Name | Type | Description | +| :------ | :------ | :------ | +| `account_id_field?` | `string` | Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the `create_account` function. | +| `drop_id_field?` | `string` | Specifies what field Keypom should auto-inject the drop's ID into when calling the `create_account` function. | +| `funder_id_field?` | `string` | Specifies what field Keypom should auto-inject the drop funder's account ID into when calling the `create_account` function. | +| `key_id_field?` | `string` | Specifies what field Keypom should auto-inject the key's ID into when calling the `create_account` function. | + +#### Defined in + +[lib/types/protocol.ts:141](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L141) + +___ + +### auto\_delete\_drop + + `Optional` **auto\_delete\_drop**: `boolean` + +When a key is used and deleted, if it results in the drop being empty, should the drop automatically be deleted? If this isn't specified, it defaults to false. + +#### Defined in + +[lib/types/protocol.ts:134](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L134) + +___ + +### auto\_withdraw + + `Optional` **auto\_withdraw**: `boolean` + +In the case where `autoDeleteDrop` is set to true and the drop is the owner's last, should their balance be automatically withdrawn? If this isn't specified, it defaults to false. + +#### Defined in + +[lib/types/protocol.ts:138](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L138) + +___ + +### permissions + + `Optional` **permissions**: `string` + +Specify which methods can be called by the access key (either `claim` or `create_account_and_claim`). If this isn't specified, both methods can be called. + +#### Defined in + +[lib/types/protocol.ts:125](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L125) + +___ + +### refund\_deposit + + `Optional` **refund\_deposit**: `boolean` + +If the method `claim` is called rather than `create_account_and_claim`, should the `deposit_per_use` be refunded to the owner's balance? +If this isn't specified, it defaults to false. + +#### Defined in + +[lib/types/protocol.ts:130](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/protocol.ts#L130) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PublicSaleConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PublicSaleConfig.md new file mode 100644 index 00000000..6b4d3617 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/PublicSaleConfig.md @@ -0,0 +1,107 @@ +--- +id: "PublicSaleConfig" +title: "Interface: PublicSaleConfig" +sidebar_label: "PublicSaleConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Within the config, there are configurable options related to how keys can be sold and a funder can potentially make a profit. + +## Properties + +### allowlist + + `Optional` **allowlist**: `string`[] + +Which accounts are allowed to add keys? If the allowlist is empty, anyone that is not in the blocklist can add keys. + +#### Defined in + +[lib/types/drops.ts:169](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L169) + +___ + +### autoWithdrawFunds + + `Optional` **autoWithdrawFunds**: `boolean` + +Should the revenue generated be sent to the funder's account balance or +automatically withdrawn and sent to their NEAR wallet? + +#### Defined in + +[lib/types/drops.ts:176](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L176) + +___ + +### blocklist + + `Optional` **blocklist**: `string`[] + +Which accounts are NOT allowed to add keys? + +#### Defined in + +[lib/types/drops.ts:171](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L171) + +___ + +### end + + `Optional` **end**: `number` + +Block timestamp dictating the end of the public sale. If None, keys can be added indefinitely +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:186](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L186) + +___ + +### maxNumKeys + + `Optional` **maxNumKeys**: `number` + +Maximum number of keys that can be added to this drop. If None, there is no max. + +#### Defined in + +[lib/types/drops.ts:161](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L161) + +___ + +### pricePerKeyNEAR + + `Optional` **pricePerKeyNEAR**: `number` + +Amount of $NEAR that the user needs to attach (if they are not the funder) on top of costs. This amount will be +Automatically sent to the funder's balance. If None, the keys are free to the public. + +#### Defined in + +[lib/types/drops.ts:166](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L166) + +___ + +### pricePerKeyYocto + + `Optional` **pricePerKeyYocto**: `string` + +#### Defined in + +[lib/types/drops.ts:167](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L167) + +___ + +### start + + `Optional` **start**: `number` + +Minimum block timestamp before the public sale starts. If None, keys can be added immediately +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:181](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L181) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/SimpleData.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/SimpleData.md new file mode 100644 index 00000000..fefc4f35 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/SimpleData.md @@ -0,0 +1,21 @@ +--- +id: "SimpleData" +title: "Interface: SimpleData" +sidebar_label: "SimpleData" +sidebar_position: 0 +custom_edit_url: null +--- + +Specific configurable information for Simple drops. + +## Properties + +### lazyRegister + + `Optional` **lazyRegister**: `boolean` + +If this is set to true, keys can be created and registered AFTER they've been created (for simple and FC drops only). + +#### Defined in + +[lib/types/simple.ts:6](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/simple.ts#L6) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/TimeConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/TimeConfig.md new file mode 100644 index 00000000..40fc7152 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/TimeConfig.md @@ -0,0 +1,62 @@ +--- +id: "TimeConfig" +title: "Interface: TimeConfig" +sidebar_label: "TimeConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Within the config, there are configurable options related to timing such as how often a key can be used. + +## Properties + +### end + + `Optional` **end**: `number` + +Block timestamp that keys must be used before. If this isn't specified, keys can be used indefinitely. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:98](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L98) + +___ + +### interval + + `Optional` **interval**: `number` + +Interval of time after the `start_timestamp` that must pass before a key can be used. If multiple intervals pass, the key can be used multiple times. +This has nothing to do With the throttle timestamp. It only pertains to the start timestamp and the current timestamp. The last_used timestamp is not taken into account. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:111](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L111) + +___ + +### start + + `Optional` **start**: `number` + +Minimum block timestamp before keys can be used. If this isn't specified, keys can be used immediately. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:92](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L92) + +___ + +### throttle + + `Optional` **throttle**: `number` + +Amount of time that *must* pass in between each key use. If this isn't specified, there is no delay between key uses. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:104](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L104) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/UsageConfig.md b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/UsageConfig.md new file mode 100644 index 00000000..ceb10cf7 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/UsageConfig.md @@ -0,0 +1,79 @@ +--- +id: "UsageConfig" +title: "Interface: UsageConfig" +sidebar_label: "UsageConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Within the config, there are configurable options related to how keys can be used. What permissions they have, whether an empty drop should be automatically deleted etc. + +## Properties + +### accountCreationFields + + `Optional` **accountCreationFields**: `Object` + +When calling `create_account` on the root account, which keypom args should be attached to the payload. + +#### Type declaration + +| Name | Type | Description | +| :------ | :------ | :------ | +| `accountIdField?` | `string` | Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the `create_account` function. | +| `dropIdField?` | `string` | Specifies what field Keypom should auto-inject the drop's ID into when calling the `create_account` function. | +| `funderIdField?` | `string` | Specifies what field Keypom should auto-inject the drop funder's account ID into when calling the `create_account` function. | +| `keyIdField?` | `string` | Specifies what field Keypom should auto-inject the key's ID into when calling the `create_account` function. | + +#### Defined in + +[lib/types/drops.ts:136](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L136) + +___ + +### autoDeleteDrop + + `Optional` **autoDeleteDrop**: `boolean` + +When a key is used and deleted, if it results in the drop being empty, should the drop automatically be deleted? If this isn't specified, it defaults to false. + +#### Defined in + +[lib/types/drops.ts:130](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L130) + +___ + +### autoWithdraw + + `Optional` **autoWithdraw**: `boolean` + +When the last key in this drop is used, in the case where `autoDeleteDrop` is set to true and the drop is the owner's last, should their balance be automatically withdrawn? If this isn't specified, it defaults to false. + +#### Defined in + +[lib/types/drops.ts:134](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L134) + +___ + +### permissions + + `Optional` **permissions**: `string` + +Specify which methods can be called by the access key (either `claim` or `create_account_and_claim`). If this isn't specified, both methods can be called. + +#### Defined in + +[lib/types/drops.ts:121](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L121) + +___ + +### refundDeposit + + `Optional` **refundDeposit**: `boolean` + +If the method `claim` is called rather than `create_account_and_claim`, should the `deposit_per_use` be refunded to the owner's balance? +If this isn't specified, it defaults to false. + +#### Defined in + +[lib/types/drops.ts:126](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/drops.ts#L126) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/_category_.yml b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/_category_.yml new file mode 100644 index 00000000..43bec88c --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/interfaces/_category_.yml @@ -0,0 +1,2 @@ +label: "Interfaces" +position: 4 \ No newline at end of file diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/modules.md b/versioned_docs/version-2.0/keypom-sdk/Core/modules.md new file mode 100644 index 00000000..a7b6445b --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/modules.md @@ -0,0 +1,3290 @@ +--- +id: "modules" +title: "@keypom/core - v1.0.2" +sidebar_label: "Exports" +sidebar_position: 0.5 +custom_edit_url: null +--- + +## Interfaces + +- [BasicTransaction](interfaces/BasicTransaction.md) +- [ContractSourceMetadata](interfaces/ContractSourceMetadata.md) +- [CreateDropProtocolArgs](interfaces/CreateDropProtocolArgs.md) +- [CreateOrAddReturn](interfaces/CreateOrAddReturn.md) +- [Drop](interfaces/Drop.md) +- [DropConfig](interfaces/DropConfig.md) +- [EnvVars](interfaces/EnvVars.md) +- [FCData](interfaces/FCData.md) +- [FTData](interfaces/FTData.md) +- [Funder](interfaces/Funder.md) +- [FungibleTokenMetadata](interfaces/FungibleTokenMetadata.md) +- [GeneratedKeyPairs](interfaces/GeneratedKeyPairs.md) +- [KeyInfo](interfaces/KeyInfo.md) +- [Method](interfaces/Method.md) +- [NFTData](interfaces/NFTData.md) +- [NonFungibleTokenMetadata](interfaces/NonFungibleTokenMetadata.md) +- [PasswordPerUse](interfaces/PasswordPerUse.md) +- [ProtocolReturnedDrop](interfaces/ProtocolReturnedDrop.md) +- [ProtocolReturnedDropConfig](interfaces/ProtocolReturnedDropConfig.md) +- [ProtocolReturnedFCData](interfaces/ProtocolReturnedFCData.md) +- [ProtocolReturnedFTData](interfaces/ProtocolReturnedFTData.md) +- [ProtocolReturnedKeyInfo](interfaces/ProtocolReturnedKeyInfo.md) +- [ProtocolReturnedMethod](interfaces/ProtocolReturnedMethod.md) +- [ProtocolReturnedNFTData](interfaces/ProtocolReturnedNFTData.md) +- [ProtocolReturnedNonFungibleTokenMetadata](interfaces/ProtocolReturnedNonFungibleTokenMetadata.md) +- [ProtocolReturnedNonFungibleTokenObject](interfaces/ProtocolReturnedNonFungibleTokenObject.md) +- [ProtocolReturnedPublicSaleConfig](interfaces/ProtocolReturnedPublicSaleConfig.md) +- [ProtocolReturnedSimpleData](interfaces/ProtocolReturnedSimpleData.md) +- [ProtocolReturnedTimeConfig](interfaces/ProtocolReturnedTimeConfig.md) +- [ProtocolReturnedUsageConfig](interfaces/ProtocolReturnedUsageConfig.md) +- [PublicSaleConfig](interfaces/PublicSaleConfig.md) +- [SimpleData](interfaces/SimpleData.md) +- [TimeConfig](interfaces/TimeConfig.md) +- [UsageConfig](interfaces/UsageConfig.md) + +## Type Aliases + +### AnyWallet + + **AnyWallet**: `BrowserWalletBehaviour` \| `Wallet` \| `Promise`<`Wallet`\> + +#### Defined in + +[lib/types/params.ts:19](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/params.ts#L19) + +___ + +### NearKeyPair + + **NearKeyPair**: `KeyPair` + +#### Defined in + +[lib/types/general.ts:12](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/types/general.ts#L12) + +## Variables + +### TRIAL\_ERRORS + + `Const` **TRIAL\_ERRORS**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `EXIT_EXPECTED` | `string` | +| `INSUFFICIENT_BALANCE` | `string` | +| `INVALID_ACTION` | `string` | + +#### Defined in + +[lib/trial-accounts/utils.ts:13](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/utils.ts#L13) + +___ + +### networks + + `Const` **networks**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `localnet` | { `networkId`: `string` = 'localnet'; `viewAccountId`: `string` = 'test.near' } | +| `localnet.networkId` | `string` | +| `localnet.viewAccountId` | `string` | +| `mainnet` | { `helperUrl`: `string` = 'https://helper.mainnet.near.org'; `networkId`: `string` = 'mainnet'; `nodeUrl`: `string` = 'https://rpc.mainnet.near.org'; `viewAccountId`: `string` = 'near'; `walletUrl`: `string` = 'https://wallet.near.org' } | +| `mainnet.helperUrl` | `string` | +| `mainnet.networkId` | `string` | +| `mainnet.nodeUrl` | `string` | +| `mainnet.viewAccountId` | `string` | +| `mainnet.walletUrl` | `string` | +| `testnet` | { `helperUrl`: `string` = 'https://helper.testnet.near.org'; `networkId`: `string` = 'testnet'; `nodeUrl`: `string` = 'https://rpc.testnet.near.org'; `viewAccountId`: `string` = 'testnet'; `walletUrl`: `string` = 'https://wallet.testnet.near.org' } | +| `testnet.helperUrl` | `string` | +| `testnet.networkId` | `string` | +| `testnet.nodeUrl` | `string` | +| `testnet.viewAccountId` | `string` | +| `testnet.walletUrl` | `string` | + +#### Defined in + +[lib/keypom.ts:25](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L25) + +## Keypom SDK Environment + +### accountMappingContract + + `Const` **accountMappingContract**: `Object` + +Recovery mapping contracts used to keep track of trial account IDs for given public keys. + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `mainnet` | `string` | +| `testnet` | `string` | + +#### Defined in + +[lib/keypom.ts:93](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L93) + +___ + +### supportedKeypomContracts + + `Const` **supportedKeypomContracts**: `Object` + +List of supported Keypom contracts that can be used with the SDK. + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `localnet` | { `keypom.test.near`: `boolean` = true } | +| `localnet.keypom.test.near` | `boolean` | +| `mainnet` | { `v1-3.keypom.near`: `boolean` = false; `v1-4.keypom.near`: `boolean` = true; `v1.keypom.near`: `boolean` = false; `v2.keypom.near`: `boolean` = true } | +| `mainnet.v1-3.keypom.near` | `boolean` | +| `mainnet.v1-4.keypom.near` | `boolean` | +| `mainnet.v1.keypom.near` | `boolean` | +| `mainnet.v2.keypom.near` | `boolean` | +| `testnet` | { `v1-3.keypom.testnet`: `boolean` = false; `v1-4.keypom.testnet`: `boolean` = true; `v1.keypom.testnet`: `boolean` = false; `v2.keypom.testnet`: `boolean` = true } | +| `testnet.v1-3.keypom.testnet` | `boolean` | +| `testnet.v1-4.keypom.testnet` | `boolean` | +| `testnet.v1.keypom.testnet` | `boolean` | +| `testnet.v2.keypom.testnet` | `boolean` | + +#### Defined in + +[lib/keypom.ts:51](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L51) + +___ + +### supportedLinkdropClaimPages + + `Const` **supportedLinkdropClaimPages**: `Object` + +Official linkdrop claim pages for wallets and other applications + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `mainnet` | { `keypom`: `string` = 'https://keypom.xyz/claim/CONTRACT\_ID#SECRET\_KEY'; `meteor`: `string` = 'https://wallet.meteorwallet.app/linkdrop/CONTRACT\_ID/SECRET\_KEY'; `mynearwallet`: `string` = 'https://app.mynearwallet.com/linkdrop/CONTRACT\_ID/SECRET\_KEY' } | +| `mainnet.keypom` | `string` | +| `mainnet.meteor` | `string` | +| `mainnet.mynearwallet` | `string` | +| `testnet` | { `keypom`: `string` = 'https://testnet.keypom.xyz/claim/CONTRACT\_ID#SECRET\_KEY'; `meteor`: `string` = 'https://wallet.meteorwallet.app/linkdrop/CONTRACT\_ID/SECRET\_KEY'; `mynearwallet`: `string` = 'https://testnet.mynearwallet.com/linkdrop/CONTRACT\_ID/SECRET\_KEY' } | +| `testnet.keypom` | `string` | +| `testnet.meteor` | `string` | +| `testnet.mynearwallet` | `string` | + +#### Defined in + +[lib/keypom.ts:74](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L74) + +___ + +### getEnv + +**getEnv**(): [`EnvVars`](interfaces/EnvVars.md) + +#### Returns + +[`EnvVars`](interfaces/EnvVars.md) + +The environment variables used by the Keypom library. + +#### Defined in + +[lib/keypom.ts:119](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L119) + +___ + +### initKeypom + +**initKeypom**(`Β«destructuredΒ»`): `Promise`<`any`\> + +Initializes the SDK to allow for interactions with the Keypom Protocol. By default, a new NEAR connection will be established but this can be overloaded by +passing in an existing connection object. In either case, if a funder is passed in, the credentials will be added to the keystore to sign transactions. + +To update the funder account, refer to the `updateFunder` function. If you only wish to use view methods and not sign transactions, no funder account is needed. +If you wish to update the Keypom Contract ID being used, refer to the `updateKeypomContractId` function. + +**`Example`** + +Using a pre-created NEAR connection instance with an UnencryptedFileSystemKeyStore: +```js +const path = require("path"); +const homedir = require("os").homedir(); +const { KeyPair, keyStores, connect } = require("near-api-js"); +const { initKeypom, getDrops } = require("keypom-js"); + +// Establish the network we wish to work on +const network = "testnet"; +// Get the location where the credentials are stored for our KeyStore +const CREDENTIALS_DIR = ".near-credentials"; +const credentialsPath = (await path).join(homedir, CREDENTIALS_DIR); +(await path).join; +let keyStore = new keyStores.UnencryptedFileSystemKeyStore(credentialsPath); + +// Establish the configuration for the connection +let nearConfig = { + networkId: network, + keyStore, + nodeUrl: `https://rpc.${network}.near.org`, + walletUrl: `https://wallet.${network}.near.org`, + helperUrl: `https://helper.${network}.near.org`, + explorerUrl: `https://explorer.${network}.near.org`, +}; +// Connect to the NEAR blockchain and get the connection instance +let near = await connect(nearConfig); + +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + near, + network +}); + +// Get the drops for the given owner +const dropsForOwner = await getDrops({accountId: "benjiman.testnet"}); +``` + +**`Example`** + +Creating an entirely new NEAR connection instance by using initKeypom and passing in a funder account: +```js +const { initKeypom, getDrops } = require("keypom-js"); + +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Get the drops for the given owner +const dropsForOwner = await getDrops({accountId: "benjiman.testnet"}); +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `funder?` | [`Funder`](interfaces/Funder.md) | The account that will sign transactions to create drops and interact with the Keypom contract. This account will be added to the KeyStore if provided. If rootEntropy is provided for the funder, all access keys will be derived deterministically based off this string. | +| β€ΊΒ `keypomContractId?` | `string` | Instead of using the most up-to-date, default Keypom contract, you can specify a specific account ID to use. If an older version is specified, some features of the SDK might not be usable. | +| β€ΊΒ `near?` | `Near` | The NEAR connection instance to use. If not passed in, it will create a new one. | +| β€ΊΒ `network?` | `string` | The network to connect to either `mainnet` or `testnet`. If a near object is passed in, this field can be omitted | + +#### Returns + +`Promise`<`any`\> + +If a funder is passed in, its account object is returned. Otherwise, it null is returned. + +#### Defined in + +[lib/keypom.ts:239](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L239) + +___ + +### updateFunder + +**updateFunder**(`funder`): `Promise`<`any`\> + +Once the SDK is initialized, this function allows the current funder account to be updated. Having a funder is only necessary if you wish to sign transactions on the Keypom Protocol. + +**`Example`** + +After initializing the SDK, the funder is updated. +```js +const path = require("path"); +const homedir = require("os").homedir(); +const { KeyPair, keyStores, connect } = require("near-api-js"); +const { initKeypom, updateFunder, getDrops } = require("keypom-js"); + + // Initialize the SDK for the given network and NEAR connection + await initKeypom({ + network: "testnet", + }); + + // Update the current funder account + await updateFunder({ + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } + }) + + // Get the drops for the given owner + const dropsForOwner = await getDrops({accountId: "benjiman.testnet"}); + console.log('dropsForOwner: ', dropsForOwner) + + return; +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `funder` | `Object` | The account that will sign transactions to create drops and interact with the Keypom contract. This account will be added to the KeyStore if provided. If rootEntropy is provided for the funder, all access keys will be derived deterministically based off this string. | +| `funder.funder` | [`Funder`](interfaces/Funder.md) | - | + +#### Returns + +`Promise`<`any`\> + +The funder's account object is returned. + +#### Defined in + +[lib/keypom.ts:369](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L369) + +___ + +### updateKeypomContractId + +**updateKeypomContractId**(`keypomContractId`): `any` + +This allows the desired Keypom contract ID to be set. By default, the most up-to-date Keypom contract for the given network is set during initKeypom. + +**`Example`** + +After initializing the SDK, the Keypom contract ID is updated. +```js +const path = require("path"); +const homedir = require("os").homedir(); +const { KeyPair, keyStores, connect } = require("near-api-js"); +const { initKeypom, updateKeypomContractId, getDrops } = require("keypom-js"); + + // Initialize the SDK for the given network and NEAR connection + await initKeypom({ + network: "testnet", + }); + + // Update the current Keypom contract ID + updateKeypomContractId({ + keypomContractId: "v1.keypom.testnet" + }) + + //Get the drops for the given owner + const dropsForOwner = await getDrops({accountId: "benjiman.testnet"}); + console.log('dropsForOwner: ', dropsForOwner) + + return; +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `keypomContractId` | `Object` | The account ID that should be used for the Keypom contract. | +| `keypomContractId.keypomContractId` | `string` | - | + +#### Returns + +`any` + +#### Defined in + +[lib/keypom.ts:430](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L430) + +## Utility + +### accountExists + +**accountExists**(`accountId`): `Promise`<`boolean`\> + +Check whether or not a given account ID exists on the network. + +**`Example`** + +```js +const accountExists = await accountExists("benji.near"); +console.log(accountExists); // true +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `accountId` | `any` | The account ID you wish to check | + +#### Returns + +`Promise`<`boolean`\> + +- A boolean indicating whether or not the account exists + +#### Defined in + +[lib/keypom-utils.ts:87](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L87) + +___ + +### createNFTSeries + +**createNFTSeries**(`Β«destructuredΒ»`): `Promise`<`void` \| `FinalExecutionOutcome`[]\> + +Creates a new NFT series on the official Keypom Series contracts. This is for lazy minting NFTs as part of an FC drop. + +**`Example`** + +Send 3 NFTs using the funder account (not passing in any accounts into the call): +```js + await initKeypom({ + // near, + network: 'testnet', + funder: { + accountId, + secretKey, + } + }) + + const {keys, dropId} = await createDrop({ + numKeys: 1, + config: { + usesPerKey: 100 + }, + metadata: "My Cool Drop Title!", + depositPerUseNEAR: 0.5, + fcData: { + methods: [[ + { + receiverId: `nft-v2.keypom.testnet`, + methodName: "nft_mint", + args: "", + dropIdField: "mint_id", + accountIdField: "receiver_id", + attachedDeposit: parseNearAmount("0.1") + } + ]] + } + }) + + const res = await createNFTSeries({ + dropId, + metadata: { + title: "Moon NFT!", + description: "A cool NFT for the best dog in the world.", + media: "bafybeibwhlfvlytmttpcofahkukuzh24ckcamklia3vimzd4vkgnydy7nq", + copies: 500 + } + }); + console.log('res: ', res) + + const URLs = formatLinkdropUrl({ + baseUrl: "localhost:3000/claim", + secretKeys: keys.secretKeys + }) + console.log('URLs: ', URLs) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `dropId` | `string` | The drop ID for the drop that should have a series associated with it. | +| β€ΊΒ `metadata` | [`NonFungibleTokenMetadata`](interfaces/NonFungibleTokenMetadata.md) | The metadata that all minted NFTs will have. | +| β€ΊΒ `royalty?` | `Map`<`string`, `number`\> | Any royalties associated with the series (as per official NEP-199 standard: https://github.com/near/NEPs/blob/master/neps/nep-0199.md) | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | + +#### Returns + +`Promise`<`void` \| `FinalExecutionOutcome`[]\> + +#### Defined in + +[lib/keypom-utils.ts:227](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L227) + +___ + +### estimateRequiredDeposit + +**estimateRequiredDeposit**(`Β«destructuredΒ»`): `Promise`<`string`\> + +Initiate the connection to the NEAR blockchain. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `attachedGas` | `number` | How much Gas will be attached to each key's use. | +| β€ΊΒ `depositPerUse` | `string` | How much yoctoNEAR each key will transfer upon use. | +| β€ΊΒ `fcData?` | [`FCData`](interfaces/FCData.md) | The FC data for the drop that is being created. | +| β€ΊΒ `ftData?` | [`FTData`](interfaces/FTData.md) | The FT data for the drop that is being created. | +| β€ΊΒ `keyStorage?` | `string` | How much storage an individual key uses. | +| β€ΊΒ `near` | `Near` | The NEAR connection instance used to interact with the chain. This can either the connection that the SDK uses from `getEnv` or a separate connection. | +| β€ΊΒ `numKeys` | `number` | How many keys are being added to the drop. | +| β€ΊΒ `storage?` | `string` | The estimated storage costs (can be retrieved through `getStorageBase`). | +| β€ΊΒ `usesPerKey` | `number` | How many uses each key has. | + +#### Returns + +`Promise`<`string`\> + +#### Defined in + +[lib/keypom-utils.ts:1162](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L1162) + +___ + +### execute + +**execute**(`args`): `Promise`<`void` \| `FinalExecutionOutcome`[] \| (`void` \| `FinalExecutionOutcome`)[]\> + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `args` | `any` | + +#### Returns + +`Promise`<`void` \| `FinalExecutionOutcome`[] \| (`void` \| `FinalExecutionOutcome`)[]\> + +#### Defined in + +[lib/keypom.ts:147](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom.ts#L147) + +___ + +### formatLinkdropUrl + +**formatLinkdropUrl**(`Β«destructuredΒ»`): `string`[] + +Constructs a valid linkdrop URL for a given claim page or custom URL. To view the list of supported claim pages, see the exported `supportedLinkdropClaimPages` variable. + +**`Example`** + +Use the keypom claim page: +```js +await initKeypom({ + network: 'testnet', + funder: { + accountId, + secretKey, + } +}) + +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1 +}); + +const linkdropUrl = formatLinkdropUrl({ + claimPage: "keypom", + contractId: "v2.keypom.testnet", + secretKeys: keys.secretKeys[0] // Can be either the array or individual secret key string +}) + +console.log('linkdropUrl: ', linkdropUrl) +``` + +**`Example`** + +Use a custom claim page with ONLY the secret key +```js +await initKeypom({ + network: 'testnet', + funder: { + accountId, + secretKey, + } +}) + +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1 +}); + +const linkdropUrl = formatLinkdropUrl({ + customURL: "foobar/SECRET_KEY/barfoo", + contractId: "v2.keypom.testnet", + secretKeys: keys.secretKeys[0] // Can be either the array or individual secret key string +}) + +console.log('linkdropUrl: ', linkdropUrl) +``` + +**`Example`** + +Use a custom claim page with both the secret key and contract ID +```js +await initKeypom({ + network: 'testnet', + funder: { + accountId, + secretKey, + } +}) + +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1 +}); + +const linkdropUrl = formatLinkdropUrl({ + customURL: "foobar/SECRET_KEY/barfoo/CONTRACT_ID", + contractId: "v2.keypom.testnet", + secretKeys: keys.secretKeys[0] // Can be either the array or individual secret key string +}) + +console.log('linkdropUrl: ', linkdropUrl) +``` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `claimPage?` | `string` | +| β€ΊΒ `contractId?` | `string` | +| β€ΊΒ `customURL?` | `string` | +| β€ΊΒ `networkId?` | `string` | +| β€ΊΒ `secretKeys` | `string` \| `string`[] | + +#### Returns + +`string`[] + +- An array of the linkdrop URLs + +#### Defined in + +[lib/keypom-utils.ts:384](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L384) + +___ + +### generateKeys + +**generateKeys**(`Β«destructuredΒ»`): `Promise`<[`GeneratedKeyPairs`](interfaces/GeneratedKeyPairs.md)\> + +Generate ed25519 KeyPairs that can be used for Keypom linkdrops, or full access keys to claimed accounts. These keys can optionally be derived from some entropy such as a root password and metadata pertaining to each key (user provided password etc.). +Entropy is useful for creating an onboarding experience where in order to recover a keypair, the client simply needs to provide the meta entropy (could be a user's password) and the secret root key like a UUID). + +**`Example`** + +Generating 10 unique random keypairs with no entropy: +```js +// Generate 10 keys with no entropy (all random) +let keys = await generateKeys({ + numKeys: 10, +}) + +let pubKey1 = keys.publicKeys[0]; +let secretKey1 = keys.secretKeys[0]; + +console.log('1st Public Key: ', pubKey1); +console.log('1st Secret Key: ', secretKey1) +``` + +**`Example`** + +Generating 1 keypair based on entropy: +```js +// Generate 1 key with the given entropy +let {publicKeys, secretKeys} = await generateKeys({ + numKeys: 1, + rootEntropy: "my-global-password", + metaEntropy: "user-password-123" // In this case, since there is only 1 key, the entropy can be an array of size 1 as well. +}) + +let pubKey = publicKeys[0]; +let secretKey = secretKeys[0]; + +console.log('Public Key: ', pubKey); +console.log('Secret Key: ', secretKey) +``` + +**`Example`** + +Generating 2 keypairs each with their own entropy: +```js +// Generate 2 keys each with their own unique entropy +let keys = await generateKeys({ + numKeys: 2, + rootEntropy: "my-global-password", + metaEntropy: [ + `first-password:0`, + `second-password:1` + ] +}) + +console.log('Pub Keys ', keys.publicKeys); +console.log('Secret Keys ', keys.secretKeys); +``` + * + +**`Example`** + +Generate 50 keys exactly how the auto key generation would in createDrop and addKeys: +```js +const dropId = '1676913490360'; +const basePassword = "my-password"; +// Generate 50 keys each with their own unique entropy +let keys = await generateKeys({ + numKeys: 50, + rootEntropy: `${basePassword}-${dropId}`, + autoMetaNonceStart: 0 +}) + +console.log('Pub Keys ', keys.publicKeys); +console.log('Secret Keys ', keys.secretKeys); +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `autoMetaNonceStart?` | `number` | - | +| β€ΊΒ `metaEntropy?` | `string` \| `string`[] | An array of entropies to use in conjunction with a base rootEntropy to deterministically generate the private keys. For single key generation, you can either pass in a string array with a single element, or simply pass in the string itself directly (not within an array). | +| β€ΊΒ `numKeys` | `number` | The number of keys to generate. | +| β€ΊΒ `rootEntropy?` | `string` | A root string that will be used as a baseline for all keys in conjunction with different metaEntropies (if provided) to deterministically generate a keypair. If not provided, the keypair will be completely random. | + +#### Returns + +`Promise`<[`GeneratedKeyPairs`](interfaces/GeneratedKeyPairs.md)\> + +- An object containing an array of KeyPairs, Public Keys and Secret Keys. + +#### Defined in + +[lib/keypom-utils.ts:536](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L536) + +___ + +### generatePerUsePasswords + +**generatePerUsePasswords**(`Β«destructuredΒ»`): `Promise`<[`PasswordPerUse`](interfaces/PasswordPerUse.md)[][]\> + +Generate passwords for a set of public keys. A unique password will be created for each specified use of a public key where the use is NOT zero indexed (i.e 1st use = 1). +The passwords will be generated via a double hash of the base password + public key + specific use + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `basePassword` | `string` | +| β€ΊΒ `publicKeys` | `string`[] | +| β€ΊΒ `uses` | `number`[] | + +#### Returns + +`Promise`<[`PasswordPerUse`](interfaces/PasswordPerUse.md)[][]\> + +An array of objects for each key where each object has a password and maps it to its specific key use. + +#### Defined in + +[lib/keypom-utils.ts:1358](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L1358) + +___ + +### getFTMetadata + +**getFTMetadata**(`contractId`): `Promise`<[`FungibleTokenMetadata`](interfaces/FungibleTokenMetadata.md)\> + +Get the FT Metadata for a given fungible token contract. This is used to display important information such as the icon for the token, decimal format etc. + +**`Example`** + +```js +const ft = await getFTMetadata({ + contractId: "ft.keypom.testnet" +}); +console.log(ft); +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `contractId` | `Object` | The contract ID of the FT contract | +| `contractId.contractId` | `string` | - | + +#### Returns + +`Promise`<[`FungibleTokenMetadata`](interfaces/FungibleTokenMetadata.md)\> + +- The FT Metadata + +#### Defined in + +[lib/keypom-utils.ts:156](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L156) + +___ + +### getNFTMetadata + +**getNFTMetadata**(`Β«destructuredΒ»`): `Promise`<[`ProtocolReturnedNonFungibleTokenObject`](interfaces/ProtocolReturnedNonFungibleTokenObject.md)\> + +Get the NFT Object (metadata, owner, approval IDs etc.) for a given token ID on a given contract. + +**`Example`** + +```js +const nft = await getNFTMetadata({ + contractId: "nft.keypom.testnet", + tokenId: "1" +}); +console.log(nft); +``` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `contractId` | `string` | +| β€ΊΒ `tokenId` | `string` | + +#### Returns + +`Promise`<[`ProtocolReturnedNonFungibleTokenObject`](interfaces/ProtocolReturnedNonFungibleTokenObject.md)\> + +- The NFT Object + +#### Defined in + +[lib/keypom-utils.ts:120](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L120) + +___ + +### getPubFromSecret + +**getPubFromSecret**(`secretKey`): `string` + +Get the public key from a given secret key. + +**`Example`** + +```js +const pubKey = getPubFromSecret("ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1"); +console.log(pubKey); +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `secretKey` | `string` | The secret key you wish to get the public key from | + +#### Returns + +`string` + +- The public key + +#### Defined in + +[lib/keypom-utils.ts:68](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L68) + +___ + +### getStorageBase + +**getStorageBase**(`Β«destructuredΒ»`): `string` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | [`CreateDropProtocolArgs`](interfaces/CreateDropProtocolArgs.md) | + +#### Returns + +`string` + +#### Defined in + +[lib/keypom-utils.ts:1073](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L1073) + +___ + +### hashPassword + +**hashPassword**(`str`, `fromHex?`): `Promise`<`string`\> + +Generate a sha256 hash of a passed in string. If the string is hex encoded, set the fromHex flag to true. + +**`Example`** + +Generating the required password to pass into `claim` given a base password: +```js + // Create the password to pass into claim which is a hash of the basePassword, public key and whichever use we are on +let currentUse = 1; +let passwordForClaim = await hashPassword(basePassword + publicKey + currentUse.toString()); +``` + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `str` | `string` | `undefined` | the string you wish to hash. By default, this should be utf8 encoded. If the string is hex encoded, set the fromHex flag to true. | +| `fromHex` | `boolean` | `false` | (OPTIONAL) - A flag that should be set if the string is hex encoded. Defaults to false. | + +#### Returns + +`Promise`<`string`\> + +- The resulting hash + +#### Defined in + +[lib/keypom-utils.ts:451](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L451) + +___ + +### viewAccessKeyData + +**viewAccessKeyData**(`Β«destructuredΒ»`): `Promise`<`any`\> + +Query for important access key data such as the nonce, allowance, method names etc. that is stored on the NEAR protocol for a given account and public key. + +**`Example`** + +Check if an access key belongs to a trial account +```js +const keyInfo = await viewAccessKeyData({accountId, secretKey}); +let keyPerms = keyInfo.permission.FunctionCall; +isValidTrialInfo = keyPerms.receiver_id === accountId && keyPerms.method_names.includes('execute') +console.log('isValidTrialInfo: ', isValidTrialInfo) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `accountId` | `string` | The account that the access key belongs to. | +| β€ΊΒ `publicKey?` | `string` | The public key of the access key | +| β€ΊΒ `secretKey?` | `string` | The secret key of the access key | + +#### Returns + +`Promise`<`any`\> + +#### Defined in + +[lib/keypom-utils.ts:623](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L623) + +## Creating, And Claiming Drops + +### addKeys + +**addKeys**(`Β«destructuredΒ»`): `Promise`<[`CreateOrAddReturn`](interfaces/CreateOrAddReturn.md)\> + +Add keys that are manually generated and passed in, or automatically generated to an existing drop. If they're +automatically generated, they can be based off a set of entropy. For NFT and FT drops, assets can automatically be sent to Keypom to register keys as part of the payload. +The deposit is estimated based on parameters that are passed in and the transaction can be returned instead of signed and sent to the network. This can allow you to get the +required deposit from the return value and use that to fund the account's Keypom balance to avoid multiple transactions being signed in the case of a drop with many keys. + +**`Example`** + +Create a basic empty simple drop and add 10 keys. Each key is completely random: +```js +// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto generated keys will +// be completely random unless otherwise overwritten. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create an empty simple drop with no keys. +const {dropId} = await createDrop({ + depositPerUseNEAR: 1, +}); + +// Add 10 completely random keys. The return value `keys` contains information about the generated keys +const {keys} = await addKeys({ + dropId, + numKeys: 10 +}) + +console.log('public keys: ', keys.publicKeys); +console.log('private keys: ', keys.secretKeys); +``` + +**`Example`** + +Init funder with root entropy, create empty drop and add generate deterministic keys. Compare with manually generated keys: +```js +// Initialize the SDK for the given network and NEAR connection. Root entropy is passed into the funder account so any generated keys +// Will be based off that entropy. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1", + rootEntropy: "my-global-secret-password" + } +}); + +// Create a simple drop with no keys +const { dropId } = await createDrop({ + depositPerUseNEAR: 1, +}); + +// Add 5 keys to the empty simple drop. Each key will be derived based on the rootEntropy of the funder, the drop ID, and key nonce. +const {keys: keysFromDrop} = await addKeys({ + dropId, + numKeys: 5 +}) + +// Deterministically Generate the Private Keys: +const nonceDropIdMeta = Array.from({length: 5}, (_, i) => `${dropId}_${i}`); +const manualKeys = await generateKeys({ + numKeys: 5, + rootEntropy: "my-global-secret-password", + metaEntropy: nonceDropIdMeta +}) + +// Get the public and private keys from the keys generated by addKeys +const {publicKeys, secretKeys} = keysFromDrop; +// Get the public and private keys from the keys that were manually generated +const {publicKeys: pubKeysGenerated, secretKeys: secretKeysGenerated} = manualKeys; +// These should match! +console.log('secretKeys: ', secretKeys) +console.log('secretKeysGenerated: ', secretKeysGenerated) + +// These should match! +console.log('publicKeys: ', publicKeys) +console.log('pubKeysGenerated: ', pubKeysGenerated) +``` + +**`Example`** + +Create an empty drop and add manually created keys: +```js +// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto generated keys will +// be completely random unless otherwise overwritten. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create an empty simple drop using the keys that were generated. Since keys are passed in, the return value won't contain information about the keys. +const {dropId} = await createDrop({ + publicKeys, + depositPerUseNEAR: 1, +}); + +// Generate 10 random keys +const {publicKeys} = await generateKeys({ + numKeys: 10 +}); + +// Add keys to the drop using the keys that were generated. Since keys are passed in, the return value won't contain information about the keys. +await addKeys({ + publicKeys, + dropId +}) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `basePassword?` | `string` | For doing password protected drops, this is the base password that will be used to generate all the passwords. It will be double hashed with the public keys. If specified, by default, all key uses will have their own unique password unless passwordProtectedUses is passed in. | +| β€ΊΒ `drop?` | [`ProtocolReturnedDrop`](interfaces/ProtocolReturnedDrop.md) | If the drop information from getDropInformation is already known to the client, it can be passed in instead of the drop ID to reduce computation. | +| β€ΊΒ `dropId?` | `string` | Specify the drop ID for which you want to add keys to. | +| β€ΊΒ `extraDepositNEAR?` | `number` | For Public Sales, drops might require an additional fee for adding keys. This specifies the amount of $NEAR in human readable format (i.e `1.5` = 1.5 $NEAR) | +| β€ΊΒ `extraDepositYocto?` | `string` | For Public Sales, drops might require an additional fee for adding keys. This specifies the amount of $NEAR in yoctoNEAR (i.e `1` = 1 $yoctoNEAR = 1e-24 $NEAR) | +| β€ΊΒ `nftTokenIds?` | `string`[] | If the drop type is an NFT drop, the token IDs can be passed in so that the tokens are automatically sent to the Keypom contract rather than having to do two separate transactions. A maximum of 2 token IDs can be sent during the `addKeys` function. To send more token IDs in order to register key uses, use the `nftTransferCall` function. | +| β€ΊΒ `numKeys` | `number` | Specify how many keys should be generated for the drop. If the funder has rootEntropy set OR rootEntropy is passed in, the keys will be deterministically generated using the drop ID, key nonce, and entropy. Otherwise, each key will be generated randomly. | +| β€ΊΒ `passwordProtectedUses?` | `number`[] | For doing password protected drops, specifies exactly which uses will be password protected. The uses are NOT zero indexed (i.e 1st use = 1). Each use will have a different, unique password generated via double hashing the base password + public key + key use. | +| β€ΊΒ `publicKeys?` | `string`[] | Pass in a custom set of publicKeys to add to the drop. If this is not passed in, keys will be generated based on the numKeys parameter. | +| β€ΊΒ `returnTransactions?` | `boolean` | If true, the transaction will be returned instead of being signed and sent. This is useful for getting the requiredDeposit from the return value without actually signing the transaction. | +| β€ΊΒ `rootEntropy?` | `string` | Specify an entropy to use for generating keys (will overload the funder's rootEntropy if applicable). This parameter only matters if the publicKeys variable is not passed in. | +| β€ΊΒ `useBalance?` | `boolean` | If the account has a balance within the Keypom contract, set this to true to avoid the need to attach a deposit. If the account doesn't have enough balance, an error will throw. | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | + +#### Returns + +`Promise`<[`CreateOrAddReturn`](interfaces/CreateOrAddReturn.md)\> + +Object containing: the drop ID, the responses of the execution, as well as any auto generated keys (if any). + +#### Defined in + +[lib/keys.ts:148](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keys.ts#L148) + +___ + +### claim + +**claim**(`Β«destructuredΒ»`): `Promise`<`any`\> + +Allows a specific Keypom drop to be claimed via the secret key. + +**`Example`** + +Creating a simple $NEAR drop and claiming to an existing account: +```js +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// create 1 keys with no entropy (random key) +const {publicKeys, secretKeys} = await generateKeys({ + numKeys: 1 +}); + +// Create a simple drop with 1 $NEAR +await createDrop({ + publicKeys, + depositPerUseNEAR: 1, +}); + +// Claim the drop to the passed in account ID +await claim({ + secretKey: secretKeys[0], + accountId: "benjiman.testnet" +}) +``` + +**`Example`** + +Creating a simple $NEAR drop and using it to create a brand new NEAR account: +```js +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// create 2 keys with no entropy (all random). The first will be used for the drop and the second +// will be used as the full access key for the newly created account +const {publicKeys, secretKeys} = await generateKeys({ + numKeys: 2 +}); + +// Create a simple drop with 1 $NEAR +await createDrop({ + publicKeys: [publicKeys[0]], + depositPerUseNEAR: 1, +}); + +// Claim the drop and create a new account +await claim({ + secretKey: secretKeys[0], + newAccountId: "my-newly-creating-account.testnet", + newPublicKey: publicKeys[1] +}) +``` + +**`Example`** + +Creating a drop and adding a password to it. Generate the password using the hash function and pass it into claim the drop: +```js +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +const basePassword = "my-cool-password123"; +// Create a simple drop with 1 $NEAR and pass in a base password to create a unique password for each use of each key +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1, + basePassword +}); + +// Create the password to pass into claim which is a hash of the basePassword, public key and whichever use we are on +let currentUse = 1; +let passwordForClaim = await hashPassword(basePassword + keys.publicKeys[0] + currentUse.toString()); + +// Claim the drop to the passed in account ID and use the password we generated above. +await claim({ + secretKey: keys.secretKeys[0], + accountId: "benjiman.testnet", + password: passwordForClaim +}) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `accountId?` | `string` | The account ID of an existing account that will be used to claim the drop. | +| β€ΊΒ `fcArgs?` | `string`[] | For FC drops, if `user_args_rule` is set by the funder, when claiming, custom arguments can be passed into the function. The number of args in the array need to match the number of methods being executed. | +| β€ΊΒ `newAccountId?` | `string` | If passed in, a new account ID will be created and the drop will be claimed to that account. This must be an account that does not exist yet. | +| β€ΊΒ `newPublicKey?` | `string` | If creating a new account, a public key must be passed in to be used as the full access key for the newly created account. | +| β€ΊΒ `password?` | `string` | If a password is required to use the key, it can be passed in | +| β€ΊΒ `secretKey` | `string` | The private key associated with the Keypom link. This can either contain the `ed25519:` prefix or not. | + +#### Returns + +`Promise`<`any`\> + +#### Defined in + +[lib/claims.ts:108](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/claims.ts#L108) + +___ + +### createDrop + +**createDrop**(`Β«destructuredΒ»`): `Promise`<[`CreateOrAddReturn`](interfaces/CreateOrAddReturn.md)\> + +Creates a new drop based on parameters passed in. This drop can have keys that are manually generated and passed in, or automatically generated. If they're +automatically generated, they can be based off a set of entropy. For NFT and FT drops, assets can automatically be sent to Keypom to register keys as part of the payload. +The deposit is estimated based on parameters that are passed in and the transaction can be returned instead of signed and sent to the network. This can allow you to get the +required deposit from the return value and use that to fund the account's Keypom balance to avoid multiple transactions being signed in the case of a drop with many keys. + +**`Example`** + +Create a basic simple drop containing 10 keys each with 1 $NEAR. Each key is completely random: +```js +// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto generated keys will +// be completely random unless otherwise overwritten. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create a drop with 10 completely random keys. The return value `keys` contains information about the generated keys +const {keys} = await createDrop({ + numKeys: 10, + depositPerUseNEAR: 1, +}); + +console.log('public keys: ', keys.publicKeys); +console.log('private keys: ', keys.secretKeys); +``` + +**`Example`** + +Init funder with root entropy and generate deterministic keys for a drop. Compare with manually generated keys: +```js +// Initialize the SDK for the given network and NEAR connection. Root entropy is passed into the funder account so any generated keys +// Will be based off that entropy. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1", + rootEntropy: "my-global-secret-password" + } +}); + +// Create a simple drop with 5 keys. Each key will be derived based on the rootEntropy of the funder, the drop ID, and key nonce. +const { keys: keysFromDrop, dropId } = await createDrop({ + numKeys: 5, + depositPerUseNEAR: 1, +}); + +// Deterministically Generate the Private Keys: +const nonceDropIdMeta = Array.from({length: 5}, (_, i) => `${dropId}_${i}`); +const manualKeys = await generateKeys({ + numKeys: 5, + rootEntropy: "my-global-secret-password", + metaEntropy: nonceDropIdMeta +}) + +// Get the public and private keys from the keys generated by the drop +const {publicKeys, secretKeys} = keysFromDrop; +// Get the public and private keys from the keys that were manually generated +const {publicKeys: pubKeysGenerated, secretKeys: secretKeysGenerated} = manualKeys; +// These should match! +console.log('secretKeys: ', secretKeys) +console.log('secretKeysGenerated: ', secretKeysGenerated) + +// These should match! +console.log('publicKeys: ', publicKeys) +console.log('pubKeysGenerated: ', pubKeysGenerated) +``` + +**`Example`** + +Use manually generated keys to create a drop: +```js +// Initialize the SDK for the given network and NEAR connection. No entropy passed in so any auto generated keys will +// be completely random unless otherwise overwritten. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Generate 10 random keys +const {publicKeys} = await generateKeys({ + numKeys: 10 +}); + +// Create a drop using the keys that were generated. Since keys are passed in, the return value won't contain information about the keys. +await createDrop({ + publicKeys, + depositPerUseNEAR: 1, +}); +``` + +**`Example`** + +Create a simple drop with 1 key and 1 use per key. This 1 use-key should be password protected based on a base-password: +```js +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +const basePassword = "my-cool-password123"; +// Create a simple drop with 1 $NEAR and pass in a base password to create a unique password for each use of each key +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1, + basePassword +}); + +// Create the password to pass into claim which is a hash of the basePassword, public key and whichever use we are on +let currentUse = 1; +let passwordForClaim = await hashPassword(basePassword + keys.publicKeys[0] + currentUse.toString()); +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `basePassword?` | `string` | For doing password protected drops, this is the base password that will be used to generate all the passwords. It will be double hashed with the public keys. If specified, by default, all key uses will have their own unique password unless passwordProtectedUses is passed in. | +| β€ΊΒ `config?` | [`DropConfig`](interfaces/DropConfig.md) | Allows specific drop behaviors to be configured such as the number of uses each key / link will have. | +| β€ΊΒ `depositPerUseNEAR?` | `string` \| `number` | How much $NEAR should be contained in each link. Unit in $NEAR (i.e `1` = 1 $NEAR) | +| β€ΊΒ `depositPerUseYocto?` | `string` | How much $yoctoNEAR should be contained in each link. Unit in yoctoNEAR (1 yoctoNEAR = 1e-24 $NEAR) | +| β€ΊΒ `dropId?` | `string` | Specify a custom drop ID rather than using the incrementing nonce on the contract. | +| β€ΊΒ `fcData?` | [`FCData`](interfaces/FCData.md) | For creating a function call drop, this contains necessary configurable information about the drop. | +| β€ΊΒ `ftData?` | [`FTData`](interfaces/FTData.md) | For creating a fungible token drop, this contains necessary configurable information about the drop. | +| β€ΊΒ `metadata?` | `string` | String of metadata to attach to the drop. This can be whatever you would like and is optional. Often this is stringified JSON. | +| β€ΊΒ `nftData?` | [`NFTData`](interfaces/NFTData.md) | For creating a non-fungible token drop, this contains necessary configurable information about the drop. | +| β€ΊΒ `numKeys?` | `number` | Specify how many keys should be generated for the drop. If the funder has rootEntropy set OR rootEntropy is passed in, the keys will be deterministically generated using the drop ID, key nonce, and entropy. Otherwise, each key will be generated randomly. If this is not passed in, the publicKeys parameter *must* be passed in. | +| β€ΊΒ `passwordProtectedUses?` | `number`[] | For doing password protected drops, specifies exactly which uses will be password protected. The uses are NOT zero indexed (i.e 1st use = 1). Each use will have a different, unique password generated via double hashing the base password + public key + key use. | +| β€ΊΒ `publicKeys?` | `string`[] | Pass in a custom set of publicKeys to add to the drop. If this is not passed in, keys will be generated based on the numKeys parameter. | +| β€ΊΒ `requiredGas?` | `string` | Allows you to overload how much gas should be attached to the transaction when the key is claimed. This should be in Gas units (1 TGas = 1000000000000). By default, 100 TGas is attached. | +| β€ΊΒ `returnTransactions?` | `boolean` | If true, the transaction will be returned instead of being signed and sent. This is useful for getting the requiredDeposit from the return value without actually signing the transaction. | +| β€ΊΒ `rootEntropy?` | `string` | Specify an entropy to use for generating keys (will overload the funder's rootEntropy if applicable). This parameter only matters if the publicKeys variable is not passed in. | +| β€ΊΒ `simpleData?` | [`SimpleData`](interfaces/SimpleData.md) | For creating a simple drop, this contains necessary configurable information about the drop. | +| β€ΊΒ `successUrl?` | `string` | When signing with a wallet, a success URl can be included that the user will be redirected to once the transaction has been successfully signed. | +| β€ΊΒ `useBalance?` | `boolean` | If the account has a balance within the Keypom contract, set this to true to avoid the need to attach a deposit. If the account doesn't have enough balance, an error will throw. | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | + +#### Returns + +`Promise`<[`CreateOrAddReturn`](interfaces/CreateOrAddReturn.md)\> + +Object containing: the drop ID, the responses of the execution, as well as any auto generated keys (if any). + +#### Defined in + +[lib/drops.ts:176](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/drops.ts#L176) + +## User Balance Functions + +### addToBalance + +**addToBalance**(`Β«destructuredΒ»`): `Promise`<`any`\> + +Deposit some amount of $NEAR or yoctoNEAR$ into the Keypom contract. This amount can then be used to create drops or add keys without +Having to explicitly attach a deposit every time. It can be thought of like a bank account. + +**`Example`** + +Add 1 $NEAR to the account balance +```js +// Initialize the SDK on testnet +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +await addToBalance({ + amount: "1", +)}; +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `amountNear?` | `string` | Human readable format for the amount of tokens to add. **`Example`** ```ts Example: transferring one $NEAR should be passed in as "1" and NOT "1000000000000000000000000" ``` | +| β€ΊΒ `amountYocto?` | `string` | Amount of tokens to add but considering the decimal amount (non human-readable). **`Example`** ```ts Transferring one $NEAR should be passed in as "1000000000000000000000000" and NOT "1" ``` | +| β€ΊΒ `successUrl?` | `string` | When signing with a wallet, a success URl can be included that the user will be redirected to once the transaction has been successfully signed. | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | + +#### Returns + +`Promise`<`any`\> + +#### Defined in + +[lib/balances.ts:37](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/balances.ts#L37) + +___ + +### withdrawBalance + +**withdrawBalance**(`Β«destructuredΒ»`): `Promise`<`any`\> + +Withdraw all the $NEAR from your balance in the Keypom contract. + +**`Example`** + +Add 1 $NEAR to the account balance and then withdraw it +```js +// Initialize the SDK on testnet +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +await addToBalance({ + amount: "1", +}); + +await withdrawBalance({}); +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | + +#### Returns + +`Promise`<`any`\> + +#### Defined in + +[lib/balances.ts:118](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/balances.ts#L118) + +## Public Sale Functions + +### addToSaleAllowlist + +**addToSaleAllowlist**(`Β«destructuredΒ»`): `Promise`<`any`\> + +Add a list of account IDs to a drop's sale allowlist. If the allowlist is empty, anyone can purchase keys. The sale object must exist in the drop's config for this to go through. + +**`Example`** + +```js +const {dropId} = await createDrop({ + numKeys: 0, + depositPerUseNEAR: 0.1, + config: { + sale: { + maxNumKeys: 2, + pricePerKeyNEAR: 1 + } + } + }); + + let canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"}); + t.is(canAddKeys, true); + + await addToSaleAllowlist({dropId, accountIds: ["barfoo.testnet"]}); + canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"}); + t.is(canAddKeys, false); + ``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `accountIds` | `string`[] | A list of account IDs that should be added to the sale allowlist | +| β€ΊΒ `dropId` | `string` | The drop ID for the drop | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | + +#### Returns + +`Promise`<`any`\> + +#### Defined in + +[lib/sales.ts:44](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/sales.ts#L44) + +___ + +### addToSaleBlocklist + +**addToSaleBlocklist**(`Β«destructuredΒ»`): `Promise`<`any`\> + +Add a list of account IDs to a drop's sale blocklist. The sale object must exist in the drop's config for this to go through. + +**`Example`** + +```js + const {dropId} = await createDrop({ + numKeys: 0, + depositPerUseNEAR: 0.1, + config: { + sale: { + maxNumKeys: 2, + pricePerKeyNEAR: 1 + } + } + }); + + let canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"}); + t.is(canAddKeys, true); + + await addToSaleBlocklist({dropId, accountIds: ["foobar.testnet"]}); + canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"}); + t.is(canAddKeys, false); + ``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `accountIds` | `string`[] | A list of account IDs that should be added to the sale blocklist | +| β€ΊΒ `dropId` | `string` | The drop ID for the drop | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | + +#### Returns + +`Promise`<`any`\> + +#### Defined in + +[lib/sales.ts:224](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/sales.ts#L224) + +___ + +### removeFromSaleAllowlist + +**removeFromSaleAllowlist**(`Β«destructuredΒ»`): `Promise`<`any`\> + +Remove a list of account IDs from a drop's sale allowlist. If the allowlist is empty, anyone can purchase keys. The sale object must exist in the drop's config for this to go through. + +**`Example`** + +```js + const {dropId} = await createDrop({ + numKeys: 0, + depositPerUseNEAR: 0.1, + config: { + sale: { + maxNumKeys: 2, + pricePerKeyNEAR: 1, + allowlist: ["foobar.testnet", "barfoo.testnet"] + } + } + }); + + let canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"}); + t.is(canAddKeys, true); + + canAddKeys = await canUserAddKeys({dropId, accountId: "not_in_allowlist.testnet"}); + t.is(canAddKeys, false); + + await removeFromSaleAllowlist({dropId, accountIds: ["foobar.testnet"]}); + canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"}); + t.is(canAddKeys, false); + + await removeFromSaleAllowlist({dropId, accountIds: ["barfoo.testnet"]}); + canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"}); + t.is(canAddKeys, true); + ``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `accountIds` | `string`[] | A list of account IDs that should be removed from the sale's allowlist | +| β€ΊΒ `dropId` | `string` | The drop ID for the drop | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | + +#### Returns + +`Promise`<`any`\> + +#### Defined in + +[lib/sales.ts:138](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/sales.ts#L138) + +___ + +### removeFromSaleBlocklist + +**removeFromSaleBlocklist**(`Β«destructuredΒ»`): `Promise`<`any`\> + +Remove a list of account IDs from a drop's sale blocklist. The sale object must exist in the drop's config for this to go through. + +**`Example`** + +```js + const {dropId} = await createDrop({ + numKeys: 0, + depositPerUseNEAR: 0.1, + config: { + sale: { + maxNumKeys: 2, + pricePerKeyNEAR: 1, + blocklist: ["foobar.testnet"] + } + } + }); + + let canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"}); + t.is(canAddKeys, false); + + canAddKeys = await canUserAddKeys({dropId, accountId: "not_in_blocklist.testnet"}); + t.is(canAddKeys, true); + + await removeFromSaleBlocklist({dropId, accountIds: ["foobar.testnet"]}); + canAddKeys = await canUserAddKeys({dropId, accountId: "foobar.testnet"}); + t.is(canAddKeys, true); + ``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `accountIds` | `string`[] | A list of account IDs that should be removed from the sale's allowlist | +| β€ΊΒ `dropId` | `string` | The drop ID for the drop | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | + +#### Returns + +`Promise`<`any`\> + +#### Defined in + +[lib/sales.ts:314](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/sales.ts#L314) + +___ + +### updateSale + +**updateSale**(`Β«destructuredΒ»`): `Promise`<`any`\> + +Remove a list of account IDs from a drop's sale blocklist. The sale object must exist in the drop's config for this to go through. + +**`Example`** + +```js + const {dropId} = await createDrop({ + numKeys: 0, + depositPerUseNEAR: 0.1, + config: { + sale: { + maxNumKeys: 2, + pricePerKeyNEAR: 1 + } + } + }); + + await updateSale({ + dropId, + pricePerKeyNEAR: 2 + }) + ``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `autoWithdrawFunds?` | `boolean` | Should the revenue generated be sent to the funder's account balance or automatically withdrawn and sent to their NEAR wallet? | +| β€ΊΒ `dropId` | `string` | The drop ID for the drop | +| β€ΊΒ `end?` | `number` | Block timestamp dictating the end of the public sale. If None, keys can be added indefinitely Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. | +| β€ΊΒ `maxNumKeys?` | `number` | Maximum number of keys that can be added to this drop. If None, there is no max. | +| β€ΊΒ `pricePerKeyNEAR?` | `number` | Amount of $NEAR that the user needs to attach (if they are not the funder) on top of costs. This amount will be Automatically sent to the funder's balance. If None, the keys are free to the public. | +| β€ΊΒ `pricePerKeyYocto?` | `string` | - | +| β€ΊΒ `start?` | `number` | Minimum block timestamp before the public sale starts. If None, keys can be added immediately Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | + +#### Returns + +`Promise`<`any`\> + +#### Defined in + +[lib/sales.ts:399](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/sales.ts#L399) + +## Trial Accounts + +### canExitTrial + +**canExitTrial**(`Β«destructuredΒ»`): `Promise`<`boolean`\> + +Check whether a trial account is able to exit their trial state and become a fully fledged normal account. + +**`Example`** + +Create a trial account and check whether it can immediately exit +```js + await initKeypom({ + // near, + network: 'testnet', + funder: { + accountId: fundingAccountId, + secretKey: fundingAccountSecretKey, + } + }); + + const callableContracts = [ + `nft.examples.testnet` + ] + + const {dropId, keys: {secretKeys: trialSecretKeys, publicKeys: trialPublicKeys}} + = await createTrialAccountDrop({ + numKeys: 1, + contractBytes: [...readFileSync('./test/ext-wasm/trial-accounts.wasm')], + startingBalanceNEAR: 0.5, + callableContracts: callableContracts, + callableMethods: ['*'], + maxAttachableNEARPerContract: [1], + trialEndFloorNEAR: 0.33 + 0.3 + }) + + const desiredAccountId = `${dropId}-keypom.testnet` + const trialSecretKey = trialSecretKeys[0] + await claimTrialAccountDrop({ + desiredAccountId, + secretKey: trialSecretKey + }) + + const canExitTrial = await keypom.canExitTrial({ + trialAccountId: desiredAccountId + }) + console.log('canExitTrial: ', canExitTrial) + ``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `trialAccountId` | `string` | The account ID of the trial account | + +#### Returns + +`Promise`<`boolean`\> + +#### Defined in + +[lib/trial-accounts/trial-active.ts:403](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/trial-active.ts#L403) + +___ + +### claimTrialAccountDrop + +**claimTrialAccountDrop**(`Β«destructuredΒ»`): `Promise`<`any`\> + +Claim a Keypom trial account drop which will create a new account, deploy and initialize the trial account contract, and setup the account with initial conditions as specified in the drop. + +**`Example`** + +Creating a trial account with any callable methods, an amount of 0.5 $NEAR and 5 keys. +```js +const callableContracts = [ + `v1.social08.testnet`, + 'guest-book.examples.keypom.testnet', +] + +const {dropId, keys: {secretKeys: trialSecretKeys, publicKeys: trialPublicKeys}} += await createTrialAccountDrop({ + numKeys: 1, + contractBytes: [...readFileSync('./test/ext-wasm/trial-accounts.wasm')], + startingBalanceNEAR: 0.5, + callableContracts: callableContracts, + callableMethods: ['set:grant_write_permission', '*'], + maxAttachableNEARPerContract: callableContracts.map(() => '1'), + trialEndFloorNEAR: 0.33 +}) + +const newAccountId = `${Date.now().toString()}.linkdrop-beta.keypom.testnet` +await claimTrialAccountDrop({ + secretKey: trialSecretKeys[0], + desiredAccountId: newAccountId, +}) + +console.log(` + +${JSON.stringify({ + account_id: newAccountId, + public_key: trialPublicKeys[0], + private_key: trialSecretKeys[0] +})} + +`) + +console.log(`http://localhost:1234/keypom-url/${newAccountId}#${trialSecretKeys[0]}`) + +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `desiredAccountId` | `string` | The account ID that will be created for the trial | +| β€ΊΒ `secretKey` | `string` | The private key associated with the Keypom link. This can either contain the `ed25519:` prefix or not. | + +#### Returns + +`Promise`<`any`\> + +#### Defined in + +[lib/trial-accounts/pre-trial.ts:505](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/pre-trial.ts#L505) + +___ + +### createTrialAccountDrop + +**createTrialAccountDrop**(`Β«destructuredΒ»`): `Promise`<[`CreateOrAddReturn`](interfaces/CreateOrAddReturn.md)\> + +Creates a new trial account drop which can be used to instantly sign users into decentralized applications that support the Keypom wallet selector plugin. + +The trial account is locked into certain behaviors depending on what is passed into `createTrialAccountDrop`. These behaviors include callable contracts, methods on +those contracts, the maximum amount of $NEAR that can be spent on each contract as well as an exit condition. Once the trial account has run out of funds, the only way to +retain any assets from the trial or continue using the account ID, is to repay the specific account ID for the amount of $NEAR specified. + +**`Example`** + +Creating a trial account with any callable methods, an amount of 0.5 $NEAR and 5 keys. +```js +const {keys: {secretKeys: trialSecretKeys, publicKeys: trialPublicKeys}} = await createTrialAccountDrop({ + contractBytes: [...readFileSync('./test/ext-wasm/trial-accounts.wasm')], + trialFundsNEAR: 0.5, + callableContracts: ['dev-1676298343226-57701595703433'], + callableMethods: ['*'], + amounts: ['0.5'], + numKeys: 5, + config: { + dropRoot: "linkdrop-beta.keypom.testnet" + } +}) + +const newAccountId = `${Date.now().toString()}.linkdrop-beta.keypom.testnet` +await claimTrialAccountDrop({ + secretKey: trialSecretKeys[0], + desiredAccountId: newAccountId, +}) + +console.log(` + +${JSON.stringify({ + account_id: newAccountId, + public_key: trialPublicKeys[0], + private_key: trialSecretKeys[0] +})} + +`) + +console.log(`http://localhost:1234/keypom-url/${newAccountId}#${trialSecretKeys[0]}`) + +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `callableContracts` | `string`[] | The contracts that the trial account should be able to call. | +| β€ΊΒ `callableMethods` | `string`[][] | An array that contains the list of methods that the trial account should be able to call on each respective contract. To allow any methods to be called on the receiver contract, pass in `[*]`. | +| β€ΊΒ `config?` | [`DropConfig`](interfaces/DropConfig.md) | Allows specific drop behaviors to be configured such as the number of uses each key / link will have. | +| β€ΊΒ `contractBytes` | `number`[] | Bytes of the trial account smart contract | +| β€ΊΒ `dropId?` | `string` | Specify a custom drop ID rather than using the incrementing nonce on the contract. | +| β€ΊΒ `maxAttachableNEARPerContract` | (`string` \| `number`)[] | The upper bound of $NEAR that trial account is able to attach to calls associated with each contract passed in. For no upper limit, pass in `*`. Units are in $NEAR (i.e `1` = 1 $NEAR). | +| β€ΊΒ `maxAttachableYoctoPerContract` | `string`[] | The upper bound of $yocto that trial account is able to attach to calls associated with each contract passed in. For no upper limit, pass in `*`. Units are in $yoctoNEAR (i.e `1` = 1 $yoctoNEAR). | +| β€ΊΒ `metadata?` | `string` | String of metadata to attach to the drop. This can be whatever you would like and is optional. Often this is stringified JSON. | +| β€ΊΒ `numKeys` | `number` | Specify how many keys should be generated for the drop. If the funder has rootEntropy set OR rootEntropy is passed in, the keys will be deterministically generated using the drop ID, key nonce, and entropy. Otherwise, each key will be generated randomly. | +| β€ΊΒ `publicKeys?` | `string`[] | Pass in a custom set of publicKeys to add to the drop. If this is not passed in, keys will be generated based on the numKeys parameter. | +| β€ΊΒ `repayAmountNEAR?` | `string` \| `number` | How much $NEAR should be paid back to the specified funder in order to unlock the trial account. Unit in $NEAR (i.e `1` = 1 $NEAR) | +| β€ΊΒ `repayAmountYocto?` | `string` | How much $NEAR should be paid back to the specified funder in order to unlock the trial account. Unit in yoctoNEAR (1 yoctoNEAR = 1e-24 $NEAR) | +| β€ΊΒ `repayTo?` | `string` | The account that should receive the repayment of the trial account. If not specified, the drop funder will be used. | +| β€ΊΒ `returnTransactions?` | `boolean` | If true, the transaction will be returned instead of being signed and sent. This is useful for getting the requiredDeposit from the return value without actually signing the transaction. | +| β€ΊΒ `rootEntropy?` | `string` | Specify an entropy to use for generating keys (will overload the funder's rootEntropy if applicable). This parameter only matters if the publicKeys variable is not passed in. | +| β€ΊΒ `startingBalanceNEAR?` | `string` \| `number` | How much $NEAR should the trial account start with? Unit in $NEAR (i.e `1` = 1 $NEAR) | +| β€ΊΒ `startingBalanceYocto?` | `string` | How much $NEAR should the trial account start with? Unit in yoctoNEAR (1 yoctoNEAR = 1e-24 $NEAR) | +| β€ΊΒ `successUrl?` | `string` | When signing with a wallet, a success URl can be included that the user will be redirected to once the transaction has been successfully signed. | +| β€ΊΒ `trialEndFloorNEAR` | `string` \| `number` | Once the account has spent more than this amount (in $NEAR), the trial is over and the exit conditions must be met. | +| β€ΊΒ `trialEndFloorYocto` | `string` | Once the account has spent more than this amount (in yocto), the trial is over and the exit conditions must be met. | +| β€ΊΒ `useBalance?` | `boolean` | If the account has a balance within the Keypom contract, set this to true to avoid the need to attach a deposit. If the account doesn't have enough balance, an error will throw. | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | + +#### Returns + +`Promise`<[`CreateOrAddReturn`](interfaces/CreateOrAddReturn.md)\> + +Object containing: the drop ID, the responses of the execution, as well as any auto generated keys (if any). + +#### Defined in + +[lib/trial-accounts/pre-trial.ts:81](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/pre-trial.ts#L81) + +___ + +### trialCallMethod + +**trialCallMethod**(`Β«destructuredΒ»`): `Promise`<`FinalExecutionOutcome`[]\> + +Execute a method using a trial account. If the trial account is in the exit state, this will throw an error. Similarly, if the given method data +cannot be executed by the trial account (e.g. the attached deposit exceeds the trial account's restrictions), this will throw an error. + +**`Example`** + +Using a trial account to mint a new NFT: +```js + await initKeypom({ + network: 'testnet', + funder: { + accountId: fundingAccountId, + secretKey: fundingAccountSecretKey, + } + }); + + const callableContracts = [ + `nft.examples.testnet` + ] + + const {dropId, keys: {secretKeys: trialSecretKeys, publicKeys: trialPublicKeys}} + = await createTrialAccountDrop({ + numKeys: 1, + contractBytes: [...readFileSync('./test/ext-wasm/trial-accounts.wasm')], + startingBalanceNEAR: 0.5, + callableContracts: callableContracts, + callableMethods: ['*'], + maxAttachableNEARPerContract: [1], + trialEndFloorNEAR: 0.33 + 0.3 + }) + + const desiredAccountId = `${dropId}-keypom.testnet` + const trialSecretKey = trialSecretKeys[0] + await claimTrialAccountDrop({ + desiredAccountId, + secretKey: trialSecretKeys[0], + }) + + console.log('desiredAccountId: ', desiredAccountId) + console.log(`trialSecretKey: ${JSON.stringify(trialSecretKey)}`) + + await trialCallMethod({ + trialAccountId: desiredAccountId, + trialAccountSecretKey: trialSecretKey, + contractId: callableContracts[0], + methodName: 'nft_mint', + args: { + token_id: 'asdkasldkjasdlkajsldajsldaskjd', + receiver_id: 'foo.testnet', + metadata: { + title: 'test', + description: 'test', + media: 'test', + } + }, + attachedDeposit: parseNearAmount('0.1'), + attachedGas: '30000000000000', + }) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `args` | `Object` | The arguments to pass to the method | +| β€ΊΒ `attachedDeposit` | `string` | The amount of NEAR to attach to the transaction | +| β€ΊΒ `attachedGas` | `string` | The amount of gas to attach to the transaction | +| β€ΊΒ `contractId` | `string` | The contract ID of the contract to call | +| β€ΊΒ `methodName` | `string` | The method name to call | +| β€ΊΒ `trialAccountId` | `string` | The account ID of the trial account | +| β€ΊΒ `trialAccountSecretKey` | `string` | The secret key of the trial account | + +#### Returns + +`Promise`<`FinalExecutionOutcome`[]\> + +The outcome of the transaction + +#### Defined in + +[lib/trial-accounts/trial-active.ts:248](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/trial-active.ts#L248) + +___ + +### trialSignAndSendTxns + +**trialSignAndSendTxns**(`Β«destructuredΒ»`): `Promise`<`FinalExecutionOutcome`[]\> + +Execute a transaction that can contain multiple actions using a trial account. If the trial account is in the exit state, this will throw an error. Similarly, if any action +cannot be executed by the trial account (e.g. the attached deposit exceeds the trial account's restrictions), this will throw an error. + +**`Example`** + +Use a Trial Account to min2 +```js +await initKeypom({ + // near, + network: 'testnet', + funder: { + accountId: fundingAccountId, + secretKey: fundingAccountSecretKey, + } + }); + + const callableContracts = [ + `nft.examples.testnet` + ] + + const {dropId, keys: {secretKeys: trialSecretKeys, publicKeys: trialPublicKeys}} + = await createTrialAccountDrop({ + numKeys: 1, + contractBytes: [...readFileSync('./test/ext-wasm/trial-accounts.wasm')], + startingBalanceNEAR: 0.5, + callableContracts: callableContracts, + callableMethods: ['*'], + maxAttachableNEARPerContract: [1], + trialEndFloorNEAR: 0.33 + 0.3 + }) + + const desiredAccountId = `${dropId}-keypom.testnet` + const trialSecretKey = trialSecretKeys[0] + await claimTrialAccountDrop({ + desiredAccountId, + secretKey: trialSecretKeys[0], + }) + + console.log('desiredAccountId: ', desiredAccountId) + console.log(`trialSecretKey: ${JSON.stringify(trialSecretKey)}`) + const txns = [{ + receiverId: callableContracts[0], + actions: [ + { + type: 'FunctionCall', + params: { + methodName: 'nft_mint', + args: { + token_id: 'tokenId-keypom-1', + receiver_id: 'foo.testnet', + metadata: { + title: 'test1', + description: 'test1', + media: 'test1', + } + }, + gas: '30000000000000', + deposit: parseNearAmount('0.1') + }, + }, + { + type: 'FunctionCall', + params: { + methodName: 'nft_mint', + args: { + token_id: 'tokenId-keypom-2', + receiver_id: 'foo.testnet', + metadata: { + title: 'test2', + description: 'test2', + media: 'test2', + } + }, + gas: '30000000000000', + deposit: parseNearAmount('0.1') + }, + }, + ], + }]; + + await trialSignAndSendTxns({ + trialAccountId: desiredAccountId, + trialAccountSecretKey: trialSecretKey, + txns + }) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `trialAccountId` | `string` | The trial account ID to use | +| β€ΊΒ `trialAccountSecretKey` | `string` | The trial account secret key to use | +| β€ΊΒ `txns` | `Transaction`[] | The transactions to execute | + +#### Returns + +`Promise`<`FinalExecutionOutcome`[]\> + +The outcomes of the transactions + +#### Defined in + +[lib/trial-accounts/trial-active.ts:106](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/trial-active.ts#L106) + +## View Functions + +### canUserAddKeys + +**canUserAddKeys**(`Β«destructuredΒ»`): `Promise`<`boolean`\> + +Check if a given user can add keys to a drop. The only case where a user *other than the funder* could add keys is if the drop has a public sale running. + +**`Example`** + +```js +await createDrop({ + numKeys: 0, + depositPerUseNEAR: 0, + config: { + sale: { + maxNumKeys: 2, + pricePerKeyNEAR: 1 + } + } +}); + +const canAddKeys = await canUserAddKeys({accountId: "foobar.testnet"}); +t.is(canAddKeys, true); +``` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `accountId` | `string` | +| β€ΊΒ `dropId` | `string` | + +#### Returns + +`Promise`<`boolean`\> + +Whether or not the user can add keys to the drop + +#### Defined in + +[lib/views.ts:854](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L854) + +___ + +### getContractSourceMetadata + +**getContractSourceMetadata**(): `Promise`<[`ContractSourceMetadata`](interfaces/ContractSourceMetadata.md)\> + +Returns the source metadata for the Keypom contract that the SDK has been initialized on. This includes valuable information +such as which specific version the contract is on and link to exactly which GitHub commit is deployed. + +**`Example`** + +Query for the current Keypom contract's source metadata: +```js +// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls. +await initKeypom({ +network: "testnet", +}); + +// Query for the Keypom contract's source metadata +const metadata = await getContractSourceMetadata(); + +console.log('metadata: ', metadata) +``` + +#### Returns + +`Promise`<[`ContractSourceMetadata`](interfaces/ContractSourceMetadata.md)\> + +The contract's source metadata + +#### Defined in + +[lib/views.ts:896](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L896) + +___ + +### getCurMethodData + +**getCurMethodData**(`Β«destructuredΒ»`): `Promise`<[`ProtocolReturnedMethod`](interfaces/ProtocolReturnedMethod.md)[]\> + +Query for the current method data for a given key. This pertains to FC drops and the current method data is either null or an array of methods that will be invoked when the key is claimed next. + +**`Example`** + +```js +const fcData = { + methods: [ + null, + [ + { + methodName: "nft_token", + receiverId: "nft.examples.testnet", + args: JSON.stringify({ + token_id: "1" + }), + attachedDeposit: "0" + }, + { + methodName: "nft_token", + receiverId: "nft.examples.testnet", + args: JSON.stringify({ + token_id: "2" + }), + attachedDeposit: "0" + } + ], + null + ] +} + +const {keys: {publicKeys, secretKeys}} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 0, + fcData, + config: { + usesPerKey: 3 + } +}); +const secretKey = secretKeys[0]; + +let curMethodData = await getCurMethodData({secretKey}); +console.log('curMethodData (first): ', curMethodData) +t.is(curMethodData, null); + + curMethodData = await getCurMethodData({secretKey, keyUse: 1}); + t.is(curMethodData, null); + curMethodData = await getCurMethodData({secretKey, keyUse: 2}); + t.true(curMethodData != null); + curMethodData = await getCurMethodData({secretKey, keyUse: 3}); + t.is(curMethodData, null); + +await claim({secretKey, accountId: 'foobar'}) +curMethodData = await getCurMethodData({secretKey}); +t.true(curMethodData != null); + +await claim({secretKey, accountId: 'foobar'}) +curMethodData = await getCurMethodData({secretKey}); +console.log('curMethodData (third): ', curMethodData) +t.is(curMethodData, null); +``` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `keyUse?` | `number` | +| β€ΊΒ `publicKey?` | `string` | +| β€ΊΒ `secretKey?` | `string` | + +#### Returns + +`Promise`<[`ProtocolReturnedMethod`](interfaces/ProtocolReturnedMethod.md)[]\> + +The current method data for the key + +#### Defined in + +[lib/views.ts:797](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L797) + +___ + +### getDropInformation + +**getDropInformation**(`Β«destructuredΒ»`): `Promise`<[`ProtocolReturnedDrop`](interfaces/ProtocolReturnedDrop.md)\> + +Get information about a specific drop by passing in either a drop ID, public key, or secret key. + +**`Example`** + +Create a simple drop and retrieve information about it: +```js +// Initialize the SDK on testnet. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create a drop with 1 key automatically created. That key will be completely random since there is no entropy. +const {dropId} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1 +}); + +// Query for the drop information and also return the key information as well +const dropInfo = await getDropInformation({ + dropId, + withKeys: true +}) + +console.log('dropInfo: ', dropInfo) +``` + +**`Example`** + +Create a simple drop and get the drop information based on a public key and then the secret key: +```js +// Initialize the SDK on testnet. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create a drop with 1 key automatically created. That key will be completely random since there is no entropy. +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1 +}); + +// Query for the drop information and also return the key information as well +let dropInfo = await getDropInformation({ + publicKey: keys.publicKeys[0], + withKeys: true +}) + +console.log('dropInfo via public key: ', dropInfo) + +// Query for the drop information and also return the key information as well +dropInfo = await getDropInformation({ + secretKey: keys.secretKeys[0], + withKeys: true +}) + +console.log('dropInfo via secret key: ', dropInfo) +``` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `dropId?` | `string` | +| β€ΊΒ `publicKey?` | `string` | +| β€ΊΒ `secretKey?` | `string` | +| β€ΊΒ `withKeys?` | `boolean` | + +#### Returns + +`Promise`<[`ProtocolReturnedDrop`](interfaces/ProtocolReturnedDrop.md)\> + +Drop information which may or may not have a keys field of type `KeyInfo` depending on if withKeys is specified as true. + +#### Defined in + +[lib/views.ts:336](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L336) + +___ + +### getDropSupplyForOwner + +**getDropSupplyForOwner**(`accountId`): `Promise`<`number`\> + +Returns the total supply of active drops for a given account ID + +**`Example`** + +Create a drop and check how many the owner has: +```js +// Initialize the SDK on testnet. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create a drop with no keys +await createDrop({ + depositPerUseNEAR: 1 +}); + +// Query for the amount of drops owned by the account +const dropSupply = await getDropSupplyForOwner({ + accountId: "benji_demo.testnet" +}) + +console.log('dropSupply: ', dropSupply) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `accountId` | `Object` | The account that the drops belong to. | +| `accountId.accountId` | `string` | - | + +#### Returns + +`Promise`<`number`\> + +Amount of drops + +#### Defined in + +[lib/views.ts:517](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L517) + +___ + +### getDrops + +**getDrops**(`Β«destructuredΒ»`): `Promise`<[`ProtocolReturnedDrop`](interfaces/ProtocolReturnedDrop.md)[]\> + +Paginate through drops owned by an account. If specified, information for the first 50 keys in each drop can be returned as well. + +**`Example`** + +Get drop information for the last 5 drops owned by a given account: +```js +// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls. +await initKeypom({ + network: "testnet", +}); + +// Get the number of drops the account has. +const numDrops = await getDropSupply({ + accountId: "benjiman.testnet" +}); + +// Query for drop information for the last 5 drops and their respective keys +const dropsAndKeys = await getDrops({ + accountId: "benjiman.testnet", + start: numDrops - 5, + withKeys: true +}) + +console.log('dropsAndKeys: ', dropsAndKeys) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `accountId` | `string` | The funding account that the drops belong to. | +| β€ΊΒ `limit` | `number` | How many drops to paginate through. | +| β€ΊΒ `start` | `string` \| `number` | Where to start paginating through drops. | +| β€ΊΒ `withKeys` | `boolean` | Whether or not to include key information for the first 50 keys in each drop. | + +#### Returns + +`Promise`<[`ProtocolReturnedDrop`](interfaces/ProtocolReturnedDrop.md)[]\> + +#### Defined in + +[lib/views.ts:562](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L562) + +___ + +### getKeyBalance + +**getKeyBalance**(`Β«destructuredΒ»`): `Promise`<`string`\> + +Returns the balance associated a with given public key. If only the secret key is known, this can be passed in instead. This is used by the NEAR wallet to display the amount of the linkdrop + +**`Example`** + +Create a 1 $NEAR linkdrop and query for its balance: +```js +// Initialize the SDK on testnet. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create a drop with 1 key automatically created. That key will be completely random since there is no entropy. +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1 +}); + +// Query for the amount of yoctoNEAR contained within the key +const keyBalance = await getKeyBalance({ + publicKey: keys.publicKeys[0] +}) + +console.log('keyBalance: ', keyBalance) +``` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `publicKey?` | `string` | +| β€ΊΒ `secretKey?` | `string` | + +#### Returns + +`Promise`<`string`\> + +The amount of yoctoNEAR that is contained within the key + +#### Defined in + +[lib/views.ts:47](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L47) + +___ + +### getKeyInformation + +**getKeyInformation**(`Β«destructuredΒ»`): `Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)\> + +Returns the KeyInfo corresponding to a specific public key + +**`Example`** + +Create a drop and query for the key information: +```js +// Initialize the SDK on testnet. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create a drop with 1 key automatically created. That key will be completely random since there is no entropy. +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1 +}); + +// Query for the key information for the key that was created +const keyInfo = await getKeyInformation({ + publicKey: keys.publicKeys[0] +}) + +console.log('keyInfo: ', keyInfo) +``` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `publicKey?` | `string` | +| β€ΊΒ `secretKey?` | `string` | + +#### Returns + +`Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)\> + +Key information struct for that specific key. + +#### Defined in + +[lib/views.ts:177](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L177) + +___ + +### getKeyInformationBatch + +**getKeyInformationBatch**(`Β«destructuredΒ»`): `Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)[]\> + +Returns a vector of KeyInfo corresponding to a set of public keys passed in. + +**`Example`** + +Create a drop and query for the key information for all keys created: +```js +// Initialize the SDK on testnet. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create a drop with 5 keys automatically created. That key will be completely random since there is no entropy. +const {keys} = await createDrop({ + numKeys: 5, + depositPerUseNEAR: 1 +}); + +// Query for the key information for the key that was created +const keyInfos = await getKeyInformationBatch({ + publicKeys: keys.publicKeys +}) + +console.log('keyInfos: ', keyInfos) +``` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `publicKeys?` | `string`[] | +| β€ΊΒ `secretKeys?` | `string`[] | + +#### Returns + +`Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)[]\> + +Array of Key information structs for the keys passed in + +#### Defined in + +[lib/views.ts:236](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L236) + +___ + +### getKeySupplyForDrop + +**getKeySupplyForDrop**(`dropId`): `Promise`<`number`\> + +Returns the total supply of active keys for a given drop + +**`Example`** + +Create a drop with 5 keys and query for the key supply: +```js +// Initialize the SDK on testnet. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create a drop with 5 keys automatically created. That key will be completely random since there is no entropy. +const {keys, dropId} = await createDrop({ + numKeys: 5, + depositPerUseNEAR: 1 +}); + +// Query for the key supply for the drop that was created +const keySupply = await getKeySupplyForDrop({ + dropId +}) + +console.log('keySupply: ', keySupply) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `dropId` | `Object` | The drop ID for the specific drop that you want to get information about. | +| `dropId.dropId` | `string` | - | + +#### Returns + +`Promise`<`number`\> + +Number of active keys + +#### Defined in + +[lib/views.ts:416](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L416) + +___ + +### getKeyTotalSupply + +**getKeyTotalSupply**(): `Promise`<`number`\> + +Query for the total supply of keys currently on the Keypom contract + +**`Example`** + +Query for the key supply on the `v1.keypom.testnet` contract: +```js +// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls +await initKeypom({ + network: "testnet", + keypomContractId: "v1.keypom.testnet" +}); + +// Query for the number of keys on the contract +const numKeys = await getKeyTotalSupply(); + +console.log('numKeys: ', numKeys) +``` + +#### Returns + +`Promise`<`number`\> + +The amount of keys. + +#### Defined in + +[lib/views.ts:92](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L92) + +___ + +### getKeys + +**getKeys**(`Β«destructuredΒ»`): `Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)[]\> + +Paginate through all active keys on the contract and return a vector of key info. + +**`Example`** + +Query for first 50 keys on the `v1.keypom.testnet` contract: +```js +// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls +await initKeypom({ + network: "testnet", + keypomContractId: "v1.keypom.testnet" +}); + +// Query for the first 50 keys on the contract +const keyInfo = await getKeys({ + start: 0, + limit: 50 +}); + +console.log('keyInfo: ', keyInfo) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `limit?` | `number` | (OPTIONAL) How many keys to paginate through. | +| β€ΊΒ `start?` | `string` \| `number` | (OPTIONAL) Where to start paginating through keys. | + +#### Returns + +`Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)[]\> + +Vector of KeyInfo. + +#### Defined in + +[lib/views.ts:126](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L126) + +___ + +### getKeysForDrop + +**getKeysForDrop**(`Β«destructuredΒ»`): `Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)[]\> + +Paginate through all keys in a specific drop, returning an array of KeyInfo. + +**`Example`** + +Create a drop with 5 keys and return all the key info objects: +```js +// Initialize the SDK on testnet. +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create a drop with 5 keys automatically created. That key will be completely random since there is no entropy. +const {dropId} = await createDrop({ + numKeys: 5, + depositPerUseNEAR: 1 +}); + +// Query for the key supply for the drop that was created +const keyInfos = await getKeysForDrop({ + dropId +}) + +console.log('keyInfos: ', keyInfos) +``` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `dropId` | `string` | +| β€ΊΒ `limit?` | `number` | +| β€ΊΒ `start?` | `string` \| `number` | + +#### Returns + +`Promise`<[`ProtocolReturnedKeyInfo`](interfaces/ProtocolReturnedKeyInfo.md)[]\> + +Vector of KeyInfo objects returned from pagination + +#### Defined in + +[lib/views.ts:465](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L465) + +___ + +### getNftSupplyForDrop + +**getNftSupplyForDrop**(`dropId`): `Promise`<`number`\> + +Return the total supply of token IDs for a given NFT drop. + +**`Example`** + +Query for the supply of tokens on a specific drop: +```js +// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls. +await initKeypom({ +network: "testnet", +}); + +// Query for the amount of token IDs on the drop +const tokenSupply = await getNftSupplyForDrop({ + dropId: "1669840629120" +}) + +console.log('tokenSupply: ', tokenSupply) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `dropId` | `Object` | The drop ID that the tokens belong to. | +| `dropId.dropId` | `string` | - | + +#### Returns + +`Promise`<`number`\> + +The amount of token IDs on the drop + +#### Defined in + +[lib/views.ts:634](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L634) + +___ + +### getNftTokenIDsForDrop + +**getNftTokenIDsForDrop**(`Β«destructuredΒ»`): `Promise`<`string`[]\> + +Paginate through token IDs in an NFT drop to return a vector of token IDs. + +**`Example`** + +Query for a list of token IDs on a specific drop: +```js +// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls. +await initKeypom({ +network: "testnet", +}); + +// Query for a set of token IDs on the drop +const tokenList = await getNftTokenIDsForDrop({ + dropId: "1669840629120" +}) + +console.log('tokenList: ', tokenList) +``` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `dropId` | `string` | +| β€ΊΒ `limit?` | `number` | +| β€ΊΒ `start?` | `string` \| `number` | + +#### Returns + +`Promise`<`string`[]\> + +Vector of token IDs + +#### Defined in + +[lib/views.ts:673](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L673) + +___ + +### getUserBalance + +**getUserBalance**(`accountId`): `Promise`<`string`\> + +Query for a user's current balance on the Keypom contract + +**`Example`** + +Query for a user's current balance on the Keypom contract: +```js +// Initialize the SDK on testnet. No funder is passed in since we're only doing view calls. +await initKeypom({ +network: "testnet", +}); + +// Query for the drop information for a specific drop +const userBal = await getUserBalance({ +accountId: "benjiman.testnet", +}) + +console.log('userBal: ', userBal) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `accountId` | `Object` | The account ID of the user to retrieve the balance for. | +| `accountId.accountId` | `string` | - | + +#### Returns + +`Promise`<`string`\> + +The user's current balance + +#### Defined in + +[lib/views.ts:716](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/views.ts#L716) + +## Functions + +### convertBasicTransaction + +**convertBasicTransaction**(`Β«destructuredΒ»`): `Promise`<`Transaction`\> + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `signerId` | `string` | +| β€ΊΒ `signerPk` | `PublicKey` | +| β€ΊΒ `txnInfo` | [`BasicTransaction`](interfaces/BasicTransaction.md) | + +#### Returns + +`Promise`<`Transaction`\> + +#### Defined in + +[lib/keypom-utils.ts:1445](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L1445) + +___ + +### isUnclaimedTrialDrop + +**isUnclaimedTrialDrop**(`Β«destructuredΒ»`): `Promise`<`boolean`\> + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | + +#### Returns + +`Promise`<`boolean`\> + +#### Defined in + +[lib/trial-accounts/utils.ts:232](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/utils.ts#L232) + +___ + +### wrapTxnParamsForTrial + +**wrapTxnParamsForTrial**(`params`, `newParams?`): `Object` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `params` | `any` | +| `newParams` | `Object` | + +#### Returns + +`Object` + +#### Defined in + +[lib/trial-accounts/utils.ts:103](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/trial-accounts/utils.ts#L103) + +## Deleting State + +### deleteDrops + +**deleteDrops**(`Β«destructuredΒ»`): `Promise`<(`void` \| `FinalExecutionOutcome`[])[][]\> + +Delete a set of drops and optionally withdraw any remaining balance you have on the Keypom contract. + +**`Example`** + +Create 5 drops and delete each of them: +```js +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// loop to create 5 simple drops each with 5 more keys than the next +for(var i = 0; i < 5; i++) { + // create 10 keys with no entropy (all random) + const {publicKeys} = await generateKeys({ + numKeys: 5 * (i+1) // First drop will have 5, then 10, then 15 etc.. + }); + + // Create the simple + await createDrop({ + publicKeys, + depositPerUseNEAR: 1, + }); +} + +let drops = await getDrops({accountId: "benji_demo.testnet"}); +console.log('drops: ', drops) + +await deleteDrops({ + drops +}) + + // Get the number of drops the account has after deletion (should be zero) + const numDrops = await getDropSupply({ + accountId: "benjiman.testnet" +}); +console.log('numDrops: ', numDrops) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `dropIds?` | `string`[] | Specify a set of drop IDs to delete. | +| β€ΊΒ `drops?` | [`ProtocolReturnedDrop`](interfaces/ProtocolReturnedDrop.md)[] | If the set of drop information for the drops you want to delete (from `getDropInformation` or `getDrops`) is already known to the client, it can be passed in instead of the drop IDs to reduce computation. | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | +| β€ΊΒ `withdrawBalance?` | `boolean` | Whether or not to withdraw any remaining balance on the Keypom contract. | + +#### Returns + +`Promise`<(`void` \| `FinalExecutionOutcome`[])[][]\> + +#### Defined in + +[lib/drops.ts:599](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/drops.ts#L599) + +___ + +### deleteKeys + +**deleteKeys**(`Β«destructuredΒ»`): `Promise`<`any`\> + +Delete a set of keys from a drop and optionally withdraw any remaining balance you have on the Keypom contract. + +**`Example`** + +Create a drop with 5 keys and delete the first one: +```js +// Initialize the SDK for the given network and NEAR connection +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +// Create the simple drop with 5 random keys +const {keys, dropId} = await createDrop({ + numKeys: 5, + depositPerUseNEAR: 1, +}); + +await deleteKeys({ + dropId, + publicKeys: keys.publicKeys[0] // Can be wrapped in an array as well +}) +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `dropId` | `string` | Which drop ID do the keys belong to? | +| β€ΊΒ `publicKeys` | `string` \| `string`[] | Specify a set of public keys to delete. If deleting a single publicKey, the string can be passed in without wrapping it in an array. | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | +| β€ΊΒ `withdrawBalance?` | `boolean` | Whether or not to withdraw any remaining balance on the Keypom contract. | + +#### Returns + +`Promise`<`any`\> + +#### Defined in + +[lib/keys.ts:441](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keys.ts#L441) + +## Registering Key Uses + +### ftTransferCall + +**ftTransferCall**(`Β«destructuredΒ»`): `Promise`<`Transaction` \| `Promise`<`void` \| `FinalExecutionOutcome`[]\>\> + +For FT Drops, keys need to be registered before they can be used. This is done via the `ft_transfer_call` method on the FT contract. +This is a convenience method to make that process easier. + +**`Example`** + +Send FTs using the funder account (not passing in any accounts into the call): +```js +// Initialize the SDK on testnet +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +await ftTransferCall({ + contractId: "ft.keypom.testnet", + amount: "1", + dropId: "1231231", +)}; +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `absoluteAmount?` | `string` | Amount of tokens to transfer but considering the decimal amount (non human-readable). Example: transferring one wNEAR should be passed in as "1000000000000000000000000" and NOT "1" | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `amount?` | `string` | Human readable format for the amount of tokens to transfer. Example: transferring one wNEAR should be passed in as "1" and NOT "1000000000000000000000000" | +| β€ΊΒ `contractId` | `string` | The fungible token contract ID. | +| β€ΊΒ `dropId` | `string` | The drop ID to register the keys for. | +| β€ΊΒ `returnTransaction?` | `boolean` | If true, the transaction will be returned instead of being signed and sent. | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | + +#### Returns + +`Promise`<`Transaction` \| `Promise`<`void` \| `FinalExecutionOutcome`[]\>\> + +#### Defined in + +[lib/keypom-utils.ts:797](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L797) + +___ + +### nftTransferCall + +**nftTransferCall**(`Β«destructuredΒ»`): `Promise`<`Transaction`[] \| (`void` \| `FinalExecutionOutcome`[])[]\> + +For NFT Drops, keys need to be registered before they can be used. This is done via the `nft_transfer_call` method on the NFT contract. +This is a convenience method to make that process easier. + +**`Example`** + +Send 3 NFTs using the funder account (not passing in any accounts into the call): +```js +// Initialize the SDK on testnet +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +await nftTransferCall({ + contractId: "nft.keypom.testnet", + tokenIds: ["1", "2", "3], + dropId: "1231231", +)}; +``` + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `Β«destructuredΒ»` | `Object` | - | +| β€ΊΒ `account?` | `Account` | Account object that if passed in, will be used to sign the txn instead of the funder account. | +| β€ΊΒ `contractId` | `string` | The non-fungible token contract ID. | +| β€ΊΒ `dropId` | `string` | The drop ID to register the keys for. | +| β€ΊΒ `returnTransactions?` | `boolean` | If true, the transaction will be returned instead of being signed and sent. | +| β€ΊΒ `tokenIds` | `string`[] | A set of token IDs that should be sent to the Keypom contract in order to register keys. | +| β€ΊΒ `wallet?` | `AnyWallet` | If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. | + +#### Returns + +`Promise`<`Transaction`[] \| (`void` \| `FinalExecutionOutcome`[])[]\> + +#### Defined in + +[lib/keypom-utils.ts:906](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/core/src/lib/keypom-utils.ts#L906) diff --git a/versioned_docs/version-2.0/keypom-sdk/Core/welcome.md b/versioned_docs/version-2.0/keypom-sdk/Core/welcome.md new file mode 100644 index 00000000..3fcc11a5 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Core/welcome.md @@ -0,0 +1,216 @@ +--- +id: "welcome" +title: "@keypom/core - v1.0.2" +sidebar_label: "Readme" +sidebar_position: 0 +custom_edit_url: null +--- + +

+ + + + +

Keypom Core SDK

+ +

+ +

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

+ +The core package serves as a way to interact with Keypom through a set of easy to use methods that abstract away the complexities of the protocol. The package includes ways to: +- Create drops of all kinds +- Claim drops +- Create and use trial accounts +- View information about drops and keys +- Delete drops and refund assets +- Manage user balances + +# Table of Contents +- [Table of Contents](#table-of-contents) +- [Installation](#installation) +- [Getting Started](#getting-started) + - [View Methods \& Utility Functions Only](#view-methods--utility-functions-only) + - [Funder Object](#funder-object) + - [Customized KeyStore \& Multiple Signers](#customized-keystore--multiple-signers) +- [Costs](#costs) + - [Per Drop](#per-drop) + - [Per Key](#per-key) + - [Key Costs for Simple Drop](#key-costs-for-simple-drop) + - [Additional Costs for NFT Drops](#additional-costs-for-nft-drops) + - [Additional Costs for FT Drops](#additional-costs-for-ft-drops) + - [Additional Costs for FC Drops](#additional-costs-for-fc-drops) +- [Contributing](#contributing) +- [License](#license) + +--- + +# Installation + +To install the Keypom Core SDK, run the following command: + +```bash +npm install @keypom/core +# or +yarn add @keypom/core +# or +pnpm add @keypom/core +``` + +# Getting Started + +The first thing you must *always* do when using the SDK is to call `initKeypom`. This will initialize the package state and establish a connection to the NEAR blockchain. + +By default, the SDK will create a new [InMemoryKeyStore](https://github.com/near/near-api-js/blob/master/packages/keystores/src/in_memory_key_store.ts) to sign transactions with. Thus, if you don't pass in a `funder` object, you won't be able to sign transactions and can only invoke utility and view methods. Alternatively, if you'd like to use a different keystore, you can pass in a customized `near` object to the initialization function. + +With the SDK, every function that requires transactions to be signed can be carried through in 1 of two ways: +1. Passing in an [Account](https://github.com/near/near-api-js/blob/master/packages/accounts/src/account.ts) object into the function whose keys are kept in the SDK's keystore. +2. Passing in a `funder` object once during initialization whose keys will be kept in the SDK's [InMemoryKeyStore](https://github.com/near/near-api-js/blob/master/packages/keystores/src/in_memory_key_store.ts). + +## View Methods & Utility Functions Only + +If your only purpose is to query information from the chain or use Keypom's utility functions such as `generateKeys`, you don't need to pass in a `near` or `funder` object to `initKeypom`: + +```js +await initKeypom({ + network: "testnet" +}); + +const keys = await generateKeys({ + numKeys: 1 +}) +console.log('keys: ', keys) + +const dropSupply = await getKeyTotalSupply(); +console.log('dropSupply: ', dropSupply) +``` + +## Funder Object + +If you have the private key of an account that you'd like to use to sign transactions with, you can pass in a `funder` object to `initKeypom`. The private key can either be hardcoded or passed in through environment variables / secrets. + +Using this method, you only need to pass the funder object once on initialization and can freely invoke any of the SDK methods moving forward. To update the funder object, you can call `updateFunder` and pass in different information. + +```js +await initKeypom({ + network: "testnet", + funder: { + accountId: "benji_demo.testnet", + secretKey: "ed25519:5yARProkcALbxaSQ66aYZMSBPWL9uPBmkoQGjV3oi2ddQDMh1teMAbz7jqNV9oVyMy7kZNREjYvWPqjcA6LW9Jb1" + } +}); + +const dropSupply = await getKeyTotalSupply(); +console.log('dropSupply: ', dropSupply) + +const {keys} = await createDrop({ + numKeys: 1, + depositPerUseNEAR: 1 +}) +console.log('keys: ', keys) +``` + +## Customized KeyStore & Multiple Signers + +Passing in a custom `near` object when initializing Keypom has several benefits as seen below: +- If you have multiple accounts that will be signing transactions and don't want to keep calling `updateFunder`. +- You don't want to hardcode the private key in the `funder` object. +- You have a keystore containing keys that will be used to sign transactions already in scope. + +In this case, you can pass in an existing `near` object and then pass in `Account` objects when calling the SDK methods. + +```js +let keyStore = new UnencryptedFileSystemKeyStore(credentialsPath); +let nearConfig = { + networkId: NETWORK_ID, + keyStore: keyStore, + nodeUrl: `https://rpc.${NETWORK_ID}.near.org`, + walletUrl: `https://wallet.${NETWORK_ID}.near.org`, + helperUrl: `https://helper.${NETWORK_ID}.near.org`, + explorerUrl: `https://explorer.${NETWORK_ID}.near.org`, +}; +let near = new Near(nearConfig); + +await initKeypom({ + near +}); + +const dropSupply = await getKeyTotalSupply(); +console.log('dropSupply: ', dropSupply) + +const fundingAccount = new Account(near.connection, funderAccountId); +const {keys} = await createDrop({ + account: fundingAccount, + numKeys: 1, + depositPerUseNEAR: 1 +}) +console.log('keys: ', keys) +``` + +# Costs + +It is important to note that the Keypom contracts are 100% **FEE FREE** and will remain that way for the *foreseeable future*. These contracts are a public good and are meant to inspire change in the NEAR ecosystem. + +With that being said, there are several mandatory costs that must be taken into account when using Keypom. These costs are broken down into two categories: per key and per drop. + +> **NOTE:** Creating an empty drop and then adding 100 keys in separate calls will incur the same cost as creating a drop with 100 keys in the same call. + +## Per Drop + +When creating an empty drop, there is only one cost to keep in mind regardless of the drop type: +- Storage cost (**~0.006 $NEAR** for simple drops) + +## Per Key +Whenever keys are added to a drop (either when the drop is first created or at a later date), the costs are outlined below. + +### Key Costs for Simple Drop + +- $NEAR sent whenever the key is used (can be 0). +- Access key allowance (**~0.0187 $NEAR per use**). +- Storage for creating access key (**0.001 $NEAR**). +- Storage cost (**~0.006 $NEAR** for simple drops) + +### Additional Costs for NFT Drops + +Since keys aren't registered for use until **after** the contract has received the NFT, we don't know how much storage the token IDs will use on the contract. To combat this, the Keypom contract will automatically measure the storage used up for storing each token ID in the `nft_on_transfer` function and that $NEAR will be taken from the funder's balance. + +### Additional Costs for FT Drops + +Since accounts claiming FTs may or may not be registered on the Fungible Token contract, Keypom will automatically try to register **all** accounts. This means that the drop creators must front the cost of registering users depending on the `storage_balance_bounds` returned from the FT contract. This applies to every use for every key. + +In addition, Keypom must be registered on the FT contract. If you create a FT drop and are the first person to ever do so for a specific FT contract on Keypom, Keypom will be automatically registered when the drop is created. This is a one time cost and once it is done, no other account will need to register Keypom for that specific FT contract. + +### Additional Costs for FC Drops + +Drop creators have a ton of customization available to them when creation Function Call drops. A cost that they might incur is the attached deposit being sent alongside the function call. Keypom will charge creators for all the attached deposits they specify. + +> **NOTE:** The storage costs are dynamically calculated and will vary depending on the information you store on-chain. + +# Contributing + +First off, thanks for taking the time to contribute! Contributions are what makes the open-source community such an amazing place to learn, inspire, and create. Any contributions you make will benefit everybody else and are **greatly appreciated**. + +Please try to create bug reports that are: + +- _Reproducible._ Include steps to reproduce the problem. +- _Specific._ Include as much detail as possible: which version, what environment, etc. +- _Unique._ Do not duplicate existing opened issues. +- _Scoped to a Single Bug._ One bug per report. + +You can use [markdownlint-cli](https://github.com/igorshubovych/markdownlint-cli) to check for common markdown style inconsistency. + +# License + +This project is licensed under the **GPL License**. diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/_category_.yml b/versioned_docs/version-2.0/keypom-sdk/Selector/_category_.yml new file mode 100644 index 00000000..368d9d7e --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/_category_.yml @@ -0,0 +1,3 @@ +label: "Selector TypeDocs" +position: 0 +collapsed: false \ No newline at end of file diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/classes/KeypomWallet.md b/versioned_docs/version-2.0/keypom-sdk/Selector/classes/KeypomWallet.md new file mode 100644 index 00000000..b105c864 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/classes/KeypomWallet.md @@ -0,0 +1,465 @@ +--- +id: "KeypomWallet" +title: "Class: KeypomWallet" +sidebar_label: "KeypomWallet" +sidebar_position: 0 +custom_edit_url: null +--- + +## Implements + +- `InstantLinkWalletBehaviour` + +## Constructors + +### constructor + +**new KeypomWallet**(`Β«destructuredΒ»`) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `instantSignInSpecs?` | `InstantSignInSpecs` | +| β€ΊΒ `networkId` | `string` | +| β€ΊΒ `signInContractId` | `string` | +| β€ΊΒ `trialAccountSpecs?` | `TrialSignInSpecs` | + +#### Defined in + +[core/wallet.ts:33](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L33) + +## Properties + +### accountId + + `Optional` **accountId**: `string` + +#### Defined in + +[core/wallet.ts:19](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L19) + +___ + +### instantSignInSpecs + + `Optional` **instantSignInSpecs**: `InternalInstantSignInSpecs` + +#### Defined in + +[core/wallet.ts:29](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L29) + +___ + +### keyStore + + **keyStore**: `BrowserLocalStorageKeyStore` + +#### Defined in + +[core/wallet.ts:26](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L26) + +___ + +### modal + + `Optional` **modal**: `KeypomTrialModal` + +#### Defined in + +[core/wallet.ts:31](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L31) + +___ + +### moduleId + + `Optional` **moduleId**: `string` + +#### Defined in + +[core/wallet.ts:21](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L21) + +___ + +### near + + **near**: `Near` + +#### Defined in + +[core/wallet.ts:25](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L25) + +___ + +### secretKey + + `Optional` **secretKey**: `string` + +#### Defined in + +[core/wallet.ts:20](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L20) + +___ + +### signInContractId + + **signInContractId**: `string` + +#### Defined in + +[core/wallet.ts:23](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L23) + +___ + +### trialAccountSpecs + + `Optional` **trialAccountSpecs**: `InternalTrialSignInSpecs` + +#### Defined in + +[core/wallet.ts:28](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L28) + +## Methods + +### assertSignedIn + +`Private` **assertSignedIn**(): `void` + +#### Returns + +`void` + +#### Defined in + +[core/wallet.ts:337](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L337) + +___ + +### checkValidTrialInfo + +**checkValidTrialInfo**(): `boolean` + +#### Returns + +`boolean` + +#### Defined in + +[core/wallet.ts:287](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L287) + +___ + +### getAccountId + +**getAccountId**(): `string` + +#### Returns + +`string` + +#### Defined in + +[core/wallet.ts:63](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L63) + +___ + +### getAccounts + +**getAccounts**(): `Promise`<`Account`[]\> + +#### Returns + +`Promise`<`Account`[]\> + +#### Implementation of + +InstantLinkWalletBehaviour.getAccounts + +#### Defined in + +[core/wallet.ts:306](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L306) + +___ + +### getAvailableBalance + +**getAvailableBalance**(`id?`): `Promise`<`BN`\> + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `id?` | `string` | + +#### Returns + +`Promise`<`BN`\> + +#### Defined in + +[core/wallet.ts:301](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L301) + +___ + +### getContractId + +**getContractId**(): `string` + +#### Returns + +`string` + +#### Implementation of + +InstantLinkWalletBehaviour.getContractId + +#### Defined in + +[core/wallet.ts:59](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L59) + +___ + +### internalSignIn + +`Private` **internalSignIn**(`accountId`, `secretKey`, `moduleId`): `Promise`<`Account`[]\> + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `accountId` | `any` | +| `secretKey` | `any` | +| `moduleId` | `any` | + +#### Returns + +`Promise`<`Account`[]\> + +#### Defined in + +[core/wallet.ts:319](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L319) + +___ + +### isSignedIn + +**isSignedIn**(): `Promise`<`boolean`\> + +#### Returns + +`Promise`<`boolean`\> + +#### Defined in + +[core/wallet.ts:68](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L68) + +___ + +### setSpecsFromKeypomParams + +`Private` **setSpecsFromKeypomParams**(`Β«destructuredΒ»`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `Object` | +| β€ΊΒ `instantSignInSpecs?` | `InstantSignInSpecs` | +| β€ΊΒ `shouldSetupModal` | `boolean` | +| β€ΊΒ `trialAccountSpecs?` | `TrialSignInSpecs` | + +#### Returns + +`void` + +#### Defined in + +[core/wallet.ts:343](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L343) + +___ + +### showModal + +**showModal**(`modalType?`): `void` + +#### Parameters + +| Name | Type | Default value | +| :------ | :------ | :------ | +| `modalType` | `Object` | `undefined` | +| `modalType.id` | `string` | `MODAL_TYPE_IDS.TRIAL_OVER` | + +#### Returns + +`void` + +#### Defined in + +[core/wallet.ts:282](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L282) + +___ + +### signAndSendTransaction + +**signAndSendTransaction**(`params`): `Promise`<`FinalExecutionOutcome`\> + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `params` | `any` | + +#### Returns + +`Promise`<`FinalExecutionOutcome`\> + +#### Implementation of + +InstantLinkWalletBehaviour.signAndSendTransaction + +#### Defined in + +[core/wallet.ts:201](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L201) + +___ + +### signAndSendTransactions + +**signAndSendTransactions**(`params`): `Promise`<`FinalExecutionOutcome`[]\> + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `params` | `Object` | +| `params.transactions` | `Transaction`[] | + +#### Returns + +`Promise`<`FinalExecutionOutcome`[]\> + +#### Implementation of + +InstantLinkWalletBehaviour.signAndSendTransactions + +#### Defined in + +[core/wallet.ts:225](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L225) + +___ + +### signIn + +**signIn**(): `Promise`<`Account`[]\> + +#### Returns + +`Promise`<`Account`[]\> + +#### Implementation of + +InstantLinkWalletBehaviour.signIn + +#### Defined in + +[core/wallet.ts:147](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L147) + +___ + +### signInInstantAccount + +**signInInstantAccount**(`accountId`, `secretKey`, `moduleId`): `Promise`<`Account`[]\> + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `accountId` | `any` | +| `secretKey` | `any` | +| `moduleId` | `any` | + +#### Returns + +`Promise`<`Account`[]\> + +#### Defined in + +[core/wallet.ts:128](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L128) + +___ + +### signInTrialAccount + +**signInTrialAccount**(`accountId`, `secretKey`): `Promise`<`Account`[]\> + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `accountId` | `any` | +| `secretKey` | `any` | + +#### Returns + +`Promise`<`Account`[]\> + +#### Defined in + +[core/wallet.ts:72](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L72) + +___ + +### signOut + +**signOut**(): `Promise`<`void`\> + +#### Returns + +`Promise`<`void`\> + +#### Implementation of + +InstantLinkWalletBehaviour.signOut + +#### Defined in + +[core/wallet.ts:191](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L191) + +___ + +### switchAccount + +**switchAccount**(`id`): `Promise`<`void`\> + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `id` | `string` | + +#### Returns + +`Promise`<`void`\> + +#### Defined in + +[core/wallet.ts:315](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L315) + +___ + +### verifyOwner + +**verifyOwner**(): `Promise`<`void`\> + +#### Returns + +`Promise`<`void`\> + +#### Implementation of + +InstantLinkWalletBehaviour.verifyOwner + +#### Defined in + +[core/wallet.ts:295](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/wallet.ts#L295) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/classes/_category_.yml b/versioned_docs/version-2.0/keypom-sdk/Selector/classes/_category_.yml new file mode 100644 index 00000000..55c7980a --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/classes/_category_.yml @@ -0,0 +1,2 @@ +label: "Classes" +position: 3 \ No newline at end of file diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/BasicTransaction.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/BasicTransaction.md new file mode 100644 index 00000000..83586f31 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/BasicTransaction.md @@ -0,0 +1,37 @@ +--- +id: "BasicTransaction" +title: "Interface: BasicTransaction" +sidebar_label: "BasicTransaction" +sidebar_position: 0 +custom_edit_url: null +--- + +## Properties + +### actions + + **actions**: `Action`[] + +#### Defined in + +[lib/types/general.ts:108](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L108) + +___ + +### receiverId + + **receiverId**: `string` + +#### Defined in + +[lib/types/general.ts:106](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L106) + +___ + +### signerId + + **signerId**: `string` + +#### Defined in + +[lib/types/general.ts:107](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L107) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ContractSourceMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ContractSourceMetadata.md new file mode 100644 index 00000000..1f98bad4 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ContractSourceMetadata.md @@ -0,0 +1,34 @@ +--- +id: "ContractSourceMetadata" +title: "Interface: ContractSourceMetadata" +sidebar_label: "ContractSourceMetadata" +sidebar_position: 0 +custom_edit_url: null +--- + +Information returned from `getContractSourceMetadata` about the deployed Keypom contract. This is part of [NEP-330](https://nomicon.io/Standards/SourceMetadata) and +can allow you to view exactly what code is deployed to the contract. + +## Properties + +### link + + **link**: `string` + +Link to the specific commit and code on GitHub that is deployed to the Keypom account + +#### Defined in + +[lib/types/general.ts:102](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L102) + +___ + +### version + + **version**: `string` + +Versioning used by the Keypom developers to indicate which version of the contract is deployed. + +#### Defined in + +[lib/types/general.ts:100](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L100) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateDropProtocolArgs.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateDropProtocolArgs.md new file mode 100644 index 00000000..628606b8 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateDropProtocolArgs.md @@ -0,0 +1,117 @@ +--- +id: "CreateDropProtocolArgs" +title: "Interface: CreateDropProtocolArgs" +sidebar_label: "CreateDropProtocolArgs" +sidebar_position: 0 +custom_edit_url: null +--- + +## Properties + +### config + + `Optional` **config**: [`ProtocolReturnedDropConfig`](ProtocolReturnedDropConfig.md) + +#### Defined in + +[lib/types/params.ts:54](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L54) + +___ + +### deposit\_per\_use + + **deposit\_per\_use**: `string` + +#### Defined in + +[lib/types/params.ts:51](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L51) + +___ + +### drop\_id + + `Optional` **drop\_id**: `string` + +#### Defined in + +[lib/types/params.ts:53](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L53) + +___ + +### fc + + `Optional` **fc**: [`ProtocolReturnedFCData`](ProtocolReturnedFCData.md) + +#### Defined in + +[lib/types/params.ts:60](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L60) + +___ + +### ft + + `Optional` **ft**: [`ProtocolReturnedFTData`](ProtocolReturnedFTData.md) + +#### Defined in + +[lib/types/params.ts:58](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L58) + +___ + +### metadata + + `Optional` **metadata**: `string` + +#### Defined in + +[lib/types/params.ts:55](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L55) + +___ + +### nft + + `Optional` **nft**: [`ProtocolReturnedNFTData`](ProtocolReturnedNFTData.md) + +#### Defined in + +[lib/types/params.ts:59](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L59) + +___ + +### passwords\_per\_use + + `Optional` **passwords\_per\_use**: [`PasswordPerUse`](PasswordPerUse.md)[][] + +#### Defined in + +[lib/types/params.ts:61](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L61) + +___ + +### public\_keys + + `Optional` **public\_keys**: `string`[] + +#### Defined in + +[lib/types/params.ts:50](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L50) + +___ + +### required\_gas + + `Optional` **required\_gas**: `string` + +#### Defined in + +[lib/types/params.ts:56](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L56) + +___ + +### simple + + `Optional` **simple**: [`ProtocolReturnedSimpleData`](ProtocolReturnedSimpleData.md) + +#### Defined in + +[lib/types/params.ts:57](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L57) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateOrAddReturn.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateOrAddReturn.md new file mode 100644 index 00000000..098ae1bc --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/CreateOrAddReturn.md @@ -0,0 +1,69 @@ +--- +id: "CreateOrAddReturn" +title: "Interface: CreateOrAddReturn" +sidebar_label: "CreateOrAddReturn" +sidebar_position: 0 +custom_edit_url: null +--- + +Information returned when creating a drop or adding keys via `createDrop` and `addKeys` respectively. + +## Properties + +### dropId + + **dropId**: `string` + +The drop ID for the drop that is being interacted with. + +#### Defined in + +[lib/types/params.ts:34](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L34) + +___ + +### keys + + `Optional` **keys**: [`GeneratedKeyPairs`](GeneratedKeyPairs.md) + +Any keys that were automatically generated. + +#### Defined in + +[lib/types/params.ts:32](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L32) + +___ + +### requiredDeposit + + `Optional` **requiredDeposit**: `string` + +The required deposit that should be attached to the transaction. + +#### Defined in + +[lib/types/params.ts:30](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L30) + +___ + +### responses + + `Optional` **responses**: `any` + +The responses to any transactions that were signed and sent to the network. + +#### Defined in + +[lib/types/params.ts:26](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L26) + +___ + +### transactions + + `Optional` **transactions**: `Transaction`[] + +Information about the transactions if `returnTransactions` is specified in the arguments. This will result in the information being returned instead of signed and sent. + +#### Defined in + +[lib/types/params.ts:28](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/params.ts#L28) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Drop.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Drop.md new file mode 100644 index 00000000..906fde01 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Drop.md @@ -0,0 +1,153 @@ +--- +id: "Drop" +title: "Interface: Drop" +sidebar_label: "Drop" +sidebar_position: 0 +custom_edit_url: null +--- + +Information related to a specific drop. + +## Properties + +### config + + `Optional` **config**: [`DropConfig`](DropConfig.md) + +All drops regardless of their type can have a suite of configurations such as how many uses each key has or how often a key can be used. + +#### Defined in + +[lib/types/drops.ts:50](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L50) + +___ + +### depositPerUse + + **depositPerUse**: `string` + +How much $yoctoNEAR will be transferred anytime a key is used that is part of this drop. + +#### Defined in + +[lib/types/drops.ts:40](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L40) + +___ + +### dropId + + **dropId**: `string` + +Drop ID for this specific drop. + +#### Defined in + +[lib/types/drops.ts:36](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L36) + +___ + +### fc + + `Optional` **fc**: [`FCData`](FCData.md) + +For Function-Call drops, important information needs to be stored such as which methods, the attached deposit, args etc. + +#### Defined in + +[lib/types/drops.ts:48](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L48) + +___ + +### ft + + `Optional` **ft**: [`FTData`](FTData.md) + +For Fungible Token drops, important information such as the amount of tokens to transfer, or contract need to be stored. + +#### Defined in + +[lib/types/drops.ts:46](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L46) + +___ + +### metadata + + `Optional` **metadata**: `string` + +Any extra information about the drop can be stored as metadata. This is up to the drop creator and can be stringified JSON, or any other string. + +#### Defined in + +[lib/types/drops.ts:52](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L52) + +___ + +### nextKeyId + + **nextKeyId**: `number` + +What is the next unique ID that will be given to the next access key added to this drop. + +#### Defined in + +[lib/types/drops.ts:58](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L58) + +___ + +### nft + + `Optional` **nft**: [`NFTData`](NFTData.md) + +For NFT drops, important information such as the token IDs, or contract need to be stored. + +#### Defined in + +[lib/types/drops.ts:44](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L44) + +___ + +### ownerId + + **ownerId**: `string` + +Which account created this drop. + +#### Defined in + +[lib/types/drops.ts:38](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L38) + +___ + +### registeredUses + + **registeredUses**: `number` + +How many key uses are registered for this drop? This is only applicable to simple drops with lazy registrations, FT drops, and NFT drops. + +#### Defined in + +[lib/types/drops.ts:54](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L54) + +___ + +### requiredGas + + **requiredGas**: `string` + +In order to use an access key that's part of this drop, how much Gas *needs* to be attached to the call? + +#### Defined in + +[lib/types/drops.ts:56](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L56) + +___ + +### simple + + `Optional` **simple**: [`SimpleData`](SimpleData.md) + +For simple drops, there are specific, optional configurations. + +#### Defined in + +[lib/types/drops.ts:42](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L42) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/DropConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/DropConfig.md new file mode 100644 index 00000000..caf9f428 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/DropConfig.md @@ -0,0 +1,71 @@ +--- +id: "DropConfig" +title: "Interface: DropConfig" +sidebar_label: "DropConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Configurable options for any drop regardless of type. + +## Properties + +### dropRoot + + `Optional` **dropRoot**: `string` + +Override the global root account that all created sub-accounts will have (currently `near` or `testnet`). This allows users to drops that have a custom root. +For example, Fayyr could specify a root of `fayyr.near` By which all sub-accounts will then be `ACCOUNT.fayyr.near`. +It's important to note that this root account *MUST* have a smart contract deployed that has a method `create_account`. + +#### Defined in + +[lib/types/drops.ts:81](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L81) + +___ + +### sale + + `Optional` **sale**: [`PublicSaleConfig`](PublicSaleConfig.md) + +Any information related to primary market sales for access keys added to this drop. + +#### Defined in + +[lib/types/drops.ts:75](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L75) + +___ + +### time + + `Optional` **time**: [`TimeConfig`](TimeConfig.md) + +Any information related to time-based configurations such as a starting date for keys etc. + +#### Defined in + +[lib/types/drops.ts:69](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L69) + +___ + +### usage + + `Optional` **usage**: [`UsageConfig`](UsageConfig.md) + +Any information related to how access keys are used such as which methods they can call or whether an empty drop should be automatically deleted etc. + +#### Defined in + +[lib/types/drops.ts:72](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L72) + +___ + +### usesPerKey + + `Optional` **usesPerKey**: `number` + +How many uses can each key have before it's deleted. If this isn't specified, it defaults to 1 use per key. + +#### Defined in + +[lib/types/drops.ts:66](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L66) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/EnvVars.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/EnvVars.md new file mode 100644 index 00000000..f4334f13 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/EnvVars.md @@ -0,0 +1,223 @@ +--- +id: "EnvVars" +title: "Interface: EnvVars" +sidebar_label: "EnvVars" +sidebar_position: 0 +custom_edit_url: null +--- + +Important context that is used throughout the SDK. This is generated when `initKeypom` is called and can be retrieved by calling `useKeypom`. +All parameters will start off as undefined until the Keypom SDK is initialized. + +## Properties + +### attachedGas + + `Optional` **attachedGas**: `string` + +The amount of Gas that will be attached to the `claim` and `create_account_and_claim` functions for claiming linkdrops (100 TGas). + +#### Defined in + +[lib/types/general.ts:77](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L77) + +___ + +### connection + + `Optional` **connection**: `Connection` + +The connection instance that is part of the NEAR object + +#### Defined in + +[lib/types/general.ts:59](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L59) + +___ + +### contractAccount + + `Optional` **contractAccount**: `Account` + +The NEAR Account object for the Keypom contract being used. This lets you know the account ID for the contract and can be used to sign transactions for claiming linkdrops. + +#### Defined in + +[lib/types/general.ts:69](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L69) + +___ + +### contractId + + `Optional` **contractId**: `string` + +The account ID where the Keypom contract is deployed to. + +#### Defined in + +[lib/types/general.ts:79](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L79) + +___ + +### error + + `Optional` **error**: `string` + +#### Defined in + +[lib/types/general.ts:83](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L83) + +___ + +### execute + + `Optional` **execute**: `any` + +#### Defined in + +[lib/types/general.ts:87](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L87) + +___ + +### fundingAccount + + `Optional` **fundingAccount**: `Account` + +The NEAR Account object for the Funder + +#### Defined in + +[lib/types/general.ts:65](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L65) + +___ + +### fundingAccountDetails + + `Optional` **fundingAccountDetails**: [`Funder`](Funder.md) + +The details for the funder such as any `rootEntropy` or their `secretKey` etc. + +#### Defined in + +[lib/types/general.ts:67](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L67) + +___ + +### gas + + `Optional` **gas**: `string` + +The default amount of Gas that will be attached to transactions (200 TGas). + +#### Defined in + +[lib/types/general.ts:73](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L73) + +___ + +### gas300 + + `Optional` **gas300**: `string` + +The max amount of Gas that will be attached to transactions (300 TGas). + +#### Defined in + +[lib/types/general.ts:75](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L75) + +___ + +### getAccount + + `Optional` **getAccount**: `any` + +#### Defined in + +[lib/types/general.ts:85](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L85) + +___ + +### keyStore + + `Optional` **keyStore**: `KeyStore` + +Which type of KeyStore is used when locating keys and signing transactions throughout the SDK (In Memory, Unencrypted FileStore etc.) + +#### Defined in + +[lib/types/general.ts:61](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L61) + +___ + +### near + + `Optional` **near**: `Near` + +The specific NEAR object that contains important information such as the KeyStore and connection. This is used to interact with the chain and can either be manually passed in or will be automatically created during `initKeypom` + +#### Defined in + +[lib/types/general.ts:57](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L57) + +___ + +### networkId + + `Optional` **networkId**: `string` + +What network is the SDK using (`testnet` or `mainnet`) + +#### Defined in + +[lib/types/general.ts:63](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L63) + +___ + +### receiverId + + `Optional` **receiverId**: `string` + +#### Defined in + +[lib/types/general.ts:81](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L81) + +___ + +### supportedKeypomContracts + + `Optional` **supportedKeypomContracts**: `Object` + +Object containing the supported Keypom contracts for both mainnet and testnet + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `mainnet` | {} | +| `testnet` | {} | + +#### Defined in + +[lib/types/general.ts:89](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L89) + +___ + +### viewAccount + + `Optional` **viewAccount**: `any` + +#### Defined in + +[lib/types/general.ts:71](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L71) + +___ + +### viewCall + + `Optional` **viewCall**: `any` + +Function that allows you to invoke a view method. This takes in a `receiverId`, `methodName`, and `args`. + +#### Defined in + +[lib/types/general.ts:91](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L91) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FCData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FCData.md new file mode 100644 index 00000000..8a814cde --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FCData.md @@ -0,0 +1,22 @@ +--- +id: "FCData" +title: "Interface: FCData" +sidebar_label: "FCData" +sidebar_position: 0 +custom_edit_url: null +--- + +Information pertaining to all Function-Call drops. This should be passed in if the drop will be a Function-Call drop. + +## Properties + +### methods + + **methods**: [`Method`](Method.md)[][] + +The top level array indicates a different set of methods that can be called for every key use. It is possible that for a given key use, no methods are called thus acting as a "free" key use whereby the use is reflected on-chain but no assets are transferred. +If a given key use does not have an undefined set of methods, when it is used, all the methods in the set will be called. + +#### Defined in + +[lib/types/fc.ts:73](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L73) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FTData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FTData.md new file mode 100644 index 00000000..2b0726d5 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FTData.md @@ -0,0 +1,59 @@ +--- +id: "FTData" +title: "Interface: FTData" +sidebar_label: "FTData" +sidebar_position: 0 +custom_edit_url: null +--- + +Information pertaining to all Fungible-Token drops. This should be passed in if the drop will be used to transfer any fungible tokens. + +## Properties + +### absoluteAmount + + `Optional` **absoluteAmount**: `string` + +Amount of tokens to transfer but considering the decimal amount. +Example: transferring one wNEAR should be passed in as "1000000000000000000000000" and NOT "1" + +#### Defined in + +[lib/types/ft.ts:22](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L22) + +___ + +### amount + + `Optional` **amount**: `string` + +Human readable format for the amount of tokens to transfer every time the FT key is used. +Example: transferring one wNEAR should be passed in as "1" and NOT "1000000000000000000000000" + +#### Defined in + +[lib/types/ft.ts:17](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L17) + +___ + +### contractId + + **contractId**: `string` + +Which contract do the FTs belong to? + +#### Defined in + +[lib/types/ft.ts:8](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L8) + +___ + +### senderId + + `Optional` **senderId**: `string` + +By default, anyone can fund your drop with FTs. This field allows you to set a specific account ID that will be locked into sending the FTs. + +#### Defined in + +[lib/types/ft.ts:12](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L12) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Funder.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Funder.md new file mode 100644 index 00000000..6230c715 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Funder.md @@ -0,0 +1,75 @@ +--- +id: "Funder" +title: "Interface: Funder" +sidebar_label: "Funder" +sidebar_position: 0 +custom_edit_url: null +--- + +Outlines how the structure of the *funder* object should be passed into `initKeypom` or `updateFunder`. This contains important information such as the +secret key, account ID and any root entropy associated with the account. + +**`Throws`** + +if neither `secretKey` or `seedPhrase` are provided. One of these need to be passed in. + +## Properties + +### accountId + + **accountId**: `string` + +The account ID of the funder that will be used to sign transactions. + +#### Defined in + +[lib/types/general.ts:35](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L35) + +___ + +### fundingKeyPair + + `Optional` **fundingKeyPair**: `KeyPair` + +#### Defined in + +[lib/types/general.ts:48](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L48) + +___ + +### rootEntropy + + `Optional` **rootEntropy**: `string` + +When interacting with the SDK, there are several places where KeyPairs can be generated automatically rather than you having to pass them in. +For example, during `createDrop` and `addKeys`, if `publicKeys` isn't passed in, the SDK will generate `numKeys` number of keys automatically. +These generated keys can either be completely random or deterministically generated based off some entropy. If `rootEntropy` is provided, all the +keys that are auto-generated will be based off this entropy. + +#### Defined in + +[lib/types/general.ts:46](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L46) + +___ + +### secretKey + + `Optional` **secretKey**: `string` + +A valid private key associated with the funder's account. This can be function-call or full access (depending on what limitations and security measures are in place). + +#### Defined in + +[lib/types/general.ts:37](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L37) + +___ + +### seedPhrase + + `Optional` **seedPhrase**: `string` + +12 word seedphrase that can be used to derive the `secretKey`. If this is present, it will override the passed in `secretKey`. + +#### Defined in + +[lib/types/general.ts:39](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L39) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FungibleTokenMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FungibleTokenMetadata.md new file mode 100644 index 00000000..184f02f1 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/FungibleTokenMetadata.md @@ -0,0 +1,96 @@ +--- +id: "FungibleTokenMetadata" +title: "Interface: FungibleTokenMetadata" +sidebar_label: "FungibleTokenMetadata" +sidebar_position: 0 +custom_edit_url: null +--- + +General structure of Fungible Token Metadata as per official NEP-148 standard (https://github.com/near/NEPs/blob/master/neps/nep-0148.md). + +## Properties + +### decimals + + **decimals**: `number` + +Used in frontends to show the proper significant digits of a token. This concept is explained well in this OpenZeppelin post (https://docs.openzeppelin.com/contracts/3.x/erc20#a-note-on-decimals). + +#### Defined in + +[lib/types/ft.ts:36](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L36) + +___ + +### icon + + `Optional` **icon**: `string` + +A small image associated with this token. Must be a data URL, to help consumers display it quickly while protecting user data. +Recommendation: use optimized SVG, which can result in high-resolution images with only 100s of bytes of storage cost. +(Note that these storage costs are incurred to the token owner/deployer, but that querying these icons is a very cheap & cacheable read operation for all consumers of the contract and the RPC nodes that serve the data.) +Recommendation: create icons that will work well with both light-mode and dark-mode websites by either using middle-tone color schemes, or by embedding media queries in the SVG. + +#### Defined in + +[lib/types/ft.ts:43](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L43) + +___ + +### name + + **name**: `string` + +The human-readable name of the token. + +#### Defined in + +[lib/types/ft.ts:32](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L32) + +___ + +### reference + + `Optional` **reference**: `string` + +A link to a valid JSON file containing various keys offering supplementary details on the token. Example: /ipfs/QmdmQXB2mzChmMeKY47C43LxUdg1NDJ5MWcKMKxDu7RgQm, https://example.com/token.json, etc. If the information given in this document conflicts with the on-chain attributes, the values in reference shall be considered the source of truth. + +#### Defined in + +[lib/types/ft.ts:45](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L45) + +___ + +### reference\_hash + + `Optional` **reference\_hash**: `string` + +The base64-encoded sha256 hash of the JSON file contained in the reference field. This is to guard against off-chain tampering. + +#### Defined in + +[lib/types/ft.ts:47](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L47) + +___ + +### spec + + **spec**: `string` + +A string. Should be ft-1.0.0 to indicate that a Fungible Token contract adheres to the current versions of this Metadata and the Fungible Token Core specs. This will allow consumers of the Fungible Token to know if they support the features of a given contract. + +#### Defined in + +[lib/types/ft.ts:30](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L30) + +___ + +### symbol + + **symbol**: `string` + +The abbreviation, like wETH or AMPL. + +#### Defined in + +[lib/types/ft.ts:34](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/ft.ts#L34) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/GeneratedKeyPairs.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/GeneratedKeyPairs.md new file mode 100644 index 00000000..adb8ab92 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/GeneratedKeyPairs.md @@ -0,0 +1,46 @@ +--- +id: "GeneratedKeyPairs" +title: "Interface: GeneratedKeyPairs" +sidebar_label: "GeneratedKeyPairs" +sidebar_position: 0 +custom_edit_url: null +--- + +For each generated KeyPair (either through `createDrop`, `addKeys` or `generateKeys`), the public and private keys are returned. +In addition, the actual KeyPair objects are returned as well. + +## Properties + +### keyPairs + + **keyPairs**: `KeyPair`[] + +Actual KeyPair objects that can be used to sign messages, verify signatures, and get the public and private keys + +#### Defined in + +[lib/types/general.ts:20](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L20) + +___ + +### publicKeys + + **publicKeys**: `string`[] + +Set of public keys that were generated + +#### Defined in + +[lib/types/general.ts:22](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L22) + +___ + +### secretKeys + + **secretKeys**: `string`[] + +Set of private keys that were generated + +#### Defined in + +[lib/types/general.ts:24](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/general.ts#L24) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/KeyInfo.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/KeyInfo.md new file mode 100644 index 00000000..4f60ca08 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/KeyInfo.md @@ -0,0 +1,93 @@ +--- +id: "KeyInfo" +title: "Interface: KeyInfo" +sidebar_label: "KeyInfo" +sidebar_position: 0 +custom_edit_url: null +--- + +Important information returned in many view calls regarding a specific access key. + +## Properties + +### allowance + + **allowance**: `number` + +How much allowance does the key have left (measured in $yoctoNEAR). When the key is deleted, this is refunded to the funder's balance. + +#### Defined in + +[lib/types/drops.ts:25](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L25) + +___ + +### curKeyUse + + **curKeyUse**: `number` + +Which use is the key currently on? For single-use keys, this is always 1. + +#### Defined in + +[lib/types/drops.ts:16](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L16) + +___ + +### dropId + + **dropId**: `string` + +Drop ID for the specific drop that the key belongs to. + +#### Defined in + +[lib/types/drops.ts:11](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L11) + +___ + +### keyId + + **keyId**: `number` + +The unique ID associated to this key. IDs are *not* unique across drops but they are unique for any key in the drop. + +#### Defined in + +[lib/types/drops.ts:28](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L28) + +___ + +### lastUsed + + **lastUsed**: `number` + +At what timestamp was the key last used? Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:22](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L22) + +___ + +### publicKey + + **publicKey**: `string` + +Public key for this access key. + +#### Defined in + +[lib/types/drops.ts:13](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L13) + +___ + +### remainingUses + + **remainingUses**: `number` + +How many uses this key has left before it's deleted. + +#### Defined in + +[lib/types/drops.ts:19](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L19) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Method.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Method.md new file mode 100644 index 00000000..475cd370 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/Method.md @@ -0,0 +1,153 @@ +--- +id: "Method" +title: "Interface: Method" +sidebar_label: "Method" +sidebar_position: 0 +custom_edit_url: null +--- + +Outlines the information needed for any given method as part of a Function-Call drop. +Each individual key use can have an array of Methods that can be called. + +## Properties + +### accountIdField + + `Optional` **accountIdField**: `string` + +Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the function. +As an example, if the methodName was `nft_mint` and it expected a field `receiver_id` to be passed in, indicating who should receive the token, then the `accountIdField` would be `receiver_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/fc.ts:34](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L34) + +___ + +### args + + **args**: `string` + +What arguments should be passed to the method. This should be in stringified JSON. + +#### Defined in + +[lib/types/fc.ts:19](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L19) + +___ + +### attachedDeposit + + **attachedDeposit**: `string` + +How much yoctoNEAR should be attached to the call. + +#### Defined in + +[lib/types/fc.ts:23](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L23) + +___ + +### attachedGas + + `Optional` **attachedGas**: `string` + +How much gas to attach to this method call. If none, all the gas is split between the parallel method calls in a given claim. +If this is specified, the key can ONLY be used to call `claim` and no `deposit_per_use` can be specified. This leads the key to act like a method calling proxy instead of a linkdrop. + +#### Defined in + +[lib/types/fc.ts:28](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L28) + +___ + +### dropIdField + + `Optional` **dropIdField**: `string` + +Specifies what field Keypom should auto-inject the drops ID into when calling the function. +As an example, if an NFT contract expected the Keypom drop ID to be passed in as the field `keypom_drop_id` in order to gate access to who can mint NFTs, then the `dropIdField` would be `keypom_drop_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/fc.ts:40](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L40) + +___ + +### funderIdField + + `Optional` **funderIdField**: `string` + +Specifies what field Keypom should auto-inject the drop funder's account ID into when calling the function. +As an example, if an NFT contract wanted to gate only users that had a key coming from a specific funder's drops, it could expect a field called `keypom_funder_id` and the `funderIdField` would be `keypom_funder_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/fc.ts:52](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L52) + +___ + +### keyIdField + + `Optional` **keyIdField**: `string` + +Specifies what field Keypom should auto-inject the key's ID into when calling the function. +As an example, if an NFT contract wanted to gate only users with an odd key ID to be able to mint an NFT and their parameter was called `keypom_key_id`, then the `keyIdField` would be `keypom_key_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/fc.ts:46](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L46) + +___ + +### methodName + + **methodName**: `string` + +The method that should be invoked on the `receiverId`'s contract. + +#### Defined in + +[lib/types/fc.ts:15](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L15) + +___ + +### receiverId + + **receiverId**: `string` + +The account ID that the contract is deployed to that the method will be called on. + +#### Defined in + +[lib/types/fc.ts:11](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L11) + +___ + +### receiverToClaimer + + `Optional` **receiverToClaimer**: `boolean` + +If set to true, the claiming account ID will be the receiver ID of the method call. +This receiver must be a valid account and non-malicious (cannot be set to the keypom contract) + +#### Defined in + +[lib/types/fc.ts:57](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L57) + +___ + +### userArgsRule + + `Optional` **userArgsRule**: ``"AllUser"`` \| ``"FunderPreferred"`` \| ``"UserPreferred"`` + +What permissions does the user have when providing custom arguments to the function call? +By default, the user cannot provide any custom arguments + +#### Defined in + +[lib/types/fc.ts:62](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/fc.ts#L62) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NFTData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NFTData.md new file mode 100644 index 00000000..b16cde0b --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NFTData.md @@ -0,0 +1,47 @@ +--- +id: "NFTData" +title: "Interface: NFTData" +sidebar_label: "NFTData" +sidebar_position: 0 +custom_edit_url: null +--- + +General structure of a Non-Fungible Token drop. This should be passed into `createDrop` if you wish to have an NFT drop. + +## Properties + +### contractId + + **contractId**: `string` + +The account ID that the NFT contract is deployed to. This contract is where all the NFTs for the specific drop must come from. + +#### Defined in + +[lib/types/nft.ts:6](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L6) + +___ + +### senderId + + `Optional` **senderId**: `string` + +By default, anyone can fund your drop with NFTs. This field allows you to set a specific account ID that will be locked into sending the NFTs. + +#### Defined in + +[lib/types/nft.ts:8](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L8) + +___ + +### tokenIds + + `Optional` **tokenIds**: `string`[] + +If there are any token IDs that you wish to be automatically sent to the Keypom contract in order to register keys as part of `createDrop`, specify them here. +A maximum of 2 token IDs can be sent as part of the transaction. If you wish to register more keys by sending more NFTs, you must do this in a separate call by invoking +the `nftTransferCall` method separately. + +#### Defined in + +[lib/types/nft.ts:14](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L14) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NonFungibleTokenMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NonFungibleTokenMetadata.md new file mode 100644 index 00000000..1aff33fc --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/NonFungibleTokenMetadata.md @@ -0,0 +1,153 @@ +--- +id: "NonFungibleTokenMetadata" +title: "Interface: NonFungibleTokenMetadata" +sidebar_label: "NonFungibleTokenMetadata" +sidebar_position: 0 +custom_edit_url: null +--- + +General structure of Non-Fungible Token Metadata (in camelCase) as per official NEP-177 standard (https://github.com/near/NEPs/blob/master/neps/nep-0177.md). + +## Properties + +### copies + + `Optional` **copies**: `number` + +number of copies of this set of metadata in existence when token was minted. + +#### Defined in + +[lib/types/nft.ts:76](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L76) + +___ + +### description + + `Optional` **description**: `string` + +free-form description + +#### Defined in + +[lib/types/nft.ts:70](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L70) + +___ + +### expiresAt + + `Optional` **expiresAt**: `number` + +When token expires, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:80](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L80) + +___ + +### extra + + `Optional` **extra**: `string` + +anything extra the NFT wants to store on-chain. Can be stringified JSON. + +#### Defined in + +[lib/types/nft.ts:86](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L86) + +___ + +### issuedAt + + `Optional` **issuedAt**: `number` + +When token was issued or minted, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:78](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L78) + +___ + +### media + + `Optional` **media**: `string` + +URL to associated media, preferably to decentralized, content-addressed storage + +#### Defined in + +[lib/types/nft.ts:72](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L72) + +___ + +### mediaHash + + `Optional` **mediaHash**: `string` + +Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. + +#### Defined in + +[lib/types/nft.ts:74](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L74) + +___ + +### reference + + `Optional` **reference**: `string` + +URL to an off-chain JSON file with more info. + +#### Defined in + +[lib/types/nft.ts:88](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L88) + +___ + +### referenceHash + + `Optional` **referenceHash**: `string` + +Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. + +#### Defined in + +[lib/types/nft.ts:90](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L90) + +___ + +### startsAt + + `Optional` **startsAt**: `number` + +When token starts being valid, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:82](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L82) + +___ + +### title + + `Optional` **title**: `string` + +ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" + +#### Defined in + +[lib/types/nft.ts:68](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L68) + +___ + +### updatedAt + + `Optional` **updatedAt**: `number` + +When token was last updated, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:84](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L84) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PasswordPerUse.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PasswordPerUse.md new file mode 100644 index 00000000..4d76ef2f --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PasswordPerUse.md @@ -0,0 +1,33 @@ +--- +id: "PasswordPerUse" +title: "Interface: PasswordPerUse" +sidebar_label: "PasswordPerUse" +sidebar_position: 0 +custom_edit_url: null +--- + +Keeps track of the password for a given key use. This should be passed in as an array for each key that has passwords. + +## Properties + +### key\_use + + **key\_use**: `number` + +Which use does the password belong to? These uses are *NOT* zero-indexed so the first use corresponds to `1` not `0`. + +#### Defined in + +[lib/types/drops.ts:196](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L196) + +___ + +### pw + + **pw**: `string` + +The password for this given use + +#### Defined in + +[lib/types/drops.ts:194](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L194) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDrop.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDrop.md new file mode 100644 index 00000000..e1af40d1 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDrop.md @@ -0,0 +1,166 @@ +--- +id: "ProtocolReturnedDrop" +title: "Interface: ProtocolReturnedDrop" +sidebar_label: "ProtocolReturnedDrop" +sidebar_position: 0 +custom_edit_url: null +--- + +Drop information returned from the Protocol. This interface is exactly the same as the `Drop`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### config + + `Optional` **config**: [`ProtocolReturnedDropConfig`](ProtocolReturnedDropConfig.md) + +All drops regardless of their type can have a suite of configurations such as how many uses each key has or how often a key can be used. + +#### Defined in + +[lib/types/protocol.ts:49](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L49) + +___ + +### deposit\_per\_use + + **deposit\_per\_use**: `string` + +How much $yoctoNEAR will be transferred anytime a key is used that is part of this drop. + +#### Defined in + +[lib/types/protocol.ts:39](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L39) + +___ + +### drop\_id + + **drop\_id**: `string` + +Drop ID for this specific drop. + +#### Defined in + +[lib/types/protocol.ts:35](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L35) + +___ + +### fc + + `Optional` **fc**: [`ProtocolReturnedFCData`](ProtocolReturnedFCData.md) + +For Function-Call drops, important information needs to be stored such as which methods, the attached deposit, args etc. + +#### Defined in + +[lib/types/protocol.ts:47](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L47) + +___ + +### ft + + `Optional` **ft**: [`ProtocolReturnedFTData`](ProtocolReturnedFTData.md) + +For Fungible Token drops, important information such as the amount of tokens to transfer, or contract need to be stored. + +#### Defined in + +[lib/types/protocol.ts:45](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L45) + +___ + +### keys + + `Optional` **keys**: [`ProtocolReturnedKeyInfo`](ProtocolReturnedKeyInfo.md)[] + +If calling `getDrops` or `getDropInformation` and `withKeys` is passed in as true, an extra view call will be done to get a set of keys that are currently on the drop. + +#### Defined in + +[lib/types/protocol.ts:59](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L59) + +___ + +### metadata + + `Optional` **metadata**: `string` + +Any extra information about the drop can be stored as metadata. This is up to the drop creator and can be stringified JSON, or any other string. + +#### Defined in + +[lib/types/protocol.ts:51](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L51) + +___ + +### next\_key\_id + + **next\_key\_id**: `number` + +What is the next unique ID that will be given to the next access key added to this drop. + +#### Defined in + +[lib/types/protocol.ts:57](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L57) + +___ + +### nft + + `Optional` **nft**: [`ProtocolReturnedNFTData`](ProtocolReturnedNFTData.md) + +For NFT drops, important information such as the token IDs, or contract need to be stored. + +#### Defined in + +[lib/types/protocol.ts:43](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L43) + +___ + +### owner\_id + + **owner\_id**: `string` + +Which account created this drop. + +#### Defined in + +[lib/types/protocol.ts:37](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L37) + +___ + +### registered\_uses + + **registered\_uses**: `number` + +How many key uses are registered for this drop? This is only applicable to simple drops with lazy registrations, FT drops, and NFT drops. + +#### Defined in + +[lib/types/protocol.ts:53](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L53) + +___ + +### required\_gas + + **required\_gas**: `string` + +In order to use an access key that's part of this drop, how much Gas *needs* to be attached to the call? + +#### Defined in + +[lib/types/protocol.ts:55](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L55) + +___ + +### simple + + `Optional` **simple**: [`ProtocolReturnedSimpleData`](ProtocolReturnedSimpleData.md) + +For simple drops, there are specific, optional configurations. + +#### Defined in + +[lib/types/protocol.ts:41](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L41) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDropConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDropConfig.md new file mode 100644 index 00000000..aa4df5c3 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedDropConfig.md @@ -0,0 +1,70 @@ +--- +id: "ProtocolReturnedDropConfig" +title: "Interface: ProtocolReturnedDropConfig" +sidebar_label: "ProtocolReturnedDropConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Drop config returned from the Protocol. This interface is exactly the same as the `DropConfig`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### root\_account\_id + + `Optional` **root\_account\_id**: `string` + +Override the global root account that all created sub-accounts will have (currently `near` or `testnet`). This allows users to drops that have a custom root. +For example, Fayyr could specify a root of `fayyr.near` By which all sub-accounts will then be `ACCOUNT.fayyr.near`. +It's important to note that this root account *MUST* have a smart contract deployed that has a method `create_account`. + +#### Defined in + +[lib/types/protocol.ts:83](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L83) + +___ + +### sale + + `Optional` **sale**: [`ProtocolReturnedPublicSaleConfig`](ProtocolReturnedPublicSaleConfig.md) + +#### Defined in + +[lib/types/protocol.ts:76](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L76) + +___ + +### time + + `Optional` **time**: [`ProtocolReturnedTimeConfig`](ProtocolReturnedTimeConfig.md) + +Any information related to time-based configurations such as a starting date for keys etc. + +#### Defined in + +[lib/types/protocol.ts:71](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L71) + +___ + +### usage + + `Optional` **usage**: [`ProtocolReturnedUsageConfig`](ProtocolReturnedUsageConfig.md) + +Any information related to how access keys are used such as which methods they can call or whether an empty drop should be automatically deleted etc. + +#### Defined in + +[lib/types/protocol.ts:74](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L74) + +___ + +### uses\_per\_key + + `Optional` **uses\_per\_key**: `number` + +How many uses can each key have before it's deleted. If this isn't specified, it defaults to 1 use per key. + +#### Defined in + +[lib/types/protocol.ts:68](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L68) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFCData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFCData.md new file mode 100644 index 00000000..34d8c655 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFCData.md @@ -0,0 +1,23 @@ +--- +id: "ProtocolReturnedFCData" +title: "Interface: ProtocolReturnedFCData" +sidebar_label: "ProtocolReturnedFCData" +sidebar_position: 0 +custom_edit_url: null +--- + +FC Data returned from the Protocol. This interface is exactly the same as the `FCData`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### methods + + **methods**: [`ProtocolReturnedMethod`](ProtocolReturnedMethod.md)[][] + +The top level array indicates a different set of methods that can be called for every key use. It is possible that for a given key use, no methods are called thus acting as a "free" key use whereby the use is reflected on-chain but no assets are transferred. +If a given key use does not have an undefined set of methods, when it is used, all the methods in the set will be called. + +#### Defined in + +[lib/types/protocol.ts:300](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L300) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFTData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFTData.md new file mode 100644 index 00000000..be0e8340 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedFTData.md @@ -0,0 +1,47 @@ +--- +id: "ProtocolReturnedFTData" +title: "Interface: ProtocolReturnedFTData" +sidebar_label: "ProtocolReturnedFTData" +sidebar_position: 0 +custom_edit_url: null +--- + +FT Data returned from the Protocol. This interface is exactly the same as the `FTData`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### balance\_per\_use + + `Optional` **balance\_per\_use**: `string` + +Amount of tokens to transfer but considering the decimal amount. +Example: transferring one wNEAR should be passed in as "1000000000000000000000000" and NOT "1" + +#### Defined in + +[lib/types/protocol.ts:226](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L226) + +___ + +### contract\_id + + **contract\_id**: `string` + +Which contract do the FTs belong to? + +#### Defined in + +[lib/types/protocol.ts:217](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L217) + +___ + +### sender\_id + + `Optional` **sender\_id**: `string` + +By default, anyone can fund your drop with FTs. This field allows you to set a specific account ID that will be locked into sending the FTs. + +#### Defined in + +[lib/types/protocol.ts:221](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L221) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedKeyInfo.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedKeyInfo.md new file mode 100644 index 00000000..fc5551be --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedKeyInfo.md @@ -0,0 +1,94 @@ +--- +id: "ProtocolReturnedKeyInfo" +title: "Interface: ProtocolReturnedKeyInfo" +sidebar_label: "ProtocolReturnedKeyInfo" +sidebar_position: 0 +custom_edit_url: null +--- + +Key information returned from the Protocol. This interface is exactly the same as the `KeyInfo`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### allowance + + **allowance**: `number` + +How much allowance does the key have left (measured in $yoctoNEAR). When the key is deleted, this is refunded to the funder's balance. + +#### Defined in + +[lib/types/protocol.ts:23](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L23) + +___ + +### cur\_key\_use + + **cur\_key\_use**: `number` + +Which use is the key currently on? For single-use keys, this is always 1. + +#### Defined in + +[lib/types/protocol.ts:14](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L14) + +___ + +### drop\_id + + **drop\_id**: `string` + +Drop ID for the specific drop that the key belongs to. + +#### Defined in + +[lib/types/protocol.ts:9](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L9) + +___ + +### key\_id + + **key\_id**: `number` + +The unique ID associated to this key. IDs are *not* unique across drops but they are unique for any key in the drop. + +#### Defined in + +[lib/types/protocol.ts:26](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L26) + +___ + +### last\_used + + **last\_used**: `number` + +At what timestamp was the key last used? Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:20](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L20) + +___ + +### public\_key + + **public\_key**: `string` + +Public key for this access key. + +#### Defined in + +[lib/types/protocol.ts:11](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L11) + +___ + +### remaining\_uses + + **remaining\_uses**: `number` + +How many uses this key has left before it's deleted. + +#### Defined in + +[lib/types/protocol.ts:17](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L17) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedMethod.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedMethod.md new file mode 100644 index 00000000..0746a1e0 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedMethod.md @@ -0,0 +1,153 @@ +--- +id: "ProtocolReturnedMethod" +title: "Interface: ProtocolReturnedMethod" +sidebar_label: "ProtocolReturnedMethod" +sidebar_position: 0 +custom_edit_url: null +--- + +Method information returned from the Protocol. This interface is exactly the same as the `Method`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### account\_id\_field + + `Optional` **account\_id\_field**: `string` + +Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the function. +As an example, if the methodName was `nft_mint` and it expected a field `receiver_id` to be passed in, indicating who should receive the token, then the `accountIdField` would be `receiver_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/protocol.ts:260](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L260) + +___ + +### args + + **args**: `string` + +What arguments should be passed to the method. This should be in stringified JSON. + +#### Defined in + +[lib/types/protocol.ts:245](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L245) + +___ + +### attached\_deposit + + **attached\_deposit**: `string` + +How much yoctoNEAR should be attached to the call. + +#### Defined in + +[lib/types/protocol.ts:249](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L249) + +___ + +### attached\_gas + + `Optional` **attached\_gas**: `string` + +How much gas to attach to this method call. If none, all the gas is split between the parallel method calls in a given claim. +If this is specified, the key can ONLY be used to call `claim` and no `deposit_per_use` can be specified. This leads the key to act like a method calling proxy instead of a linkdrop. + +#### Defined in + +[lib/types/protocol.ts:254](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L254) + +___ + +### drop\_id\_field + + `Optional` **drop\_id\_field**: `string` + +Specifies what field Keypom should auto-inject the drops ID into when calling the function. +As an example, if an NFT contract expected the Keypom drop ID to be passed in as the field `keypom_drop_id` in order to gate access to who can mint NFTs, then the `dropIdField` would be `keypom_drop_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/protocol.ts:266](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L266) + +___ + +### funder\_id\_field + + `Optional` **funder\_id\_field**: `string` + +Specifies what field Keypom should auto-inject the funder's account ID into when calling the function. +As an example, if an NFT contract wanted to gate only users with an odd key ID to be able to mint an NFT and their parameter was called `keypom_key_id`, then the `keyIdField` would be `keypom_key_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/protocol.ts:278](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L278) + +___ + +### key\_id\_field + + `Optional` **key\_id\_field**: `string` + +Specifies what field Keypom should auto-inject the key's ID into when calling the function. +As an example, if an NFT contract wanted to gate only users with an odd key ID to be able to mint an NFT and their parameter was called `keypom_key_id`, then the `keyIdField` would be `keypom_key_id`. +To insert into nested objects, use periods to separate. For example, to insert into args.metadata.field, you would specify "metadata.field" + +#### Defined in + +[lib/types/protocol.ts:272](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L272) + +___ + +### method\_name + + **method\_name**: `string` + +The method that should be invoked on the `receiverId`'s contract. + +#### Defined in + +[lib/types/protocol.ts:241](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L241) + +___ + +### receiver\_id + + **receiver\_id**: `string` + +The account ID that the contract is deployed to that the method will be called on. + +#### Defined in + +[lib/types/protocol.ts:237](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L237) + +___ + +### receiver\_to\_claimer + + `Optional` **receiver\_to\_claimer**: `boolean` + +If set to true, the claiming account ID will be the receiver ID of the method call. +This receiver must be a valid account and non-malicious (cannot be set to the keypom contract) + +#### Defined in + +[lib/types/protocol.ts:283](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L283) + +___ + +### user\_args\_rule + + `Optional` **user\_args\_rule**: ``"AllUser"`` \| ``"FunderPreferred"`` \| ``"UserPreferred"`` + +What permissions does the user have when providing custom arguments to the function call? +By default, the user cannot provide any custom arguments + +#### Defined in + +[lib/types/protocol.ts:288](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L288) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNFTData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNFTData.md new file mode 100644 index 00000000..1f809b8b --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNFTData.md @@ -0,0 +1,34 @@ +--- +id: "ProtocolReturnedNFTData" +title: "Interface: ProtocolReturnedNFTData" +sidebar_label: "ProtocolReturnedNFTData" +sidebar_position: 0 +custom_edit_url: null +--- + +NFT Data information returned from the Protocol. This interface is exactly the same as the `NFTData`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### contract\_id + + **contract\_id**: `string` + +The account ID that the NFT contract is deployed to. This contract is where all the NFTs for the specific drop must come from. + +#### Defined in + +[lib/types/protocol.ts:204](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L204) + +___ + +### sender\_id + + `Optional` **sender\_id**: `string` + +By default, anyone can fund your drop with NFTs. This field allows you to set a specific account ID that will be locked into sending the NFTs. + +#### Defined in + +[lib/types/protocol.ts:206](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L206) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md new file mode 100644 index 00000000..1460ffac --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenMetadata.md @@ -0,0 +1,153 @@ +--- +id: "ProtocolReturnedNonFungibleTokenMetadata" +title: "Interface: ProtocolReturnedNonFungibleTokenMetadata" +sidebar_label: "ProtocolReturnedNonFungibleTokenMetadata" +sidebar_position: 0 +custom_edit_url: null +--- + +General structure of Non-Fungible Token Metadata as per official NEP-177 standard (https://github.com/near/NEPs/blob/master/neps/nep-0177.md). + +## Properties + +### copies + + `Optional` **copies**: `number` + +number of copies of this set of metadata in existence when token was minted. + +#### Defined in + +[lib/types/nft.ts:46](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L46) + +___ + +### description + + `Optional` **description**: `string` + +free-form description + +#### Defined in + +[lib/types/nft.ts:40](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L40) + +___ + +### expires\_at + + `Optional` **expires\_at**: `number` + +When token expires, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:50](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L50) + +___ + +### extra + + `Optional` **extra**: `string` + +anything extra the NFT wants to store on-chain. Can be stringified JSON. + +#### Defined in + +[lib/types/nft.ts:56](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L56) + +___ + +### issued\_at + + `Optional` **issued\_at**: `number` + +When token was issued or minted, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:48](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L48) + +___ + +### media + + `Optional` **media**: `string` + +URL to associated media, preferably to decentralized, content-addressed storage + +#### Defined in + +[lib/types/nft.ts:42](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L42) + +___ + +### media\_hash + + `Optional` **media\_hash**: `string` + +Base64-encoded sha256 hash of content referenced by the `media` field. Required if `media` is included. + +#### Defined in + +[lib/types/nft.ts:44](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L44) + +___ + +### reference + + `Optional` **reference**: `string` + +URL to an off-chain JSON file with more info. + +#### Defined in + +[lib/types/nft.ts:58](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L58) + +___ + +### reference\_hash + + `Optional` **reference\_hash**: `string` + +Base64-encoded sha256 hash of JSON from reference field. Required if `reference` is included. + +#### Defined in + +[lib/types/nft.ts:60](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L60) + +___ + +### starts\_at + + `Optional` **starts\_at**: `number` + +When token starts being valid, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:52](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L52) + +___ + +### title + + `Optional` **title**: `string` + +ex. "Arch Nemesis: Mail Carrier" or "Parcel #5055" + +#### Defined in + +[lib/types/nft.ts:38](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L38) + +___ + +### updated\_at + + `Optional` **updated\_at**: `number` + +When token was last updated, Unix epoch in milliseconds + +#### Defined in + +[lib/types/nft.ts:54](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L54) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenObject.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenObject.md new file mode 100644 index 00000000..6170554a --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedNonFungibleTokenObject.md @@ -0,0 +1,69 @@ +--- +id: "ProtocolReturnedNonFungibleTokenObject" +title: "Interface: ProtocolReturnedNonFungibleTokenObject" +sidebar_label: "ProtocolReturnedNonFungibleTokenObject" +sidebar_position: 0 +custom_edit_url: null +--- + +General structure of a Non-Fungible Token object as per official NEP-171 standard (https://github.com/near/NEPs/blob/master/neps/nep-0171.md). + +## Properties + +### approved\_account\_ids + + `Optional` **approved\_account\_ids**: `Map`<`string`, `number`\> + +Map of account IDs to approval IDs as per official NEP-178 standard (https://github.com/near/NEPs/blob/master/neps/nep-0178.md). + +#### Defined in + +[lib/types/nft.ts:28](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L28) + +___ + +### metadata + + `Optional` **metadata**: [`ProtocolReturnedNonFungibleTokenMetadata`](ProtocolReturnedNonFungibleTokenMetadata.md) + +Metadata for the token + +#### Defined in + +[lib/types/nft.ts:26](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L26) + +___ + +### owner\_id + + **owner\_id**: `string` + +Account ID of the owner + +#### Defined in + +[lib/types/nft.ts:24](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L24) + +___ + +### royalty + + `Optional` **royalty**: `Map`<`string`, `number`\> + +A mapping of NEAR accounts to the amount each should be paid out as per official NEP-199 standard (https://github.com/near/NEPs/blob/master/neps/nep-0199.md). + +#### Defined in + +[lib/types/nft.ts:30](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L30) + +___ + +### token\_id + + **token\_id**: `string` + +String ID for the token + +#### Defined in + +[lib/types/nft.ts:22](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/nft.ts#L22) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedPublicSaleConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedPublicSaleConfig.md new file mode 100644 index 00000000..936dcc77 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedPublicSaleConfig.md @@ -0,0 +1,97 @@ +--- +id: "ProtocolReturnedPublicSaleConfig" +title: "Interface: ProtocolReturnedPublicSaleConfig" +sidebar_label: "ProtocolReturnedPublicSaleConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Within the config, there are configurable options related to how keys can be sold and a funder can potentially make a profit. + +## Properties + +### allowlist + + `Optional` **allowlist**: `string`[] + +Which accounts are allowed to add keys? If the allowlist is empty, anyone that is not in the blocklist can add keys. + +#### Defined in + +[lib/types/protocol.ts:173](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L173) + +___ + +### auto\_withdraw\_funds + + `Optional` **auto\_withdraw\_funds**: `boolean` + +Should the revenue generated be sent to the funder's account balance or +automatically withdrawn and sent to their NEAR wallet? + +#### Defined in + +[lib/types/protocol.ts:180](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L180) + +___ + +### blocklist + + `Optional` **blocklist**: `string`[] + +Which accounts are NOT allowed to add keys? + +#### Defined in + +[lib/types/protocol.ts:175](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L175) + +___ + +### end + + `Optional` **end**: `number` + +Block timestamp dictating the end of the public sale. If None, keys can be added indefinitely +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:190](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L190) + +___ + +### max\_num\_keys + + `Optional` **max\_num\_keys**: `number` + +Maximum number of keys that can be added to this drop. If None, there is no max. + +#### Defined in + +[lib/types/protocol.ts:166](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L166) + +___ + +### price\_per\_key + + `Optional` **price\_per\_key**: `string` + +Amount of $NEAR that the user needs to attach (if they are not the funder) on top of costs. This amount will be +Automatically sent to the funder's balance. If None, the keys are free to the public. + +#### Defined in + +[lib/types/protocol.ts:171](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L171) + +___ + +### start + + `Optional` **start**: `number` + +Minimum block timestamp before the public sale starts. If None, keys can be added immediately +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:185](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L185) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedSimpleData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedSimpleData.md new file mode 100644 index 00000000..9b62136b --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedSimpleData.md @@ -0,0 +1,17 @@ +--- +id: "ProtocolReturnedSimpleData" +title: "Interface: ProtocolReturnedSimpleData" +sidebar_label: "ProtocolReturnedSimpleData" +sidebar_position: 0 +custom_edit_url: null +--- + +## Properties + +### lazy\_register + + `Optional` **lazy\_register**: `boolean` + +#### Defined in + +[lib/types/protocol.ts:195](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L195) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedTimeConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedTimeConfig.md new file mode 100644 index 00000000..0d0eeb09 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedTimeConfig.md @@ -0,0 +1,63 @@ +--- +id: "ProtocolReturnedTimeConfig" +title: "Interface: ProtocolReturnedTimeConfig" +sidebar_label: "ProtocolReturnedTimeConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Time Config information returned from the Protocol. This interface is exactly the same as the `TimeConfig`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### end + + `Optional` **end**: `number` + +Block timestamp that keys must be used before. If this isn't specified, keys can be used indefinitely. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:101](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L101) + +___ + +### interval + + `Optional` **interval**: `number` + +Interval of time after the `start_timestamp` that must pass before a key can be used. If multiple intervals pass, the key can be used multiple times. +This has nothing to do With the throttle timestamp. It only pertains to the start timestamp and the current timestamp. The last_used timestamp is not taken into account. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:114](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L114) + +___ + +### start + + `Optional` **start**: `number` + +Minimum block timestamp before keys can be used. If this isn't specified, keys can be used immediately. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:95](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L95) + +___ + +### throttle + + `Optional` **throttle**: `number` + +Amount of time that *must* pass in between each key use. If this isn't specified, there is no delay between key uses. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/protocol.ts:107](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L107) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedUsageConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedUsageConfig.md new file mode 100644 index 00000000..5fc090bd --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/ProtocolReturnedUsageConfig.md @@ -0,0 +1,80 @@ +--- +id: "ProtocolReturnedUsageConfig" +title: "Interface: ProtocolReturnedUsageConfig" +sidebar_label: "ProtocolReturnedUsageConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Usage Config information returned from the Protocol. This interface is exactly the same as the `UsageConfig`, except all the fields are +snake cased instead of camel cased due to what the Protocol returns. + +## Properties + +### account\_creation\_fields + + `Optional` **account\_creation\_fields**: `Object` + +When calling `create_account` on the root account, which keypom args should be attached to the payload. + +#### Type declaration + +| Name | Type | Description | +| :------ | :------ | :------ | +| `account_id_field?` | `string` | Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the `create_account` function. | +| `drop_id_field?` | `string` | Specifies what field Keypom should auto-inject the drop's ID into when calling the `create_account` function. | +| `funder_id_field?` | `string` | Specifies what field Keypom should auto-inject the drop funder's account ID into when calling the `create_account` function. | +| `key_id_field?` | `string` | Specifies what field Keypom should auto-inject the key's ID into when calling the `create_account` function. | + +#### Defined in + +[lib/types/protocol.ts:141](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L141) + +___ + +### auto\_delete\_drop + + `Optional` **auto\_delete\_drop**: `boolean` + +When a key is used and deleted, if it results in the drop being empty, should the drop automatically be deleted? If this isn't specified, it defaults to false. + +#### Defined in + +[lib/types/protocol.ts:134](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L134) + +___ + +### auto\_withdraw + + `Optional` **auto\_withdraw**: `boolean` + +In the case where `autoDeleteDrop` is set to true and the drop is the owner's last, should their balance be automatically withdrawn? If this isn't specified, it defaults to false. + +#### Defined in + +[lib/types/protocol.ts:138](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L138) + +___ + +### permissions + + `Optional` **permissions**: `string` + +Specify which methods can be called by the access key (either `claim` or `create_account_and_claim`). If this isn't specified, both methods can be called. + +#### Defined in + +[lib/types/protocol.ts:125](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L125) + +___ + +### refund\_deposit + + `Optional` **refund\_deposit**: `boolean` + +If the method `claim` is called rather than `create_account_and_claim`, should the `deposit_per_use` be refunded to the owner's balance? +If this isn't specified, it defaults to false. + +#### Defined in + +[lib/types/protocol.ts:130](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/protocol.ts#L130) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PublicSaleConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PublicSaleConfig.md new file mode 100644 index 00000000..2f2fe27f --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/PublicSaleConfig.md @@ -0,0 +1,107 @@ +--- +id: "PublicSaleConfig" +title: "Interface: PublicSaleConfig" +sidebar_label: "PublicSaleConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Within the config, there are configurable options related to how keys can be sold and a funder can potentially make a profit. + +## Properties + +### allowlist + + `Optional` **allowlist**: `string`[] + +Which accounts are allowed to add keys? If the allowlist is empty, anyone that is not in the blocklist can add keys. + +#### Defined in + +[lib/types/drops.ts:169](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L169) + +___ + +### autoWithdrawFunds + + `Optional` **autoWithdrawFunds**: `boolean` + +Should the revenue generated be sent to the funder's account balance or +automatically withdrawn and sent to their NEAR wallet? + +#### Defined in + +[lib/types/drops.ts:176](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L176) + +___ + +### blocklist + + `Optional` **blocklist**: `string`[] + +Which accounts are NOT allowed to add keys? + +#### Defined in + +[lib/types/drops.ts:171](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L171) + +___ + +### end + + `Optional` **end**: `number` + +Block timestamp dictating the end of the public sale. If None, keys can be added indefinitely +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:186](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L186) + +___ + +### maxNumKeys + + `Optional` **maxNumKeys**: `number` + +Maximum number of keys that can be added to this drop. If None, there is no max. + +#### Defined in + +[lib/types/drops.ts:161](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L161) + +___ + +### pricePerKeyNEAR + + `Optional` **pricePerKeyNEAR**: `number` + +Amount of $NEAR that the user needs to attach (if they are not the funder) on top of costs. This amount will be +Automatically sent to the funder's balance. If None, the keys are free to the public. + +#### Defined in + +[lib/types/drops.ts:166](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L166) + +___ + +### pricePerKeyYocto + + `Optional` **pricePerKeyYocto**: `string` + +#### Defined in + +[lib/types/drops.ts:167](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L167) + +___ + +### start + + `Optional` **start**: `number` + +Minimum block timestamp before the public sale starts. If None, keys can be added immediately +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:181](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L181) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/SimpleData.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/SimpleData.md new file mode 100644 index 00000000..ea3cb6fb --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/SimpleData.md @@ -0,0 +1,21 @@ +--- +id: "SimpleData" +title: "Interface: SimpleData" +sidebar_label: "SimpleData" +sidebar_position: 0 +custom_edit_url: null +--- + +Specific configurable information for Simple drops. + +## Properties + +### lazyRegister + + `Optional` **lazyRegister**: `boolean` + +If this is set to true, keys can be created and registered AFTER they've been created (for simple and FC drops only). + +#### Defined in + +[lib/types/simple.ts:6](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/simple.ts#L6) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/TimeConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/TimeConfig.md new file mode 100644 index 00000000..ac76a265 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/TimeConfig.md @@ -0,0 +1,62 @@ +--- +id: "TimeConfig" +title: "Interface: TimeConfig" +sidebar_label: "TimeConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Within the config, there are configurable options related to timing such as how often a key can be used. + +## Properties + +### end + + `Optional` **end**: `number` + +Block timestamp that keys must be used before. If this isn't specified, keys can be used indefinitely. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:98](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L98) + +___ + +### interval + + `Optional` **interval**: `number` + +Interval of time after the `start_timestamp` that must pass before a key can be used. If multiple intervals pass, the key can be used multiple times. +This has nothing to do With the throttle timestamp. It only pertains to the start timestamp and the current timestamp. The last_used timestamp is not taken into account. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:111](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L111) + +___ + +### start + + `Optional` **start**: `number` + +Minimum block timestamp before keys can be used. If this isn't specified, keys can be used immediately. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:92](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L92) + +___ + +### throttle + + `Optional` **throttle**: `number` + +Amount of time that *must* pass in between each key use. If this isn't specified, there is no delay between key uses. +Measured in number of non-leap-nanoseconds since January 1, 1970 0:00:00 UTC. + +#### Defined in + +[lib/types/drops.ts:104](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L104) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/UsageConfig.md b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/UsageConfig.md new file mode 100644 index 00000000..e86b592d --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/UsageConfig.md @@ -0,0 +1,79 @@ +--- +id: "UsageConfig" +title: "Interface: UsageConfig" +sidebar_label: "UsageConfig" +sidebar_position: 0 +custom_edit_url: null +--- + +Within the config, there are configurable options related to how keys can be used. What permissions they have, whether an empty drop should be automatically deleted etc. + +## Properties + +### accountCreationFields + + `Optional` **accountCreationFields**: `Object` + +When calling `create_account` on the root account, which keypom args should be attached to the payload. + +#### Type declaration + +| Name | Type | Description | +| :------ | :------ | :------ | +| `accountIdField?` | `string` | Specifies what field Keypom should auto-inject the account that claimed the drop's ID into when calling the `create_account` function. | +| `dropIdField?` | `string` | Specifies what field Keypom should auto-inject the drop's ID into when calling the `create_account` function. | +| `funderIdField?` | `string` | Specifies what field Keypom should auto-inject the drop funder's account ID into when calling the `create_account` function. | +| `keyIdField?` | `string` | Specifies what field Keypom should auto-inject the key's ID into when calling the `create_account` function. | + +#### Defined in + +[lib/types/drops.ts:136](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L136) + +___ + +### autoDeleteDrop + + `Optional` **autoDeleteDrop**: `boolean` + +When a key is used and deleted, if it results in the drop being empty, should the drop automatically be deleted? If this isn't specified, it defaults to false. + +#### Defined in + +[lib/types/drops.ts:130](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L130) + +___ + +### autoWithdraw + + `Optional` **autoWithdraw**: `boolean` + +When the last key in this drop is used, in the case where `autoDeleteDrop` is set to true and the drop is the owner's last, should their balance be automatically withdrawn? If this isn't specified, it defaults to false. + +#### Defined in + +[lib/types/drops.ts:134](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L134) + +___ + +### permissions + + `Optional` **permissions**: `string` + +Specify which methods can be called by the access key (either `claim` or `create_account_and_claim`). If this isn't specified, both methods can be called. + +#### Defined in + +[lib/types/drops.ts:121](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L121) + +___ + +### refundDeposit + + `Optional` **refundDeposit**: `boolean` + +If the method `claim` is called rather than `create_account_and_claim`, should the `deposit_per_use` be refunded to the owner's balance? +If this isn't specified, it defaults to false. + +#### Defined in + +[lib/types/drops.ts:126](https://github.com/keypom/keypom-js/blob/68bf90396/packages/core/src/lib/types/drops.ts#L126) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/_category_.yml b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/_category_.yml new file mode 100644 index 00000000..43bec88c --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/interfaces/_category_.yml @@ -0,0 +1,2 @@ +label: "Interfaces" +position: 4 \ No newline at end of file diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/modules.md b/versioned_docs/version-2.0/keypom-sdk/Selector/modules.md new file mode 100644 index 00000000..2dd4129f --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/modules.md @@ -0,0 +1,31 @@ +--- +id: "modules" +title: "@keypom/selector - v1.2.0" +sidebar_label: "Exports" +sidebar_position: 0.5 +custom_edit_url: null +--- + +## Classes + +- [KeypomWallet](classes/KeypomWallet.md) + +## Functions + +### setupKeypom + +**setupKeypom**(`Β«destructuredΒ»`): `WalletModuleFactory`<`KeypomWalletInstant`\> + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `Β«destructuredΒ»` | `KeypomParams` | + +#### Returns + +`WalletModuleFactory`<`KeypomWalletInstant`\> + +#### Defined in + +[core/setup.ts:92](https://github.com/keypom/keypom-js/blob/9a866ee41/packages/selector/src/core/setup.ts#L92) diff --git a/versioned_docs/version-2.0/keypom-sdk/Selector/welcome.md b/versioned_docs/version-2.0/keypom-sdk/Selector/welcome.md new file mode 100644 index 00000000..27dff653 --- /dev/null +++ b/versioned_docs/version-2.0/keypom-sdk/Selector/welcome.md @@ -0,0 +1,407 @@ +--- +id: "welcome" +title: "@keypom/selector - v1.2.0" +sidebar_label: "Readme" +sidebar_position: 0 +custom_edit_url: null +--- + +

+ + + + +

Keypom Wallet Selector

+ +

+ +

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

+ +The Keypom Wallet Selector is a package that allows apps to be fully compatible with both trial accounts and instant sign in experiences. See the following demos for examples of the user experience. +- Instant Sign-In [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw&feature=youtu.be) +- Trial Account [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw) + +# Table of Contents +- [Table of Contents](#table-of-contents) +- [Installation](#installation) +- [Getting Started](#getting-started) + - [Setup Keypom Parameters](#setup-keypom-parameters) + - [IPFS Customizations](#ipfs-customizations) +- [Keypom Trial Accounts](#keypom-trial-accounts) + - [Trial Account Specs](#trial-account-specs) + - [Modal Options](#modal-options) + - [Wallets](#wallets) + - [Theme And CSS](#theme-and-css) + - [Modal Text](#modal-text) + - [Example Trial Account Integration](#example-trial-account-integration) +- [Keypom Instant Sign In Experiences](#keypom-instant-sign-in-experiences) + - [Instant Sign In Specs](#instant-sign-in-specs) +- [Contributing](#contributing) +- [License](#license) + +--- + +# Installation + +To install the Keypom Wallet Selector, run the following command: + +```bash +npm install @keypom/selector +# or +yarn add @keypom/selector +# or +pnpm add @keypom/selector +``` + +# Getting Started + +Most apps on NEAR should be compatible with the official [wallet selector](https://github.com/near/wallet-selector) to enable sign-in and sending transactions. For this reason, the Keypom selector has been made to fully support any app that uses the wallet selector. + +To get started, navigate to the app's `setupWalletSelector` code where the selector is initialized. Here, you can specify which wallet modules your app should support. Simply add Keypom's `setupKeypom` function to the list of modules and you're good to go! + +```js +const selector = await setupWalletSelector({ + network: "testnet", + modules: [ + setupMyNearWallet(), + ... + setupSender(), + setupKeypom(PARAMS) + ], +}); +``` + +## Setup Keypom Parameters + +`setupKeypom` is the core of the Keypom wallet selector and is the only function you should know about. There are a ton of customizable features that you can make use of to tailor the user experience to your app's needs. At its core, the setup function takes the following parameters: + +- `networkId`: Either `testnet` or `mainnet`. +- `signInContractId`: Which contract will be used to sign in users. +- `trialAccountSpecs`: If specified, trial accounts will be supported on the app. These specifications outline two aspects: + 1. How the URL should be constructed for the app to trigger the trial account sign in flow. + 2. Customizable options for the trial account modals including *all* the text such as titles, descriptions, buttons, placeholders etc. In addition, you can specify exactly which off-boarding wallets you'd like to support. +- `instantSignInSpecs`: If specified, trial accounts will be supported on the app. The instant sign in specs dictate how the URL should be constructed for the app to trigger the instant sign in flow. + +### IPFS Customizations + +For apps that wish to customize the Keypom parameters on a per page basis or even a per user basis, they can make use of IPFS CIDs. By adding a `?cid=` parameter to the URL, Keypom will fetch the parameters from the specified CID. The contents on IPFS must be JSON that match the Keypom parameters: + +```json +{ + "networkId": "testnet", // Or "mainnet", + "signInContractId": CONTRACT_ID, + "trialAccountSpecs": { + "url": "vandeley_industries.com/trial-sign-in/ACCOUNT_ID#SECRET_KEY", + "modalOptions": KEYPOM_OPTIONS + }, + "instantSignInSpecs": { + "url": "vandeley_industries.com/instant-sign-in/ACCOUNT_ID#SECRET_KEY" + } +} +``` + +An example CID can be found below: +``` +bafkreidneri4ffymscahjprlapg4j62yleli73ncwdmopnkxpgczpusqn4 +``` + +# Keypom Trial Accounts + +Keypom Trial Accounts are an exciting new opportunity for Web3 apps to seamlessly onboard users whether they’re completely new to crypto or seasoned veterans. With the click of a link, users require no software, wallet setup, wallet connection, and are *instantly signed into apps* with their trial account, ready to make on-chain transactions. Unlike most other onboarding mechanisms, the entire experience can be embedded *directly in the app* to increase user retention and is entirely on-chain. + +This technology is perfect for dApps of all sizes ranging from small indie to large enterprise applications. + +- Trial Account [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw) + +In order to support trial accounts, your app must have the `setupKeypom` function embedded within the wallet selector with the `trialAccountSpecs` parameter specified. + +## Trial Account Specs + +The trial account specifications allows the Keypom wallet selector to support trial accounts on your app. In order to trigger the sign in flow, the user must be on the correct URL. This URL is specified in the specifications as a string and should look like this: + +```js +https://near.org/#trial-url/ACCOUNT_ID/SECRET_KEY +``` + +The URL *must* have the `ACCOUNT_ID` and `SECRET_KEY` placeholders. + +As an example, if you wanted your trial users to sign in once they reached `https://near.org/#trial-url/`, and you wanted the account and secret key to be separated using `/`, your specs should look like this: + +```js +trialAccountSpecs: { + url: "https://near.org/#trial-url/ACCOUNT_ID/SECRET_KEY", +} +``` + +Alternatively, you could swap the `/` delimiter with a `#` instead: + +```js +trialAccountSpecs: { + url: "https://near.org/#trial-url/ACCOUNT_ID#SECRET_KEY", +} +``` + +> **NOTE:** The account ID must come first and the secret key must follow the delimiter. For unclaimed trial account linkdrops, the account ID will be the Keypom contract. For claimed trial account linkdrops, the account ID will be the account ID chosen by the user. + +## Modal Options + +The second field in the trial account specs is the `modalOptions`. This contains all the customizable options for the trial account modals as well as the wallets you want to support for user offboarding. + +```js +export interface ModalCustomizations { + wallets: OffboardingWallet[]; + theme?: Theme; + beginTrial?: BeginTrialCustomizations, + trialOver?: TrialOverCustomizations, + invalidAction?: InvalidActionCustomizations, + insufficientBalance?: InsufficientBalanceCustomizations, +} +``` + +#### Wallets + +The only required field is `wallets`. This should be a list of valid domains that support trial account offboarding. Each of the wallets in the list will be displayed as a button once the trial is over. + +```js +export interface OffboardingWallet { + name: string; + description: string; + iconUrl: string; + redirectUrl: string; +} +``` + +For each wallet, you can specify a name to display, a description, an image (in the form of a URL), and where to redirect the user to once the button is clicked. The redirect URL follows the same format as the trial account URL and should look like this: + +```js +https://app.mynearwallet.com/linkdrop/ACCOUNT_ID/SECRET_KEY +``` + +The URL *must* have the `ACCOUNT_ID` and `SECRET_KEY` placeholders. + +### Theme And CSS + +The modal used by Keypom uses the same CSS as the official wallet selector modal behind the scenes. To learn how to customize the theme to match your app, see the selector's [documentation](https://github.com/near/wallet-selector/tree/main/packages/modal-ui#react--vue). + +If you only wish to change the theme between light and dark mode, you can pass in a `theme` field in the modal options. This field should be either `light` or `dark`. + +### Modal Text + +In addition to the modal style, you have complete control over the text that is displayed at each stage of the claiming process. To see the default text, see the [Default Text](#modal-default-text) section. + +For the trial account creation process, there are currently 3 modals that can be customized: + +1. Landing page: what the user sees when they first click the link + +```bash +landing?: { + title?: string; + body?: string; + fieldPlaceholder?: string; + buttonText?: string; + subText?: { + landing?: string; + invalidAccountId?: string; + accountIdTaken?: string; + accountIdAvailable?: string; + } +}, +``` + +2. Claiming: while the account is being created: +```bash +claiming?: { + title?: string; + body?: string; +}, +``` + +3. Claimed: once the account has been created: +```bash +claimed?: { + title?: string; + body?: string; + buttonText?: string; +} +``` + +The next stage that can be customized is what the user sees once their trial is over and they need to choose a wallet to offboard to. + +```bash +trialOver?: { + mainBody?: { + title?: string; + body?: string; + imageOne?: { + title: string; + body: string; + }, + imageTwo?: { + title: string; + body: string; + }, + button?: { + url?: string; + newTab?: boolean; + text?: string; + } + }, + offboardingOptions?: { + title?: string; + } +} +``` + +You can change the titles, descriptions, button text / behavior and more to tailor the experience to your app. Finally, you can change the text for when the user tries to perform an invalid action, or tries to spend more $NEAR than the account has available. + +## Example Trial Account Integration + +In the following example, you'll see how the trial account flow can be fully integrated into an application. The app has the domain `https://example.com` and the trial account modals should show up once the user lands on `https://example.com/trial-accounts`. In addition, the app doesn't want to expose the secret key in their analytics so they'll separate the account ID and secret key using a `#` instead of a `/`. + +The app will also support MyNEARWallet offboarding and will change the default text for the landing modal when the trial begins. + +```js +const NETWORK_ID = "testnet"; +const CONTRACT_ID = "example.near"; + +export const KEYPOM_OPTIONS = { + beginTrial: { + landing: { + title: "Welcome To My Cool Example App!", + }, + }, + wallets: [ + { + name: "MyNEARWallet", + description: "Secure your account with a Seed Phrase", + redirectUrl: "https://testnet.mynearwallet.com/linkdrop/ACCOUNT_ID/SECRET_KEY", + iconUrl: "INSERT_ICON_URL_HERE" + }, + ] +} + +const selector = await setupWalletSelector({ + network: NETWORK_ID, + modules: [ + setupMyNearWallet(), + ... + setupSender(), + setupKeypom({ + networkId: NETWORK_ID, + signInContractId: CONTRACT_ID, + trialAccountSpecs: { + url: "https://example.com/trial-accounts/ACCOUNT_ID#SECRET_KEY", + modalOptions: KEYPOM_OPTIONS + } + }) + ], +}); +``` + +# Keypom Instant Sign In Experiences + +Instant sign in experiences are a great way to reduce friction for users signing into applications. Currently, the sign in flow for a new user is as follows: +1. User creates an account. +2. They navigate to an application. +3. Sign-in is clicked. +4. The wallet selector modal is opened and the user needs to scroll to find their wallet. +5. The user clicks their wallet and is redirected to the wallet's website to approve a transaction. +6. The user is redirected back to the app and is signed in. + +As NEAR pushes to abstract the crypto complexities and jargon away from the end user, this current approach is not scalable. Not only is there a huge amount of clicks and redirects which leads to a loss in conversion, but the user is also expected to know which wallet they own. This is a huge barrier to entry as often times, the wallet logic will be abstracted from the user as seen with SWEAT. + +The flow that Keypom offers is as follows: +1. User creates an account. +2. User clicks discovers an application from their wallet. +3. User is instantly signed in and can start using the application. + +This flow is much more seamless and removes all the redirects and wallet selector modal friction. + +- Instant Sign-In [Demo](https://www.youtube.com/watch?v=p_NOcYbRlJw&feature=youtu.be) + +In order to support instant sign in, your app must have the `setupKeypom` function embedded within the wallet selector with the `instantSignInSpecs` parameter specified. + +## Instant Sign In Specs + +The instant sign in specifications allows the Keypom wallet selector to support instant sign on experiences for your app. In order to trigger the sign in flow, the user must be on the correct URL. This URL is specified in the specifications as a string and should look like this: + +```js +https://near.org/#trial-url/ACCOUNT_ID/SECRET_KEY/MODULE_ID +``` + +The URL *must* have the `ACCOUNT_ID`, `SECRET_KEY`, and `MODULE_ID` placeholders. + +Behind the scenes, Keypom will take the secret key and use it to sign transactions on behalf of the account whenever they perform an action. Since this key is limited access, there needs to be a way to approve any transaction that requires full access. This is why the `MODULE_ID` field is present. This is the ID of the wallet that the user will be redirected to in order to approve any full access key required transactions. + +Currently, Keypom supports: +- MyNEARWallet: `my-near-wallet`, +- NEAR Wallet: `near-wallet`, +- SWEAT Wallet: `sweat-wallet` + +As an example, if you wanted to support instant sign in for users once they reached `https://near.org/#instant-url/`, and you wanted the account and secret key to be separated using `#`, but the module ID and secret key to be separated by `/`, your specs should look like this: + +```js +instantSignInSpecs: { + url: "https://near.org/#instant-url/ACCOUNT_ID#SECRET_KEY/MODULE_ID", +} +``` + +> **NOTE:** The account ID must come first followed by the secret key and then finally the module ID. + +The wallet selector would then look as follows. + +```js +const selector = await setupWalletSelector({ + network: NETWORK_ID, + modules: [ + setupMyNearWallet(), + ... + setupSender(), + setupKeypom({ + networkId: NETWORK_ID, + signInContractId: CONTRACT_ID, + instantSignInSpecs: { + url: "https://near.org/#instant-url/ACCOUNT_ID#SECRET_KEY/MODULE_ID" + } + }) + ], +}); +``` + +From this point onwards, any app or wallet could create a limited access key for the contract that your app is using and then redirect the user to your instant sign in URL. An example could be that that account `benjiman.near` wants to use the `near.org` app and the contract being used there is `social.near`. Benji came from MyNEARWallet and so the URL would be: + +``` +https://near.org/#instant-url/benjiman.near#3C6rhKRWLFmho9bQo32EUmk9Ldx47paRSMUdaoR551EtcaNSPziave55HJosi71tfWSRQjjRrL4exfaBi9o7XKUG/my-near-wallet +``` + +At this point, Benji would be instantly signed into `near.org` and can start using the app. If anything requires a full access key, he would be redirected to MyNEARWallet to approve the transaction and come back. + +# Contributing + +First off, thanks for taking the time to contribute! Contributions are what makes the open-source community such an amazing place to learn, inspire, and create. Any contributions you make will benefit everybody else and are **greatly appreciated**. + +Please try to create bug reports that are: + +- _Reproducible._ Include steps to reproduce the problem. +- _Specific._ Include as much detail as possible: which version, what environment, etc. +- _Unique._ Do not duplicate existing opened issues. +- _Scoped to a Single Bug._ One bug per report. + +You can use [markdownlint-cli](https://github.com/igorshubovych/markdownlint-cli) to check for common markdown style inconsistency. + +# License + +This project is licensed under the **GPL License**. diff --git a/versioned_sidebars/version-1.1-sidebars.json b/versioned_sidebars/version-1.1-sidebars.json deleted file mode 100644 index 445b351d..00000000 --- a/versioned_sidebars/version-1.1-sidebars.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "version-1.1/tutorialSidebar": [ - { - "type": "autogenerated", - "dirName": "." - } - ] -} diff --git a/versioned_sidebars/version-1.2-sidebars.json b/versioned_sidebars/version-1.2-sidebars.json deleted file mode 100644 index caea0c03..00000000 --- a/versioned_sidebars/version-1.2-sidebars.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tutorialSidebar": [ - { - "type": "autogenerated", - "dirName": "." - } - ] -} diff --git a/versioned_sidebars/version-1.2.1-sidebars.json b/versioned_sidebars/version-1.2.1-sidebars.json deleted file mode 100644 index caea0c03..00000000 --- a/versioned_sidebars/version-1.2.1-sidebars.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "tutorialSidebar": [ - { - "type": "autogenerated", - "dirName": "." - } - ] -} diff --git a/versioned_sidebars/version-2.0-sidebars.json b/versioned_sidebars/version-2.0-sidebars.json new file mode 100644 index 00000000..4670a33f --- /dev/null +++ b/versioned_sidebars/version-2.0-sidebars.json @@ -0,0 +1,180 @@ +{ + "Concepts": [ + "Concepts/welcome", + "exec-summary", + { + "type": "category", + "label": "Linkdrops and Access Keys", + "collapsed": false, + "items": [ + "Concepts/LinkdropsAndAccessKeys/near-access-keys", + "Concepts/LinkdropsAndAccessKeys/linkdrop-basics" + ] + }, + { + "type": "category", + "label": "Keypom Protocol", + "collapsed": false, + "items": [ + "Concepts/KeypomProtocol/overview", + { + "type": "category", + "label": "Types of Drops", + "collapsed": true, + "items": [ + "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/introduction", + "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/simple-drops", + "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/nft-drops", + "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/ft-drops", + "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops" + ] + }, + "Concepts/KeypomProtocol/balances", + { + "type": "category", + "label": "Configuring Your Drop", + "collapsed": true, + "items": [ + "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/customization-homepage", + "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/drop-customization", + "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/time-customization", + "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/usage-customization", + "Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/sale-customization" + ] + }, + "Concepts/KeypomProtocol/GithubReadme/password-protect", + { + "type": "category", + "label": "Overhead Items", + "collapsed": true, + "items": [ + "Concepts/KeypomProtocol/GithubReadme/costs", + "Concepts/KeypomProtocol/GithubReadme/querying", + "Concepts/KeypomProtocol/GithubReadme/testing", + "Concepts/KeypomProtocol/GithubReadme/contribute", + "Concepts/KeypomProtocol/GithubReadme/licenses" + ] + } + ] + } + ], + "Tutorials": [ + "Tutorials/welcome", + { + "type": "category", + "label": "Basics", + "collapsed": false, + "items": [ + "Tutorials/Basics/getting-started", + "Tutorials/Basics/simple-drops", + "Tutorials/Basics/nft-drops", + "Tutorials/Basics/ft-drops", + "Tutorials/Basics/fc-drops" + ] + }, + { + "type": "category", + "label": "Advanced", + "collapsed": false, + "items": [ + { + "type": "category", + "label": "Ticketing", + "collapsed": true, + "items": [ + "Tutorials/Advanced/ticketing/introduction", + "Tutorials/Advanced/ticketing/architecture", + "Tutorials/Advanced/ticketing/drop", + "Tutorials/Advanced/ticketing/drop-test", + "Tutorials/Advanced/ticketing/react-outline", + "Tutorials/Advanced/ticketing/user-code", + "Tutorials/Advanced/ticketing/scanner-code", + "Tutorials/Advanced/ticketing/final", + "Tutorials/Advanced/ticketing/analytics", + "Tutorials/Advanced/ticketing/bos-tool" + ] + }, + { + "type": "category", + "label": "DAO Auto-Registration", + "collapsed": true, + "items": [ + "Tutorials/Advanced/daos/introduction", + "Tutorials/Advanced/daos/architecture", + "Tutorials/Advanced/daos/drop", + "Tutorials/Advanced/daos/daobot", + "Tutorials/Advanced/daos/security", + "Tutorials/Advanced/daos/final" + ] + }, + { + "type": "category", + "label": "Recurring Payments", + "collapsed": true, + "items": [ + "Tutorials/Advanced/subscriptions/introduction" + ] + } + ] + }, + { + "type": "category", + "label": "BOS", + "collapsed": false, + "items": [ + "Tutorials/BOS/welcome" + ] + }, + "Tutorials/Advanced/homepage" + ], + "TrialAccounts": [ + "TrialAccounts/introduction", + { + "type": "category", + "label": "Creating Trial Experiences", + "collapsed": false, + "items": [ + "TrialAccounts/Creation/getting-started", + "TrialAccounts/Creation/understanding-trial-accounts", + "TrialAccounts/Creation/drop-creation", + "TrialAccounts/Creation/integration" + ] + }, + "TrialAccounts/offboarding" + ], + "Cookbook": [ + "Cookbook/welcome", + { + "type": "category", + "label": "Drops", + "collapsed": false, + "items": [ + "Cookbook/drops/NEAR", + "Cookbook/drops/nft", + "Cookbook/drops/ft", + "Cookbook/drops/fc", + "Cookbook/drops/trial", + { + "type": "category", + "label": "Customizations", + "collapsed": true, + "items": [ + "Cookbook/drops/customizations/password", + "Cookbook/drops/customizations/dropConfig", + "Cookbook/drops/customizations/timeConfig", + "Cookbook/drops/customizations/saleConfig", + "Cookbook/drops/customizations/usageConfig" + ] + } + ] + }, + "Cookbook/keys", + "Cookbook/balances" + ], + "TypeDocSDK": [ + { + "type": "autogenerated", + "dirName": "keypom-sdk" + } + ] +} diff --git a/versions.json b/versions.json index 6d3d1fb8..59f17b2b 100644 --- a/versions.json +++ b/versions.json @@ -1,5 +1,3 @@ [ - "1.2.1", - "1.2", - "1.1" + "2.0" ] From dcdbff0972b7f486095530f108a3d45cd1fbfbea Mon Sep 17 00:00:00 2001 From: Min Qian Lu <59981815+minqianlu@users.noreply.github.com> Date: Sun, 17 Sep 2023 01:29:32 -0400 Subject: [PATCH 2/9] rearranging nav bar and rephrasing to fit smaller desktop browser sizes --- docusaurus.config.js | 7 ++++--- src/theme/DocVersionBanner/index.js | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docusaurus.config.js b/docusaurus.config.js index 3be22cd4..a767fe85 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -113,12 +113,13 @@ const darkCodeTheme = require('prism-react-renderer/themes/dracula'); position: "left", }, { - href: 'https://github.com/keypom/keypom-docs/tree/main', - label: 'GitHub', + type: 'docsVersionDropdown', position: 'right', }, { - type: 'docsVersionDropdown', + href: 'https://github.com/keypom/keypom-docs/tree/main', + label: 'GitHub', + position: 'right', }, ], }, diff --git a/src/theme/DocVersionBanner/index.js b/src/theme/DocVersionBanner/index.js index 3658e716..e5c148f2 100644 --- a/src/theme/DocVersionBanner/index.js +++ b/src/theme/DocVersionBanner/index.js @@ -33,7 +33,7 @@ function UnreleasedVersionLabel({siteTitle, versionMetadata, latestVersion, to, ), }}> { - 'This is unreleased Keypom documentation for v{versionLabel}. For the lastest, select v{latestVersionLink} from the dropdown' + 'This is unreleased Keypom documentation for v{versionLabel}. For the lastest, see v{latestVersionLink}' } ); @@ -59,7 +59,7 @@ function UnmaintainedVersionLabel({siteTitle, versionMetadata, latestVersion, to ), }}> { - 'You are viewing documentation for Keypom v{versionLabel}. For the lastest, select v{latestVersionLink} from the dropdown' + 'You are viewing documentation for Keypom v{versionLabel}. For the lastest, see v{latestVersionLink}' } ); From ea336464a64e32448e19b9ac41af8319a8c76078 Mon Sep 17 00:00:00 2001 From: Min Qian Lu <59981815+minqianlu@users.noreply.github.com> Date: Mon, 18 Sep 2023 21:23:59 -0400 Subject: [PATCH 3/9] prelim framework --- .../AssetLoading/asset-configurations.md | 4 + .../AssetLoading/asset-types.md | 4 + .../AssetLoading/basic-assets.md | 4 + .../AssetLoading/function-call.md | 4 + .../KeypomProtocol/drop-configurations.md | 3 + .../KeypomProtocol/intro-to-keypom.md | 76 ++++++++++ docs/Concepts/KeypomProtocol/nft-keys.md | 77 ++++++++++ docs/Concepts/KeypomProtocol/terminology.md | 140 ++++++++++++++++++ sidebars.js | 36 ++--- 9 files changed, 323 insertions(+), 25 deletions(-) create mode 100644 docs/Concepts/KeypomProtocol/AssetLoading/asset-configurations.md create mode 100644 docs/Concepts/KeypomProtocol/AssetLoading/asset-types.md create mode 100644 docs/Concepts/KeypomProtocol/AssetLoading/basic-assets.md create mode 100644 docs/Concepts/KeypomProtocol/AssetLoading/function-call.md create mode 100644 docs/Concepts/KeypomProtocol/drop-configurations.md create mode 100644 docs/Concepts/KeypomProtocol/intro-to-keypom.md create mode 100644 docs/Concepts/KeypomProtocol/nft-keys.md create mode 100644 docs/Concepts/KeypomProtocol/terminology.md diff --git a/docs/Concepts/KeypomProtocol/AssetLoading/asset-configurations.md b/docs/Concepts/KeypomProtocol/AssetLoading/asset-configurations.md new file mode 100644 index 00000000..493608ce --- /dev/null +++ b/docs/Concepts/KeypomProtocol/AssetLoading/asset-configurations.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Asset Configurations' +--- +# Asset Configurations \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/AssetLoading/asset-types.md b/docs/Concepts/KeypomProtocol/AssetLoading/asset-types.md new file mode 100644 index 00000000..bd4f65e8 --- /dev/null +++ b/docs/Concepts/KeypomProtocol/AssetLoading/asset-types.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Asset Types' +--- +# Asset Types \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/AssetLoading/basic-assets.md b/docs/Concepts/KeypomProtocol/AssetLoading/basic-assets.md new file mode 100644 index 00000000..5afdd74b --- /dev/null +++ b/docs/Concepts/KeypomProtocol/AssetLoading/basic-assets.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Basic Assets' +--- +# Basic Assets - NEAR, NFTs, & FTs \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/AssetLoading/function-call.md b/docs/Concepts/KeypomProtocol/AssetLoading/function-call.md new file mode 100644 index 00000000..86fbf384 --- /dev/null +++ b/docs/Concepts/KeypomProtocol/AssetLoading/function-call.md @@ -0,0 +1,4 @@ +--- +sidebar_label: 'Function Call Asset' +--- +# Function Call Asset \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/drop-configurations.md b/docs/Concepts/KeypomProtocol/drop-configurations.md new file mode 100644 index 00000000..b6280760 --- /dev/null +++ b/docs/Concepts/KeypomProtocol/drop-configurations.md @@ -0,0 +1,3 @@ +--- +sidebar_label: Drop Configurations +--- \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/intro-to-keypom.md b/docs/Concepts/KeypomProtocol/intro-to-keypom.md new file mode 100644 index 00000000..ebfb8cdb --- /dev/null +++ b/docs/Concepts/KeypomProtocol/intro-to-keypom.md @@ -0,0 +1,76 @@ +--- +sidebar_label: 'Introduction to Keypom' +--- + +# Introduction to Keypom +> To view our debut talk at NEARCON 2022, click [here](https://www.youtube.com/watch?v=J-BOnfhHV50). + +PUT MORE EMPHASIS ON WHAT IT IS, ECO PROJECTS ETC. + +Keypom is an access key factory created as a result of 3 common problems that arose in the ecosystem. + +1. People want a *cheap, customizable, and unique* onboarding experience for users. +2. Companies don't want to expose **full access keys** in their backend servers. +3. dApps want a *smooth UX* with zero barrier to entry onboarding. + +The contract was initially created as a way to handle the 1 $NEAR minimum deposit required for creating linkdrops using the [regular linkdrop contract](https://github.com/near/near-linkdrop/blob/f24f2608e1558db773f2408a28849d330abb3881/src/lib.rs#L18). + +If users wanted to create linkdrops, they needed to attach a **minimum** of 1 $NEAR. This made it costly and unscalable for projects that wanted to mass onboard onto NEAR. Keypom, on the other hand, has been highly optimized to allow for the lowest possible costs. + +## Problem + +Blockchain technology comes with many benefits such as sovereign ownership, digital rights, privacy, freedom, +peer to peer coordination and much more. The problem with this technology, however, is that there is an extremely +high barrier to entry for an everyday individual. None of it matters if nobody can onboard. + +It’s confusing to create and fund a crypto wallet. People are unfamiliar with the process, technical jargon, +and the general flow. NEAR’s account model is powerful, but extremely underutilized because it’s complex for +developers to take full advantage of. Keypom wraps this up in a single API call. + +With NEAR’s goal of onboarding 1 billion users to Web3, there needs to be a solution to this high barrier to +entry for developers building on NEAR and users onboarding to their apps and the NEAR ecosystem. + +Below is a table outlining the minimum costs to onboard a new user onto NEAR with a named account. + +| | 1 Account | 1,000 Accounts | 1,000,000 Accounts | +|----------------------|-----------------|-----------------|--------------------| +| Traditional Linkdrop | ~1 NEAR | ~1,003 NEAR | ~1,002,840 NEAR | +| Keypom | ~0.0035 NEAR | ~3.5 NEAR | ~3,500 NEAR | +| | ~99.65% Cheaper | ~99.65% Cheaper | ~99.65% Cheaper | + +Keypom allows anyone to create highly customizable onboarding experiences for their users. These experiences +can be both for new, or existing users. If someone already has a wallet, they can still use a Keypom link to +experience an app, and then transfer the assets later. + +## Comparable Solutions + +| | **Keypom** | **NEAR Drop** | **Satori** | +|----------------------------------------------|------------|---------------|------------| +| NEAR Drop | βœ… | βœ… | ❌ | +| FT Drop | βœ… | ❌ | ❌ | +| NFT Drop | βœ… | ❌ | βœ… | +| Function Call Drop | βœ… | ❌ | ❌ | +| Embeddable in Dapps | βœ… | ❌ | ❌ | +| Wallet Selector Integration | βœ… | ❌ | ❌ | +| No Fee | βœ… | Maybe? | ❌ | +| No Backend / 3rd Party | βœ… | βœ… | ❌ | +| Campaigns | βœ… | βœ… | βœ… | +| Multi-Step e.g. Tickets click > scan > claim | βœ… | ❌ | ❌ | +| Password Protected Drops | βœ… | ❌ | ❌ | +| Timed Drops e.g. recurring payments | βœ… | ❌ | ❌ | +| Custom Names e.g. user.myapp.near | βœ… | ❌ | ❌ | + +# Our Solution + +Keypom allows for the creation of highly customizable access keys. These keys can be thought of as having their +own *smart contracts*. Each access key derives from what's known as a *drop*. These drops outline the different +functionalities and behaviors the key will have. A drop can be thought of as a bucket that access keys belong to. +You can create many different buckets and fill them each with their own keys. Each key will act in accordance to the +drop, or bucket, it belongs to. + +A drop can be one of four different types: + +1. Simple drop. +2. Non Fungible Token drop. +3. Fungible Token drop. +4. Function Call drop. \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/nft-keys.md b/docs/Concepts/KeypomProtocol/nft-keys.md new file mode 100644 index 00000000..85df4b84 --- /dev/null +++ b/docs/Concepts/KeypomProtocol/nft-keys.md @@ -0,0 +1,77 @@ +--- +sidebar_label: 'NFTs and Access Keys' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Keypom Balances +## What is a Keypom Balance? +Let's put on our imagination caps for a second; pretend you're an event host and you are in charge of ticketing for numerous events. You deduce that for the sake of organization, the best approach would be to create separate drops for separate events. + +Being the busy event organizer that you are, sometimes you need to create these drops and keys while on the road. As we can see in the [basic tutorials](../../Tutorials/Basics/simple-drops.md), you need to attach a deposit to every one of your function calls: every time you create a drop, add keys, delete keys etc. This can be a real headache for a busy event organizer! + +This is where the concept of a **Keypom Balance** comes in real handy! + +Every account that uses Keypom carries an internal balance (in $NEAR) on the Keypom contract. Effectively, the Keypom balance is similar to a debit card. You can overload your balance and sip from it as you interact with the contract. + +Let's go back to your event organizer persona; this Keypom Balance allows you to simply preload your "debit card" with loads of $NEAR and then go about your business without needing to worry about transferring $NEAR for ever function call! +## Interacting with Balances +There are a few functions that you can use to interact with your Keypom balance. Let's quickly run through their meanings, and then show some examples! + + + + +```ts +// Deposit some amount of $NEAR or yoctoNEAR$ into the Keypom contract. This amount can then be used to create drops or add keys without having to explicitly attach a deposit every time. It can be thought of like a bank account. +export const addToBalance{ + /** Account object that if passed in, will be used to sign the txn instead of the funder account. */ + account?: Account, + /** If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. */ + wallet?: AnyWallet, + /** Amount of tokens to add but considering the decimal amount (non human-readable). + Transferring one $NEAR should be passed in as "1000000000000000000000000" and NOT "1" */ + amountYocto?: string + /** Human readable format for the amount of tokens to add. + Transferring one $NEAR should be passed in as "1" and NOT "1000000000000000000000000" */ + amountNear?: 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. */ + successUrl?: string +} + +// Withdraw your balance back into your wallet. +export const withdrawBalance { + /** Account object that if passed in, will be used to sign the txn instead of the funder account. */ + account?: Account, + /** If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. */ + wallet?: AnyWallet, +} + +//This allows you to view your own or other people's Keypom balance. This can be useful to determine +//if you need to top up if you are on the verge of creating a large drop +export const getUserBalance{ + accountId: string +} +``` + + + + +```rust +// Deposit some amount of $NEAR or yoctoNEAR$ into the Keypom contract. This amount can then be used to create drops or add keys without having to explicitly attach a deposit every time. It can be thought of like a bank account. +pub fn add_to_balance(&mut self) + +// Allows users to withdraw their balance +pub fn withdraw_from_balance(&mut self) + +// Return the current balance for a given account +pub fn get_user_balance(&self, account_id: AccountId) -> U128 +``` + + + + + + +For example, Alice wants to add 10 $NEAR to her Keypom balance. She will do this by calling `addToBalance` and transferring 10 $NEAR to the Keypom contract. Then, if Alice wants to create a drop that costs her 5 $NEAR, she can simply create the drop and Keypom will automatically deduct from her internal Keypom balance rather than needing to transfer 5 $NEAR to the contract. + +Once she has created the drop, she can check her balance using `getUserBalance`, which will return 5 $NEAR. Then, she can withdraw this 5 $NEAR into her NEAR wallet; this will cause her Keypom balance to go down to 0 $NEAR. diff --git a/docs/Concepts/KeypomProtocol/terminology.md b/docs/Concepts/KeypomProtocol/terminology.md new file mode 100644 index 00000000..9397092f --- /dev/null +++ b/docs/Concepts/KeypomProtocol/terminology.md @@ -0,0 +1,140 @@ +--- +sidebar_label: 'Foundational Concepts' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Foundational Concepts +## Drops vs. Keys +At its core, Keypom is revolves around Access Keys and Drops. These two concepts are closely related. + +* **Access Key**: A NEAR keypair, this is what each user receives to start their Keypom experience. + * Can have assets, such an NFT, FTs, NEAR or FunctionCalls, associated with them. + * When a user receives a key and claims it, they will receive those assets. +* **Drop**: A collection of access keys that all share the same traits - such as assets and configurations. + * As a funder, you create the drop and fund all the assets + * You can add as many keys as you want to the drop, even after its creation. + +An easy way to think about it is that you *create a drop* but you *distrubute keys*. + +## What are Assets? +In the Keypom Protocol, assets can be NEAR, Fungible Tokens, Non-Fungible Tokens, or FunctionCalls. Each key in a drop holds the same assets, meaning a user can receive any key from the drop and be guarenteed the same set of assets. Assets are defined **per use** and can be mix-and-matched to craft any experience you want. An example can be seen below: + + +| **Key Use** | **Assets** | +|-------------|-----------------------------------| +| 1 | NEAR, FunctionCall, Fungible Token| +| 2 | Non-Fungible Token | +| 3 | Fungible Token, NEAR | + + +This means when the user claims their key for the first time, they will receive a FT, some NEAR and call a set of functions. On the second claim, they will receive an NFT while on the third and final claim, they will receive some NEAR and FTs. + +This behaviour is the same accross all the keys in the drop. As the drop funder, you would need to ensure your drop has all the necessary assets to fund all of the keys. For example, if each FT asset represents 1 Go-Team Token and you have 10 keys, you would need to fund your drop with 20 Go-Team Tokens. For more on how to use each asset, see the pages below. + + + + + + + + +```ts +// Deposit some amount of $NEAR or yoctoNEAR$ into the Keypom contract. This amount can then be used to create drops or add keys without having to explicitly attach a deposit every time. It can be thought of like a bank account. +export const addToBalance{ + /** Account object that if passed in, will be used to sign the txn instead of the funder account. */ + account?: Account, + /** If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. */ + wallet?: AnyWallet, + /** Amount of tokens to add but considering the decimal amount (non human-readable). + Transferring one $NEAR should be passed in as "1000000000000000000000000" and NOT "1" */ + amountYocto?: string + /** Human readable format for the amount of tokens to add. + Transferring one $NEAR should be passed in as "1" and NOT "1000000000000000000000000" */ + amountNear?: 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. */ + successUrl?: string +} + +// Withdraw your balance back into your wallet. +export const withdrawBalance { + /** Account object that if passed in, will be used to sign the txn instead of the funder account. */ + account?: Account, + /** If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. */ + wallet?: AnyWallet, +} + +//This allows you to view your own or other people's Keypom balance. This can be useful to determine +//if you need to top up if you are on the verge of creating a large drop +export const getUserBalance{ + accountId: string +} +``` + + + + +```rust +// Deposit some amount of $NEAR or yoctoNEAR$ into the Keypom contract. This amount can then be used to create drops or add keys without having to explicitly attach a deposit every time. It can be thought of like a bank account. +pub fn add_to_balance(&mut self) + +// Allows users to withdraw their balance +pub fn withdraw_from_balance(&mut self) + +// Return the current balance for a given account +pub fn get_user_balance(&self, account_id: AccountId) -> U128 +``` + + + + + + +For example, Alice wants to add 10 $NEAR to her Keypom balance. She will do this by calling `addToBalance` and transferring 10 $NEAR to the Keypom contract. Then, if Alice wants to create a drop that costs her 5 $NEAR, she can simply create the drop and Keypom will automatically deduct from her internal Keypom balance rather than needing to transfer 5 $NEAR to the contract. + +Once she has created the drop, she can check her balance using `getUserBalance`, which will return 5 $NEAR. Then, she can withdraw this 5 $NEAR into her NEAR wallet; this will cause her Keypom balance to go down to 0 $NEAR. diff --git a/sidebars.js b/sidebars.js index f666401b..59aa2102 100644 --- a/sidebars.js +++ b/sidebars.js @@ -8,7 +8,7 @@ const sidebars = { // link: { // type: 'concepts/Linkdrops and Access Keys/linkdrop-welcome', // }, - collapsed: false, + collapsed: true, items: [ 'Concepts/LinkdropsAndAccessKeys/near-access-keys', 'Concepts/LinkdropsAndAccessKeys/linkdrop-basics', @@ -22,39 +22,25 @@ const sidebars = { // }, collapsed: false, items: [ - 'Concepts/KeypomProtocol/overview', + 'Concepts/KeypomProtocol/intro-to-keypom', + 'Concepts/KeypomProtocol/terminology', { type: 'category', - label: 'Types of Drops', + label: 'Keypom Drop Assets', // link: { // item: 'Concepts/Keypom Protocol/Github Readme/Types of Drops/introduction', // }, - collapsed: true, + collapsed: false, items: [ - 'Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/introduction', - 'Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/simple-drops', - 'Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/nft-drops', - 'Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/ft-drops', - 'Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/fc-drops', + 'Concepts/KeypomProtocol/AssetLoading/asset-types', + 'Concepts/KeypomProtocol/AssetLoading/basic-assets', + 'Concepts/KeypomProtocol/AssetLoading/function-call', + 'Concepts/KeypomProtocol/AssetLoading/asset-configurations', ], }, + 'Concepts/KeypomProtocol/nft-keys', + 'Concepts/KeypomProtocol/drop-configurations', 'Concepts/KeypomProtocol/balances', - { - type: 'category', - label: 'Configuring Your Drop', - // link: { - // type: 'doc', - // id: 'Concepts/Keypom Protocol/Github Readme/Types of Drops/customization-homepage', - // }, - collapsed: true, - items: [ - 'Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/customization-homepage', - 'Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/drop-customization', - 'Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/time-customization', - 'Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/usage-customization', - 'Concepts/KeypomProtocol/GithubReadme/TypesOfDrops/sale-customization', - ], - }, 'Concepts/KeypomProtocol/GithubReadme/password-protect', { type: 'category', From e5a4b2a67816176a8d6eea36589cd0b8133b1ce5 Mon Sep 17 00:00:00 2001 From: Min Qian Lu <59981815+minqianlu@users.noreply.github.com> Date: Wed, 27 Sep 2023 22:25:42 -0400 Subject: [PATCH 4/9] added and filling out asset pages --- .../AssetLoading/asset-types.md | 4 - .../AssetLoading/basic-assets.md | 4 - .../AssetLoading/function-call.md | 4 - .../asset-configurations.md | 0 .../KeypomProtocol/Assets/asset-types.md | 74 ++++++ .../KeypomProtocol/Assets/basic-assets.md | 92 ++++++++ .../KeypomProtocol/Assets/function-call.md | 222 ++++++++++++++++++ docs/Concepts/KeypomProtocol/drop.md | 86 +++++++ docs/Concepts/KeypomProtocol/terminology.md | 83 ++----- sidebars.js | 8 +- 10 files changed, 493 insertions(+), 84 deletions(-) delete mode 100644 docs/Concepts/KeypomProtocol/AssetLoading/asset-types.md delete mode 100644 docs/Concepts/KeypomProtocol/AssetLoading/basic-assets.md delete mode 100644 docs/Concepts/KeypomProtocol/AssetLoading/function-call.md rename docs/Concepts/KeypomProtocol/{AssetLoading => Assets}/asset-configurations.md (100%) create mode 100644 docs/Concepts/KeypomProtocol/Assets/asset-types.md create mode 100644 docs/Concepts/KeypomProtocol/Assets/basic-assets.md create mode 100644 docs/Concepts/KeypomProtocol/Assets/function-call.md create mode 100644 docs/Concepts/KeypomProtocol/drop.md diff --git a/docs/Concepts/KeypomProtocol/AssetLoading/asset-types.md b/docs/Concepts/KeypomProtocol/AssetLoading/asset-types.md deleted file mode 100644 index bd4f65e8..00000000 --- a/docs/Concepts/KeypomProtocol/AssetLoading/asset-types.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -sidebar_label: 'Asset Types' ---- -# Asset Types \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/AssetLoading/basic-assets.md b/docs/Concepts/KeypomProtocol/AssetLoading/basic-assets.md deleted file mode 100644 index 5afdd74b..00000000 --- a/docs/Concepts/KeypomProtocol/AssetLoading/basic-assets.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -sidebar_label: 'Basic Assets' ---- -# Basic Assets - NEAR, NFTs, & FTs \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/AssetLoading/function-call.md b/docs/Concepts/KeypomProtocol/AssetLoading/function-call.md deleted file mode 100644 index 86fbf384..00000000 --- a/docs/Concepts/KeypomProtocol/AssetLoading/function-call.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -sidebar_label: 'Function Call Asset' ---- -# Function Call Asset \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/AssetLoading/asset-configurations.md b/docs/Concepts/KeypomProtocol/Assets/asset-configurations.md similarity index 100% rename from docs/Concepts/KeypomProtocol/AssetLoading/asset-configurations.md rename to docs/Concepts/KeypomProtocol/Assets/asset-configurations.md diff --git a/docs/Concepts/KeypomProtocol/Assets/asset-types.md b/docs/Concepts/KeypomProtocol/Assets/asset-types.md new file mode 100644 index 00000000..5f062c86 --- /dev/null +++ b/docs/Concepts/KeypomProtocol/Assets/asset-types.md @@ -0,0 +1,74 @@ +--- +sidebar_label: 'Asset Types' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Admonition from '@theme/Admonition'; + +# Asset Types +## Basics +> In the Keypom Protocol, an asset it something you attach to every key in your drop. When someone obtains and uses a key, they will receive the assets - either to a new or existing account. + +Assets are meant to create new experience and bring value to your users. They can be one of the following: + +* **NEAR** +* **Fungible Tokens** +* **Non-Fungible Tokens** +* **Function Calls** + +Each key in a drop holds the same assets, meaning a user can receive any key from the drop and be guarenteed the same set of assets. + +Access Keys can have multiple uses and their assets are defined **per use**. These can be mix-and-matched to craft any experience you want. An example can be seen below: + + + + +| **Key Use** | **Assets** | +|-------------|-----------------------------------| +| 1 | NEAR, FunctionCall, Fungible Token| +| 2 | Non-Fungible Token | +| 3 | Fungible Token, NEAR | + + +This means when the user claims their key for the first time, they will receive some FTs, some NEAR and call a set of functions. On the second claim, they will receive an NFT while on the third and final claim, they will receive some NEAR and FTs. + +New with Keypom V3, you can mix-and-match and add multiple different types of assets per use, for as many key uses/claims as you want! + + + +___ + +## Defining vs Funding Assets +An important distinction to be made is the difference between defining and funding assets. + +:::caution +If assets are not properly funded, your drop may not perform as expected. Proper funding is highlighted in each asset type's respective concepts pages and tutorials. +::: + +Defining an asset is similar to creating a blueprint for your drop while funding is the process of building it. A more formal definition can be: + +* ***Defining an Asset***: This is the process you go through when creating your drop; you outline a particular asset to be available on certain set of uses. Note that the asset is not actually present in the drop after you've defined it. +* ***Funding an Asset***: This happens when you send Keypom the assets required as defined in your drop. This way, Keypom has ownership and can transfer it to the user when they claim their key. \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/Assets/basic-assets.md b/docs/Concepts/KeypomProtocol/Assets/basic-assets.md new file mode 100644 index 00000000..8ad058fd --- /dev/null +++ b/docs/Concepts/KeypomProtocol/Assets/basic-assets.md @@ -0,0 +1,92 @@ +--- +sidebar_label: 'NEAR, NFT, & FT Assets' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Admonition from '@theme/Admonition'; + +# NEAR, NFT, & FT Assets + +For every use on an Access Key, the different types of assets can be mixed to create an infinite number of experiences! + + +## NEAR Asset +> A NEAR Asset attaches some claimable NEAR to each use it is defined for + +Whenever a NEAR asset is present in a key use, the user will receive some NEAR for that particular key use. For example, if a key has 2 uses, and a NEAR asset is defined in the first use but not the second, then the user will only receive NEAR the first time they claim their key. + +### Structure +The structure of a NEAR asset is relatively simple. All that needs to be defined is the amount. Note that if multiple NEAR assets are defined in the same use, the claiming user will receive the sum of `yoctonear` contained in all the NEAR assets. +```rust reference +https://github.com/keypom/keypom/blob/8f9f8df397cb8cabbda30d1ddffdcddc4a733274/contract/src/models/external/models.rs#L30-L33 +``` +### Funding +In the case of NEAR assets, defining and funding are synonomous. This is because the drop creation will fail if insufficient NEAR is provided. This NEAR can come from: + +* Your [Keypom Balance](../balances.md). +* An [attached deposit](https://docs.near.org/develop/contracts/environment/#environment-variables) when creating the drop. + +___ + +## NFT Asset +> A properly funded NFT Asset will allow a user to receive a Non-fungible Token + +Whenever an NFT asset is present and properly funded in a key use, the user will receive an NFT for that particular key use. For example, if a key has 2 uses, and an NFT asset is defined in the first use but not the second, then the user will only receive an NFT the first time they claim their key. + +Note that multiple different tokens can be sent at once by simply including more NFT Assets. +### Structure +When defining an NFT Asset, only one item needs to be specified: +* `nft_contract_id`: the contract that the NFT lives on. +```rust reference +https://github.com/keypom/keypom/blob/8f9f8df397cb8cabbda30d1ddffdcddc4a733274/contract/src/models/external/models.rs#L50-L53 +``` +### Funding +:::caution +An improperly loaded NFT Asset will result in **no NFT being sent to the user** +::: + +In order to fund an NFT asset, you must transfer it to the Keypom contract: `v3.keypom.near` or `v3.keypom.testnet`. By doing this, you give the Keypom contract the ability to transfer it to the end user when they claim. + +It is important that when transferring, you are transferring from the contract that you defined above. It is also important to include the `dropId` as a `msg`. This tells Keypom to associate the incoming NFT with your drop. +```js reference +https://github.com/keypom/keypom/blob/8a4009be98f263e93d718779983efcdac1b1a9f8/__tests__/creation/nft-creation.ava.ts#L189-L199 +``` +In the case where you have multiple NFT Assets, you will need to transfer the appropriate number of NFTs. For example, if you have 5 keys with 2 NFT Assets each, you will need to transfer 10 NFTs to Keypom. + +When claiming, the user will receive the lastest NFT that was transferred to Keypom. + +:::note +Only a drop's creator can fund its NFT Assets +::: +___ + +## FT Asset +> A properly funded FT Asset will send the claiming user a predetermined amount of Fungible Tokens + +Whenever an FT asset is present and properly funded in a key use, the user will receive a set amount of FTs for that particular key use. For example, if a key has 2 uses, and an FT asset is defined in the first use but not the second, then the user will only receive an the predefined amount of FTs the first time they claim their key. + +Note that multiple different tokens can be sent at once by simply including more FT Assets. +### Structure +When defining an FT Asset, a few things need to be defined: +* *ft_contract_id*: The Fungible Token contract. +* *ft_amount*: The amout of Fungible Tokens to be sent. Defined in the smallest divisible unit. For more, see the token's definition of the [decimal value](https://docs.openzeppelin.com/contracts/3.x/erc20#a-note-on-decimals). +* *registration_cost*: Specific to each FT contract, this is the cost to register the user on the FT contract. + +```rust reference +https://github.com/keypom/keypom/blob/8a4009be98f263e93d718779983efcdac1b1a9f8/contract/src/models/external/models.rs#L38-L45 +``` +### Funding +:::caution +An improperly loaded FT Asset will result in **no FTs being sent to the user** +::: + +In order to fund a Fungible Token asset, you must transfer it to the Keypom contract: `v3.keypom.near` or `v3.keypom.testnet`. By doing this, you give the Keypom contract the FT balance necessary to transfer it to the end user when they claim. + +It is important that when transferring, you are transferring from the contract that you defined above. It is also important to include the `dropId` as a `msg`. This tells Keypom to associate the incoming NFT with your drop. +```js reference +https://github.com/keypom/keypom/blob/8a4009be98f263e93d718779983efcdac1b1a9f8/__tests__/utils/ft-utils.ts#L17-L28 +``` +:::note +Anybody can fund a drop's FT Assets +::: +___ \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/Assets/function-call.md b/docs/Concepts/KeypomProtocol/Assets/function-call.md new file mode 100644 index 00000000..c65d7bbc --- /dev/null +++ b/docs/Concepts/KeypomProtocol/Assets/function-call.md @@ -0,0 +1,222 @@ +--- +sidebar_label: 'Function Call Asset' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +# Function Call Asset + +The function call asset is by far the most powerful feature that Keypom provides. FC assets allow **any** method on **any** +contract to be executed (with some exceptions). In addition, there are a huge variety of customizations and features you can choose from when +defining the drop that come on top of the global options. The possibilities are almost endless. State of the art NFT ticketing, +lazy minting NFTs, auto registration into DAOs, analytics for marketing at events and much more. + +## How does it work? + +Unlike NFT and FT assets, the function calls must have everything paid for **upfront**. There is no two step process +so the creation is similar to Simple assets. Once the drop is created and keys are added, you can immediately start using it. + +### Function Call Config + +When creating the drop, you have quite a lot of customization available. At the top level, there is a FC drop global +config similar to how the *general* config works. + + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de977945/src/lib/types/fc.ts#L68-L74 +``` + + + + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/models/fc_model.rs#L53-L58 +``` + + + + + +### `Method`/`MethodData` + +In addition to the global config, the user can specify a set of what's known as `Method`. This represents the +information for the function being called. Within this data, there are also a few optional configurations you can use +to extend your use cases. You'll see how powerful these can be in the use cases [section](#use-cases). + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de977945/src/lib/types/fc.ts#L7-L63 +``` + + + + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/models/fc_model.rs#L18-L48 +``` + + + + + +`Method`/`MethodData` keeps track of the method being called, receiver, arguments, and attached deposit. In addition, there are +some optional fields that can be used to extend the use cases. If you have a contract that requires some more context from +Keypom such as the drop ID, key ID, or account ID that used the key, these can all be specified. + +We've kept it generic such that you can specify the actual argument name that these will be passed in as. For example, if you +had a contract that would lazy mint an NFT and it required the account to be passed in as `receiver_id`, you could specify +an `account_id_field` set to `receiver_id` such that Keypom will automatically pass in the account ID that used the key under the +field `receiver_id`. + +This logic extends to the drop ID, and key Id as well. + +### Key Uses + +For **every key use**, you can specify a *vector* of `Method`/`MethodData` which allows you to execute multiple function calls each +time a key is used. These calls are scheduled 1 by 1 using a simple for loop. This means that most of the time, the function +calls will be executed in the order specified in the vector but it is not *guaranteed*. + +It's important to note that the Gas available is split evenly between *all* the function calls and if there are too many, +you might run into issues with not having enough Gas. You're responsible for ensuring that this doesn't happen. + +The vector of `Method`/`MethodData` is *optional* for each key use. If a key use has `null` rather than `Some(Vector)` or `Maybe>`, +it will decrement the uses and work as normal such that the `throttle_timestamp, `start_timestamp` etc. are enforced. The only +difference is that after the key uses are decremented and these checks are performed, the execution **finishes early**. The null +case does **not** create an account or send *any* funds. It doesn't invoke any function calls and simply *returns once the +checks are done*. This makes the null case act as a "burner" where you disregard any logic. This has many uses which will +be explored in the use cases [section](#use-cases). + +If a key has more than 1 use, you can specify a *different vector* of `Method`/`MethodData` for **each use**. As an example, you could +specify that the first use will result in a null case and the second use will result in a lazy minting function being called. +If you have multiple uses but want them all to do the same thing, you don't have to repeat the same data. Passing in only 1 +vector of `Method`/`MethodData` will result in **all the uses** inheriting that data. + +## Security + +Since all FC assets will be signed by the Keypom contract, there are a few restrictions in place to avoid malicious behaviors. +To avoid users from stealing registered assets from other assets, the following methods cannot be called via FC assets: + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/lib.rs#L926-L934 +``` + +In addition, the Keypom contract cannot be the receiver of any function call. This is to avoid people +from calling private methods through FC assets. + +### Keypom Arguments + +When a key is used and a function is called, there is a data structure that is **automatically** attached to the arguments. +This is known as the `keypom_args`. It contains the information that the drop creator specified in the `Method`/`MethodData`. + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/stage1/function_call.rs#L17-L22 +``` + +#### Motivation + +Let's say there was an exclusive NFT contract that allowed the Keypom contract to mint NFTs as part of an FC drop. Only Keypom +was given access to mint the NFTs so they could be given out as linkassets. The organizer only wanted links that were part of their +drop to be valid. For this reason, the NFT contract would only mint if Keypom called the `nft_mint` function and there was a field +`series` passed in and it was equal to the drop ID created by the organizer. + +Let's say the owner created an exclusive drop that happened to have a drop ID of 5. They could then go to the NFT contract +and restrict NFTs to only be minted if: +- `series` had a value of 5. +- The Keypom contract was the one calling the function. + +In order for this to work, when creating the drop, the owner would need to specify that the`drop_id_field` was set to a value of `series` +such that the drop ID is correctly passed into the function. + +The problem with this approach is that the NFT contract has no way of knowing which arguments were sent by the **user** when the drop +was created as part of the MethodData `args` and which arguments are automatically populated by the Keypom contract. There is nothing +stopping a malicious user from creating a new drop that has an ID of 6 but hard-coding in the actual arguments that `series` should have +a value of 5. In this case, the malicious drop would have *no* `drop_id_field` and the NFT contract would have no way of knowing that the +`series` value is malicious. + +This can be prevented if a new field is introduced representing what was automatically injected by the Keypom contract itself. At the +end of the day, Keypom will **always** send correct information to the receiving contracts. If those contracts have a way to know what has +been sent by Keypom and what has been manually set by users, the problem is solved. In the above scenario, the NFT contract would simply add +an assertion that the `keypom_args` had the `account_id_field` set to `Some(series)` meaning that the incoming `series` field was set by Keypom +and not by a malicious user. + +## Use Cases + +Function call assets are the bread and butter of the Keypom contract. They are the most powerful and complex assets that can currently be created. +With this complexity, there are an almost infinite number of use-cases that arise. + +### Proof of Attendance Protocols + +A very common use case in the space is what's known as Proof of Attendance. Often times when people go to events, they want a way to prove +that they were there. Some traditional approaches would be to submit your wallet address and you would be sent an NFT or some other form of +proof at a later date. The problem with this is that it has a very high barrier to entry. Not everyone has a wallet. + +With Keypom, you can create a function call drop that allows people to onboard onto NEAR if they don't have a wallet or if they do, they can +simply use that. As part of the onboarding / claiming process, they would receive some sort of proof of attendance such as an NFT. This can +be lazy minted on-demand such that storage isn't paid up-front for all the tokens. + +At this point, the event organizers or the funder can distribute links to people that attend the event in-person. These links would then be +claimed by users and they would receive the proof of attendance. + +### Auto Registration into DAOs + +DAOs are a raging topic in crypto. The problem with DAOs, however, is there is a barrier to entry for users that aren't familiar with the +specific chain they're built on top of. Users might not have wallets or understand how to interact with contracts. On the contrary, they +might be very well versed or immersed in the DAO's topics. They shouldn't be required to create a wallet and learn the onboarding process. + +With Keypom, you can create a function call drop with the main purpose of registering users into a DAO. For people that have a wallet, +this will act as an easy way of registering them with the click of a link. For users that don't have a wallet and are unfamiliar with +NEAR, they can be onboarded and registered into the DAO with the same click of a link. + +### Multisig Contracts + +Another amazing use-case for Keypom is allowing multisig contracts to have ZERO barrier to entry. Often times when using a multisig contract, +you will entrust a key to a trusted party. This party might have no idea what NEAR is or how to interact with your contract. With Keypom, +you can create a drop that will allow them to sign their transaction with a click of a link. No NEAR wallet is needed and no knowledge of the +chain is required. + +At the end of the day, from the users perspective, they are given a link and when they click it, their portion of the multisig transaction is +signed. The action is only performed on the multisig contract once all links have been clicked. This is an extremely powerful way of doing +accomplishing multisig transactions with zero barrier to entry. + +The users don't even need to create a new account. They can simply call `claim` when the link is clicked which will fire the cross-contract call +to the multisig contract and pass in the keypom arguments that will be cross-checked by that contract. + +### NFT Ticketing + +The problem with current NFT ticketing systems is that they require users to have a wallet. This is a huge barrier to entry for people that +are attending events but don't have wallets. In addition, there is often no proof of attendance for the event as the NFT is burned in order +to get into the event which requires an internet connection. + +Keypom aims to solve these problems by having a ticketing system that has the following features. +* Users are not required to have a wallet to enter the event. +* Each ticket is unique and can only be used by one person. +* Attendees are not required to have wifi to gain entry to the event. +* Attendees that did not have a NEAR wallet can get one for free. +* Attendees can choose to receive an NFT proving their attendance at the event. This is commonly known as a [POAP](https://academy.binance.com/en/glossary/proof-of-attendance-protocol-poap). + +In addition, some way to provide analytics to event organizers that contains information such as links that were: +- Given out but not clicked at all. +- Clicked but not attended. +- Partially claimed indicating the number of people that attended but did not onboard or receive a POAP. +- Fully claimed indicating the number of people that attended and received a POAP. + +In order to accomplish this, you can create a drop that has 3 uses per key. These uses would be: +1. Array(`null`) +2. Array(`null`) +3. Array(function call to POAP contract to lazy mint an NFT) + +The event organizer would create the links and distribute them to people however they see fit. When a user receives the link, the first +claim is automatically fired. This is a `null` case so nothing happens except for the fact that the key uses are decremented. At this point, +the organizer knows that the user has clicked the link since the uses have been decremented. + +The next claim happens **only** when the user is at the door. Keypom would expose a QR code that can only be scanned by the host's phone. +This QR code would appear once the first link is clicked and contains the private key for the link. At the event, they wouldn't need any wifi +to get in as they only need to show the host the QR code. Once the host scans it, the site would ensure that they have exactly 2 out of +the 3 uses left. If they don't, they're not let in. At that point, a use is decremented from the key and the next time they visit the +ticket page (when they have internet), they would be able to claim the final use and be onboarded / receive a POAP. + +

ticketing

\ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/drop.md b/docs/Concepts/KeypomProtocol/drop.md new file mode 100644 index 00000000..c16a4d09 --- /dev/null +++ b/docs/Concepts/KeypomProtocol/drop.md @@ -0,0 +1,86 @@ +--- +sidebar_label: 'The Keypom Drop' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Admonition from '@theme/Admonition'; + +# The Keypom Drop +> A Keypom Drop is a collection of access keys that all share the same traits - such as assets and configurations. . + +* ***Access Key***: A NEAR keypair, this is what each user receives to start their Keypom experience. + * Can have assets, such an NFT, FTs, NEAR or FunctionCalls, associated with them. + * When a user receives a key and claims it, they will receive those assets. +* ***Drop***: A collection of access keys that all share the same traits - such as assets and configurations. + * As a funder, you create the drop and fund all the assets + * You can add as many keys as you want to the drop, even after its creation. + +An easy way to think about it is that you *create a drop* but you *distrubute keys*. + +___ + +## What are Assets? +> In the Keypom Protocol, an asset it something you attach to every key in your drop. When someone obtains and uses a key, they will receive the assets - either to a new or existing account. + +Assets can be NEAR, Fungible Tokens, Non-Fungible Tokens, or FunctionCalls. Each key in a drop holds the same assets, meaning a user can receive any key from the drop and be guarenteed the same set of assets. + +Access Keys can have multiple uses and their assets are defined **per use**. These can be mix-and-matched to craft any experience you want. An example can be seen below: + + +| **Key Use** | **Assets** | +|-------------|-----------------------------------| +| 1 | NEAR, FunctionCall, Fungible Token| +| 2 | Non-Fungible Token | +| 3 | Fungible Token, NEAR | + + +This means when the user claims their key for the first time, they will receive a FT, some NEAR and call a set of functions. On the second claim, they will receive an NFT while on the third and final claim, they will receive some NEAR and FTs. + +This behaviour is the same accross all the keys in the drop. As the drop funder, you would need to ensure your drop has all the necessary assets to fund all of the keys. For example, if each FT asset represents 1 Go-Team Token and you have 10 keys, you would need to fund your drop with 20 Go-Team Tokens. For more on how to use each asset, see the pages below. + + diff --git a/docs/Concepts/KeypomProtocol/terminology.md b/docs/Concepts/KeypomProtocol/terminology.md index 9397092f..52e2f534 100644 --- a/docs/Concepts/KeypomProtocol/terminology.md +++ b/docs/Concepts/KeypomProtocol/terminology.md @@ -3,22 +3,29 @@ sidebar_label: 'Foundational Concepts' --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; +import Admonition from '@theme/Admonition'; # Foundational Concepts ## Drops vs. Keys -At its core, Keypom is revolves around Access Keys and Drops. These two concepts are closely related. +> At its core, Keypom revolves around creating **Drops** and using **Access Keys**. -* **Access Key**: A NEAR keypair, this is what each user receives to start their Keypom experience. +* ***Access Key***: A NEAR keypair, this is what each user receives to start their Keypom experience. * Can have assets, such an NFT, FTs, NEAR or FunctionCalls, associated with them. * When a user receives a key and claims it, they will receive those assets. -* **Drop**: A collection of access keys that all share the same traits - such as assets and configurations. +* ***Drop***: A collection of access keys that all share the same traits - such as assets and configurations. * As a funder, you create the drop and fund all the assets * You can add as many keys as you want to the drop, even after its creation. An easy way to think about it is that you *create a drop* but you *distrubute keys*. +___ + ## What are Assets? -In the Keypom Protocol, assets can be NEAR, Fungible Tokens, Non-Fungible Tokens, or FunctionCalls. Each key in a drop holds the same assets, meaning a user can receive any key from the drop and be guarenteed the same set of assets. Assets are defined **per use** and can be mix-and-matched to craft any experience you want. An example can be seen below: +> In the Keypom Protocol, an asset it something you attach to every key in your drop. When someone obtains and uses a key, they will receive the assets - either to a new or existing account. + +Assets can be NEAR, Fungible Tokens, Non-Fungible Tokens, or FunctionCalls. Each key in a drop holds the same assets, meaning a user can receive any key from the drop and be guarenteed the same set of assets. + +Access Keys can have multiple uses and their assets are defined **per use**. These can be mix-and-matched to craft any experience you want. An example can be seen below: | **Key Use** | **Assets** | @@ -35,7 +42,7 @@ This behaviour is the same accross all the keys in the drop. As the drop funder,
- +
- +

Simple Assets

@@ -57,7 +64,7 @@ This behaviour is the same accross all the keys in the drop. As the drop funder,
- +
- - - - - - -```ts -// Deposit some amount of $NEAR or yoctoNEAR$ into the Keypom contract. This amount can then be used to create drops or add keys without having to explicitly attach a deposit every time. It can be thought of like a bank account. -export const addToBalance{ - /** Account object that if passed in, will be used to sign the txn instead of the funder account. */ - account?: Account, - /** If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. */ - wallet?: AnyWallet, - /** Amount of tokens to add but considering the decimal amount (non human-readable). - Transferring one $NEAR should be passed in as "1000000000000000000000000" and NOT "1" */ - amountYocto?: string - /** Human readable format for the amount of tokens to add. - Transferring one $NEAR should be passed in as "1" and NOT "1000000000000000000000000" */ - amountNear?: 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. */ - successUrl?: string -} - -// Withdraw your balance back into your wallet. -export const withdrawBalance { - /** Account object that if passed in, will be used to sign the txn instead of the funder account. */ - account?: Account, - /** If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. */ - wallet?: AnyWallet, -} - -//This allows you to view your own or other people's Keypom balance. This can be useful to determine -//if you need to top up if you are on the verge of creating a large drop -export const getUserBalance{ - accountId: string -} -``` - - - - -```rust -// Deposit some amount of $NEAR or yoctoNEAR$ into the Keypom contract. This amount can then be used to create drops or add keys without having to explicitly attach a deposit every time. It can be thought of like a bank account. -pub fn add_to_balance(&mut self) - -// Allows users to withdraw their balance -pub fn withdraw_from_balance(&mut self) - -// Return the current balance for a given account -pub fn get_user_balance(&self, account_id: AccountId) -> U128 -``` - - - - - - -For example, Alice wants to add 10 $NEAR to her Keypom balance. She will do this by calling `addToBalance` and transferring 10 $NEAR to the Keypom contract. Then, if Alice wants to create a drop that costs her 5 $NEAR, she can simply create the drop and Keypom will automatically deduct from her internal Keypom balance rather than needing to transfer 5 $NEAR to the contract. - -Once she has created the drop, she can check her balance using `getUserBalance`, which will return 5 $NEAR. Then, she can withdraw this 5 $NEAR into her NEAR wallet; this will cause her Keypom balance to go down to 0 $NEAR. diff --git a/sidebars.js b/sidebars.js index 59aa2102..4da140d3 100644 --- a/sidebars.js +++ b/sidebars.js @@ -32,10 +32,10 @@ const sidebars = { // }, collapsed: false, items: [ - 'Concepts/KeypomProtocol/AssetLoading/asset-types', - 'Concepts/KeypomProtocol/AssetLoading/basic-assets', - 'Concepts/KeypomProtocol/AssetLoading/function-call', - 'Concepts/KeypomProtocol/AssetLoading/asset-configurations', + 'Concepts/KeypomProtocol/Assets/asset-types', + 'Concepts/KeypomProtocol/Assets/basic-assets', + 'Concepts/KeypomProtocol/Assets/function-call', + 'Concepts/KeypomProtocol/Assets/asset-configurations', ], }, 'Concepts/KeypomProtocol/nft-keys', From 3ca27f932c6f3cc9f3338f47ea9a22b8445ffdad Mon Sep 17 00:00:00 2001 From: Min Qian Lu <59981815+minqianlu@users.noreply.github.com> Date: Thu, 28 Sep 2023 16:52:39 -0400 Subject: [PATCH 5/9] fc asset partway done, need to edit back half --- .../KeypomProtocol/Assets/basic-assets.md | 44 ++++++ .../KeypomProtocol/Assets/function-call.md | 140 ++++++++---------- 2 files changed, 107 insertions(+), 77 deletions(-) diff --git a/docs/Concepts/KeypomProtocol/Assets/basic-assets.md b/docs/Concepts/KeypomProtocol/Assets/basic-assets.md index 8ad058fd..5f3862a7 100644 --- a/docs/Concepts/KeypomProtocol/Assets/basic-assets.md +++ b/docs/Concepts/KeypomProtocol/Assets/basic-assets.md @@ -17,9 +17,23 @@ Whenever a NEAR asset is present in a key use, the user will receive some NEAR f ### Structure The structure of a NEAR asset is relatively simple. All that needs to be defined is the amount. Note that if multiple NEAR assets are defined in the same use, the claiming user will receive the sum of `yoctonear` contained in all the NEAR assets. + + + ```rust reference https://github.com/keypom/keypom/blob/8f9f8df397cb8cabbda30d1ddffdcddc4a733274/contract/src/models/external/models.rs#L30-L33 ``` + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de977945/src/lib/types/fc.ts#L68-L74 +``` + + + + ### Funding In the case of NEAR assets, defining and funding are synonomous. This is because the drop creation will fail if insufficient NEAR is provided. This NEAR can come from: @@ -37,9 +51,24 @@ Note that multiple different tokens can be sent at once by simply including more ### Structure When defining an NFT Asset, only one item needs to be specified: * `nft_contract_id`: the contract that the NFT lives on. + + + + ```rust reference https://github.com/keypom/keypom/blob/8f9f8df397cb8cabbda30d1ddffdcddc4a733274/contract/src/models/external/models.rs#L50-L53 ``` + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de977945/src/lib/types/fc.ts#L68-L74 +``` + + + + ### Funding :::caution An improperly loaded NFT Asset will result in **no NFT being sent to the user** @@ -72,9 +101,24 @@ When defining an FT Asset, a few things need to be defined: * *ft_amount*: The amout of Fungible Tokens to be sent. Defined in the smallest divisible unit. For more, see the token's definition of the [decimal value](https://docs.openzeppelin.com/contracts/3.x/erc20#a-note-on-decimals). * *registration_cost*: Specific to each FT contract, this is the cost to register the user on the FT contract. + + + ```rust reference https://github.com/keypom/keypom/blob/8a4009be98f263e93d718779983efcdac1b1a9f8/contract/src/models/external/models.rs#L38-L45 ``` + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de977945/src/lib/types/fc.ts#L68-L74 +``` + + + + + ### Funding :::caution An improperly loaded FT Asset will result in **no FTs being sent to the user** diff --git a/docs/Concepts/KeypomProtocol/Assets/function-call.md b/docs/Concepts/KeypomProtocol/Assets/function-call.md index c65d7bbc..5cc82e03 100644 --- a/docs/Concepts/KeypomProtocol/Assets/function-call.md +++ b/docs/Concepts/KeypomProtocol/Assets/function-call.md @@ -3,123 +3,97 @@ sidebar_label: 'Function Call Asset' --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; + # Function Call Asset -The function call asset is by far the most powerful feature that Keypom provides. FC assets allow **any** method on **any** -contract to be executed (with some exceptions). In addition, there are a huge variety of customizations and features you can choose from when -defining the drop that come on top of the global options. The possibilities are almost endless. State of the art NFT ticketing, -lazy minting NFTs, auto registration into DAOs, analytics for marketing at events and much more. +The function call asset is by far Keypom's most powerful asset class. FC assets allow **any** method on **any** +contract to be executed (with some exceptions). In addition, there are a huge variety of customizations and features you can choose from when defining the drop that come on top of the global options. The possibilities are almost endless. State of the art NFT ticketing, lazy minting NFTs, auto registration into DAOs, analytics for marketing at events and much more. ## How does it work? + +When an a key use containing a Function Call asset is claimed, Keypom will make the predetermined function call. This call works as any normal function call and has a preset receiver, method, and attached deposit but can include user specified arguments, immutable Keypom populated basis-of-truth arguments. -Unlike NFT and FT assets, the function calls must have everything paid for **upfront**. There is no two step process -so the creation is similar to Simple assets. Once the drop is created and keys are added, you can immediately start using it. -### Function Call Config +## Structure -When creating the drop, you have quite a lot of customization available. At the top level, there is a FC drop global -config similar to how the *general* config works. +A Function Call Asset is defined by a vector of `MethodData`, which indicates a vector of function calls. Each `MethodData` represents a single function call, meaning that since an FC asset is defined with a vector of `MethodData`, multiple function calls can be made in a single key use. +The `MethodData` object outlines the following: - - +* `receiver_id`: The contract on the receiving end of the function call. +* `method_name`: The desired method to be called. +* `args`: Arguments to be included in the function call, JSON stringified. +* `attached_deposit`: Amount of yoctoNEAR to attach to the function call. +* `attached_gas`: Amount of gas for this method +* `keypom_args`: Immutable Keypom populated basis-of-truth arguments, you specify the location and Keypom will inject certain values into these JSON locations within `args`. These cannot be spoofed, for more info see [below](#keypom-arguments) +* `receiver_to_claimer`: Boolean that allows the claimer to become the receiver +* `user_args_rule`: Rules outlining the behaviour of user inputs and predefined `args` when claiming. -```ts reference -https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de977945/src/lib/types/fc.ts#L68-L74 -``` - + ```rust reference -https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/models/fc_model.rs#L53-L58 +https://github.com/keypom/keypom/blob/8f9f8df397cb8cabbda30d1ddffdcddc4a733274/contract/src/assets/function_call/models.rs#L6-L26 ``` - - - -### `Method`/`MethodData` - -In addition to the global config, the user can specify a set of what's known as `Method`. This represents the -information for the function being called. Within this data, there are also a few optional configurations you can use -to extend your use cases. You'll see how powerful these can be in the use cases [section](#use-cases). - - ```ts reference -https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de977945/src/lib/types/fc.ts#L7-L63 -``` - - - - -```rust reference -https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/models/fc_model.rs#L18-L48 +https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de977945/src/lib/types/fc.ts#L68-L74 ``` +## Execution -`Method`/`MethodData` keeps track of the method being called, receiver, arguments, and attached deposit. In addition, there are -some optional fields that can be used to extend the use cases. If you have a contract that requires some more context from -Keypom such as the drop ID, key ID, or account ID that used the key, these can all be specified. - -We've kept it generic such that you can specify the actual argument name that these will be passed in as. For example, if you -had a contract that would lazy mint an NFT and it required the account to be passed in as `receiver_id`, you could specify -an `account_id_field` set to `receiver_id` such that Keypom will automatically pass in the account ID that used the key under the -field `receiver_id`. +For **every Function Call Asset**, you can specify a *vector* of `MethodData` which allows you to execute multiple function calls for each asset. These calls are scheduled 1 by 1 using a simple for loop. This means that most of the time, the function calls will be executed in the order specified in the vector but it is not *guaranteed*. -This logic extends to the drop ID, and key Id as well. +## Injecting Keypom Arguments +Prior to calling the function defined in each `MethodData`, the Keypom contract will **automatically** modify the outgoing arguments according to the defined `keypom_args`. -### Key Uses +For example, if the `account_id_field` is set to `"claiming_account"`, then Keypom will inject the claiming account's IDs into the `claiming_account` field in the args. In addition, arguments can be injected into nested fields by using object dot notation; `funder_id_field: "creator.account_id"` will inject the drop funder's account ID into the `creator` object under the field `account_id`. If specified fields do not exist, Keypom will create them. -For **every key use**, you can specify a *vector* of `Method`/`MethodData` which allows you to execute multiple function calls each -time a key is used. These calls are scheduled 1 by 1 using a simple for loop. This means that most of the time, the function -calls will be executed in the order specified in the vector but it is not *guaranteed*. +When a key is used and a function is called, an data structure is **automatically** attached to the arguments, known as the `keypom_args`. It contains the information that the drop creator specified in the `MethodData.keypom_args`. -It's important to note that the Gas available is split evenly between *all* the function calls and if there are too many, -you might run into issues with not having enough Gas. You're responsible for ensuring that this doesn't happen. +```rust reference +https://github.com/keypom/keypom/blob/8f9f8df397cb8cabbda30d1ddffdcddc4a733274/contract/src/assets/function_call/models.rs#L32-L45 +``` -The vector of `Method`/`MethodData` is *optional* for each key use. If a key use has `null` rather than `Some(Vector)` or `Maybe>`, -it will decrement the uses and work as normal such that the `throttle_timestamp, `start_timestamp` etc. are enforced. The only -difference is that after the key uses are decremented and these checks are performed, the execution **finishes early**. The null -case does **not** create an account or send *any* funds. It doesn't invoke any function calls and simply *returns once the -checks are done*. This makes the null case act as a "burner" where you disregard any logic. This has many uses which will -be explored in the use cases [section](#use-cases). -If a key has more than 1 use, you can specify a *different vector* of `Method`/`MethodData` for **each use**. As an example, you could -specify that the first use will result in a null case and the second use will result in a lazy minting function being called. -If you have multiple uses but want them all to do the same thing, you don't have to repeat the same data. Passing in only 1 -vector of `Method`/`MethodData` will result in **all the uses** inheriting that data. +This additional data structure allows receiving contracts to protect themselves from malicious calls by ensuring that critical pieces of information are correct. For example, if a contract knows that `claiming_account_id` should be automatically injected and only wants to work with drops from a particular funder `moon.near`, they can check the `keypom_args`. -## Security +To ensure that `claiming_account_id` is being injected by Keypom rather than hardcoded, the receiving contract can check that `keypom_args.account_id_field` is set to `claiming_account_id`. -Since all FC assets will be signed by the Keypom contract, there are a few restrictions in place to avoid malicious behaviors. -To avoid users from stealing registered assets from other assets, the following methods cannot be called via FC assets: +To make sure that all claims come from a drop funded by `moon.near`, the drop can inject the funder's account ID using `keypom_args` into any arbitrary field such as `drop_funder`. The receiver contract can then check the value `drop_funder` is `moon.near`, **and** check that `keypom_args.funder_id_field` is set to `drop_funder`. -```rust reference -https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/lib.rs#L926-L934 -``` +:::info +The receiver contract's validation of injected arguments per the examples given above looks like this -In addition, the Keypom contract cannot be the receiver of any function call. This is to avoid people -from calling private methods through FC assets. - -### Keypom Arguments +```rust +#[payable] +pub fn myFunction(&mut self, mint_id: String, claiming_account_id: String, drop_funder: data, keypomArgs: keypom_args) -> Promise { + // Ensure arguments are correct if predecessor is Keypom + if(env::predecessor_account_id() == "v3.keypom.near"){ + //Ensure claiming_account_id was not hardcoded + assert!(keypomArgs.account_id_field == "claiming_account_id", "Call must come from valid Keypom drop"); -When a key is used and a function is called, there is a data structure that is **automatically** attached to the arguments. -This is known as the `keypom_args`. It contains the information that the drop creator specified in the `Method`/`MethodData`. - -```rust reference -https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/stage1/function_call.rs#L17-L22 + // Ensure drop_funder is moon.near and not hardcoded + assert!(drop_funder == "moon.near" && keypomArgs.funder_id_field == "drop_funder", "Call must come from valid Keypom drop"); + } + ... +} ``` +::: + -#### Motivation +### Motivation +By using these injected arguments as a source-of-truth, you can easily create **both** exclusivity and security in your Keypom experiences. Let's say there was an exclusive NFT contract that allowed the Keypom contract to mint NFTs as part of an FC drop. Only Keypom -was given access to mint the NFTs so they could be given out as linkassets. The organizer only wanted links that were part of their +was given access to mint the NFTs so they could be given out as linkdrops. The organizer only wanted links that were part of their drop to be valid. For this reason, the NFT contract would only mint if Keypom called the `nft_mint` function and there was a field `series` passed in and it was equal to the drop ID created by the organizer. @@ -128,7 +102,7 @@ and restrict NFTs to only be minted if: - `series` had a value of 5. - The Keypom contract was the one calling the function. -In order for this to work, when creating the drop, the owner would need to specify that the`drop_id_field` was set to a value of `series` +In order for this to work, when creating the drop, the owner would need to specify that the `drop_id_field` was set to a value of `series` such that the drop ID is correctly passed into the function. The problem with this approach is that the NFT contract has no way of knowing which arguments were sent by the **user** when the drop @@ -143,6 +117,18 @@ been sent by Keypom and what has been manually set by users, the problem is solv an assertion that the `keypom_args` had the `account_id_field` set to `Some(series)` meaning that the incoming `series` field was set by Keypom and not by a malicious user. +## Prohibited Methods + +Since all function calls will be signed by the Keypom contract, there are a few restrictions in place to avoid malicious behaviors. +To avoid users from stealing registered assets from other assets, the following methods cannot be called via FC assets: + +```rust reference +https://github.com/keypom/keypom/blob/7a654aa847f2ce9dedf65755c6a08817eece4666/contract/src/lib.rs#L926-L934 +``` + +In addition, the Keypom contract cannot be the receiver of any function call. This is to avoid people +from calling private methods through FC assets. + ## Use Cases Function call assets are the bread and butter of the Keypom contract. They are the most powerful and complex assets that can currently be created. From ec833217a0384693dcd32e19e4480a58903548b5 Mon Sep 17 00:00:00 2001 From: Min Qian Lu <59981815+minqianlu@users.noreply.github.com> Date: Fri, 13 Oct 2023 16:35:32 -0400 Subject: [PATCH 6/9] slight restructure --- .../Assets/asset-configurations.md | 12 +- .../KeypomProtocol/Assets/function-call.md | 70 +++++------ .../Assets/time-customization.md | 110 ++++++++++++++++++ docs/Concepts/KeypomProtocol/terminology.md | 5 + sidebars.js | 1 + 5 files changed, 156 insertions(+), 42 deletions(-) create mode 100644 docs/Concepts/KeypomProtocol/Assets/time-customization.md diff --git a/docs/Concepts/KeypomProtocol/Assets/asset-configurations.md b/docs/Concepts/KeypomProtocol/Assets/asset-configurations.md index 493608ce..b04b7aa7 100644 --- a/docs/Concepts/KeypomProtocol/Assets/asset-configurations.md +++ b/docs/Concepts/KeypomProtocol/Assets/asset-configurations.md @@ -1,4 +1,14 @@ --- sidebar_label: 'Asset Configurations' --- -# Asset Configurations \ No newline at end of file +import Admonition from '@theme/Admonition'; + +# Asset Configurations + + +For every use on an Access Key, the different types of assets can be mixed to create an infinite number of experiences! + + +```rust reference +https://github.com/keypom/keypom/blob/8f9f8df397cb8cabbda30d1ddffdcddc4a733274/contract/src/models/config.rs#L16-L31 +``` \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/Assets/function-call.md b/docs/Concepts/KeypomProtocol/Assets/function-call.md index 5cc82e03..5416c269 100644 --- a/docs/Concepts/KeypomProtocol/Assets/function-call.md +++ b/docs/Concepts/KeypomProtocol/Assets/function-call.md @@ -11,12 +11,12 @@ contract to be executed (with some exceptions). In addition, there are a huge va ## How does it work? -When an a key use containing a Function Call asset is claimed, Keypom will make the predetermined function call. This call works as any normal function call and has a preset receiver, method, and attached deposit but can include user specified arguments, immutable Keypom populated basis-of-truth arguments. +When an a key use containing a Function Call asset is claimed, Keypom will make the predetermined function call. This call works as any normal function call and has a preset receiver, method, and attached deposit. Beyond these predefined aspects, Function Call assets can also include dynamically defined arguments such as user inputs, and immutable Keypom basis-of-truth arguments. ## Structure -A Function Call Asset is defined by a vector of `MethodData`, which indicates a vector of function calls. Each `MethodData` represents a single function call, meaning that since an FC asset is defined with a vector of `MethodData`, multiple function calls can be made in a single key use. +A Function Call Asset is defined by a **vector of function calls**, which is *represented by a vector of `MethodData`*. Each `MethodData` represents a single function call. Since a Function Call asset is defined with a vector of `MethodData`, multiple function calls can be made in a single key use. The `MethodData` object outlines the following: @@ -52,22 +52,38 @@ https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de97794 For **every Function Call Asset**, you can specify a *vector* of `MethodData` which allows you to execute multiple function calls for each asset. These calls are scheduled 1 by 1 using a simple for loop. This means that most of the time, the function calls will be executed in the order specified in the vector but it is not *guaranteed*. ## Injecting Keypom Arguments -Prior to calling the function defined in each `MethodData`, the Keypom contract will **automatically** modify the outgoing arguments according to the defined `keypom_args`. +Injected Keypom Arguments are arguments that are automatically populated into a function call's outgoing arguments. These arguments are immutable and cannot be spoofed, meaning they allow receiving contracts to use them as a source of truth for certain pieces of information. The following arguments can be injected automatically by Keypom: -For example, if the `account_id_field` is set to `"claiming_account"`, then Keypom will inject the claiming account's IDs into the `claiming_account` field in the args. In addition, arguments can be injected into nested fields by using object dot notation; `funder_id_field: "creator.account_id"` will inject the drop funder's account ID into the `creator` object under the field `account_id`. If specified fields do not exist, Keypom will create them. +* **Claiming Account ID**: This is the account ID that is claiming that particular key use. +* **Drop ID**: This is a unique identifier for each drop. +* **Drop Funder Account ID**: The account ID of the account that created the drop, this can be useful for ensuring only trusted users can trigger certain behaviours in your receiving contract +* **Key ID**: Each key in a drop is identified with an integer key ID. This is **unique in to that specific drop** but not accross multiple different drops. -When a key is used and a function is called, an data structure is **automatically** attached to the arguments, known as the `keypom_args`. It contains the information that the drop creator specified in the `MethodData.keypom_args`. + Prior to function execution, the Keypom contract will **automatically** modify the outgoing arguments according to the defined `keypom_args`. The desired location for these arguments to be injected can be specified using the following data structure. These locations must be specified at drop creation and cannot be changed. ```rust reference https://github.com/keypom/keypom/blob/8f9f8df397cb8cabbda30d1ddffdcddc4a733274/contract/src/assets/function_call/models.rs#L32-L45 ``` +For example, if the `account_id_field` is set to `"claiming_account"`, then Keypom will inject the claiming account's IDs into the `claiming_account` field in the args. -This additional data structure allows receiving contracts to protect themselves from malicious calls by ensuring that critical pieces of information are correct. For example, if a contract knows that `claiming_account_id` should be automatically injected and only wants to work with drops from a particular funder `moon.near`, they can check the `keypom_args`. +Arguments can be injected into nested fields by using object dot notation; `funder_id_field: "creator.account_id"` will inject the drop funder's account ID into the `creator` object under the field `account_id`. If specified fields do not exist, Keypom will create them. Attempting to nest into a non-object will cause the drop creation to fail. -To ensure that `claiming_account_id` is being injected by Keypom rather than hardcoded, the receiving contract can check that `keypom_args.account_id_field` is set to `claiming_account_id`. +### Protect your Contracts and Validate Information with Keypom Args +Take the perspective of the receiver contract form the previous examples. If you expect a certain funder account ID under the `creator` field, how do you know that this value has actually been injected by Keypom and not maliciously hardcoded? That is, how can you know that somebody else didn't create a malicious drop and hardcode the `creator` field to the expected value? -To make sure that all claims come from a drop funded by `moon.near`, the drop can inject the funder's account ID using `keypom_args` into any arbitrary field such as `drop_funder`. The receiver contract can then check the value `drop_funder` is `moon.near`, **and** check that `keypom_args.funder_id_field` is set to `drop_funder`. +Here, `keypom_args` comes in handy. When a key is used and a function is called, a seperate data structure is **automatically** attached to the arguments, known as the `keypom_args`. This object contains informs the receiver contract of the arguments that have been automatically injected and the location in which they were injected. This is information that the drop creator specified in the `MethodData.keypom_args` during drop creation. + +This additional data structure allows receiving contracts to protect themselves from malicious calls by ensuring that critical pieces of information are correct. For example, if a contract + +* Knows that the field `claiming_account_id` should contain information automatically injected by Keypom +* Only wants to work with drops from a particular funder `moon.near` + +They can leverage the `keypom_args` in the following manner. + +To ensure that `claiming_account_id` is being injected by Keypom rather than hardcoded, the receiving contract can check that `keypom_args.account_id_field` is set to `claiming_account_id`. Since Keypom injected arguments cannot be overriden, you know with 100% certainty that whatever value you read in the `claiming_account_id` has been injected by Keypom. + +To make sure that all claims come from a drop funded by `moon.near`, a similar strategy can be employed but this time while also checking the value. The drop can first inject the funder's account ID using `keypom_args` into any arbitrary field such as `creator`. The receiver contract can then check the value `creator` is `moon.near`, **and** check that `keypom_args.funder_id_field` is set to `creator`. If both checks pass, you know with 100% certainty that Keypom populated the `creator` field and that the drop funder was `moon.near` :::info The receiver contract's validation of injected arguments per the examples given above looks like this @@ -75,12 +91,12 @@ The receiver contract's validation of injected arguments per the examples given ```rust #[payable] pub fn myFunction(&mut self, mint_id: String, claiming_account_id: String, drop_funder: data, keypomArgs: keypom_args) -> Promise { - // Ensure arguments are correct if predecessor is Keypom + // If the function call is coming from Keypom, validate arguments if(env::predecessor_account_id() == "v3.keypom.near"){ //Ensure claiming_account_id was not hardcoded assert!(keypomArgs.account_id_field == "claiming_account_id", "Call must come from valid Keypom drop"); - // Ensure drop_funder is moon.near and not hardcoded + // Ensure drop_funder is moon.near AND is not hardcoded assert!(drop_funder == "moon.near" && keypomArgs.funder_id_field == "drop_funder", "Call must come from valid Keypom drop"); } ... @@ -89,34 +105,6 @@ pub fn myFunction(&mut self, mint_id: String, claiming_account_id: String, drop_ ::: -### Motivation -By using these injected arguments as a source-of-truth, you can easily create **both** exclusivity and security in your Keypom experiences. - -Let's say there was an exclusive NFT contract that allowed the Keypom contract to mint NFTs as part of an FC drop. Only Keypom -was given access to mint the NFTs so they could be given out as linkdrops. The organizer only wanted links that were part of their -drop to be valid. For this reason, the NFT contract would only mint if Keypom called the `nft_mint` function and there was a field -`series` passed in and it was equal to the drop ID created by the organizer. - -Let's say the owner created an exclusive drop that happened to have a drop ID of 5. They could then go to the NFT contract -and restrict NFTs to only be minted if: -- `series` had a value of 5. -- The Keypom contract was the one calling the function. - -In order for this to work, when creating the drop, the owner would need to specify that the `drop_id_field` was set to a value of `series` -such that the drop ID is correctly passed into the function. - -The problem with this approach is that the NFT contract has no way of knowing which arguments were sent by the **user** when the drop -was created as part of the MethodData `args` and which arguments are automatically populated by the Keypom contract. There is nothing -stopping a malicious user from creating a new drop that has an ID of 6 but hard-coding in the actual arguments that `series` should have -a value of 5. In this case, the malicious drop would have *no* `drop_id_field` and the NFT contract would have no way of knowing that the -`series` value is malicious. - -This can be prevented if a new field is introduced representing what was automatically injected by the Keypom contract itself. At the -end of the day, Keypom will **always** send correct information to the receiving contracts. If those contracts have a way to know what has -been sent by Keypom and what has been manually set by users, the problem is solved. In the above scenario, the NFT contract would simply add -an assertion that the `keypom_args` had the `account_id_field` set to `Some(series)` meaning that the incoming `series` field was set by Keypom -and not by a malicious user. - ## Prohibited Methods Since all function calls will be signed by the Keypom contract, there are a few restrictions in place to avoid malicious behaviors. @@ -134,7 +122,7 @@ from calling private methods through FC assets. Function call assets are the bread and butter of the Keypom contract. They are the most powerful and complex assets that can currently be created. With this complexity, there are an almost infinite number of use-cases that arise. -### Proof of Attendance Protocols +### Proof of Attendance Protocols [➜](../../../Cookbook/drops/fc.md#attaching-nfts-to-your-fc-drop) A very common use case in the space is what's known as Proof of Attendance. Often times when people go to events, they want a way to prove that they were there. Some traditional approaches would be to submit your wallet address and you would be sent an NFT or some other form of @@ -147,7 +135,7 @@ be lazy minted on-demand such that storage isn't paid up-front for all the token At this point, the event organizers or the funder can distribute links to people that attend the event in-person. These links would then be claimed by users and they would receive the proof of attendance. -### Auto Registration into DAOs +### Auto Registration into DAOs [➜](../../../Tutorials/Advanced/daos/introduction.md) DAOs are a raging topic in crypto. The problem with DAOs, however, is there is a barrier to entry for users that aren't familiar with the specific chain they're built on top of. Users might not have wallets or understand how to interact with contracts. On the contrary, they @@ -171,7 +159,7 @@ accomplishing multisig transactions with zero barrier to entry. The users don't even need to create a new account. They can simply call `claim` when the link is clicked which will fire the cross-contract call to the multisig contract and pass in the keypom arguments that will be cross-checked by that contract. -### NFT Ticketing +### NFT Ticketing [➜](../../../Tutorials/Advanced/ticketing/introduction.md) The problem with current NFT ticketing systems is that they require users to have a wallet. This is a huge barrier to entry for people that are attending events but don't have wallets. In addition, there is often no proof of attendance for the event as the NFT is burned in order diff --git a/docs/Concepts/KeypomProtocol/Assets/time-customization.md b/docs/Concepts/KeypomProtocol/Assets/time-customization.md new file mode 100644 index 00000000..64f238f3 --- /dev/null +++ b/docs/Concepts/KeypomProtocol/Assets/time-customization.md @@ -0,0 +1,110 @@ +--- +sidebar_label: 'Time Configurations' +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Time Configurations +Time configurations are particularly useful in defining limits on ***when*** a key may be used. This can have a wide range of applications from [Subscriptions](../../../Tutorials/Advanced/subscriptions/introduction.md) to [Ticketing](../../../Tutorials/Advanced/ticketing/introduction.md). + + + + +```rust reference +https://github.com/keypom/keypom/blob/8f9f8df397cb8cabbda30d1ddffdcddc4a733274/contract/src/models/config.rs#L35-L54 +``` + + + + +```ts reference +https://github.com/keypom/keypom-js/blob/29c10f949f02f673d4a3cecc21b0f74bca600075/src/lib/types/drops.ts#L87-L112 +``` + + + + +:::tip +All these time parameters are measured in non-leap-nanoseconds and can be tricky to work with. An example struct has been provided [below](#example-time-configuration). +::: + + +--- + +## Start +*Default: none, Keys can be used anytime* + +`Start` time is useful for any drops where you intend to restrict access until a certain time. Setting a `start` time effectively sets an activation time; a time where the keys become usable afterwards. Before a `start` time is reached, if a user tries to `claim` the key or use `create_account_and_claim`, it will not work. + +### Use case +Let's say you are running a concert, and you want to give fans exclusive access using preferred and general admission tickets. Those with preferred admission tickets can enter anytime, even when the band is setting up. General admission, on the other hand, may only enter once the band is set up. + +In this case, you would hand out general admission tickets with a start time in the time configurations and another set of preferred admission tickets with an earlier start time in the time configurations. + +To do this, you would need to create two drops, one for preferred admission and another for general admission. This is because, as covered in the [Drop Configurations Introduction](../GithubReadme/TypesOfDrops/customization-homepage.md), one set of configurations will apply to **all** keys in that drop. + +--- + +## End +*Default: none, Keys can be used anytime* + +The end parameter acts as a deactivation time. This means that once the end time is reached, all the keys in the drop will be deactivated and can no longer be used. + +### Use case +Let's pretend that you are at NEARCON representing an NFT marketplace looking to onboard users onto your platform. Your strategy is to offer an exclusive NFT to users that sign up during NEARCON. + +To do this, you hand out QR codes with an NFT drop embedded in the QR code during the event. To ensure that the users sign up *during* NEARCON, you set the drop configuration's `end` parameter to be the end of NEARCON. + +--- + +## Throttle +*Default: none, Keys can be used anytime* + +The `throttle` parameter controls how much time must pass between key uses. This works great if you want to control how frequently somebody is able to claim their assets. + +### Use case +Pretend you are running an NFT raffle for your latest creation, the MoonNFT. For this raffle, the 20th person claiming their key will be the winner and will receive their own personalized MoonNFT. + +To protect again spam and ensure a fair playing field, you can configure the drop to have a 5 minute cooldown using the `throttle` parameter. This way, a contestant cannot spam claim the key to increase their odds of winning. + +--- + +## Interval +*Default: none, Keys can be used anytime* + +The `interval` parameter is similar to the `throttle` parameter but uses the `start` time as a constant reference. This means if `interval` is every week, the key will become useable on the same day every week, regardless of when the last key use was. + +### Use case +Pretend you have a subscription to Moon's **weekly** dog biscuit delivery service that charges you every Monday. Due to all the horror stories of data breaches and identity theft, you now no longer give out your credit card information. For this reason, you wish to pay with $NEAR but the current linkdrop standard does not allow for a subscription model. + +With Keypom, you can give Moon a multi-use simple drop with a `throttle` parameter set to 2 weeks. This way, Moon will only be able to claim every week, making it a subscription. This is also beneficial in giving a sense of security to Moon, as they can claim later than Monday and know that they will be able to claim again next Monday. + +If, for one week, Moon forgets to claim, he would be able to claim twice the next week. + + +The massive benefit here is that you can have a subscription service in the NEAR ecosystem and never need to expose any of your private information. + + +--- + +## Example Time Configuration + +```ts +const ONE_SECOND_NS = 1e9; + +time: { + // Start time is 30 seconds from now + start: (Date.now() * 1000000) + ONE_SECOND_NS * 30, + + // End time is 5 minutes from start time + end: (Date.now() * 1000000) + ONE_SECOND_NS * 330, + + // Time between use is 15 seconds + throttle: ONE_SECOND_NS * 15, + + // Time after start for first use is 15 seconds + interval: ONE_SECOND_NS * 15, +} +``` + + diff --git a/docs/Concepts/KeypomProtocol/terminology.md b/docs/Concepts/KeypomProtocol/terminology.md index 52e2f534..50508b11 100644 --- a/docs/Concepts/KeypomProtocol/terminology.md +++ b/docs/Concepts/KeypomProtocol/terminology.md @@ -25,6 +25,11 @@ ___ Assets can be NEAR, Fungible Tokens, Non-Fungible Tokens, or FunctionCalls. Each key in a drop holds the same assets, meaning a user can receive any key from the drop and be guarenteed the same set of assets. + +For every use on an Access Key, the different types of assets can be mixed to create an infinite number of experiences! + + + Access Keys can have multiple uses and their assets are defined **per use**. These can be mix-and-matched to craft any experience you want. An example can be seen below: diff --git a/sidebars.js b/sidebars.js index 4da140d3..b2df2102 100644 --- a/sidebars.js +++ b/sidebars.js @@ -36,6 +36,7 @@ const sidebars = { 'Concepts/KeypomProtocol/Assets/basic-assets', 'Concepts/KeypomProtocol/Assets/function-call', 'Concepts/KeypomProtocol/Assets/asset-configurations', + 'Concepts/KeypomProtocol/Assets/time-customization', ], }, 'Concepts/KeypomProtocol/nft-keys', From 0cbf27258d85ec5d4a9acae6c8218dbc7c4a46b5 Mon Sep 17 00:00:00 2001 From: Min Qian Lu <59981815+minqianlu@users.noreply.github.com> Date: Tue, 17 Oct 2023 16:53:48 -0400 Subject: [PATCH 7/9] nft keys, configs, and more --- .../Assets/asset-configurations.md | 77 ++++- .../KeypomProtocol/Assets/asset-types.md | 13 +- .../KeypomProtocol/Assets/basic-assets.md | 22 +- .../KeypomProtocol/Assets/function-call.md | 11 +- .../KeypomProtocol/drop-configurations.md | 6 +- docs/Concepts/KeypomProtocol/nft-keys.md | 323 ++++++++++++++---- 6 files changed, 373 insertions(+), 79 deletions(-) diff --git a/docs/Concepts/KeypomProtocol/Assets/asset-configurations.md b/docs/Concepts/KeypomProtocol/Assets/asset-configurations.md index b04b7aa7..afa3cdc2 100644 --- a/docs/Concepts/KeypomProtocol/Assets/asset-configurations.md +++ b/docs/Concepts/KeypomProtocol/Assets/asset-configurations.md @@ -1,14 +1,79 @@ --- -sidebar_label: 'Asset Configurations' +sidebar_label: 'Key Use Configurations' --- import Admonition from '@theme/Admonition'; -# Asset Configurations +# Key Use Configurations - -For every use on an Access Key, the different types of assets can be mixed to create an infinite number of experiences! - +> For each set of key uses in your drop, different behaviours can be defined to create unique experiences! + +:::info +These configurations apply to a set of key uses, for global configurations see [drop configurations](../drop-configurations.md) +::: + +# What are Key Use Configurations? +Key use configuration defines the expected behaviour for a particular key use in the following aspects: + +* [**Time Configuration**](#time-configuration): Umbrella configuration for all things related to timing, such as claim periods and intervals +* [**Claiming Permissions**](#claiming-permissions): Can/must a new account be created when claiming? +* [**Root Account ID**](#root-account-id): Should accounts created be subaccounts of a particular account? +* [**Account Creation Arguments**](#account-creation-arguments): Upon account creation, what information should Keypom send to the root account? + +The specification for key use configurations can be seen below: ```rust reference https://github.com/keypom/keypom/blob/8f9f8df397cb8cabbda30d1ddffdcddc4a733274/contract/src/models/config.rs#L16-L31 -``` \ No newline at end of file +``` +___ + +## Root Account ID +*Default: `near` or `testnet`* + +The `root_account_id` parameter determines which account the newly-created claiming account will be a sub-account of. For example, the default is `near` so all accounts would end in `.near` such as `benji.near`. Changing the `root_account_id` parameter will change the root of all the accounts that users create through `create_account_and_claim` when using your drop. + +### Use cases +Let's say you have an organization called Moonpom (secretly run by our beloved Pomeranian, Moon) and you want your users want to proudly represent Moonpom! + +You set `root_account_id = "moonpom.near"` and now any account created using your linkdrops will take on the form `${YOUR_USERNAME}.moonpom.near` + +:::caution Important +the `root_account_id` **must** have a contract deployed to it that exposes a method `create_account` to create the sub-account. A sample contract can be found [here](https://github.com/near/near-linkdrop/blob/49279e529c254fa7736465b4a39d05cb8f1e5443/src/lib.rs#L130) +::: + +___ + + +## Claiming Permissions +*Default: `claim` AND `create_account_and_claim`* + +The `permissions` parameter assigns which claim methods the user can call with the key you give them. They can either call both, or just one. + +### Use case +Pretend you are hosting a talk about your NEAR dApp: `Kramerly`. Your only goal is to onboard as many *new* users from the audience as possible. If the user already has a NEAR wallet, they shouldn't be able to claim assets and onboard. This is similar to free-trials in Web2 whereby only new users are able to participate. + +To do this, you can set the `permissions` parameter to `create_account_and_claim`. + +___ + +## Account Creation Arguments +*Default: `null`* + +`account_creation_keypom_args` specifies where certain Keypom arguments should be automatically injected by Keypom upon calling `create_account_and_claim`. This should be used when specifying a custom `root_account_id`, where you have control over the exposed `create_account` method. + +Similar to function call [`keypom_args`](function-call.md#injecting-keypom-arguments), these arguments are immutable and can only be inserted by Keypom. This means that they can be used to validate incoming `create_account_and_claim` calls and prevent malicious attacks against your `root_account` contract. +### Use Case +At NEARCON 2023, attendees used their Keypom keys as their tickets, and create4d accounts with a starting Fungible Token balance ($NCON) to participate in the on-the-ground economy. To do this, their keys called the NEARCON contract's exposed `create_account` method that instantiates a new account with a given starting $NCON balance. + +Say a malicious actor, EvilMoon, wishes to collect $NCON to buy delicious treats. His plan is to create a drop to fraudulently create accounts using the NEARCON contract's exposed `create_account` method without a NEARCON ticket and then sending all the $NCON to himself. + +In order to differentiate the official NEARCON tickets from EvilMoon's malicious drop, the NEARCON contract can leverage `account_creation_keypom_args` to receive the `dropId`, and compare it to the expected `dropId` of the official NEARCON tickets. + +```rust reference +https://github.com/keypom/nearcon-account-factory/blob/d4b0db55b02c37d574f194d91ddd4c5f2bb26576/contract/src/factory.rs#L28-L29 +``` + +--- + +## Time Configuration +### What is it? +Time configurations dictate when and how frequently a key can be claimed. A deep dive on these configurations can be found in the [Time Configurations section](./time-customization.md). diff --git a/docs/Concepts/KeypomProtocol/Assets/asset-types.md b/docs/Concepts/KeypomProtocol/Assets/asset-types.md index 5f062c86..500aa776 100644 --- a/docs/Concepts/KeypomProtocol/Assets/asset-types.md +++ b/docs/Concepts/KeypomProtocol/Assets/asset-types.md @@ -7,7 +7,10 @@ import Admonition from '@theme/Admonition'; # Asset Types ## Basics -> In the Keypom Protocol, an asset it something you attach to every key in your drop. When someone obtains and uses a key, they will receive the assets - either to a new or existing account. + + +In the Keypom Protocol, an asset is something that is attached to every key in your drop. When someone obtains and uses a key, they will receive the assets - either to a new or existing account. + Assets are meant to create new experience and bring value to your users. They can be one of the following: @@ -65,10 +68,10 @@ ___ An important distinction to be made is the difference between defining and funding assets. :::caution -If assets are not properly funded, your drop may not perform as expected. Proper funding is highlighted in each asset type's respective concepts pages and tutorials. +If assets are not properly funded, your drop may not perform as expected. Proper funding is defined in [next section](basic-assets.md). ::: -Defining an asset is similar to creating a blueprint for your drop while funding is the process of building it. A more formal definition can be: +Defining an asset is similar to creating a blueprint for your drop while funding is the process of building it. -* ***Defining an Asset***: This is the process you go through when creating your drop; you outline a particular asset to be available on certain set of uses. Note that the asset is not actually present in the drop after you've defined it. -* ***Funding an Asset***: This happens when you send Keypom the assets required as defined in your drop. This way, Keypom has ownership and can transfer it to the user when they claim their key. \ No newline at end of file +* ***Defining an Asset***: The process of creating a drop and outlining a particular asset to be available on certain set of uses. +* ***Funding an Asset***: Transferring ownership of defined assets to Keypom so that they can be redeemed by users claiming your keys. \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/Assets/basic-assets.md b/docs/Concepts/KeypomProtocol/Assets/basic-assets.md index 5f3862a7..1743175b 100644 --- a/docs/Concepts/KeypomProtocol/Assets/basic-assets.md +++ b/docs/Concepts/KeypomProtocol/Assets/basic-assets.md @@ -6,12 +6,26 @@ import TabItem from '@theme/TabItem'; import Admonition from '@theme/Admonition'; # NEAR, NFT, & FT Assets - -For every use on an Access Key, the different types of assets can be mixed to create an infinite number of experiences! + +For every use on a Key, the different types of assets can be mixed to create an infinite number of experiences! +## Defining vs Funding Assets +An important distinction to be made is the difference between defining and funding assets. + +:::caution +If assets are not properly funded, your drop may not perform as expected. +::: + +Defining an asset is similar to creating a blueprint for your drop while funding is the process of building it. + +* ***Defining an Asset***: The process of creating a drop and outlining a particular asset to be available on certain set of uses. +* ***Funding an Asset***: Transferring ownership of defined assets to Keypom so that they can be redeemed by users claiming your keys. + +___ + ## NEAR Asset -> A NEAR Asset attaches some claimable NEAR to each use it is defined for +> A NEAR Asset attaches some NEAR that will be deposited in the user's account when claiming Whenever a NEAR asset is present in a key use, the user will receive some NEAR for that particular key use. For example, if a key has 2 uses, and a NEAR asset is defined in the first use but not the second, then the user will only receive NEAR the first time they claim their key. @@ -43,7 +57,7 @@ In the case of NEAR assets, defining and funding are synonomous. This is because ___ ## NFT Asset -> A properly funded NFT Asset will allow a user to receive a Non-fungible Token +> A properly funded NFT Asset will allow a user to receive a Non-fungible Token when claiming Whenever an NFT asset is present and properly funded in a key use, the user will receive an NFT for that particular key use. For example, if a key has 2 uses, and an NFT asset is defined in the first use but not the second, then the user will only receive an NFT the first time they claim their key. diff --git a/docs/Concepts/KeypomProtocol/Assets/function-call.md b/docs/Concepts/KeypomProtocol/Assets/function-call.md index 5416c269..1fa35a13 100644 --- a/docs/Concepts/KeypomProtocol/Assets/function-call.md +++ b/docs/Concepts/KeypomProtocol/Assets/function-call.md @@ -3,11 +3,18 @@ sidebar_label: 'Function Call Asset' --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; +import Admonition from '@theme/Admonition'; # Function Call Asset -The function call asset is by far Keypom's most powerful asset class. FC assets allow **any** method on **any** -contract to be executed (with some exceptions). In addition, there are a huge variety of customizations and features you can choose from when defining the drop that come on top of the global options. The possibilities are almost endless. State of the art NFT ticketing, lazy minting NFTs, auto registration into DAOs, analytics for marketing at events and much more. + +For every use on a Key, the different types of assets can be mixed to create an infinite number of experiences! + + +The Function Call asset allows almost **any** method on **any** contract to be executed when claiming. + +These Function Calls can be used for utility, such as NFT ticketing and auto-regtration into DAOs or can carry value such as lazy minting NFTs. Combined with the ability to define function call arguments dynamically based on user input, the FC asset becomes the most versatile and expansive Keypom asset type. + ## How does it work? diff --git a/docs/Concepts/KeypomProtocol/drop-configurations.md b/docs/Concepts/KeypomProtocol/drop-configurations.md index b6280760..ce10eb99 100644 --- a/docs/Concepts/KeypomProtocol/drop-configurations.md +++ b/docs/Concepts/KeypomProtocol/drop-configurations.md @@ -1,3 +1,7 @@ --- sidebar_label: Drop Configurations ---- \ No newline at end of file +--- + +```rust reference +https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/models/config.rs#L59-L78 +``` \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/nft-keys.md b/docs/Concepts/KeypomProtocol/nft-keys.md index 85df4b84..a49a12da 100644 --- a/docs/Concepts/KeypomProtocol/nft-keys.md +++ b/docs/Concepts/KeypomProtocol/nft-keys.md @@ -1,77 +1,278 @@ --- -sidebar_label: 'NFTs and Access Keys' +sidebar_label: 'Tradeable Access Keys' --- import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; +import Admonition from '@theme/Admonition'; -# Keypom Balances -## What is a Keypom Balance? -Let's put on our imagination caps for a second; pretend you're an event host and you are in charge of ticketing for numerous events. You deduce that for the sake of organization, the best approach would be to create separate drops for separate events. - -Being the busy event organizer that you are, sometimes you need to create these drops and keys while on the road. As we can see in the [basic tutorials](../../Tutorials/Basics/simple-drops.md), you need to attach a deposit to every one of your function calls: every time you create a drop, add keys, delete keys etc. This can be a real headache for a busy event organizer! - -This is where the concept of a **Keypom Balance** comes in real handy! - -Every account that uses Keypom carries an internal balance (in $NEAR) on the Keypom contract. Effectively, the Keypom balance is similar to a debit card. You can overload your balance and sip from it as you interact with the contract. - -Let's go back to your event organizer persona; this Keypom Balance allows you to simply preload your "debit card" with loads of $NEAR and then go about your business without needing to worry about transferring $NEAR for ever function call! -## Interacting with Balances -There are a few functions that you can use to interact with your Keypom balance. Let's quickly run through their meanings, and then show some examples! - - - - -```ts -// Deposit some amount of $NEAR or yoctoNEAR$ into the Keypom contract. This amount can then be used to create drops or add keys without having to explicitly attach a deposit every time. It can be thought of like a bank account. -export const addToBalance{ - /** Account object that if passed in, will be used to sign the txn instead of the funder account. */ - account?: Account, - /** If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. */ - wallet?: AnyWallet, - /** Amount of tokens to add but considering the decimal amount (non human-readable). - Transferring one $NEAR should be passed in as "1000000000000000000000000" and NOT "1" */ - amountYocto?: string - /** Human readable format for the amount of tokens to add. - Transferring one $NEAR should be passed in as "1" and NOT "1000000000000000000000000" */ - amountNear?: 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. */ - successUrl?: string -} - -// Withdraw your balance back into your wallet. -export const withdrawBalance { - /** Account object that if passed in, will be used to sign the txn instead of the funder account. */ - account?: Account, - /** If using a browser wallet through wallet selector and that wallet should sign the transaction, pass in the object. */ - wallet?: AnyWallet, -} - -//This allows you to view your own or other people's Keypom balance. This can be useful to determine -//if you need to top up if you are on the verge of creating a large drop -export const getUserBalance{ - accountId: string -} +# Tradeable Access Keys +## What is a Tradeable Access Key? + +Every Keypom access key is linked with an NFT on the contract, giving your access keys NFT buy-sell functionality! + + +A tradeable access key allows you to sell, transfer and buy access keys, all securely on-chain. This creates an entirely new possibility of a secondary market and economy of access keys. This is particularly relevent to the field of event ticketing, where access keys as tickets hold high intrinsic value. + +In addition, since the access keys are associated with NFTs and leveraging technology defined by the [NFT standards](https://nomicon.io/Standards/Tokens/NonFungibleToken), they can work interoperably with any popular NFT marketplaces such as [Mintbase](https://www.mintbase.xyz/). + +:::info +In order to put an access key up for sale or transfer it, you must be one of the following: +* In possesion of the keypair and use it to sign transactions +* The key's owner, similar to the owner of an NFT +* An approved account, as per the NFT approval standard ([NEP-178](https://nomicon.io/Standards/Tokens/NonFungibleToken/ApprovalManagement)) +::: + +___ + +## Owned versus Ownerless Keys +Access Key ownership is similar to NFT ownership in that it allows you transact it directly using the owner's account. This ownership can be transferred between accounts and be forfeitted. + +An ownerless access key is one that does not belong to any particular account, and thus cannot be transacted by any particular account. Rather, they can be transacted if the `nft_transfer` or `nft_approve` methods calls are signed by the access key itself. + +:::tip +Owned and Ownerless keys have the same functionality! +::: + +:::danger +PUT PROPER SCRIPTS BELOW INSTEAD OF TEST SCRIPTS +::: + +### Initializing Owner +When creating a drop with keys or adding keys to a drop, a vector of *key data* is added. + +```rust reference +https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/drop_creation/add_keys.rs#L6-L12 +``` + +This vector represents each access key and any additional data associated with it. The key data object includes a field `key_owner` for specifying an owner account ID. + +```rust reference +https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/models/external/models.rs#L81-L92 +``` + +### Adding Owner +If you added keys to the drop without an owner and wish to retroactively add owners to them, you can do so by using `nft_transfer` and sending it to the new owner. This transaction will need to be signed with the keypair that you wish to give to the new owner. + +Below is a modified example from our contract tests. In this example, the keyair being transferred is used to sign the `nft_transfer` transaction. + +```typescript +// **************** USE KEY ***************** +await keypomV3.setKey(keyPairs.keys[0]); + +// **************** TRANSFER **************** +let newKeyPair = await generateKeyPairs(1); +await functionCall({ + signer: keypomV3, + receiver: keypomV3, + methodName: "nft_transfer", + args: { + token_id: found_key_info.token_id, + receiver_id: bob.accountId, + memo: newKeyPair.publicKeys[0] + } +}) +``` +:::note +The `nft_transfer` function details will be covered [below](#transferring-an-access-key) +::: + +___ + +## Transferring an Access Key +Whether you just sold your access key or are sending it to a friend, transferring ownership of it on-chain is crucial to ensuring that the receiver is secure in knowing that the access key is ***truly*** theirs. If instead, you simply gave someone the keypair, they would have no confirmation that they actually own the key, and that you won't use it to claim the assets or experiences linked with the key. + +For that reason, transferring ownership of an access key is not as simple as just handing over the keypair, and rather involves leveraging `nft_transfer` to transfer on-chain ownership. + +```rust reference +https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/nft_keys/nft_core.rs#L11-L17 +``` + +In order to ensure that you, the previous owner, can no longer transact using the keypair, the access key **must** be swapped with a new keypair, provided as a `publicKey` in the `memo` field. Upon completion of the transfer, the new keypair now holds all the assets and the old keypair is no longer useable. + +### Transfer to Receiver with Account +The simplest case is the one where the receiver already has a NEAR wallet. Here, the transfer is just a normal `nft_transfer` where you include the receiver's account ID. + +:::note +Both owned and ownerless keys can use this method - either with the owner account ID or using the key itself to sign the `nft_transfer` transaction. The `token_id` can be found by calling the method [`get_key_information`](https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/views/keys.rs#L31). +::: + +Shown below is when the owner, Ali, invokes the method and transfer it to Bob. Bob then receives the keypair associated with the `publicKey` specified in the `memo` The ownerless case can be found in the exapndable section below it. + +```typescript +// ************ GENERATE NEW KEY ************ +let newKeyPair = await generateKeyPairs(1); + +// **************** TRANSFER **************** +await functionCall({ + signer: ali, + receiver: keypomV3, + methodName: "nft_transfer", + args: { + token_id: found_key_info.token_id, + receiver_id: bob.accountId, + memo: newKeyPair.publicKeys[0] + } +}) ``` - - +
+ Owner invoked access key transfer +
+

+ +
+Transfer to Account using Key +

+ +The key itself can be used to sign the `nft_transfer` method. -```rust -// Deposit some amount of $NEAR or yoctoNEAR$ into the Keypom contract. This amount can then be used to create drops or add keys without having to explicitly attach a deposit every time. It can be thought of like a bank account. -pub fn add_to_balance(&mut self) +```typescript +// **************** USE KEY ***************** +await keypomV3.setKey(keyPairs.keys[0]); -// Allows users to withdraw their balance -pub fn withdraw_from_balance(&mut self) +// ************ GENERATE NEW KEY ************ +let newKeyPair = await generateKeyPairs(1); -// Return the current balance for a given account -pub fn get_user_balance(&self, account_id: AccountId) -> U128 +// **************** TRANSFER **************** +await functionCall({ + signer: keypomV3, + receiver: keypomV3, + methodName: "nft_transfer", + args: { + token_id: found_key_info.token_id, + receiver_id: bob.accountId, + memo: newKeyPair.publicKeys[0] + } +}) ``` - - +

+
+After this transfer, the receiver Bob can use this access key or trade/sell it using the same method, signing the `nft_transfer` method with his account ID. Giving Bob the new access key keypair is not necessary as he can sign with his own account but is highly recommended. +### Transfer to Receiver without Account +In this scenario, the transfer works the same way as a receiver with an account, but with one **major** difference. The new keypair defined by the `memo`'s `publicKey` ***must*** be kept track of. This is because the receiver can only transact this access key with this keypair. -For example, Alice wants to add 10 $NEAR to her Keypom balance. She will do this by calling `addToBalance` and transferring 10 $NEAR to the Keypom contract. Then, if Alice wants to create a drop that costs her 5 $NEAR, she can simply create the drop and Keypom will automatically deduct from her internal Keypom balance rather than needing to transfer 5 $NEAR to the contract. +:::caution +If the receiver does not receive the new keypair, they cannot continue to trade or sell the access key. +::: + +The rest of the process is exactly the same as the previous case transfering to a receiver with an account, except no `receiverId` is specified + +:::note +Both owned and ownerless keys can use this method - either with the owner account ID or using the key itself to sign the `nft_transfer` transaction. The `token_id` can be found by calling the method [`get_key_information`](https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/views/keys.rs#L31). +::: + +Shown below is when the owner, Ali, invokes the method and transfer it to no receiver account ID. The receiver should receive the keypair associated with the `publicKey` specified in the `memo` The ownerless case can be found in the exapndable section below it. + +```typescript +// ************ GENERATE NEW KEY ************ +let newKeyPair = await generateKeyPairs(1); + +// **************** TRANSFER **************** +await functionCall({ + signer: ali, + receiver: keypomV3, + methodName: "nft_transfer", + args: { + token_id: found_key_info.token_id, + memo: newKeyPair.publicKeys[0] + } +}) +``` + +
+ Owner invoked access key transfer +
+

+ +
+Transfer to Account using Key +

+ +The key itself can be used to sign the `nft_transfer` method. + +```typescript +// **************** USE KEY ***************** +await keypomV3.setKey(keyPairs.keys[0]); + +// ************ GENERATE NEW KEY ************ +let newKeyPair = await generateKeyPairs(1); + +// **************** TRANSFER **************** +await functionCall({ + signer: keypomV3, + receiver: keypomV3, + methodName: "nft_transfer", + args: { + token_id: found_key_info.token_id, + memo: newKeyPair.publicKeys[0] + } +}) +``` + +

+
+ +After this transfer, the receiver Bob can use this access key or trade/sell it using the same method, signing the `nft_transfer` method with his account ID. Giving Bob the new access key keypair is not necessary as he can sign with his own account but is highly recommended. + + +## Approving Marketplaces to Transact your Access Key +In order for your access key to be listed on a marketplace, such that the marketplace can sell and transfer your key for you, you must approve them, according to the NFT approval standard, [NEP-178](https://nomicon.io/Standards/Tokens/NonFungibleToken/ApprovalManagement). + +You can generate new approvals for different accounts/marketplaces by using the `nft_approve` method shown below. + +```rust reference +https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/nft_keys/approval.rs#L7C5-L7C105 +``` + +:::note +Both owned and ownerless keys can use this method - either with the owner account ID or using the key itself to sign the `nft_approve` transaction. The `token_id` can be found by calling the method [`get_key_information`](https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/views/keys.rs#L31). +::: + +Shown below is when the owner invokes the method. The ownerless case can be found in the exapndable section below it. + +```typescript +// **************** APPROVE **************** +await functionCall({ + signer: ali, + receiver: keypomV3, + methodName: "nft_approve", + args: { + token_id: token_id, + account_id: mintbase.accountId, + } +}) +``` + +
+ Owner invoked access key approval +
+

+ + +
+Approval using the Key +

+ +The key itself can be used to sign the `nft_approve` method. + +```typescript +// **************** USE KEY ***************** +await keypomV3.setKey(keyPairs.keys[0]); + +// **************** APPROVE **************** +await functionCall({ + signer: keypomV3, + receiver: keypomV3, + methodName: "nft_approve", + args: { + token_id: token_id, + account_id: mintbase.accountId, + } +}) +``` -Once she has created the drop, she can check her balance using `getUserBalance`, which will return 5 $NEAR. Then, she can withdraw this 5 $NEAR into her NEAR wallet; this will cause her Keypom balance to go down to 0 $NEAR. +

+
From e530a3496ee423842e0ba7edd25d44fc1ccae9ba Mon Sep 17 00:00:00 2001 From: Min Qian Lu <59981815+minqianlu@users.noreply.github.com> Date: Tue, 16 Jan 2024 22:05:16 -0500 Subject: [PATCH 8/9] overhaul of major concepts pages, WIP --- .../KeypomProtocol/Assets/asset-types.md | 15 +-- .../KeypomProtocol/Assets/basic-assets.md | 22 +-- .../KeypomProtocol/Assets/function-call.md | 11 +- ...gurations.md => key-use-configurations.md} | 0 .../KeypomProtocol/drop-configurations.md | 125 +++++++++++++++++- docs/Concepts/KeypomProtocol/drop.md | 2 +- docs/Concepts/KeypomProtocol/nft-keys.md | 7 + .../{GithubReadme => }/password-protect.md | 111 ++++++++++++---- docs/Concepts/KeypomProtocol/terminology.md | 8 +- .../Advanced/ticketing/architecture.md | 2 +- docs/exec-summary.md | 4 + sidebars.js | 4 +- static/img/nearcon-tickets.png | Bin 0 -> 1257748 bytes 13 files changed, 252 insertions(+), 59 deletions(-) rename docs/Concepts/KeypomProtocol/Assets/{asset-configurations.md => key-use-configurations.md} (100%) rename docs/Concepts/KeypomProtocol/{GithubReadme => }/password-protect.md (78%) create mode 100644 static/img/nearcon-tickets.png diff --git a/docs/Concepts/KeypomProtocol/Assets/asset-types.md b/docs/Concepts/KeypomProtocol/Assets/asset-types.md index 500aa776..3e134a31 100644 --- a/docs/Concepts/KeypomProtocol/Assets/asset-types.md +++ b/docs/Concepts/KeypomProtocol/Assets/asset-types.md @@ -12,7 +12,7 @@ import Admonition from '@theme/Admonition'; In the Keypom Protocol, an asset is something that is attached to every key in your drop. When someone obtains and uses a key, they will receive the assets - either to a new or existing account.
-Assets are meant to create new experience and bring value to your users. They can be one of the following: +Assets are meant to create new experience and bring value to your users. There can be any number of mixed and matched assets for each key use. Assets can take on the following types: * **NEAR** * **Fungible Tokens** @@ -54,7 +54,7 @@ New with Keypom V3, you can mix-and-match and add multiple different types of as

Function Call Assets

-

Supercharge your drop with any NEAR smart contract

+

Call any NEAR smart contract

@@ -65,13 +65,8 @@ New with Keypom V3, you can mix-and-match and add multiple different types of as ___ ## Defining vs Funding Assets -An important distinction to be made is the difference between defining and funding assets. +An important distinction to be made is the difference between defining and funding assets. Defining an asset is similar to creating a blueprint for your drop while funding is the process of building it. :::caution -If assets are not properly funded, your drop may not perform as expected. Proper funding is defined in [next section](basic-assets.md). -::: - -Defining an asset is similar to creating a blueprint for your drop while funding is the process of building it. - -* ***Defining an Asset***: The process of creating a drop and outlining a particular asset to be available on certain set of uses. -* ***Funding an Asset***: Transferring ownership of defined assets to Keypom so that they can be redeemed by users claiming your keys. \ No newline at end of file +If assets are not properly funded, your drop may not perform as expected. Proper funding is formally defined in [next section](basic-assets.md). +::: \ No newline at end of file diff --git a/docs/Concepts/KeypomProtocol/Assets/basic-assets.md b/docs/Concepts/KeypomProtocol/Assets/basic-assets.md index 1743175b..d76a182d 100644 --- a/docs/Concepts/KeypomProtocol/Assets/basic-assets.md +++ b/docs/Concepts/KeypomProtocol/Assets/basic-assets.md @@ -11,17 +11,17 @@ For every use on a Key, the different types of assets can be mixed to create an ## Defining vs Funding Assets -An important distinction to be made is the difference between defining and funding assets. +An important distinction to be made is the difference between defining and funding assets. Defining an asset is similar to creating a blueprint for your drop while funding is the process of building it. -:::caution -If assets are not properly funded, your drop may not perform as expected. -::: - -Defining an asset is similar to creating a blueprint for your drop while funding is the process of building it. +* ***Defining an Asset***: The process of creating a drop and outlining the behaviour expected for your keys. At this point, you've created a blueprint of your drop's expected assets but have not built it out. -* ***Defining an Asset***: The process of creating a drop and outlining a particular asset to be available on certain set of uses. * ***Funding an Asset***: Transferring ownership of defined assets to Keypom so that they can be redeemed by users claiming your keys. +Once a drop's assets have been defined and funded, keys can be used properly. + +:::caution +If assets are not properly funded, users of your drop will not receive the assets promised to them. +::: ___ ## NEAR Asset @@ -61,7 +61,7 @@ ___ Whenever an NFT asset is present and properly funded in a key use, the user will receive an NFT for that particular key use. For example, if a key has 2 uses, and an NFT asset is defined in the first use but not the second, then the user will only receive an NFT the first time they claim their key. -Note that multiple different tokens can be sent at once by simply including more NFT Assets. +Note that multiple different tokens can be sent at once by defining additional NFT Assets following the structure below. ### Structure When defining an NFT Asset, only one item needs to be specified: * `nft_contract_id`: the contract that the NFT lives on. @@ -92,7 +92,7 @@ In order to fund an NFT asset, you must transfer it to the Keypom contract: `v3. It is important that when transferring, you are transferring from the contract that you defined above. It is also important to include the `dropId` as a `msg`. This tells Keypom to associate the incoming NFT with your drop. ```js reference -https://github.com/keypom/keypom/blob/8a4009be98f263e93d718779983efcdac1b1a9f8/__tests__/creation/nft-creation.ava.ts#L189-L199 +https://github.com/keypom/keypom/blob/b5ee9ddde16cc604fea2da83c6368e2ea3461b81/__tests__/creation/nft-creation.ava.ts#L189-L199 ``` In the case where you have multiple NFT Assets, you will need to transfer the appropriate number of NFTs. For example, if you have 5 keys with 2 NFT Assets each, you will need to transfer 10 NFTs to Keypom. @@ -108,7 +108,7 @@ ___ Whenever an FT asset is present and properly funded in a key use, the user will receive a set amount of FTs for that particular key use. For example, if a key has 2 uses, and an FT asset is defined in the first use but not the second, then the user will only receive an the predefined amount of FTs the first time they claim their key. -Note that multiple different tokens can be sent at once by simply including more FT Assets. +Note that multiple different tokens can be sent at once by defining additional NFT Assets following the structure below. ### Structure When defining an FT Asset, a few things need to be defined: * *ft_contract_id*: The Fungible Token contract. @@ -142,7 +142,7 @@ In order to fund a Fungible Token asset, you must transfer it to the Keypom cont It is important that when transferring, you are transferring from the contract that you defined above. It is also important to include the `dropId` as a `msg`. This tells Keypom to associate the incoming NFT with your drop. ```js reference -https://github.com/keypom/keypom/blob/8a4009be98f263e93d718779983efcdac1b1a9f8/__tests__/utils/ft-utils.ts#L17-L28 +https://github.com/keypom/keypom/blob/b5ee9ddde16cc604fea2da83c6368e2ea3461b81/__tests__/utils/ft-utils.ts#L17-L28 ``` :::note Anybody can fund a drop's FT Assets diff --git a/docs/Concepts/KeypomProtocol/Assets/function-call.md b/docs/Concepts/KeypomProtocol/Assets/function-call.md index 1fa35a13..e74917ba 100644 --- a/docs/Concepts/KeypomProtocol/Assets/function-call.md +++ b/docs/Concepts/KeypomProtocol/Assets/function-call.md @@ -23,7 +23,7 @@ When an a key use containing a Function Call asset is claimed, Keypom will make ## Structure -A Function Call Asset is defined by a **vector of function calls**, which is *represented by a vector of `MethodData`*. Each `MethodData` represents a single function call. Since a Function Call asset is defined with a vector of `MethodData`, multiple function calls can be made in a single key use. +A Function Call Asset is defined by a **vector of function calls** with each call being represented by a `MethodData` object. Since a Function Call asset is defined with a vector of `MethodData`, multiple function calls can be made in a single key use. The `MethodData` object outlines the following: @@ -59,6 +59,8 @@ https://github.com/keypom/keypom-js/blob/e8c43f4219a79afb3c367296cc90b8d5de97794 For **every Function Call Asset**, you can specify a *vector* of `MethodData` which allows you to execute multiple function calls for each asset. These calls are scheduled 1 by 1 using a simple for loop. This means that most of the time, the function calls will be executed in the order specified in the vector but it is not *guaranteed*. ## Injecting Keypom Arguments +> Automatically injected immutable arguments acting as sources of truth + Injected Keypom Arguments are arguments that are automatically populated into a function call's outgoing arguments. These arguments are immutable and cannot be spoofed, meaning they allow receiving contracts to use them as a source of truth for certain pieces of information. The following arguments can be injected automatically by Keypom: * **Claiming Account ID**: This is the account ID that is claiming that particular key use. @@ -66,7 +68,10 @@ Injected Keypom Arguments are arguments that are automatically populated into a * **Drop Funder Account ID**: The account ID of the account that created the drop, this can be useful for ensuring only trusted users can trigger certain behaviours in your receiving contract * **Key ID**: Each key in a drop is identified with an integer key ID. This is **unique in to that specific drop** but not accross multiple different drops. - Prior to function execution, the Keypom contract will **automatically** modify the outgoing arguments according to the defined `keypom_args`. The desired location for these arguments to be injected can be specified using the following data structure. These locations must be specified at drop creation and cannot be changed. +Prior to function execution, the Keypom contract will **automatically** modify the outgoing arguments according to the defined `keypom_args`. The desired location for these arguments to be injected can be specified using the following data structure. +:::note +Keypom Arguments target locations must be specified at drop creation and cannot be changed. +::: ```rust reference https://github.com/keypom/keypom/blob/8f9f8df397cb8cabbda30d1ddffdcddc4a733274/contract/src/assets/function_call/models.rs#L32-L45 @@ -76,7 +81,7 @@ For example, if the `account_id_field` is set to `"claiming_account"`, then Keyp Arguments can be injected into nested fields by using object dot notation; `funder_id_field: "creator.account_id"` will inject the drop funder's account ID into the `creator` object under the field `account_id`. If specified fields do not exist, Keypom will create them. Attempting to nest into a non-object will cause the drop creation to fail. -### Protect your Contracts and Validate Information with Keypom Args +### Protect your Receiving Contracts with Keypom Args Take the perspective of the receiver contract form the previous examples. If you expect a certain funder account ID under the `creator` field, how do you know that this value has actually been injected by Keypom and not maliciously hardcoded? That is, how can you know that somebody else didn't create a malicious drop and hardcode the `creator` field to the expected value? Here, `keypom_args` comes in handy. When a key is used and a function is called, a seperate data structure is **automatically** attached to the arguments, known as the `keypom_args`. This object contains informs the receiver contract of the arguments that have been automatically injected and the location in which they were injected. This is information that the drop creator specified in the `MethodData.keypom_args` during drop creation. diff --git a/docs/Concepts/KeypomProtocol/Assets/asset-configurations.md b/docs/Concepts/KeypomProtocol/Assets/key-use-configurations.md similarity index 100% rename from docs/Concepts/KeypomProtocol/Assets/asset-configurations.md rename to docs/Concepts/KeypomProtocol/Assets/key-use-configurations.md diff --git a/docs/Concepts/KeypomProtocol/drop-configurations.md b/docs/Concepts/KeypomProtocol/drop-configurations.md index ce10eb99..407ec7fd 100644 --- a/docs/Concepts/KeypomProtocol/drop-configurations.md +++ b/docs/Concepts/KeypomProtocol/drop-configurations.md @@ -1,7 +1,130 @@ --- sidebar_label: Drop Configurations --- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import Admonition from '@theme/Admonition'; + +# Drop Configurations + +> Drop configurations are ways you can customize your drops **globally**. This means they apply to the entire drop, for all keys and key uses + +:::info +These configurations apply to your entire drop. For more granular configurations see [key use configurations](./Assets/key-use-configurations) +::: + +# What are Drop Configurations? +Drop configuration define the expected behaviour for an entire drop in the following aspects: + +* [**Add Key Allowlist**](#add-key-allowlist): Allow others to add keys to your drop, useful for selling tickets. +* [**NFT Key Configuration**](#nft-key-configuration): Customize NFTs associated with your access keys. +* [**Delete Empty Drop**](#delete-empty-drop): What happens when all the keys in your drop are used? +* [**Drop Metadata**](#drop-metadata): Drop specific information +* [**Extra Key Allowance**](#extra-key-allowance): The amount of extra key allowance to be added to dynamically calculated allowance. + +Below is the structure of the drop configuration struct, `DropConfig`: ```rust reference https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/models/config.rs#L59-L78 -``` \ No newline at end of file +``` + +___ + +## Add Key Allowlist +> *Default: null* + +`add_key_allowlist` is a vector of account IDs that controls which accounts have permissions to add keys to drop using the [`add_keys`](https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/drop_creation/add_keys.rs#L6) method. + +:::caution +Note that this ***must*** be defined at the time of *drop creation* and cannot be modified once the drop has been created. +::: + +### Use Case +Whilst linking NFTs with Access Keys has helped open up a secondary market for Access Keys, `add_key_allowlist` enables you to create a primary market. This was the technique leveraged to sell NEARCON 2023 tickets! + +

+ ticketing +

+ + +To do this, you can allow a primary market, in this case [Veriken](https://nearcon2023.veriken.app/), to add keys to your NEARCON drop using `add_key_allowlist`. Then, once Veriken handles and confirms the customer's payment, they simply call `add_keys` for each ticket purchased and then distribute the ticket to the customer. +___ + +## NFT Key Configuration +> *Default: [Keypom NFT](https://www.mintbase.xyz/meta/ncon23.keypom.near%3A46d3371766753c9d1a29e2b486438c7c) with metadata defined [here](https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/nft_keys/metadata.rs#L73-L81) and null royalties* + +Every access key in your drop is linked with an NFT, opening up the possibility of buying, selling and trading access keys using [NFT standards](https://nomicon.io/Standards/Tokens/NonFungibleToken) methods such as `nft_transfer` and `nft_approve`. This NFT contains metadata and royalties defined in the `NFTKeyConfigurations` object at time of drop creation. + +```rust reference +https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/nft_keys/metadata.rs#L45-L51 +``` + +:::caution +NFT Key Configurations can only be specified at drop creation, and cannot be changed after that. +::: + +This NFT metadata follows the definition specified in the NFT Metadata standard ([NEP-177](https://nomicon.io/Standards/Tokens/NonFungibleToken/Metadata)). + +```rust reference +https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/nft_keys/metadata.rs#L15-L22 +``` + +### Use Case +Suppose Benji is hosting his own conference known as BenjiCON. He wishes to create a seamless ticketing experience for his guests and chooses Keypom accordingly. When listing tickets on trusted secondary marketplaces such as Mintbase, he wants them to be represented by NFTs depicting him holding Moon. He also wishes to send 30% of all proceeds from secondary ticket sales to his beloved pomeranian Moon. + +To do this, he initializes a drop, whith the following `NFTKeyConfigurations`. + +```javascript +myNFTKeyConfig = { + token_metadata: { + title: "BenjiCON 2024", + description: 'Welcome to BenjiCON!', + media: '${IPFS link of image of Benjis face}', + media_hash: undefined, + . + . + reference_hash: undefined + }, + royalties: { + moon: 3000 + originalOwner: 7000 + } +} +``` + +:::note +Royalties are expressed as integers out of 10,000 +::: + +___ + +## Delete Empty Drop +> *Default: True, empty drops will automatically be deleted* + +This configuration specifies whether or not drops that have depleted all their keys should be deleted or not. By default, they will be deleted. + +### Use Case +Moon is running his annual MoonCON conference and chooses to use Keypom access keys linked with NFTs to represent tickets. Tickets can be bought at the door and only have 1 key use that is used to enter the conference. + +In this scenario, since Moon does not know how many people will attend the event, he chooses to set `delete_empty_drop` to false. This way, if he has 5 tickets and they end up being used right away, a 6th person buying a ticket at the event can still do so using the same drop. + +:::note +Drops can only be deleted by calling `delete_keys` and deleting all the keys. That is, creating a drop with 0 keys will **not** result in the drop being deleted right away. To delete an empty drop, simply call `delete_keys` with the empty drop's `drop_id` +::: + +___ + +## Extra Key Allowance +> *Default: 0* + +An extra amount of NEAR to be added to an access key's allowance. + +___ + +## Drop Metadata +> *Default: null* + +`drop_metadata` is a string that allows you to store any other information you wish to associate with the drop, such as the drop's purpose. + +___ + diff --git a/docs/Concepts/KeypomProtocol/drop.md b/docs/Concepts/KeypomProtocol/drop.md index c16a4d09..35b6367d 100644 --- a/docs/Concepts/KeypomProtocol/drop.md +++ b/docs/Concepts/KeypomProtocol/drop.md @@ -73,7 +73,7 @@ This behaviour is the same accross all the keys in the drop. As the drop funder,
- +

Asset Configuration

diff --git a/docs/Concepts/KeypomProtocol/nft-keys.md b/docs/Concepts/KeypomProtocol/nft-keys.md index a49a12da..d1e586ab 100644 --- a/docs/Concepts/KeypomProtocol/nft-keys.md +++ b/docs/Concepts/KeypomProtocol/nft-keys.md @@ -24,6 +24,13 @@ In order to put an access key up for sale or transfer it, you must be one of the ___ +## Customizing NFTs associated with your Keys +Since your access keys are now linked with NFTs, you can now change the NFT metadata such as media, title, description and more in accordance to the NFT standard ([NEP-177](https://nomicon.io/Standards/Tokens/NonFungibleToken/Metadata)). This will change the way your access keys appear on NFT marketplaces. + +This customization applies to **all** access keys in your drop. Details on this can be found in the NFT Key Configuration section of the [drop configurations](drop-configurations.md#nft-key-configuration) page. + +___ + ## Owned versus Ownerless Keys Access Key ownership is similar to NFT ownership in that it allows you transact it directly using the owner's account. This ownership can be transferred between accounts and be forfeitted. diff --git a/docs/Concepts/KeypomProtocol/GithubReadme/password-protect.md b/docs/Concepts/KeypomProtocol/password-protect.md similarity index 78% rename from docs/Concepts/KeypomProtocol/GithubReadme/password-protect.md rename to docs/Concepts/KeypomProtocol/password-protect.md index 17505d2d..54be9f24 100644 --- a/docs/Concepts/KeypomProtocol/GithubReadme/password-protect.md +++ b/docs/Concepts/KeypomProtocol/password-protect.md @@ -9,7 +9,9 @@ import TabItem from '@theme/TabItem'; Password protecting key uses is an extremely powerful feature that can unlock many use-cases. Keypom has baked flexibility and customization into the contract such that almost all use-cases involving password protection can be accomplished. Whenever a key is added to a drop, it can -have a unique password for each individual use, or it can one password for all uses in general. +have a unique password for each individual use, a set of uses or the same password for all uses. + +___ ## How Does It Work? @@ -22,31 +24,103 @@ each key and having them remember each one, we can have them input a single **ba with the key's public key. This is the most scalable option as it allows the drop funder to only need to remember 1 password and they can derive all the other ones using the -hashing algorithm and public key. +hashing algorithm, public key, and current key use. -In the above scenario, let's say the funder inputs the base password as `mypassword1`. If a user wanted to claim the first key, they would need to input +In the above scenario, let's say the funder inputs the base password as `basepassword1`. If a user wanted to claim the first key, they would need to input into the contract: -`hash("mypassword1" + key1_public_key)` +`hash("basepassword1" + key1_public_key + key_use)` The funder would need to give the user this hash somehow (such as embedding it into the link or having an app that can derive it). It's important to note -that the funder should probably **NOT** give them the base password otherwise the user could derive the passwords for all other keys (assuming those keys have -the same base password). +that the funder should probably **NOT** give them the base password otherwise the user could derive the passwords for all other keys. + +___ ## What is Stored On-Chain? -How does Keypom verify that the user passed in the correct password? If the funder were to simply pass in `hash("mypassword1" + key1_public_key)` into the +How does Keypom verify that the user passed in the correct password? If the funder were to simply pass in `hash("mypassword1" + key1_public_key + key_use)` into the contract as an argument when the key is created, users could just look at the NEAR Explorer and copy that value. -Instead, the funder needs to pass in a double hash when the key is created: `hash(hash("mypassword1" + key1_public_key))`. +Instead, the funder needs to pass in a double hash when the key is created: `hash(hash("mypassword1" + key1_public_key + key_use))`. -This is the value that is stored on-chain and when the user tries to claim the key, they would pass in just the single hash: `hash("mypassword1" + key1_public_key)`. -The contract would then compute `hash(hash("mypassword1" + key1_public_key))` and compare it to the value stored on-chain. If they match, the key is claimed. +This is the value that is stored on-chain and when the user tries to claim the key, they would pass in just the single hash: `hash("mypassword1" + key1_public_key + key_use)`. +The contract would then compute `hash(hash("mypassword1" + key1_public_key + key_use))` and compare it to the value stored on-chain. If they match, the key is claimed. Using this method, the base password is not exposed to the user, nobody can look on-chain or at the NEAR explorer and derive the password, and the password is unique across multiple keys. -# Passwords Per Key Use +___ + +## Defining Passwords + +New with Keypom V3, passwords are *no longer global*. This means that differfent access keys within your drop can have entirely different passwords, or some can have passwords while others have no passwords. + +This is done when adding keys to a drop, either when using `create_drop` or `add_keys`. These methods accept a **vector of keys objects** defined by the following: + +```rust reference +https://github.com/keypom/keypom/blob/807fea5997987cb1a97bee838c4d2312a7faab51/contract/src/models/external/models.rs#L81-L92 +``` + +Notice that `password_by_use` is mapped to each individual key, meaning you have control over the password design for each access key. + +Here, you need to define the key use number and associated password. The password you pass in should be the double hash, `hash(hash("mypassword1" + key1_public_key + key_use))`. An example `password_by_use` implementation is shown below. + +```javascript +password_by_use = { + 1: hash(hash(`${BASE_PASSWORD}${PUBLIC_KEY}1`)) + 3: hash(hash(`${BASE_PASSWORD}${PUBLIC_KEY}3`)) + 5: hash(hash(`${BASE_PASSWORD}${PUBLIC_KEY}5`)) +} +``` +:::note +Notice that not all uses are defined. Undefined uses will have no password +::: + +### Example Helper Function +You'll notice that this process of manually defining each key use password can grow tedious for each key. Below is an example helper function that was used during contract testing and NEARCON ticket generation. This function would return the record shown above. + +
+Example Password Generation Helper Function +

+ +```javascript +let basePassword = "my-example-password" +let password = await generatePasswordsForKey(publicKey.toString(), [1, 3, 5], basePassword); + +async function generatePasswordsForKey(pubKey, usesWithPassword, basePassword) { + let passwords = {}; + + // Loop through usesWithPassword + for (var use of usesWithPassword) { + let pw = basePassword + pubKey + use.toString() + console.log('pw before double hash: ', pw) + let firstHash = hash(pw) + passwords[use] = hash(firstHash, true); + } + + console.log(`pw after double hash: ${passwords[use]}`) + return passwords; +} + +function hash(string, double=false) { + if (double) { + return createHash('sha256').update(Buffer.from(string, 'hex')).digest('hex'); + } + return createHash('sha256').update(Buffer.from(string)).digest('hex'); +} +``` + +

+
+ + +___ + + + + + +## OLD Unlike the passwords per key which is the same for all uses of a key, the drop creator can specify a password for each individual key use. This password follows the same pattern as the passwords per key in that the funder inputs a `hash(hash(SOMETHING))` and then the user would input `hash(SOMETHING)` and the contract @@ -225,18 +299,3 @@ You want users to interact with new features of your site or join your mailing l You can have links where uses are ONLY unlocked if the user interacts with special parts of your site such as buying a new NFT or joining your mailing list or clicking an easter egg button on your site etc. -## dApp Free Trials for Users - -In the upcoming Keypom V2.0, dApps will be able to integrate the Keypom wallet selector plugging to allow for free trials for their users. One of the biggest pain-points with Web3 at the moment is the fact that users need to fund wallets *before* they interact with a dApp. - -In Web2, a user can find value in an application by using it before they go through the messy onboarding process. Why can't Web3 be the same? - -Keypom will allow apps to create links that will automatically sign users into their applications and give them a free trial of the app. The user will be able to interact with things, spend $NEAR, sign transactions and gather assets through the trial. A unique feature of this is that the user will *never be redirected to the NEAR wallet* to approve transactions. - -Keypom will provide a seamless user experience where users can find value in applications. Once the free trial is over and users have collected assets / $NEAR through interacting with the dApp, they can *THEN* choose to onboard. - -With Keypom's technology, users will be locked into only interacting with the dApp specified in the link. Users can't rug the application and steal the $NEAR embedded in the link. The funds are allocated for 1 thing and 1 thing only: free trials of that one specific dApp. - -

- trial accounts -

diff --git a/docs/Concepts/KeypomProtocol/terminology.md b/docs/Concepts/KeypomProtocol/terminology.md index 50508b11..72b01ee6 100644 --- a/docs/Concepts/KeypomProtocol/terminology.md +++ b/docs/Concepts/KeypomProtocol/terminology.md @@ -7,11 +7,11 @@ import Admonition from '@theme/Admonition'; # Foundational Concepts ## Drops vs. Keys -> At its core, Keypom revolves around creating **Drops** and using **Access Keys**. +> Keypom revolves around collections of **Access Keys** called **Drops**. * ***Access Key***: A NEAR keypair, this is what each user receives to start their Keypom experience. * Can have assets, such an NFT, FTs, NEAR or FunctionCalls, associated with them. - * When a user receives a key and claims it, they will receive those assets. + * When a user receives a key and uses it, they will receive those assets. * ***Drop***: A collection of access keys that all share the same traits - such as assets and configurations. * As a funder, you create the drop and fund all the assets * You can add as many keys as you want to the drop, even after its creation. @@ -42,7 +42,7 @@ Access Keys can have multiple uses and their assets are defined **per use**. The This means when the user claims their key for the first time, they will receive a FT, some NEAR and call a set of functions. On the second claim, they will receive an NFT while on the third and final claim, they will receive some NEAR and FTs. -This behaviour is the same accross all the keys in the drop. As the drop funder, you would need to ensure your drop has all the necessary assets to fund all of the keys. For example, if each FT asset represents 1 Go-Team Token and you have 10 keys, you would need to fund your drop with 20 Go-Team Tokens. For more on how to use each asset, see the pages below. +This behaviour is the same accross all the keys in the drop. As the drop funder, you would need to ensure your drop has all the necessary assets to fund all of the keys. Following the above example, if each FT asset represents 1 Go-Team Token and you have 10 keys, you would need to fund your drop with 20 Go-Team Tokens. For more on how to use each asset, see the pages below.
- +

Asset Configuration

diff --git a/docs/Tutorials/Advanced/ticketing/architecture.md b/docs/Tutorials/Advanced/ticketing/architecture.md index 590d1839..922e9f38 100644 --- a/docs/Tutorials/Advanced/ticketing/architecture.md +++ b/docs/Tutorials/Advanced/ticketing/architecture.md @@ -39,7 +39,7 @@ In order to send the attendees a POAP, the second key use will need to not only Currently, anyone with a ticket could manually claim the key (sign transactions) using the Keypom SDK. This means that people could first claim the `null` case and then claim the key again to receive the NFT without physically showing up. -To solve this, the first key use can be protected with a [password](../../../Concepts/KeypomProtocol/GithubReadme/password-protect.md) that only the host knows. This password will be provided when the QR code is scanned. By password protected the uses, the only way to receive the NFT even if you have the ticket, is to be physically scanned by the host. +To solve this, the first key use can be protected with a [password](../../../Concepts/KeypomProtocol/password-protect.md) that only the host knows. This password will be provided when the QR code is scanned. By password protected the uses, the only way to receive the NFT even if you have the ticket, is to be physically scanned by the host. ## Keypom Solution diff --git a/docs/exec-summary.md b/docs/exec-summary.md index a448aa93..c52876f5 100644 --- a/docs/exec-summary.md +++ b/docs/exec-summary.md @@ -1,3 +1,7 @@ +--- +sidebar_label: 'πŸ’‘ Keypom Executive Summary' +--- + # Keypom Executive Summary > To discover the features and details of Keypom, begin your journey [here](Concepts/welcome.md). diff --git a/sidebars.js b/sidebars.js index b2df2102..fb3a18c2 100644 --- a/sidebars.js +++ b/sidebars.js @@ -35,14 +35,14 @@ const sidebars = { 'Concepts/KeypomProtocol/Assets/asset-types', 'Concepts/KeypomProtocol/Assets/basic-assets', 'Concepts/KeypomProtocol/Assets/function-call', - 'Concepts/KeypomProtocol/Assets/asset-configurations', + 'Concepts/KeypomProtocol/Assets/key-use-configurations', 'Concepts/KeypomProtocol/Assets/time-customization', ], }, 'Concepts/KeypomProtocol/nft-keys', 'Concepts/KeypomProtocol/drop-configurations', 'Concepts/KeypomProtocol/balances', - 'Concepts/KeypomProtocol/GithubReadme/password-protect', + 'Concepts/KeypomProtocol/password-protect', { type: 'category', label: 'Overhead Items', diff --git a/static/img/nearcon-tickets.png b/static/img/nearcon-tickets.png new file mode 100644 index 0000000000000000000000000000000000000000..6759b67f7733bf527b43f0cbd673c75454a9738b GIT binary patch literal 1257748 zcmeFZXH-+&)+kI7umLtiI#v(_6zSbYFVZ^^5tJHQfB*rJM^F)>(xe1bN@yXpP(nfx zCDNsYPyQ1tFQ3PHMQ{yZ2D<-aXNW{y;Z(FIOfe-Pg(195&`{ z=d3avT)f$8(N3r8h_0!^Dyaco}mMXw&ihfk}t)8@ir%PDY=OcOvx=FD`tnXxQoWs3j?=v^+pU)N6 zV!!-c+LxUq=o9sd@9f!QkN7YU_ZKg_j>n-DT(Xd@1`KK8Gk9A|At@^FZ5OVeS^sY zsg>pQt?LDU(e5eLV_=qxOdf%+cGsw4tD?rSL+m53L{mt&Wg~vJF*4j*%dW*H%DLYTzb)mjtL+ridp^u3W>3y*Eq;Nb4yg> zFU7hbCSwDz1xUUNHD&vWj(Wb1Fem%ew}X{&~&&W114j4?{FXN50AIRNaJ zm`@yGR(aQy&U`IOQ1scd=X`YVTGpv1=Ev{YHk=4x&ixKQ#k@9&y|19Jv?z5(vGAlNU#Rv)76&MeBU^WGazXVx{w^V=Z&*_HJpe+1!qycJVK54QrBP z7pac~Rx7VopHh7VYcY1_Ez7ZC{p2E6rd`6RdhL5lG5NI@h!Y%__&xCi=*a$x;`)=k zv>U!fAQFgiX<2gGB)K7n+4IA*beng{j=E33%CKa2pZ6Ei>2u66 zd33TfiZc^>VueXVl<7#c?rfJx5=>J0)@V-umgY-_DflIGket9ed>RdtJc~ zZ*ni&zB=_@^!7Wju5ty7E!69d$GctKv;N2Ho(GBsztho`S>xaO>v6&HqL=)it>(p( zqGWrI$}tN;-99JwJ`U7CA90Mc%Bk-ST|XCk3>y{nMdl~-$w%!Ux!m3;KRWsL3)oO=- z@8~kF@pQqFdoR?RGn%gDo~k%%el+i|<6ncmI)CM>O+_DDes%u~S8w|KG5TYPTd_*8 z+K;tSwW%Q=hVCq0;(Dih1@b|?E%lty?{~-b@^V4B%Ev zq?qX_->WkL=aiIq0blOEMEu1FYI1Qldj)a9(j z=;zs)vKF`x+$Ejy;H1gXF4CeUjPRz(h<0-r!miK`8EQ$(-KfR(vfX8XOL?nw{0aUZIlXkN^yYN6uB~)?c@xi| z-ka&l@eii@W_zo9yMLlluj~fxybyv2e}uXn#cp>beZ*%(Z^RrWiGsQZlOCy9sd&NE zV0kJWfj*@0KKVXZ(i(_&VQ|3-4?!y4mC=GCt@CTFmt%-x5OhRYMCqRYF8eMAdu+0CmGt$;#c^Zg-jKGH@&KlDfkR?&iobFf{5{sVbyNc{;Yi|2c!*;XS@Zy zWqlj))|yX5aY_Dj+Gg5OL#wpRn_y!?{_O?uI%?f2w6XBB`^Um>fpPBj3r}x*R^G2X zQ;Bus?z}#Gl4?k`oRym0J%8=I%MCZ10lP8O6?@qml~M$otjchpt9P;&s;Q`%l!nTZ zA4LzL2N?~V_|^%x3L{h($o`8|ivl4in!=+x&^<0aTH3c%q3*HlEK@e|XyVp~n|+?S zzE5aB?71Yk3}Y|F+QsT5s3g2kxSGJ3AfsdZR$l-WK2T>mkvRri%dA!&4;T#O3YPZs z35uXRp8Eh65RLPW-{%C6C_@*aK<%G${q!aT|v`mwrGaMowGLkq6uH~FiHegimYIM^n7LtL)l zMuED`ZKYcwkd>BGmG4U4jlA1?NdLL;S*+!#^J(Xf7N7F?A%`Hⅆ!h;cg+Gf9c;3 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 Ydx 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 z

w$8bCh$HiE;B5g6*#f!2(=I3Itxys$QdYtOv zD7eM!q;LnZ9zm*88-mBZW{yh3IEu8Ynqw-;(hsh4*{6Xz4}Mqv?7evuZKI{68yw@$ zVOtKH!LiHhWW3@xINpw)3z!x86=fFBJ4(N;?_1istr%N>UzES~ufPbn$r!R8askEkj9Q4jv%-um`2NRp`t^|7Ebdm7B#7b zl2U-XU@C}PgYvEqMrp}nJiQ?xcVQmNuI=WwCXTSffPzJ`o1>Pv1aln5Ef546fT{4) z0L_J5{LRI4C9X$)6!;+C+b8~1BpO0kO?89NM!8~K4PrE43&A~1_(qsW87Ph0JgQ4# zM5Z>3=)isR(|AsWqn_xjyZL0}CPsm~QcR2ChYD}K7Py1VxGL*}SyqOssMiQf5=;20 z2!n~`yYV6|%#Y>Eplj4-zP3wYLI@3X>x|)&LVS0CYv9(37o`y+M?}2LATS5ul}p35 zPK+$9i^2nFP4dHA5!dX6WMi5%aZ0-8TmLPnc4<)Pzb(VHZQ<$Qanpk5$5T!@IURW5 zLA$hW+saI(+s!xMf|t0P!&q>reZ`>ZM(8^C@x|$(hv&fL^`w3G+arw}H=KU%O^v{H zXjLtSZI7d5Toy-)Zb0axg4KyIb|X^YyWjin^wxL0t)k;kZ~Oi4)5RBFly1h5t`Vkn z+QiW?;xMinE7EuEz3T$M-IWwaMj? z=_QCA-S({8?iQ=GRY|_LD={;|ILweqc&o%3(JuFzT zFkN}YH_~-KxGr^dtU+PukzacKVLoG=I^Q`5tz&F^Tv|8tQr>wdv%nYzb}`0jLt(fU zbE)$l@C6*q@6rMY%YeV_bSxIZJUl+3dDw7{Jy2;4v%wsvu)?%@7ZGq8!aetxqtXZ7 ze^%Ok_Zda1_&SD|4OmfI>Lu-9{AajpDcSBhPvcvA>CP_8YQ})+*rN_iV>o883;5`& zT+bjXZ`WhIx*?3&sxjQ_;aD?0v9V(q12vWJ3X6~}u};*cm8@~Cz`{Cpd();IAE`P1v6H#tfkc+j9I-+uF6&q&^fK@=5m9w-be1%~ZcVSU2! z$EA0^>&(=Kho`3_+;a0x=~HKaEX`)#C}@Q+uAvTkG+hTB;!z{^TX=?}UfFPs+Bn7> zgVIr@E1#q8uHhQ87<`vQrpqm-nD-R+>Dqr(TMGtIO&B+6cwQg$hQ}j!vNO2_qx$FJ zaqXX9cY2yUZF-T}F1?DAU;e`R>3iR~CTKp;k#z;-JngF2Fj~ni!6RXuOT_1mr7>Cq zKI*B5DKt&pd%twrTiy~LMI*sq;Lno9OXB$Kdv5<7-b7cW#~+`EN8iQF74>QQw5h3) zwPEhO1*x5J;JhOI4c?1q(uV`|BK;6u^Gd;QKLpg-+Ju3v|KCWbU5Q$nqni~KCO{-f}V6$B6&<xxUtr$w`Vf3Mg9!~3^`FF#+ zqr1JU_&%Dt#yUXT*CRQ%K5M%?Dz7Hi$bRnEtXY-*ID2kd#*ut_Dm&<){o`2HUta%9 z*7=^GPiG#mf7)l}zIYz!O}F26TUxYmQH*!to%^69++wYBwHkp}v7-+;Ag#f3o(6yJ z%wNkUD|dwt!(c|5wTrSl`DwToJNT)iN;x-s=#kR-P4BC(eD!P6xg1%%GvS=ioRdEO z@sGuky?=Map=l{|{e$!Hj)%Y=6b~9nxVoN-6PaGmvVpWgVU zH=;bN-20n#{^1XQls@q9|DNV@ys8@=#*7&Q-8m=L;v0z_a!;e`Oo2&X0Bmq`J_hBB zITBD~#HtV1C@`65xl9f2>jz(dOF(EuH4*|c~ zFo6MS1DlidAQ<`Z=h)+pOK*GUnQ4E#4OSXH_R)`Fxb|r)6iIBSUbH=;_Py_YZ<;!F zYNc7lak&>^JpWaGdSMm!=z@Tq{G3h9eXSCWd5)Z`z=3-BhPr0xU;DxzAM|un&&Dyu z*Ustd$*+6O>NFZYa?1GeX#@uFwQN>YAg>Xs1JQNK^ct>tjBF2d$q6SvFa77IKU*

0xt@WGtM<`Q0un+z)p6r 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 z zS_EfC%ZuKQb!W)QG+rBS*dnBF@oL|fWZOw}%yT$&X`gfbsLnzfmd+*pJ~sA@(57x8 zkM~Ux`MHdZOtj5ayLG!kTDxUCc;CNyd0JXa6mlVhh9!hDorOiM;5@I8fdcsN^&Sn`0=K2h0HXOI6X@kymM)e;Z1wZJ(b+Q^|9c)zm&>gUW z$CR+GtfiXJC+Z~Gh|^>>{aVHNsf7lsajr7LRSo@7!S}5Ffm2vzBTi+t=wVdBQdic` z+u`VE(esSc=L37NW%ptu9LE7Ooc%H%q}4HQSU$&ih^SZKKRd2LXtYVWw~Vs1pSo7F z<*q>(Z82_qhK>+@@E)E4)^f&*myM8DhW)&viT-LtA6bnK7{?>^UA`dyoKpwck1e_v zzS@IRDRy@XfM3I(tlJ*4KA)$20Og}28~x@7=hZpJU^uv`6M&vkh{PB&kcI&>#=!kl z1PdXurJD)i^#mk@kGR$b&%j$n+f47OL!veqDKq8)>y)@$lYw`6Tde17AJ5N1kF&J1 z3P;YGC0uM^UaH_j8;gJ?>iCS%DRgB9a;jJYyenBSwujSNnSDZiffKuq>cZBkjt=L$ z5dz}$kbZaf4xAu+z#sf!Zf=OW2f#5A*UZj{5=-Y}c~saLoG*Eo2l?+9Lgz<6+A;Q@ zd`v#;w{xK9>Ky7>+c#j(ccWY*4r@)=^Nl_!&4~)<7RNxr?|_;z@8{F@dvVWO9*!0N zaVI|h1*H6ulL1$3Vk3h4%q04=aW*(kvbl4XsB%P2v_G>Rllmdc;J2)=BLX3X>DZo~ zC20qJDm=_KQFAzIau(OD)Kj0KFXG6TINf`auk$w?*F>I&je6h_lQH-6GZ1@zFrIaB z@1#6V2+F~3c2(}uC`8Jp>OJI?MIl%a2oqZ{6<*Fr$>mv}!h;{n&y!*vl%;9{oKS{3 zSfm;b-z#ADx948V0tf??&hz8*zpUhfm>rOmB|^htCEf$M{IeY2k%nds9~0%ev(+5r zr2fJfSVgYeahTZry!sp=(R9XLxBt32y5Q_`L!wMIU+U zx$qSDv6o^J3Ai$WI>8t97yVb1Xu%6;x@ohKDJY!cicAcNzuoDBouGF%0AhoQ*VY0C!(-Jgk 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 z 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�gTzgaiV& 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

    K^kd_e*JQ-nMK04Q6u2JVJY{>orE5E;{HGj66^_ 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

    IkmoAszG*b62 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 nh5wH)?NskO@OSFH{Je-G|z{e`(>@%(=QbM_KU literal 0 HcmV?d00001 From 4a1ea951bfd160b74acac5a7a4ea34c95d15cfaf Mon Sep 17 00:00:00 2001 From: Min Qian Lu <59981815+minqianlu@users.noreply.github.com> Date: Tue, 16 Jan 2024 22:46:44 -0500 Subject: [PATCH 9/9] drop-config done, passwords next --- .../KeypomProtocol/drop-configurations.md | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/Concepts/KeypomProtocol/drop-configurations.md b/docs/Concepts/KeypomProtocol/drop-configurations.md index 407ec7fd..a62b5f37 100644 --- a/docs/Concepts/KeypomProtocol/drop-configurations.md +++ b/docs/Concepts/KeypomProtocol/drop-configurations.md @@ -117,14 +117,30 @@ ___ ## Extra Key Allowance > *Default: 0* -An extra amount of NEAR to be added to an access key's allowance. +An extra amount of NEAR to be added to an access key's allowance. This will give the key extra gas for all of its claims, as well as other function calls such as `nft_transfer`, and `nft_approve`. + +### Use Case +Moon recognizes that his annual MoonCON conference is very popular, and that there is the potential for a hot resale market. In order to allow plenty of activity on the secondary markets such as Mintbase, Moon adds some extra allowance to each key. This allows the key to call `nft_approve` and `nft_transfer` multiple times without running out of NEAR of gas when it comes time to use the ticket and claim the assets. +```rust +// 30TGas extra +extra_allowance_per_key: 30000000000000 +``` ___ ## Drop Metadata > *Default: null* -`drop_metadata` is a string that allows you to store any other information you wish to associate with the drop, such as the drop's purpose. +`drop_metadata` is a string that allows you to store any other information you wish to associate with the drop, such as the drop's purpose. For the sake of clarity and interoperability with frontends, this is typically a stringified JSON. +### Use case +Benji is going on a Lunch 'n' Learn tour with Moon, with ticket sales planned for every city. To facilitate a seamless experience for attendees, Benji creates a frontend hosted on BOS to sell tickets to each one of cities. In order to keep track of tickets for each city, Benji creates a number of drops, each with their own unique metadata describing the Lunch 'n Learn location and time. On the frontend, Benji can simply call `get_drop_information`, parse the returned metadata for each drop, and then render each city's ticket page according to the metadata. +```javascript +drop_metadata: JSON.stringify({ + city: "Toronto", + data: "June 13th 2024", + time: "1pm EST" +}) +``` ___

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 MRJsj| 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