UNPKG

@myria/airdrop-js

Version:

Airdrop in L1 with claim based approach

83 lines 6.29 kB
"use strict"; /** * Collection of validation functions * @module Transaction/Validation */ Object.defineProperty(exports, "__esModule", { value: true }); exports.isRecipientClaimed = exports.isAlreadyApprovedAllowanceOnchain = exports.isAlreadySubmittedOnchain = void 0; // External imports below this line const thirdweb_1 = require("thirdweb"); const airdrop_1 = require("thirdweb/extensions/airdrop"); const erc20_1 = require("thirdweb/extensions/erc20"); const internalUse_1 = require("./internalUse"); /** * Check whether MerkleTree has already been submitted on-chain or not with the same data to reduce our cost by skipping submitting. Retry safer * * @param {ThirdwebContract} airdropContract - The airdrop Thirdweb contract. * @param {Address} tokenAddress - The token address to claim. * @param {string} merkleRoot - The generated merkleRoot from whitelist. @see {@link generateMerkleTreeInfoERC20ForWhitelist|Generate merkleRoot} * @returns {Promise<boolean>} A promise that resolves whether MerkleTree has already been submitted on-chain or not. */ const isAlreadySubmittedOnchain = async (airdropContract, tokenAddress, merkleRoot) => { const startTime = (0, internalUse_1.logFunctionTrackStartTime)(exports.isAlreadySubmittedOnchain.name); const existedTokenMerkleRoot = await (0, airdrop_1.tokenMerkleRoot)({ contract: airdropContract, tokenAddress, }); const saferMerleRootFormat = `0x${merkleRoot.replace('0x', '')}`; (0, internalUse_1.logFunctionDuration)(exports.isAlreadySubmittedOnchain.name, startTime); if (existedTokenMerkleRoot == saferMerleRootFormat) { return true; } return false; }; exports.isAlreadySubmittedOnchain = isAlreadySubmittedOnchain; /** * Check whether Spender has already been approved allowance on-chain or not to reduce our cost by skipping submitting. Retry safer * * @param {Address} owner - The token's owner address. * @param {Address} spender - The spender's address. * @param {ThirdwebContract} tokenContract - The airdrop Thirdweb contract. * @param {number} totalAmount - The total airdrop amount in ether format. * @param decimals - The number of decimal places to include in the string representation. Default 18 * @returns {Promise<boolean>} A promise that resolves whether Spender has already been approved allowance on-chain or not. * @throws An error if the totalAmount <= 0. */ const isAlreadyApprovedAllowanceOnchain = async (owner, spender, tokenContract, totalAmount, decimals = 18) => { if (totalAmount <= 0) { throw Error('totalAmount must be greater than 0'); } const startTime = (0, internalUse_1.logFunctionTrackStartTime)(exports.isAlreadyApprovedAllowanceOnchain.name); const remainingAllowance = await (0, erc20_1.allowance)({ contract: tokenContract, owner, spender, }); const existedAllowance = Number((0, thirdweb_1.toTokens)(remainingAllowance, decimals)); if (existedAllowance >= totalAmount) { return true; } (0, internalUse_1.logFunctionDuration)(exports.isAlreadyApprovedAllowanceOnchain.name, startTime); return false; }; exports.isAlreadyApprovedAllowanceOnchain = isAlreadyApprovedAllowanceOnchain; /** * Check whether recipient is claimed or not * * @param {Address} recipient - The ethereum wallet address to check. * @param {ThirdwebContract} airdropContract - The airdrop Thirdweb contract. * @param {Address} token - The token address to claim. * @param {bigint} claimAmount - The claimAmount or tokenId for ERC721 * @returns {Promise<boolean>} A promise that resolves whether the recipient already claimed or not. */ const isRecipientClaimed = async (recipient, airdropContract, token, claimAmount = BigInt(0)) => { return await (0, airdrop_1.isClaimed)({ // AirdropClaimable contract at step #2 contract: airdropContract, receiver: recipient, token, tokenId: claimAmount, }); }; exports.isRecipientClaimed = isRecipientClaimed; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90cmFuc2FjdGlvbi92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQUVILG1DQUFtQztBQUNuQyx1Q0FBc0Q7QUFDdEQseURBQXlFO0FBQ3pFLHFEQUFzRDtBQUl0RCwrQ0FBK0U7QUFJL0U7Ozs7Ozs7R0FPRztBQUNJLE1BQU0seUJBQXlCLEdBQUcsS0FBSyxFQUMxQyxlQUFpQyxFQUNqQyxZQUFxQixFQUNyQixVQUFrQixFQUNGLEVBQUU7SUFDbEIsTUFBTSxTQUFTLEdBQUcsSUFBQSx1Q0FBeUIsRUFBQyxpQ0FBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RSxNQUFNLHNCQUFzQixHQUFHLE1BQU0sSUFBQSx5QkFBZSxFQUFDO1FBQ2pELFFBQVEsRUFBRSxlQUFlO1FBQ3pCLFlBQVk7S0FDZixDQUFDLENBQUM7SUFDSCxNQUFNLG9CQUFvQixHQUFHLEtBQUssVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUNqRSxJQUFBLGlDQUFtQixFQUFDLGlDQUF5QixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMvRCxJQUFJLHNCQUFzQixJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQWhCVyxRQUFBLHlCQUF5Qiw2QkFnQnBDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNJLE1BQU0saUNBQWlDLEdBQUcsS0FBSyxFQUNsRCxLQUFjLEVBQ2QsT0FBZ0IsRUFDaEIsYUFBK0IsRUFDL0IsV0FBbUIsRUFDbkIsV0FBbUIsRUFBRSxFQUNMLEVBQUU7SUFDbEIsSUFBSSxXQUFXLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbkIsTUFBTSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBQSx1Q0FBeUIsRUFDdkMseUNBQWlDLENBQUMsSUFBSSxDQUN6QyxDQUFDO0lBQ0YsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLElBQUEsaUJBQVMsRUFBQztRQUN2QyxRQUFRLEVBQUUsYUFBYTtRQUN2QixLQUFLO1FBQ0wsT0FBTztLQUNWLENBQUMsQ0FBQztJQUVILE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLElBQUEsbUJBQVEsRUFBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLElBQUksZ0JBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELElBQUEsaUNBQW1CLEVBQUMseUNBQWlDLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZFLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUMsQ0FBQztBQXpCVyxRQUFBLGlDQUFpQyxxQ0F5QjVDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSSxNQUFNLGtCQUFrQixHQUFHLEtBQUssRUFDbkMsU0FBa0IsRUFDbEIsZUFBaUMsRUFDakMsS0FBYyxFQUNkLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQ1AsRUFBRTtJQUNsQixPQUFPLE1BQU0sSUFBQSxtQkFBUyxFQUFDO1FBQ25CLHVDQUF1QztRQUN2QyxRQUFRLEVBQUUsZUFBZTtRQUN6QixRQUFRLEVBQUUsU0FBUztRQUNuQixLQUFLO1FBQ0wsT0FBTyxFQUFFLFdBQVc7S0FDdkIsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDO0FBYlcsUUFBQSxrQkFBa0Isc0JBYTdCIn0=