UNPKG

@ixily/activ

Version:

Alpha Capture Trade Idea Verification. Blockchain ownership proven trade ideas and strategies.

904 lines (848 loc) 39.7 kB
import { LogModule as log } from '..' import { ProvableIdeasModule } from './provable-ideas.module' import { CONTRACT_CONSTANTS, CONTRACT_INTERFACES, CacheService, Contract, ContractModule, IContract, ethers, getBoolean, isNullOrUndefined, skipExpirationInSeconds, } from '../../' interface IIdeaByNftIdSearchParams { ticker?: string type?: 'public' | 'close' strategyKey?: string } const isCloseIdea = (idea: CONTRACT_INTERFACES.ITradeIdea): boolean => { const ICanSeeThatThisIsOneIdeaPublicAndIsACloseOne = typeof idea.idea === 'string' ? false : (idea.idea as CONTRACT_INTERFACES.ITradeIdeaIdea).kind === 'close' return ICanSeeThatThisIsOneIdeaPublicAndIsACloseOne } const getETHBalance = async (contract?: Contract): Promise<number> => { contract = ContractModule.thisOrGetGate(contract) const balance = await contract.signer.getBalance() const balanceInEth = ethers.utils.formatEther(balance) return Number(Number(balanceInEth || 0).toFixed(4)) } const getIdeaByNftId = async ( ideaNft: number, decrypt: boolean = true, contract?: IContract, additionalFilters?: IIdeaByNftIdSearchParams, ): Promise<CONTRACT_INTERFACES.ITradeIdea | undefined> => { contract = ContractModule.thisOrGet(contract) let key = `getIdeaByNftId_${ideaNft}` if ( !isNullOrUndefined(additionalFilters?.strategyKey) && !isNullOrUndefined(additionalFilters?.ticker) && !isNullOrUndefined(additionalFilters?.type) ) { key = `getIdeaByNftId_${ideaNft}_${additionalFilters?.ticker}_${additionalFilters?.type}` } const { data } = await CacheService.getData({ contract: contract.gate!, key, init: async () => { let nftObject = await ProvableIdeasModule.general.getIdeaByNftId( ideaNft, decrypt, false, contract, ) const isPublic = getBoolean(nftObject.isPublic) let kind: CONTRACT_INTERFACES.ITradeIdeaIdeaKind | undefined = undefined let ticker: string | undefined = undefined if (isPublic) { kind = (nftObject.idea as CONTRACT_INTERFACES.ITradeIdeaIdea) .kind ticker = (nftObject.idea as CONTRACT_INTERFACES.ITradeIdeaIdea) .asset.ticker } if (nftObject) { nftObject.nftId = ideaNft ;(nftObject as any).unsave = true } if (isPublic || kind === 'close') { const type = isPublic ? 'public' : 'close' ;(nftObject as any).unsave = false await CacheService.updateData({ key: `getIdeaByNftId_${ideaNft}_${ticker}_${type}`, contract: contract?.gate!, data: nftObject, expirationInSeconds: skipExpirationInSeconds, forceToAdd: true, }) } if ( !isNullOrUndefined(additionalFilters?.strategyKey) && !isNullOrUndefined(additionalFilters?.ticker) && !isNullOrUndefined(additionalFilters?.type) ) { if ( additionalFilters?.strategyKey !== nftObject?.strategy?.reference || additionalFilters?.ticker !== (nftObject?.idea as any)?.asset?.ticker || additionalFilters?.type !== (isPublic ? 'public' : 'close') ) { return undefined } } return nftObject }, expirationInSeconds: skipExpirationInSeconds, }) return data } /* const filterToSkipLinkedIdeas = async ( result: IBasicNFT[], filterType: CONTRACT_INTERFACES.ITradeIdeaIdeaKind[] = [], ): Promise<IBasicNFT[]> => { const statusToFilter = kindTypeToIdeaStatus(filterType) if (filterType?.length <= 0) { filterType = ['open', 'adjust', 'close'] } const closedNfts = result.filter((each) => each.status === 3) const openOrAdjustIdeasCloseLinked: any[] = [] await Promise.all( closedNfts ?.map((res) => res.id) .map(async (nft) => { const restored = await getIdeaByNftId(nft) if (restored !== undefined) { for (const cci of ( restored!.idea as CONTRACT_INTERFACES.ITradeIdeaIdea ).chainIdeas!) { if (cci?.nftId) { openOrAdjustIdeasCloseLinked.push(cci?.nftId) } } } }), ) if (statusToFilter.length > 0) { result = result.filter((each) => statusToFilter.includes(each.status)) } const responseFiltered = [] for (const r of result) { if (r) { if (r?.status !== 3) { if (!openOrAdjustIdeasCloseLinked.includes(r?.id)) { responseFiltered.push(r) } } } } if (filterType.includes('close')) { responseFiltered.push(...closedNfts) } return responseFiltered } */ const ideaPublicVerificationHtml = async ( nftId: number, isPublic?: boolean, size?: 'small' | 'medium' | 'large', contract?: Contract, ): Promise<string> => { if (isNullOrUndefined(nftId) || nftId < 0) { throw new Error('nftId is required') } contract = ContractModule.thisOrGetGate(contract) let resposeMinified = null const minifyHtml = (html: string) => { return html .replace(/>\s+</g, '><') .replace(/\s{2,}/g, ' ') .replace(/>\s+/g, '>') .replace(/\s+</g, '<') } if (isNullOrUndefined(resposeMinified)) { let ideaDetails = { metadata: undefined as CONTRACT_INTERFACES.ITradeIdea | undefined, isPrivate: true, } try { ideaDetails.metadata = await getIdeaByNftId(nftId, true) } catch (err: any) { log.dev('ideaPublicVerificationHtml (ERROR)', err.message) } const metadata: CONTRACT_INTERFACES.ITradeIdea | undefined = ideaDetails.metadata const creator = metadata?.creator const strategy = metadata?.strategy const idea: CONTRACT_INTERFACES.ITradeIdeaIdea | undefined = metadata?.idea ? (metadata?.idea as CONTRACT_INTERFACES.ITradeIdeaIdea) : undefined const calcResultInfo = idea?.result const asset = idea?.asset const kind = idea?.kind const assetImage = idea?.asset.image log.dev('ideaPublicVerificationHtml (metadata)', metadata) const landingCheck = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAC9SURBVHgBlVMBEcIwDMxNAShYHYAEHEwCOJkEJMwCDsABc9BDQetgJMd3dL1mbf/ub+ktn1+ahSiPA7PfORdhmY45MUfEFoWKEMGi8K6JDPMJp6VAh9xNS+cKYcqLCDsU8NQOGxe4FpJnfGWMWwgGyl9WiN/MExzTvKFTHD0cZjwf9LtoFbnRjRDlnMP7FYbap9CLMLTQ9JsCx7jAh/miunF65DotIZ7Abt8aZGEsHEQw0X+ZqmFou3npecUXJIlhSNpjOnMAAAAASUVORK5CYII=' const mainArrow = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAASCAYAAAC0EpUuAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAIySURBVHgBhZTRahNBFIbP2WwS79yAogVBfYJNr0RvmgTES9EXSNIiEXoTFWmrNWlKKiJCg9AqYt30BQRfwPURkidoA2JYGlnvxOzsHM8kRpu4szkXywzz7zf/+Wd3ALieXv/+cWPJr8GcWrsxuL1xbeCu3vUvx+mMUtW3vt2UOS8fbpV2Tupx4pMCZb1bsPQzK9yVph6M6rH8wrdJCJcnGZJQd2rnt3UvlJoDB4GKIKlnGMncwWam959T9fiwnummpJnHEHyDqLFc87SO25vnyijo0CC4AiKIdIynJ5Vt35YsJCILCBrvmxcaOvhK3XMMwBI7PpIylT/Y+ecYZ8UKTL8CF0BmgHDr3XM9+N4Tz0GEIhD1QkznJmCMElee+TaI4RckOAtSNt6+XNCC7697DnHGyOCEeSa3x2DUiStrns35uiTJ4uAb+69iwI/7fHjAYDhmeF4LHYEferaJ0uV8rQThnde7Fz/ptKuP+g7rVBRdIw5qUpCFkCx2AIJET6erVo8sCGVW6TjjY1O784N+kdtwVOqsLe+3LnV0wABSfLBoE8lukoZlMxr4lYHUVuOQP5s3uwuHcUBEw+atOyYNC63W1R8YDUw4YyCU44AC0595uPgHmFdAtWZEAwnnAcctwyL/KFPAKegEyCLOML5lgeMM+aQ7SZgGqjJnHfLxlfbmtMz72ojUnXX416kSTjJUDnVAVQGk+aLBLCu1wBF0tMCXB5AoxAFHYiPRVtqolk/Xb4ahMvljlCCuAAAAAElFTkSuQmCC' const secondArrow = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAHCAYAAAA4R3wZAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABZSURBVHgBlY7RDYAwCETBCbqBOoHdzBGME+hmOoKb4OtPw+f1kgs5wgPMBEXEgvfcmxTQ3T9KBT56jzCbrhu/LDobeBGKCNY2C7iaKg5s+Bn6kOEyDGU45x/4MCszr0YH2gAAAABJRU5ErkJggg==' const stampBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALYAAAC3CAMAAACIclSTAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAKmUExURUdwTFBQUGxz6GeA6mxz52xy6Gxy52h55XBx6E9PUW1y51BOTm1x52xx52tz6FBQUFBPT2pz6lBOTm1y6GKF7GKE61BQUGxz51BPT2xz6GOD61+F6mGH7GOE7Gx052KE61BOTmxz52CG61BPT1BOTlBPT2h66GSB6md76l+E6VBOTmKD62Z86lqJ6Gxz52GG7GZ86WSC61BQUFBQUFBNTVBPT2GG7FBNTXJi5ZxC8V6D6lBOTm1x52SA62h56mh46Gxw51BOTlBOTnkI/3B05yd8/WV+6z6R2sgC/8cg/zbx/9oB/8EB/yDm/2pu7TAl2jka32xy588H/7XP/0qK3eMI/xTs/wjc/OoF/zQg6j8R7akM/0IQ+iuX298D/+kO/z0W8/EF/w3K+7La/1ji/3J7/zsZ82p36DCW5Cvy/ypa+qAB/8nc/zaT2+UA/7gZ/xbo/iPx/xWU8iBA4jkp5zQ1+joW821x6VVp+ZIF/xTv/wrC91cM/rQA/02J3u4A/8s1/6ED/50A/1p26Vpp6xnq/xHw/9Wm/9jG/5CY/yVM7MR6/x1K1LVc/9TL/1kS/utm/+2R/4jv/21y52xx51BOTmGH7GSB62OD62d76Wt16Gl46WZ+6mKF7GxZ/3Bi/31D/5BK/4tE/21t/2xm/2VX/4VJ/4Y9/3RT/4sG/3Vd/4pV/31T/5Q7/2Vh/0wS/wLj/0Zw/7IF/2R1/5sE/50l/3wy/2CI7WF8/2Fs/yKq/wnD/2UI/1uP/1dh/0Oa/1iC/4Ed/215/0CI/2V67WiJ/02t/wjT/0O//xu5/2KD7USL720+/y3l/4ss/39v/4XV/y7W/x2U/lCG3p5C/2Og/00y/6Fg/0lT/1eC4CjI/4SS/11+4auc/2K2/4C6/513/8Vq/7E4B0sAAADRdFJOUwBAnyBgQH8QIBDf39+/cCC/MIDv338wj++vX0D+n1BwUM+/n++vQN+/MJCP3yC/74DPYHBwz69gAwlQj+/v79+goM/+QP2v/v4k+eNLYoA5Hu8S+Pv7+oSNhk+m9WerN2lk5xX5ibb2grf75zfTxPogktKkKvbclvNx0sTagtzT7Mb138EzSe9x6Mngcs61sOucyv////////////////////////////////////////////////7////////////////////////////////+cRztcQAAIABJREFUeNrMmttvGtkdx8/c78MAhgETA8PF4BvGOI67BsfBytrqSnmgTaS+pFKbfUilpv0PVn2p0qeqFTM1TsxDn/O0r4mqlbrqXh6qbJStou1u2+Q/6e+cMzOAL4mxcZIjx8LYjD985/u7OghN8kiykOV5kRyeFwRZQu/1kbKmnVZbumOwrE2xbTZdc+Idp2abs+8hvSSY6ZaatnlBxl/KclQQrgtwZPJ1VDDtWsdJm7PvEbMgGi1DzIKaMm+yabXT7XZd8kEOaM2KWRCby9rVq1Uz+l7IzHYMUQBBTdbBuG7I7JLH3QfBoWLP2s4W+45Fv87qBi8h2Ux3CCThdAN6eh6E4A/ho1qfRRxffYfkktgyTAldt1UKO2D2v/TRHwzOw4fwscVmgdzZ4rl3YWgjLkpIsDtuiBmoTT63dFVV4yPUWG16rgJ5lL3Kvm1w3jCyILfjM8Jnl+gbd1iR99OHf0+iAuTFmuOD+9z7oDnH8VvVt+kVXjcEJLDxMFlgZP2aKbwmNUuzELPUJZR7f7+aRfziyvTbsgeBNoYCz41f4+XTFSR262EgOJxFHsDfiuLXDQrthuGn4vx3+hM1q77aBHwaTS/OXLTHJVYXgLwbFpP4eMz0cObWIfD6hVZ+UxUludYNHW0cz8w0FYRiRfwwzxx/pVl2PzyLs9zM4sVZXK4ZsiTi6kek7ohHJMqXNU/LI0Uro3Uvj5+xSgpSPGBnIocl57cC7oMZjrswp5iqibKqS4u2eww0Atb1pKUBo5fXiNho22uiJMb2PK18+XBGWqTUB/ubOVS/EMFlA6ROB4HYGoFmms118iDpJZWyBQ/mPY+q65U9hoHHjLfeaBdRscgcBT/AZ5HjKgsTd7jQAqk7PvWo0uslz7K8bbAz2AFOGR4pKSq24uXL1qqHEP4Hp2F52ij5ALyOFioTNoqoRyU7aDrYQY5WYgo4A4RNpmL469S8EiGPtHlffiaS0sA2Zc+zmvgZzbJKox6v7x9Q7io3vZKbZNqrGZKs+klPF4bMUUoxoCj2bHuNWLkI8YiJfWvn4S3FPLBNqsjMl/FLwOfK4eCsHtBT2eAqicnZWhUR3/Eb6CF/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' const styles = ` <style> @import url('https://fonts.googleapis.com/css2?family=Outfit:wght@200;400;600;800;900&display=swap'); /* LARGE */ .large-body { width: 850px !important; height: 271px !important; background: radial-gradient( 134.77% 134.77% at 47.29% 134.77%, rgba(202, 200, 233, 0.5) 0%, rgba(254, 254, 254, 0.5) 100% ) #ffffff !important; box-shadow: 0px -3px 57px rgba(0, 0, 0, 0.1) !important; border-radius: 20px !important; display: flex !important; align-items: center !important; padding: 30px !important; font-size: 20px !important; } .large-header { display: flex !important; justify-content: space-between !important; } .large-content { display: flex !important; align-items: flex-end !important; } .large-type { display: flex !important; align-items: center !important; } .large-text { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 200 !important; font-size: 0.7em !important; line-height: 1.4em !important; color: rgba(0, 0, 0, 0.5) !important; margin: 0px !important; max-height: 52.88px !important; text-overflow: ellipsis !important; overflow: hidden !important; } .large-name-container { display: flex !important; align-items: center !important; } .large-name { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 700 !important; font-size: 1.4em !important; line-height: 1.75em !important; margin: 0 15px !important; } .large-abrev { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 200 !important; font-size: 1.4em !important; line-height: 1.75em !important; } .by-label { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 200 !important; font-size: 0.7em !important; line-height: 0.9em !important; } .by { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 400 !important; font-size: 0.7em !important; line-height: 0.9em !important; } .large-stamp { margin-right: 1.75em !important; } .large-position { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 300 !important; font-size: 0.8em !important; line-height: 1em !important; color: rgba(0, 0, 0, 0.5) !important; } .large-button { background: radial-gradient( 110.14% 356.77% at -8.3% -103.85%, #8d61eb 0%, #24a1d4 100% ) !important; border-radius: 26.822px !important; color: white !important; font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 700 !important; font-size: 1em !important; line-height: 1.2em !important; padding: 6.25px 21px !important; border: none !important; display: flex !important; align-items: center !important; justify-content: center !important; margin-left: 1.75em !important; } .large-button:hover { cursor: pointer !important; } .large-button span { margin-right: 5px !important; } .large-duration { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 500 !important; font-size: 0.8em !important; line-height: 1em !important; color: #6d71e7 !important; padding: 5.32px 17px !important; background: rgba(109, 113, 231, 0.1) !important; border-radius: 8.66899px !important; } .large-percent { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 700 !important; font-size: 1.35em !important; line-height: 1.155em !important; } .large-profit { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 400 !important; font-size: 1em !important; line-height: 1.25em !important; } .large-access { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 700 !important; font-size: 1.4em !important; line-height: 1.65em !important; } .large-access-text { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 300 !important; font-size: 0.8em !important; line-height: 1em !important; color: rgba(0, 0, 0, 0.5) !important; } .large-logo { width: 36px !important; height: 36px !important; border-radius: 50% !important; } .large-arrows { margin: 0 2.5em !important; } .large-right { display: flex !important; flex-direction: column !important; justify-content: space-between !important; height: 211px !important; text-align: initial !important; } .noaccess { justify-content: space-around !important; padding: 35px 0 !important; text-align: initial !important; } .text-noaccess { font-size: 110% !important; } /* LARGE END */ /* MEDIUM */ .medium-body { width: 525px !important; height: 167px !important; background: radial-gradient( 134.77% 134.77% at 47.29% 134.77%, rgba(202, 200, 233, 0.5) 0%, rgba(254, 254, 254, 0.5) 100% ) #ffffff !important; box-shadow: 0px -3px 57px rgba(0, 0, 0, 0.1) !important; border-radius: 20px !important; display: flex !important; align-items: center !important; padding: 18.5px !important; font-size: 12.35px !important; } .medium-header { display: flex !important; justify-content: space-between !important; } .medium-content { display: flex !important; align-items: flex-end !important; } .medium-type { display: flex !important; align-items: center !important; } .medium-text { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 200 !important; font-size: 0.7em !important; line-height: 1.4em !important; color: rgba(0, 0, 0, 0.5) !important; margin: 0px !important; max-height: 52.88px !important; text-overflow: ellipsis !important; overflow: hidden !important; } .medium-name-container { display: flex !important; align-items: center !important; } .medium-name { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 700 !important; font-size: 1.4em !important; line-height: 1.75em !important; margin: 0 10px !important; } .medium-abrev { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 200 !important; font-size: 1.4em !important; line-height: 1.75em !important; } .by-label { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 200 !important; font-size: 0.7em !important; line-height: 0.9em !important; } .by { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 400 !important; font-size: 0.7em !important; line-height: 0.9em !important; } .medium-stamp { width: 110px !important; margin-right: 10px !important; } .medium-position { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 300 !important; font-size: 0.8em !important; line-height: 1em !important; color: rgba(0, 0, 0, 0.5) !important; } .medium-button { background: radial-gradient( 110.14% 356.77% at -8.3% -103.85%, #8d61eb 0%, #24a1d4 100% ) !important; border-radius: 26.822px !important; color: white !important; font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 700 !important; font-size: 1em !important; line-height: 1.2em !important; padding: 6.25px 21px !important; border: none !important; display: flex !important; align-items: center !important; justify-content: center !important; margin-left: 1.75em !important; } .medium-button:hover { cursor: pointer !important; } .medium-button span { margin-right: 5px !important; } .medium-duration { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 500 !important; font-size: 0.8em !important; line-height: 1em !important; color: #6d71e7 !important; padding: 5.32px 17px !important; background: rgba(109, 113, 231, 0.1) !important; border-radius: 8.66899px !important; } .medium-percent { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 700 !important; font-size: 1.35em !important; line-height: 1.155em !important; } .medium-profit { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 400 !important; font-size: 1em !important; line-height: 1.25em !important; } .medium-access { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 700 !important; font-size: 1.4em !important; line-height: 1.65em !important; } .medium-access-text { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 300 !important; font-size: 0.8em !important; line-height: 1em !important; color: rgba(0, 0, 0, 0.5) !important; } .medium-logo { width: 26px !important; height: 26px !important; border-radius: 50% !important; } .medium-arrows { width: 13px !important; margin: 0 2em !important; } .medium-right { display: flex !important; flex-direction: column !important; justify-content: space-between !important; height: 130px !important; text-align: initial !important; } .noaccess { justify-content: space-around !important; padding: 35px 0 !important; text-align: initial !important; } .text-noaccess { font-size: 110% !important; } /* MEDIUM END */ /* SMALL */ .small-body { width: 300px !important; height: 120px !important; background: radial-gradient( 134.77% 134.77% at 47.29% 134.77%, rgba(202, 200, 233, 0.5) 0%, rgba(254, 254, 254, 0.5) 100% ) #ffffff !important; box-shadow: 0px -3px 57px rgba(0, 0, 0, 0.1) !important; border-radius: 20px !important; display: flex !important; align-items: center !important; padding: 10px !important; font-size: 12.35px !important; } .small-header { display: flex !important; flex-direction: column !important; } .small-content { display: flex !important; align-items: flex-end !important; } .small-type { display: flex !important; align-items: center !important; } .small-text { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 200 !important; font-size: 0.7em !important; line-height: 1.4em !important; color: rgba(0, 0, 0, 0.5) !important; margin: 0px !important; max-height: 52.88px !important; text-overflow: ellipsis !important; overflow: hidden !important; } .small-name-container { display: flex !important; align-items: center !important; } .small-name { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 700 !important; font-size: 1.4em !important; line-height: 1.75em !important; margin: 0 5px !important; } .small-abrev { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 200 !important; font-size: 1.4em !important; line-height: 1.75em !important; } .by-label { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 200 !important; font-size: 0.7em !important; line-height: 0.9em !important; } .by { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 400 !important; font-size: 0.7em !important; line-height: 0.9em !important; } .small-stamp { width: 80px !important; margin-right: 10px !important; } .small-position { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 300 !important; font-size: 0.8em !important; line-height: 1em !important; color: rgba(0, 0, 0, 0.5) !important; } .small-button { background: radial-gradient( 110.14% 356.77% at -8.3% -103.85%, #8d61eb 0%, #24a1d4 100% ) !important; border-radius: 26.822px !important; color: white !important; font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 700 !important; font-size: 1em !important; line-height: 1.2em !important; padding: 6.25px 21px !important; border: none !important; display: flex !important; align-items: center !important; justify-content: center !important; margin-left: 1.75em !important; } .small-button:hover { cursor: pointer !important; } .small-button span { margin-right: 5px !important; } .small-duration { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 500 !important; font-size: 0.8em !important; line-height: 1em !important; color: #6d71e7 !important; padding: 5.32px 17px !important; background: rgba(109, 113, 231, 0.1) !important; border-radius: 8.66899px !important; } .small-percent { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 700 !important; font-size: 1.35em !important; line-height: 1.155em !important; } .small-profit { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 400 !important; font-size: 1em !important; line-height: 1.25em !important; } .small-access { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 700 !important; font-size: 1.4em !important; line-height: 1.65em !important; } .small-access-text { font-family: "Outfit", sans-serif !important; font-style: normal !important; font-weight: 300 !important; font-size: 0.8em !important; line-height: 1em !important; color: rgba(0, 0, 0, 0.5) !important; } .small-logo { width: 20px !important; height: 20px !important; border-radius: 50% !important; } .small-arrows { width: 13px !important; margin: 0 1em !important; } .small-right { display: flex !important; flex-direction: column !important; justify-content: space-between !important; height: 100px !important; text-align: initial !important; } .noaccess { justify-content: space-around !important; padding: 35px 0 !important; text-align: initial !important; } .text-noaccess { font-size: 110% !important; } .hidden { display: none !important; } /* SMALL END */ </style> ` const sizePrefix = size || 'small' let htmlContent = '' if (kind !== 'close') { htmlContent = ` ${styles} <div class="${sizePrefix}-body"> <div class="${sizePrefix}-left"> <img src="${stampBase64}" alt="" class="${sizePrefix}-stamp" /> </div> <div class="${sizePrefix}-right noaccess"> <span class="${sizePrefix}-access">INSUFFICIENT ACCESS</span> <p class="${sizePrefix}-access-text text-noaccess"> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Et malesuada fames ac turpis egestas maecenas. Felis donec et odio pellentesque diam volutpat commodo sed. </p> </div> </div>` } if (kind === 'close') { htmlContent = ` ${styles} <div class="${sizePrefix}-body"> <div class="${sizePrefix}-left"> <img src="${stampBase64}" alt="" class="${sizePrefix}-stamp" /> </div> <div class="${sizePrefix}-right"> <div class="${sizePrefix}-header"> <div class="${sizePrefix}-name-container"> <img src="${assetImage}" alt="" class="${sizePrefix}-logo" /> <span class="${sizePrefix}-name">${asset?.ticker}</span> <span class="${sizePrefix}-abrev">| ${asset?.description}</span> </div> <div class="by-container"> <span class="by-label">BY&nbsp;</span> <span class="by">${ strategy?.name?.toUpperCase() || creator?.name?.toUpperCase() }&nbsp;</span> <img src="${landingCheck}" alt="" class="by-img" /> </div> </div> <div class="${sizePrefix}-position"> Position Opened at $${ calcResultInfo?.calculation[0].price } and closed at $${ calcResultInfo?.calculation[ calcResultInfo?.calculation.length - 1 ].price } </div> <div class="${sizePrefix}-type"> <span class="${sizePrefix}-duration">${ calcResultInfo?.summary.profit || calcResultInfo?.summary.percentage === 0 ? 'LONG' : 'SHORT' }</span> <img src="${mainArrow}" alt="" class="${sizePrefix}-arrows" /> <div> <span class="${sizePrefix}-percent">${calcResultInfo?.summary.percentage.toFixed( 6, )}%</span> <span class="${sizePrefix}-profit">&nbsp;PROFIT</span> </div> </div> <div class="${sizePrefix}-content"> <div class="${sizePrefix}-content-left"> <p class="${sizePrefix}-text"> This trade idea was created as an NFT and saved on a blockchain so that the price at which it was opened and closed can be independently verified after the fact </p> </div> <div class="${sizePrefix}-content-right"> <button class="${sizePrefix}-button"> <span>VIEW</span> <img src="${secondArrow}" alt="" /> </button> </div> </div> </div> </div> ` } resposeMinified = minifyHtml(htmlContent) } return resposeMinified as string } const getProviderList = async (): Promise<string[]> => { return ['0x2767441E044aCd9bbC21a759fB0517494875092d'] } const getPricingProviderList = async () => { const providers = [...CONTRACT_CONSTANTS.PRICING_PROVIDER] return providers.map((provider) => { return { name: provider, // fullName: provider, enabled: true, } }) } const resetCache = async (): Promise<void> => { await CacheService.resetData() } export const MigrationV3TemporaryModule = { resetCache, getETHBalance, ideaPublicVerificationHtml, getProviderList, getPricingProviderList, isCloseIdea, }