Skip to main content

Keyship SDK

πŸ”₯Read first​

Keyship protocol will protect the secret, which cannot be longer than 1024 characters, this can be an URL of a unencrypted data, an URL of a encrypted data(in this case the key used to encrypt the data need to be used to perform the secret encryption as well) or a key you used to encrypt some data as you want.

Install​

yarn add @keyship/sdk or npm install @keyship/sdk

Usage​

Import and instantiate​

import Keyship, { INft, ISell, IToken } from "@keyship/sdk";
const kship = new Keyship();

Check if user have already fulfilled the Rule of the secret​

// itemData is dataMetaDescription from the create secret section
// userWalletAddress is the user wallet address
// chain is the chain user is auth
const canAccess = await kship.canOpen(
itemData,
userWalletAddress,
kship.CHAINS.POLYGON
);
if (canAccess) {
// user can access the secret
// auth user and decrypt the secret
// check the secret section below
} else {
// user can't access the secret
// show to the user the Item Data
}

Generate random Key​

const someKey = kship.generateKey();

Local encryption (AES256)​

const encryptedText = kship.encrypt("My secret", someKey);
// or encrypt a file
const encryptedFile = kship.encrypt(myFile, someKey);

Local decryption (AES256)​

const decryptedText = kship.decrypt(encryptedText, someKey);
// or decrypt a file
const decryptedFile = kship.encrypt(encryptedFile, someKey);

Auth​

You need to auth the user before each action: creating a item, buying a item, opening a item.

const token = await kship.auth();
const signature = await web3.eth.personal.sign(token, accounts[0]);
// finalSignature need to be used on the interaction with Keyship netowork
const finalSignature = kship.formatSignature(token, accounts[0], signature);

Secrets​

The 2 most important functions in Keyship SDK are NewSecret and OpenSecret. By passing your key or URL as the secret property(see example below) among the rule of decryption you can easly allow anyone to access the secret.

Secret using Paying/Sell Rule​

Create​

const mySecret = "https://urltosecretdata"; // or a key
const itemSell: ISell = {
name: "Some name", // optional
description: "Some description", // optional
owner: accounts[0], // creator user wallet address
price: "0.01", // price in $
secret: mySecret,
signature: finalSignature,
rule: kship.RULES.SELL,
};
const dataMetaDescription = await kship.NewSecret(itemSell);
// you can store the dataMetaDescription anywhere.
// In this case we will upload it to IPFS
const ipfsCID = await kship.uploadToIPFS(dataMetaDescription);

Buy and open the secret​

const ipfsURL = kship.getIPFSUrl(ipfsCID);
// getting the dataMetaDescription from IPFS
const dataMetaDescription = await kship.fetchItem(ipfsURL);
// getting the txData to buy the secret from the Keyship network
const txData = await kship.getSellTxData(
dataMetaDescription,
finalSignature,
kship.CHAINS.POLYGON // This rule is only available on Polygon, Ethereum and Binance Smart Chain
);
const gasPrice = await web3.eth.getGasPrice();
const networkId = await web3.eth.net.getId();
const contract = new web3.eth.Contract(
kship.contracts.proxy.abi,
kship.contracts.proxy.networks[networkId] && kship.contracts.proxy.address
);
const gas = await contract.methods
.buyProduct(txData.seller, txData.id, txData.signature, txData.mid)
.estimateGas({ from: accounts[0], value: txData.value });
// Make the payment
const execTx = await contract.methods
.buyProduct(txData.seller, txData.id, txData.signature, txData.mid)
.send({
from: accounts[0],
value: txData.value,
gasPrice: gasPrice,
gas: gas,
});
if (execTx.transactionHash) {
// After payment is done, decrypt the secret
const decryptedData = await kship.OpenSecret(
dataMetaDescription,
finalSignature,
kship.CHAINS.POLYGON // This rule is only available on Polygon, Ethereum and Binance Smart Chain, same as user auth chain.
);
console.log(decryptedData);
}

Secret using NFT Rule (Like a Paywall/Gate)​

Create​

const mySecret = "https://urltosecretdata"; // or a key
const itemNft: INft = {
owner: accounts[0], // creator user wallet address
contract: "0x828383B51514873CC937ee83F57fBbff0221700C", // NFT contract address
chain: sdk.CHAINS.POLYGON, // !!! IMPORTANT this chain need to be the same as the NFT contract chain
secret: mySecret,
signature: finalSignature,
rule: kship.RULES.NFT,
};
const dataMetaDescription = await kship.NewSecret(itemNft);
// you can store the dataMetaDescription anywhere.
// In this case we will upload it to IPFS
const ipfsCID = await kship.uploadToIPFS(dataMetaDescription);

Open the secret with NFT​

const ipfsURL = kship.getIPFSUrl(ipfsCID);
// getting the dataMetaDescription from IPFS
const dataMetaDescription = await kship.fetchItem(ipfsURL);
const decryptedData = await kship.OpenSecret(
dataMetaDescription,
finalSignature,
kship.CHAINS.POLYGON // is the chain user is auth
);
console.log(decryptedData);

Secret using Token Balance Rule​

Create​

const mySecret = "https://urltosecretdata"; // or a key
const itemToken: IToken = {
owner: accounts[0], // creator user wallet address
contract: "0x828383B51514873CC937ee83F57fBbff0221700C", // Token/ERC20 contract address
minBalance: "100", // 100 tokens - minimum balance of the token to open the secret
chain: sdk.CHAINS.POLYGON, // !!! IMPORTANT this chain need to be the same as the Token/ERC20 contract chain
secret: mySecret,
signature: finalSignature,
rule: kship.RULES.TOKEN,
};
const dataMetaDescription = await kship.NewSecret(itemToken);
// you can store the dataMetaDescription anywhere.
// In this case we will upload it to IPFS
const ipfsCID = await kship.uploadToIPFS(dataMetaDescription);

Open the secret with Token Balance​

const ipfsURL = kship.getIPFSUrl(ipfsCID);
// getting the dataMetaDescription from IPFS
const dataMetaDescription = await kship.fetchItem(ipfsURL);
const decryptedData = await kship.OpenSecret(
dataMetaDescription,
finalSignature,
kship.CHAINS.POLYGON // is the chain user is auth
);
console.log(decryptedData);