@rainfi/sdk
Version:
This package is used to interact with Rain.fi protocol on Solana
277 lines • 10.2 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.extendBorsh = exports.getMetadataAddress = exports.getMetadata = exports.decodeMetadata = exports.METADATA_SCHEMA = exports.Metadata = exports.CreateMasterEditionArgs = exports.UpdateMetadataArgs = exports.CreateMetadataArgs = exports.Data = exports.Collection = exports.TokenStandard = exports.Creator = exports.MetadataKey = exports.MetadataCategory = exports.EDITION_MARKER_BIT_SIZE = exports.MAX_EDITION_LEN = exports.MAX_METADATA_LEN = exports.MAX_CREATOR_LEN = exports.MAX_CREATOR_LIMIT = exports.MAX_URI_LENGTH = exports.MAX_SYMBOL_LENGTH = exports.MAX_NAME_LENGTH = exports.RESERVATION = exports.EDITION = exports.METADATA_PREFIX = void 0;
const web3_js_1 = require("@solana/web3.js");
const borsh_1 = require("borsh");
const bs58_1 = __importDefault(require("bs58"));
exports.METADATA_PREFIX = 'metadata';
exports.EDITION = 'edition';
exports.RESERVATION = 'reservation';
exports.MAX_NAME_LENGTH = 32;
exports.MAX_SYMBOL_LENGTH = 10;
exports.MAX_URI_LENGTH = 200;
exports.MAX_CREATOR_LIMIT = 5;
exports.MAX_CREATOR_LEN = 32 + 1 + 1;
exports.MAX_METADATA_LEN = 1 +
32 +
32 +
exports.MAX_NAME_LENGTH +
exports.MAX_SYMBOL_LENGTH +
exports.MAX_URI_LENGTH +
exports.MAX_CREATOR_LIMIT * exports.MAX_CREATOR_LEN +
2 +
1 +
1 +
198;
exports.MAX_EDITION_LEN = 1 + 32 + 8 + 200;
exports.EDITION_MARKER_BIT_SIZE = 248;
var MetadataCategory;
(function (MetadataCategory) {
MetadataCategory["Audio"] = "audio";
MetadataCategory["Video"] = "video";
MetadataCategory["Image"] = "image";
MetadataCategory["VR"] = "vr";
})(MetadataCategory || (exports.MetadataCategory = MetadataCategory = {}));
var MetadataKey;
(function (MetadataKey) {
MetadataKey[MetadataKey["Uninitialized"] = 0] = "Uninitialized";
MetadataKey[MetadataKey["MetadataV1"] = 4] = "MetadataV1";
MetadataKey[MetadataKey["EditionV1"] = 1] = "EditionV1";
MetadataKey[MetadataKey["MasterEditionV1"] = 2] = "MasterEditionV1";
MetadataKey[MetadataKey["MasterEditionV2"] = 6] = "MasterEditionV2";
MetadataKey[MetadataKey["EditionMarker"] = 7] = "EditionMarker";
})(MetadataKey || (exports.MetadataKey = MetadataKey = {}));
class Creator {
constructor(args) {
this.address = args.address;
this.verified = args.verified;
this.share = args.share;
}
}
exports.Creator = Creator;
class TokenStandard {
constructor(args) {
this.NonFungible = args.NonFungible;
this.FungibleAsset = args.FungibleAsset;
this.Fungible = args.Fungible;
this.NonFungibleEdition = args.NonFungibleEdition;
}
}
exports.TokenStandard = TokenStandard;
class Collection {
constructor(args) {
this.verified = args.verified;
this.key = args.key;
}
}
exports.Collection = Collection;
class Data {
constructor(args) {
this.name = args.name;
this.symbol = args.symbol;
this.uri = args.uri;
this.sellerFeeBasisPoints = args.sellerFeeBasisPoints;
this.creators = args.creators;
}
}
exports.Data = Data;
class CreateMetadataArgs {
constructor(args) {
this.instruction = 0;
this.data = args.data;
this.isMutable = args.isMutable;
}
}
exports.CreateMetadataArgs = CreateMetadataArgs;
class UpdateMetadataArgs {
constructor(args) {
this.instruction = 1;
this.data = args.data ? args.data : null;
this.updateAuthority = args.updateAuthority ? args.updateAuthority : null;
}
}
exports.UpdateMetadataArgs = UpdateMetadataArgs;
class CreateMasterEditionArgs {
constructor(args) {
this.instruction = 10;
this.maxSupply = args.maxSupply;
}
}
exports.CreateMasterEditionArgs = CreateMasterEditionArgs;
class Metadata {
constructor(args) {
var _a, _b, _c;
this.key = MetadataKey.MetadataV1;
this.updateAuthority = args.updateAuthority;
this.mint = args.mint;
this.data = args.data;
this.primarySaleHappened = args.primarySaleHappened;
this.isMutable = args.isMutable;
this.editionNonce = (_a = args.editionNonce) !== null && _a !== void 0 ? _a : null;
this.tokenStandard = (_b = args.tokenStandard) !== null && _b !== void 0 ? _b : undefined;
this.collection = (_c = args.collection) !== null && _c !== void 0 ? _c : undefined;
}
}
exports.Metadata = Metadata;
exports.METADATA_SCHEMA = new Map([
[
CreateMetadataArgs,
{
kind: 'struct',
fields: [
['instruction', 'u8'],
['data', Data],
['isMutable', 'u8'], // bool
],
},
],
[
CreateMasterEditionArgs,
{
kind: 'struct',
fields: [
['instruction', 'u8'],
['maxSupply', { kind: 'option', type: 'u64' }],
],
},
],
[
UpdateMetadataArgs,
{
kind: 'struct',
fields: [
['instruction', 'u8'],
['data', { kind: 'option', type: Data }],
['updateAuthority', { kind: 'option', type: 'pubkeyAsString' }],
['primarySaleHappened', { kind: 'option', type: 'u8' }],
],
},
],
[
Data,
{
kind: 'struct',
fields: [
['name', 'string'],
['symbol', 'string'],
['uri', 'string'],
['sellerFeeBasisPoints', 'u16'],
['creators', { kind: 'option', type: [Creator] }],
],
},
],
[
Creator,
{
kind: 'struct',
fields: [
['address', 'pubkeyAsString'],
['verified', 'u8'],
['share', 'u8'],
],
},
],
[
Collection,
{
kind: 'struct',
fields: [
['verified', 'u8'], // bool
['key', 'pubkeyAsString'],
],
},
],
[
TokenStandard,
{
kind: 'struct',
fields: [
['NonFungible', 'u8'],
['FungibleAsset', 'u8'],
['Fungible', 'u8'],
['NonFungibleEdition', 'u8'],
],
},
],
[
Metadata,
{
kind: 'struct',
fields: [
['key', 'u8'],
['updateAuthority', 'pubkeyAsString'],
['mint', 'pubkeyAsString'],
['data', Data],
['primarySaleHappened', 'u8'], // bool
['isMutable', 'u8'], // bool
['editionNonce', { kind: 'option', type: 'u8' }],
['tokenStandard', { kind: 'option', type: 'u8' }],
['collection', { kind: 'option', type: Collection }],
],
},
],
]);
// eslint-disable-next-line no-control-regex
const METADATA_REPLACE = new RegExp('\u0000', 'g');
const decodeMetadata = (buffer) => {
const metadata = (0, borsh_1.deserializeUnchecked)(exports.METADATA_SCHEMA, Metadata, buffer);
metadata.data.name = metadata.data.name.replace(METADATA_REPLACE, '');
metadata.data.uri = metadata.data.uri.replace(METADATA_REPLACE, '');
metadata.data.symbol = metadata.data.symbol.replace(METADATA_REPLACE, '');
return metadata;
};
exports.decodeMetadata = decodeMetadata;
const getMetadata = (connection, mint) => __awaiter(void 0, void 0, void 0, function* () {
const metadataAccount = (yield connection.getAccountInfo(yield getMetadataAddress(new web3_js_1.PublicKey(mint).toBase58())));
if (!metadataAccount)
throw new Error('No metadata found for this NFT');
return (0, exports.decodeMetadata)(metadataAccount.data);
});
exports.getMetadata = getMetadata;
function getMetadataAddress(mintKey) {
return __awaiter(this, void 0, void 0, function* () {
const metadataProgramId = new web3_js_1.PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s');
const metadataAccount = (yield web3_js_1.PublicKey.findProgramAddress([
Buffer.from(exports.METADATA_PREFIX),
metadataProgramId.toBuffer(),
new web3_js_1.PublicKey(mintKey).toBuffer(),
], metadataProgramId))[0];
return metadataAccount;
});
}
exports.getMetadataAddress = getMetadataAddress;
const extendBorsh = () => {
borsh_1.BinaryReader.prototype.readPubkey = function () {
const reader = this;
const array = reader.readFixedArray(32);
return new web3_js_1.PublicKey(array);
};
borsh_1.BinaryWriter.prototype.writePubkey = function (value) {
const writer = this;
writer.writeFixedArray(value.toBuffer());
};
borsh_1.BinaryReader.prototype.readPubkeyAsString = function () {
const reader = this;
const array = reader.readFixedArray(32);
return bs58_1.default.encode(array);
};
borsh_1.BinaryWriter.prototype.writePubkeyAsString = function (value) {
const writer = this;
writer.writeFixedArray(bs58_1.default.decode(value.toBase58()));
};
};
exports.extendBorsh = extendBorsh;
(0, exports.extendBorsh)();
//# sourceMappingURL=metadata.utils.js.map