Encryption in browser with wallet & extension
Creating a secret NFT in a browser environment
Utilizing Polkadot extension, Next.js, and TypeScript:
import { SecretNFTResponse } from "@/components/base/Forms/SecretNFT/types";
import {
NFTCreatedEvent,
NftMetadataType,
SecretAddedToNFTEvent,
TernoaIPFS,
WaitUntil,
createSecretNftTx,
generatePGPKeys,
getEnclaveHealthStatus,
getFirstPublicClusterAvailable,
getRawApi,
prepareAndStoreKeyShares,
query,
secretNftEncryptAndUploadFile,
submitTxBlocking,
} from "ternoa-js";
export const mintSecretNFT = async (
address: string,
nftFile: File,
nftMetadata: NftMetadataType,
secretNftFile: File,
secretNftMetadata: NftMetadataType,
ipfsClient: TernoaIPFS,
royalty: number,
collection: number | undefined,
isSoulbound: boolean
): Promise<SecretNFTResponse> => {
try {
const clusterId = await getFirstPublicClusterAvailable();
await getEnclaveHealthStatus(clusterId);
console.log("Uploading content on IPFS.");
const { privateKey, publicKey } = await generatePGPKeys();
const { Hash: offchainDataHash } = await ipfsClient.storeNFT(
nftFile,
nftMetadata
);
const { Hash: secretOffchainDataHash } =
await secretNftEncryptAndUploadFile(
secretNftFile,
publicKey,
ipfsClient,
secretNftMetadata
);
console.log(
"USER_ACTION: Sign transaction with your extension to create your secret NFT."
);
const txHex = await createSecretNftTx(
offchainDataHash,
secretOffchainDataHash,
royalty,
collection,
isSoulbound
);
const nonce = (
(await query("system", "account", [address])) as any
).nonce.toNumber();
const { web3FromAddress } = await import("@polkadot/extension-dapp");
const injector = (await web3FromAddress(address)) as Record<string, any>;
const signer = injector?.signer;
const api = getRawApi();
const signedTx = (
await api.tx(txHex).signAsync(address, { nonce, signer })
).toHex();
console.log("Submitting transaction to the Ternoa chain.");
const { events, blockInfo, txHash } = await submitTxBlocking(
signedTx,
WaitUntil.BlockInclusion
);
const nftEvent = events.findEventOrThrow(NFTCreatedEvent);
const secretNftEvent = events.findEventOrThrow(SecretAddedToNFTEvent);
console.log(
"USER_ACTION: Sign transaction with your extension to securize your content and upload key on Ternoa SGX clusters."
);
const teeRes = await prepareAndStoreKeyShares(
privateKey,
address,
nftEvent.nftId,
"secret",
injector,
clusterId
);
return {
event: secretNftEvent,
clusterResponse: teeRes,
blockInfo,
txHash,
};
} catch (error) {
console.log(error);
const errorDescription = `SECRET_NFT_MINT_ERROR: ${
error instanceof Error ? error.message : JSON.stringify(error)
}`;
throw new Error(errorDescription);
}
};Last updated