@myria/airdrop-js
Version:
Airdrop in L1 with claim based approach
83 lines • 6.29 kB
JavaScript
;
/**
* 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=