@metaplex-foundation/mpl-candy-guard
Version:
MPL Candy Guard JavaScript API. This MPL package is for the current generation of the Candy Guard
448 lines • 17.6 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.serialize = exports.deserialize = void 0;
const bn_js_1 = require("bn.js");
const beet = __importStar(require("@metaplex-foundation/beet"));
const log_1 = require("./utils/log");
const generated_1 = require("./generated");
const beet_1 = require("@metaplex-foundation/beet");
const GUARDS_SIZE = {
botTax: 9,
solPayment: 40,
tokenPayment: 72,
startDate: 8,
thirdPartySigner: 32,
tokenGate: 40,
gatekeeper: 33,
endDate: 8,
allowList: 32,
mintLimit: 3,
nftPayment: 64,
redeemedAmount: 8,
addressGate: 32,
nftGate: 32,
nftBurn: 32,
tokenBurn: 40,
freezeSolPayment: 40,
freezeTokenPayment: 72,
programGate: 164,
allocation: 5,
token2022Payment: 72,
};
const GUARDS_NAME = [
'botTax',
'solPayment',
'tokenPayment',
'startDate',
'thirdPartySigner',
'tokenGate',
'gatekeeper',
'endDate',
'allowList',
'mintLimit',
'nftPayment',
'redeemedAmount',
'addressGate',
'nftGate',
'nftBurn',
'tokenBurn',
'freezeSolPayment',
'freezeTokenPayment',
'programGate',
'allocation',
'token2022Payment',
];
const GUARDS_COUNT = GUARDS_NAME.length;
const MAX_LABEL_LENGTH = 6;
const MAX_PROGRAM_COUNT = 5;
function guardsFromData(buffer) {
const enabled = new bn_js_1.BN(beet.u64.read(buffer, 0)).toNumber();
const guards = [];
for (let i = 0; i < GUARDS_COUNT; i++) {
guards.push(!!((1 << i) & enabled));
}
const [botTaxEnabled, solPaymentEnabled, tokenPaymentEnabled, startDateEnabled, thirdPartySignerEnabled, tokenGateEnabled, gatekeeperEnabled, endDateEnabled, allowListEnabled, mintLimitEnabled, nftPaymentEnabled, redeemedAmountEnabled, addressGateEnabled, nftGateEnabled, nftBurnEnabled, tokenBurnEnabled, freezeSolPaymentEnabled, freezeTokenPaymentEnabled, programGateEnabled, allocationEnabled, token2022PaymentEnabled,] = guards;
return {
botTaxEnabled,
solPaymentEnabled,
tokenPaymentEnabled,
startDateEnabled,
thirdPartySignerEnabled,
tokenGateEnabled,
gatekeeperEnabled,
endDateEnabled,
allowListEnabled,
mintLimitEnabled,
nftPaymentEnabled,
redeemedAmountEnabled,
addressGateEnabled,
nftGateEnabled,
nftBurnEnabled,
tokenBurnEnabled,
freezeSolPaymentEnabled,
freezeTokenPaymentEnabled,
programGateEnabled,
allocationEnabled,
token2022PaymentEnabled,
};
}
function deserialize(buffer) {
const { guardSet: defaultSet, offset } = deserializeGuardSet(buffer);
const groupsCount = new bn_js_1.BN(beet.u32.read(buffer, offset)).toNumber();
const groups = [];
let cursor = beet.u32.byteSize + offset;
for (let i = 0; i < groupsCount; i++) {
const label = buffer.subarray(cursor, cursor + MAX_LABEL_LENGTH).toString();
cursor += MAX_LABEL_LENGTH;
const { guardSet: guards, offset } = deserializeGuardSet(buffer.subarray(cursor));
groups.push({ label, guards });
cursor += offset;
}
return {
default: defaultSet,
groups: groups.length === 0 ? null : groups,
};
}
exports.deserialize = deserialize;
function serialize(data) {
const buffer = Buffer.alloc(size(data));
let offset = serializeGuardSet(buffer, 0, data.default);
const groupsCount = data.groups ? data.groups.length : 0;
beet_1.u32.write(buffer, offset, groupsCount);
offset += beet_1.u32.byteSize;
for (let i = 0; i < groupsCount; i++) {
const group = data.groups.at(i);
if (group.label.length > MAX_LABEL_LENGTH) {
throw `Exceeded maximum label length: ${group.label.length} > ${MAX_LABEL_LENGTH}`;
}
buffer.write(group.label, offset, MAX_LABEL_LENGTH, 'utf8');
offset += MAX_LABEL_LENGTH;
offset = serializeGuardSet(buffer, offset, group.guards);
}
return buffer;
}
exports.serialize = serialize;
function size(data) {
let size = guardSetSize(data.default);
size += beet_1.u32.byteSize;
if (data.groups) {
for (let i = 0; i < data.groups.length; i++) {
size += MAX_LABEL_LENGTH;
size += guardSetSize(data.groups.at(i).guards);
}
}
return size;
}
function guardSetSize(guardSet) {
const guards = [];
for (let i = 0; i < GUARDS_COUNT; i++) {
const index = GUARDS_NAME[i];
if (guardSet[index]) {
guards.push(GUARDS_SIZE[index]);
}
}
return (beet_1.u64.byteSize + guards.reduce((previousValue, currentValue) => previousValue + currentValue, 0));
}
function deserializeGuardSet(buffer) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
const guards = guardsFromData(buffer);
const { botTaxEnabled, startDateEnabled, solPaymentEnabled, tokenPaymentEnabled, thirdPartySignerEnabled, tokenGateEnabled, gatekeeperEnabled, endDateEnabled, allowListEnabled, mintLimitEnabled, nftPaymentEnabled, redeemedAmountEnabled, addressGateEnabled, nftGateEnabled, nftBurnEnabled, tokenBurnEnabled, freezeSolPaymentEnabled, freezeTokenPaymentEnabled, programGateEnabled, allocationEnabled, token2022PaymentEnabled, } = guards;
(0, log_1.logDebug)('Guards: %O', guards);
let cursor = beet.u64.byteSize;
const data = {};
if (botTaxEnabled) {
const [botTax] = generated_1.botTaxBeet.deserialize(buffer, cursor);
data.botTax = botTax;
cursor += GUARDS_SIZE.botTax;
}
if (solPaymentEnabled) {
const [solPayment] = generated_1.solPaymentBeet.deserialize(buffer, cursor);
data.solPayment = solPayment;
cursor += GUARDS_SIZE.solPayment;
}
if (tokenPaymentEnabled) {
const [tokenPayment] = generated_1.tokenPaymentBeet.deserialize(buffer, cursor);
data.tokenPayment = tokenPayment;
cursor += GUARDS_SIZE.tokenPayment;
}
if (startDateEnabled) {
const [startDate] = generated_1.startDateBeet.deserialize(buffer, cursor);
data.startDate = startDate;
cursor += GUARDS_SIZE.startDate;
}
if (thirdPartySignerEnabled) {
const [thirdPartySigner] = generated_1.thirdPartySignerBeet.deserialize(buffer, cursor);
data.thirdPartySigner = thirdPartySigner;
cursor += GUARDS_SIZE.thirdPartySigner;
}
if (tokenGateEnabled) {
const [tokenGate] = generated_1.tokenGateBeet.deserialize(buffer, cursor);
data.tokenGate = tokenGate;
cursor += GUARDS_SIZE.tokenGate;
}
if (gatekeeperEnabled) {
const [gatekeeper] = generated_1.gatekeeperBeet.deserialize(buffer, cursor);
data.gatekeeper = gatekeeper;
cursor += GUARDS_SIZE.gatekeeper;
}
if (endDateEnabled) {
const [endDate] = generated_1.endDateBeet.deserialize(buffer, cursor);
data.endDate = endDate;
cursor += GUARDS_SIZE.endDate;
}
if (allowListEnabled) {
const [allowList] = generated_1.allowListBeet.deserialize(buffer, cursor);
data.allowList = allowList;
cursor += GUARDS_SIZE.allowList;
}
if (mintLimitEnabled) {
const [mintLimit] = generated_1.mintLimitBeet.deserialize(buffer, cursor);
data.mintLimit = mintLimit;
cursor += GUARDS_SIZE.mintLimit;
}
if (nftPaymentEnabled) {
const [nftPayment] = generated_1.nftPaymentBeet.deserialize(buffer, cursor);
data.nftPayment = nftPayment;
cursor += GUARDS_SIZE.nftPayment;
}
if (redeemedAmountEnabled) {
const [redeemedAmount] = generated_1.redeemedAmountBeet.deserialize(buffer, cursor);
data.redeemedAmount = redeemedAmount;
cursor += GUARDS_SIZE.redeemedAmount;
}
if (addressGateEnabled) {
const [addressGate] = generated_1.addressGateBeet.deserialize(buffer, cursor);
data.addressGate = addressGate;
cursor += GUARDS_SIZE.addressGate;
}
if (nftGateEnabled) {
const [nftGate] = generated_1.nftGateBeet.deserialize(buffer, cursor);
data.nftGate = nftGate;
cursor += GUARDS_SIZE.nftGate;
}
if (nftBurnEnabled) {
const [nftBurn] = generated_1.nftBurnBeet.deserialize(buffer, cursor);
data.nftBurn = nftBurn;
cursor += GUARDS_SIZE.nftBurn;
}
if (tokenBurnEnabled) {
const [tokenBurn] = generated_1.tokenBurnBeet.deserialize(buffer, cursor);
data.tokenBurn = tokenBurn;
cursor += GUARDS_SIZE.tokenBurn;
}
if (freezeSolPaymentEnabled) {
const [freezeSolPayment] = generated_1.freezeSolPaymentBeet.deserialize(buffer, cursor);
data.freezeSolPayment = freezeSolPayment;
cursor += GUARDS_SIZE.freezeSolPayment;
}
if (freezeTokenPaymentEnabled) {
const [freezeTokenPayment] = generated_1.freezeTokenPaymentBeet.deserialize(buffer, cursor);
data.freezeTokenPayment = freezeTokenPayment;
cursor += GUARDS_SIZE.freezeTokenPayment;
}
if (programGateEnabled) {
const [programGate] = generated_1.programGateBeet.deserialize(buffer, cursor);
data.programGate = programGate;
cursor += GUARDS_SIZE.programGate;
}
if (allocationEnabled) {
const [allocation] = generated_1.allocationBeet.deserialize(buffer, cursor);
data.allocation = allocation;
cursor += GUARDS_SIZE.allocation;
}
if (token2022PaymentEnabled) {
const [token2022Payment] = generated_1.token2022PaymentBeet.deserialize(buffer, cursor);
data.token2022Payment = token2022Payment;
cursor += GUARDS_SIZE.token2022Payment;
}
return {
guardSet: {
botTax: (_a = data.botTax) !== null && _a !== void 0 ? _a : null,
solPayment: (_b = data.solPayment) !== null && _b !== void 0 ? _b : null,
tokenPayment: (_c = data.tokenPayment) !== null && _c !== void 0 ? _c : null,
startDate: (_d = data.startDate) !== null && _d !== void 0 ? _d : null,
thirdPartySigner: (_e = data.thirdPartySigner) !== null && _e !== void 0 ? _e : null,
tokenGate: (_f = data.tokenGate) !== null && _f !== void 0 ? _f : null,
gatekeeper: (_g = data.gateKeeper) !== null && _g !== void 0 ? _g : null,
endDate: (_h = data.endDate) !== null && _h !== void 0 ? _h : null,
allowList: (_j = data.allowList) !== null && _j !== void 0 ? _j : null,
mintLimit: (_k = data.mintLimit) !== null && _k !== void 0 ? _k : null,
nftPayment: (_l = data.nftPayment) !== null && _l !== void 0 ? _l : null,
redeemedAmount: (_m = data.redeemedAmount) !== null && _m !== void 0 ? _m : null,
addressGate: (_o = data.addressGate) !== null && _o !== void 0 ? _o : null,
nftGate: (_p = data.nftGate) !== null && _p !== void 0 ? _p : null,
nftBurn: (_q = data.nftBurn) !== null && _q !== void 0 ? _q : null,
tokenBurn: (_r = data.tokenBurn) !== null && _r !== void 0 ? _r : null,
freezeSolPayment: (_s = data.freezeSolPayment) !== null && _s !== void 0 ? _s : null,
freezeTokenPayment: (_t = data.freezeTokenPayment) !== null && _t !== void 0 ? _t : null,
programGate: (_u = data.programGate) !== null && _u !== void 0 ? _u : null,
allocation: (_v = data.allocation) !== null && _v !== void 0 ? _v : null,
token2022Payment: (_w = data.token2022Payment) !== null && _w !== void 0 ? _w : null,
},
offset: cursor,
};
}
function serializeGuardSet(buffer, offset, guardSet) {
const start = offset;
offset += beet_1.u64.byteSize;
let features = 0;
let index = 0;
if (guardSet.botTax) {
generated_1.botTaxBeet.write(buffer, offset, guardSet.botTax);
offset += GUARDS_SIZE.botTax;
features |= 1 << index;
}
index++;
if (guardSet.solPayment) {
generated_1.solPaymentBeet.write(buffer, offset, guardSet.solPayment);
offset += GUARDS_SIZE.solPayment;
features |= 1 << index;
}
index++;
if (guardSet.tokenPayment) {
generated_1.tokenPaymentBeet.write(buffer, offset, guardSet.tokenPayment);
offset += GUARDS_SIZE.tokenPayment;
features |= 1 << index;
}
index++;
if (guardSet.startDate) {
generated_1.startDateBeet.write(buffer, offset, guardSet.startDate);
offset += GUARDS_SIZE.startDate;
features |= 1 << index;
}
index++;
if (guardSet.thirdPartySigner) {
generated_1.thirdPartySignerBeet.write(buffer, offset, guardSet.thirdPartySigner);
offset += GUARDS_SIZE.thirdPartySigner;
features |= 1 << index;
}
index++;
if (guardSet.tokenGate) {
generated_1.tokenGateBeet.write(buffer, offset, guardSet.tokenGate);
offset += GUARDS_SIZE.tokenGate;
features |= 1 << index;
}
index++;
if (guardSet.gatekeeper) {
generated_1.gatekeeperBeet.write(buffer, offset, guardSet.gatekeeper);
offset += GUARDS_SIZE.gatekeeper;
features |= 1 << index;
}
index++;
if (guardSet.endDate) {
generated_1.endDateBeet.write(buffer, offset, guardSet.endDate);
offset += GUARDS_SIZE.endDate;
features |= 1 << index;
}
index++;
if (guardSet.allowList) {
generated_1.allowListBeet.write(buffer, offset, guardSet.allowList);
offset += GUARDS_SIZE.allowList;
features |= 1 << index;
}
index++;
if (guardSet.mintLimit) {
generated_1.mintLimitBeet.write(buffer, offset, guardSet.mintLimit);
offset += GUARDS_SIZE.mintLimit;
features |= 1 << index;
}
index++;
if (guardSet.nftPayment) {
generated_1.nftPaymentBeet.write(buffer, offset, guardSet.nftPayment);
offset += GUARDS_SIZE.nftPayment;
features |= 1 << index;
}
index++;
if (guardSet.redeemedAmount) {
generated_1.redeemedAmountBeet.write(buffer, offset, guardSet.redeemedAmount);
offset += GUARDS_SIZE.redeemedAmount;
features |= 1 << index;
}
index++;
if (guardSet.addressGate) {
generated_1.addressGateBeet.write(buffer, offset, guardSet.addressGate);
offset += GUARDS_SIZE.addressGate;
features |= 1 << index;
}
index++;
if (guardSet.nftGate) {
generated_1.nftGateBeet.write(buffer, offset, guardSet.nftGate);
offset += GUARDS_SIZE.nftGate;
features |= 1 << index;
}
index++;
if (guardSet.nftBurn) {
generated_1.nftBurnBeet.write(buffer, offset, guardSet.nftBurn);
offset += GUARDS_SIZE.nftBurn;
features |= 1 << index;
}
index++;
if (guardSet.tokenBurn) {
generated_1.tokenBurnBeet.write(buffer, offset, guardSet.tokenBurn);
offset += GUARDS_SIZE.tokenBurn;
features |= 1 << index;
}
index++;
if (guardSet.freezeSolPayment) {
generated_1.freezeSolPaymentBeet.write(buffer, offset, guardSet.freezeSolPayment);
offset += GUARDS_SIZE.freezeSolPayment;
features |= 1 << index;
}
index++;
if (guardSet.freezeTokenPayment) {
generated_1.freezeTokenPaymentBeet.write(buffer, offset, guardSet.freezeTokenPayment);
offset += GUARDS_SIZE.freezeTokenPayment;
features |= 1 << index;
}
index++;
if (guardSet.programGate) {
if (guardSet.programGate.additional &&
guardSet.programGate.additional.length > MAX_PROGRAM_COUNT) {
throw `Exceeded maximum number of programs on additional list:\
${guardSet.programGate.additional.length} > ${MAX_PROGRAM_COUNT}`;
}
const [data] = generated_1.programGateBeet.serialize(guardSet.programGate, GUARDS_SIZE.programGate);
data.copy(buffer, offset);
offset += GUARDS_SIZE.programGate;
features |= 1 << index;
}
index++;
if (guardSet.allocation) {
generated_1.allocationBeet.write(buffer, offset, guardSet.allocation);
offset += GUARDS_SIZE.allocation;
features |= 1 << index;
}
index++;
if (guardSet.token2022Payment) {
generated_1.token2022PaymentBeet.write(buffer, offset, guardSet.token2022Payment);
offset += GUARDS_SIZE.token2022Payment;
features |= 1 << index;
}
index++;
beet_1.u64.write(buffer, start, features);
return offset;
}
//# sourceMappingURL=parser.js.map