UNPKG

@le7el/core_nfts

Version:

LE7EL identity, avatar and investor NFTs

296 lines (235 loc) 13.9 kB
import artifacts from './artifacts' import contracts from './contracts' import { ethers, controller, resolver, nft, utils } from '@le7el/web3_crs' import { assertExpTokensContractDeployed } from '@le7el/experience_tokens' const CURRENT_VERSION = 'v1' const CURRENT_INVESTOR_NFT_VERSION = 'v1' const LE7EL_PROJECT_NODE = '0x46f49b6a04b289d8ac4920f8a236e64e2689abdcf283566b399ff3bcfb6d967a' // .avatar const ERC1155_APPROVE_ABI = [ "function setApprovalForAll(address operator, bool approved) public", "function isApprovedForAll(address, address) public view returns (bool)" ] const assertContractDeployed = (chainId, contractName, version = CURRENT_VERSION) => { if (contracts[`${chainId}`] && contracts[`${chainId}`][version] && contracts[`${chainId}`][version][contractName]) { return Promise.resolve(contracts[chainId][version][contractName]) } return Promise.reject(`contract ${contractName}:${version} is not deployed to network ${chainId}`); } const _wrapControllerCall = (chainId, provider, contract, fnName, params) => assertContractDeployed(chainId, contract, CURRENT_VERSION) .then((contractAddress) => { params.push(contractAddress) params.push(provider) return controller[fnName].apply(this, params) }) const _wrapResolverCall = (chainId, provider, contract, fnName, params) => assertContractDeployed(chainId, contract, CURRENT_VERSION) .then((contractAddress) => { params.push(contractAddress) params.push(provider) return resolver[fnName].apply(this, params) }) const _wrapNftCall = (chainId, provider, contract, fnName, params) => assertContractDeployed(chainId, contract, CURRENT_VERSION) .then((contractAddress) => { params.push(contractAddress) params.push(provider) return nft[fnName].apply(this, params) }) const _initResolverContract = (chainId, provider = null, readOnly = true) => assertContractDeployed(chainId, 'resolver', CURRENT_VERSION) .then((contract_address) => utils.initContract(contract_address, artifacts.resolver.abi, readOnly, provider)) const _maybeErc1155Approve = (token_address, wallet_address, spender_address, provider = null) => utils.initContract(token_address, ERC1155_APPROVE_ABI, false, provider) .then((contract) => contract.isApprovedForAll(wallet_address, spender_address) .then((approved) => { if (approved) return Promise.resolve(true) return contract.setApprovalForAll(spender_address, true) }) ) // CRS NFTs const identityAvailable = (name, chainId, provider = null) => _wrapControllerCall(chainId, provider, 'identity_controller', 'available', [name]) const avatarAvailable = (name, chainId, provider = null) => _wrapControllerCall(chainId, provider, 'avatar_controller', 'available', [name]) const contributorAvailable = (name, chainId, provider = null) => _wrapControllerCall(chainId, provider, 'contributor_controller', 'available', [name]) const identityRentPrice = (name, duration, chainId, provider = null) => _wrapControllerCall(chainId, provider, 'identity_controller', 'rentPrice', [name, duration]) const avatarRentPrice = (name, duration, chainId, provider = null) => _wrapControllerCall(chainId, provider, 'avatar_controller', 'rentPrice', [name, duration]) const contributorRentPrice = (name, duration, chainId, provider = null) => _wrapControllerCall(chainId, provider, 'contributor_controller', 'rentPrice', [name, duration]) const identityDomainSeparator = (chainId, provider = null) => _wrapControllerCall(chainId, provider, 'identity_controller', 'getDomainSeparator', []) const avatarDomainSeparator = (chainId, provider = null) => _wrapControllerCall(chainId, provider, 'avatar_controller', 'getDomainSeparator', []) const contributorDomainSeparator = (chainId, provider = null) => _wrapControllerCall(chainId, provider, 'contributor_controller', 'getDomainSeparator', []) const makeIdentityCommitment = (name, owner, secret, chainId, provider = null) => assertContractDeployed(chainId, 'resolver', CURRENT_VERSION) .then((resolver) => _wrapControllerCall(chainId, provider, 'identity_controller', 'makeCommitment', [name, owner, secret, resolver, owner])) const makeAvatarCommitment = (name, owner, secret, chainId, provider = null) => assertContractDeployed(chainId, 'resolver', CURRENT_VERSION) .then((resolver) => _wrapControllerCall(chainId, provider, 'avatar_controller', 'makeCommitment', [name, owner, secret, resolver, owner])) const makeContributorCommitment = (name, owner, secret, chainId, provider = null) => assertContractDeployed(chainId, 'resolver', CURRENT_VERSION) .then((resolver) => _wrapControllerCall(chainId, provider, 'contributor_controller', 'makeCommitment', [name, owner, secret, resolver, owner])) const commitIdentity = (name, commitment, pass, chainId, provider = null) => _wrapControllerCall(chainId, provider, 'identity_controller', 'whitelistedCommit', [name, commitment, pass]) const commitAvatar = (commitment, chainId, provider = null) => _wrapControllerCall(chainId, provider, 'avatar_controller', 'commit', [commitment]) const commitAvatarWhitelisted = (name, commitment, pass, chainId, provider = null) => _wrapControllerCall(chainId, provider, 'avatar_controller', 'whitelistedCommit', [name, commitment, pass]) const commitContributor = (name, commitment, pass, chainId, provider = null) => _wrapControllerCall(chainId, provider, 'contributor_controller', 'whitelistedCommit', [name, commitment, pass]) const registerIdentity = (name, owner, duration, secret, chainId, provider = null) => assertContractDeployed(chainId, 'resolver', CURRENT_VERSION) .then((resolver) => _wrapControllerCall(chainId, provider, 'identity_controller', 'register', [name, owner, duration, secret, resolver, owner])) const registerAvatar = (name, owner, duration, secret, chainId, provider = null) => assertContractDeployed(chainId, 'resolver', CURRENT_VERSION) .then((resolver) => _wrapControllerCall(chainId, provider, 'avatar_controller', 'register', [name, owner, duration, secret, resolver, owner])) const registerContributor = (name, owner, duration, secret, chainId, provider = null) => assertContractDeployed(chainId, 'resolver', CURRENT_VERSION) .then((resolver) => _wrapControllerCall(chainId, provider, 'contributor_controller', 'register', [name, owner, duration, secret, resolver, owner])) const renewAvatar = (name, duration, chainId, provider = null) => _wrapControllerCall(chainId, provider, 'avatar_controller', 'renew', [name, duration]) const renewIdentity = (name, duration, chainId, provider = null) => _wrapControllerCall(chainId, provider, 'identity_controller', 'renew', [name, duration]) const renewContributor = (name, duration, chainId, provider = null) => _wrapControllerCall(chainId, provider, 'contributor_controller', 'renew', [name, duration]) const setText = (node, key, value, chainId, provider = null) => _wrapResolverCall(chainId, provider, 'resolver', 'setText', [node, key, value]) const getText = (node, key, chainId, provider = null) => _wrapResolverCall(chainId, provider, 'resolver', 'getText', [node, key]) const setNftImage = (node, newImageURL, chainId, provider = null) => setText(node, 'L7L_AVATAR_IMAGE', newImageURL, chainId, provider) const getNftImage = (node, chainId, provider = null) => getText(node, 'L7L_AVATAR_IMAGE', chainId, provider) const getAvatarGasFee = (duration, chainId, provider = null) => _wrapNftCall(chainId, provider, 'avatar_nft', 'gasFee', [duration]) const getIdentityGasFee = (duration, chainId, provider = null) => _wrapNftCall(chainId, provider, 'identity_nft', 'gasFee', [duration]) const getContributorGasFee = (duration, chainId, provider = null) => _wrapNftCall(chainId, provider, 'contributor_nft', 'gasFee', [duration]) const getAvatarNameExpires = (name, chainId, provider = null) => _wrapNftCall(chainId, provider, 'avatar_nft', 'getNameExpires', [name]) const getIdentityNameExpires = (name, chainId, provider = null) => _wrapNftCall(chainId, provider, 'identity_nft', 'getNameExpires', [name]) const getContributorNameExpires = (name, chainId, provider = null) => _wrapNftCall(chainId, provider, 'contributor_nft', 'getNameExpires', [name]) const getAvatarNameByNftId = (id, chainId, provider = null) => _wrapNftCall(chainId, provider, 'avatar_nft', 'getName', [id]) const getIdentityNameByNftId = (id, chainId, provider = null) => _wrapNftCall(chainId, provider, 'identity_nft', 'getName', [id]) const getContributorNameByNftId = (id, chainId, provider = null) => _wrapNftCall(chainId, provider, 'contributor_nft', 'getName', [id]) const getAvatarMetadataByNftId = (id, chainId, provider = null) => _wrapNftCall(chainId, provider, 'avatar_nft', 'getMetadata', [id]) const getIdentityMetadataByNftId = (id, chainId, provider = null) => _wrapNftCall(chainId, provider, 'identity_nft', 'getMetadata', [id]) const getContributorMetadataByNftId = (id, chainId, provider = null) => _wrapNftCall(chainId, provider, 'contributor_nft', 'getMetadata', [id]) const getAvatarNftsForWallet = (wallet, from_block, to_block, queries_per_batch, chainId, provider = null) => assertContractDeployed(chainId, 'avatar_nft', CURRENT_VERSION) .then(contractAddress => nft.getNftsForWallet(wallet, contractAddress, from_block, to_block, queries_per_batch, provider)) const getIdentityNftsForWallet = (wallet, from_block, to_block, queries_per_batch, chainId, provider = null) => assertContractDeployed(chainId, 'identity_nft', CURRENT_VERSION) .then(contractAddress => nft.getNftsForWallet(wallet, contractAddress, from_block, to_block, queries_per_batch, provider)) const getContributorNftsForWallet = (wallet, from_block, to_block, queries_per_batch, chainId, provider = null) => assertContractDeployed(chainId, 'contributor_nft', CURRENT_VERSION) .then(contractAddress => nft.getNftsForWallet(wallet, contractAddress, from_block, to_block, queries_per_batch, provider)) const getProjectExperience = (projectNode, node, chainId, provider = null) => _initResolverContract(chainId, provider) .then((contract) => contract.experience(projectNode, node)) const getProjectLevel = (projectNode, node, chainId, provider = null) => _initResolverContract(chainId, provider) .then((contract) => contract.level(projectNode, node)) const advanceToNextLevel = (projectNode, node, experienceToBurn, chainId, provider = null) => _initResolverContract(chainId, provider, false) .then((contract) => contract.advanceToNextLevel(projectNode, node, experienceToBurn)) const getLe7elExperience = (node, chainId, provider = null) => getProjectExperience(LE7EL_PROJECT_NODE, node, chainId, provider) const getLe7elLevel = (node, chainId, provider = null) => getProjectLevel(LE7EL_PROJECT_NODE, node, chainId, provider) const advanceToNextLe7elLevel = (node, experienceToBurn, chainId, provider = null) => advanceToNextLevel(LE7EL_PROJECT_NODE, node, experienceToBurn, chainId, provider) // Investor NFT helpers const _wrapInvestorNftMinterCall = (chainId, provider, contract, fnName, params, overrides = null) => assertContractDeployed(chainId, contract, CURRENT_INVESTOR_NFT_VERSION) .then((contractAddress) => { contract = new ethers.Contract(contractAddress, artifacts.investorNFTMinterV1.abi, provider) if (overrides) params.push(overrides) return contract[fnName].apply(this, params) }) const mintInvestorNft = (owner, merkleIndex, merkleProof, chainId, provider) => _wrapInvestorNftMinterCall(chainId, provider, 'investor_nft_minter', 'price', []) .then((price) => _wrapInvestorNftMinterCall(chainId, provider, 'investor_nft_minter', 'mintTo(address,uint256,bytes32[])', [owner, merkleIndex, merkleProof], {value: price})) const mintPublicInvestorNft = (owner, chainId, provider) => _wrapInvestorNftMinterCall(chainId, provider, 'investor_nft_minter', 'pricePublic', []) .then((price) => _wrapInvestorNftMinterCall(chainId, provider, 'investor_nft_minter', 'mintTo(address)', [owner], {value: price})) const isClaimedInvestorNftProof = (index, chainId, provider) => _wrapInvestorNftMinterCall(chainId, provider, 'investor_nft_minter', 'isClaimed', [index]) const investorNftMintPhase = (chainId, provider) => _wrapInvestorNftMinterCall(chainId, provider, 'investor_nft_minter', 'phase', []) const investorSetNftMintPhase = (phase, merkleRoot, chainId, provider) => _wrapInvestorNftMinterCall(chainId, provider, 'investor_nft_minter', 'ownerSetPhase', [phase, merkleRoot]) export { utils, artifacts, contracts, assertContractDeployed, identityAvailable, avatarAvailable, contributorAvailable, identityRentPrice, avatarRentPrice, contributorRentPrice, identityDomainSeparator, avatarDomainSeparator, contributorDomainSeparator, makeIdentityCommitment, makeAvatarCommitment, makeContributorCommitment, commitIdentity, commitAvatar, commitAvatarWhitelisted, commitContributor, registerIdentity, registerAvatar, registerContributor, renewAvatar, renewIdentity, renewContributor, setText, getText, setNftImage, getNftImage, getAvatarNftsForWallet, getIdentityNftsForWallet, getContributorNftsForWallet, getAvatarGasFee, getIdentityGasFee, getContributorGasFee, getAvatarNameExpires, getIdentityNameExpires, getContributorNameExpires, getAvatarMetadataByNftId, getIdentityMetadataByNftId, getContributorMetadataByNftId, getAvatarNameByNftId, getIdentityNameByNftId, getContributorNameByNftId, getProjectExperience, getProjectLevel, advanceToNextLevel, getLe7elExperience, getLe7elLevel, advanceToNextLe7elLevel, mintInvestorNft, mintPublicInvestorNft, isClaimedInvestorNftProof, investorNftMintPhase, investorSetNftMintPhase }