UNPKG

@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
"use strict"; 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