@ixily/activ
Version:
Alpha Capture Trade Idea Verification. Blockchain ownership proven trade ideas and strategies.
904 lines (848 loc) • 39.7 kB
text/typescript
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 ;
height: 271px ;
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 ;
box-shadow: 0px -3px 57px rgba(0, 0, 0, 0.1) ;
border-radius: 20px ;
display: flex ;
align-items: center ;
padding: 30px ;
font-size: 20px ;
}
.large-header {
display: flex ;
justify-content: space-between ;
}
.large-content {
display: flex ;
align-items: flex-end ;
}
.large-type {
display: flex ;
align-items: center ;
}
.large-text {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 200 ;
font-size: 0.7em ;
line-height: 1.4em ;
color: rgba(0, 0, 0, 0.5) ;
margin: 0px ;
max-height: 52.88px ;
text-overflow: ellipsis ;
overflow: hidden ;
}
.large-name-container {
display: flex ;
align-items: center ;
}
.large-name {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 700 ;
font-size: 1.4em ;
line-height: 1.75em ;
margin: 0 15px ;
}
.large-abrev {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 200 ;
font-size: 1.4em ;
line-height: 1.75em ;
}
.by-label {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 200 ;
font-size: 0.7em ;
line-height: 0.9em ;
}
.by {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 400 ;
font-size: 0.7em ;
line-height: 0.9em ;
}
.large-stamp {
margin-right: 1.75em ;
}
.large-position {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 300 ;
font-size: 0.8em ;
line-height: 1em ;
color: rgba(0, 0, 0, 0.5) ;
}
.large-button {
background: radial-gradient(
110.14% 356.77% at -8.3% -103.85%,
#8d61eb 0%,
#24a1d4 100%
) ;
border-radius: 26.822px ;
color: white ;
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 700 ;
font-size: 1em ;
line-height: 1.2em ;
padding: 6.25px 21px ;
border: none ;
display: flex ;
align-items: center ;
justify-content: center ;
margin-left: 1.75em ;
}
.large-button:hover {
cursor: pointer ;
}
.large-button span {
margin-right: 5px ;
}
.large-duration {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 500 ;
font-size: 0.8em ;
line-height: 1em ;
color: #6d71e7 ;
padding: 5.32px 17px ;
background: rgba(109, 113, 231, 0.1) ;
border-radius: 8.66899px ;
}
.large-percent {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 700 ;
font-size: 1.35em ;
line-height: 1.155em ;
}
.large-profit {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 400 ;
font-size: 1em ;
line-height: 1.25em ;
}
.large-access {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 700 ;
font-size: 1.4em ;
line-height: 1.65em ;
}
.large-access-text {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 300 ;
font-size: 0.8em ;
line-height: 1em ;
color: rgba(0, 0, 0, 0.5) ;
}
.large-logo {
width: 36px ;
height: 36px ;
border-radius: 50% ;
}
.large-arrows {
margin: 0 2.5em ;
}
.large-right {
display: flex ;
flex-direction: column ;
justify-content: space-between ;
height: 211px ;
text-align: initial ;
}
.noaccess {
justify-content: space-around ;
padding: 35px 0 ;
text-align: initial ;
}
.text-noaccess {
font-size: 110% ;
}
/* LARGE END */
/* MEDIUM */
.medium-body {
width: 525px ;
height: 167px ;
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 ;
box-shadow: 0px -3px 57px rgba(0, 0, 0, 0.1) ;
border-radius: 20px ;
display: flex ;
align-items: center ;
padding: 18.5px ;
font-size: 12.35px ;
}
.medium-header {
display: flex ;
justify-content: space-between ;
}
.medium-content {
display: flex ;
align-items: flex-end ;
}
.medium-type {
display: flex ;
align-items: center ;
}
.medium-text {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 200 ;
font-size: 0.7em ;
line-height: 1.4em ;
color: rgba(0, 0, 0, 0.5) ;
margin: 0px ;
max-height: 52.88px ;
text-overflow: ellipsis ;
overflow: hidden ;
}
.medium-name-container {
display: flex ;
align-items: center ;
}
.medium-name {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 700 ;
font-size: 1.4em ;
line-height: 1.75em ;
margin: 0 10px ;
}
.medium-abrev {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 200 ;
font-size: 1.4em ;
line-height: 1.75em ;
}
.by-label {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 200 ;
font-size: 0.7em ;
line-height: 0.9em ;
}
.by {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 400 ;
font-size: 0.7em ;
line-height: 0.9em ;
}
.medium-stamp {
width: 110px ;
margin-right: 10px ;
}
.medium-position {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 300 ;
font-size: 0.8em ;
line-height: 1em ;
color: rgba(0, 0, 0, 0.5) ;
}
.medium-button {
background: radial-gradient(
110.14% 356.77% at -8.3% -103.85%,
#8d61eb 0%,
#24a1d4 100%
) ;
border-radius: 26.822px ;
color: white ;
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 700 ;
font-size: 1em ;
line-height: 1.2em ;
padding: 6.25px 21px ;
border: none ;
display: flex ;
align-items: center ;
justify-content: center ;
margin-left: 1.75em ;
}
.medium-button:hover {
cursor: pointer ;
}
.medium-button span {
margin-right: 5px ;
}
.medium-duration {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 500 ;
font-size: 0.8em ;
line-height: 1em ;
color: #6d71e7 ;
padding: 5.32px 17px ;
background: rgba(109, 113, 231, 0.1) ;
border-radius: 8.66899px ;
}
.medium-percent {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 700 ;
font-size: 1.35em ;
line-height: 1.155em ;
}
.medium-profit {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 400 ;
font-size: 1em ;
line-height: 1.25em ;
}
.medium-access {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 700 ;
font-size: 1.4em ;
line-height: 1.65em ;
}
.medium-access-text {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 300 ;
font-size: 0.8em ;
line-height: 1em ;
color: rgba(0, 0, 0, 0.5) ;
}
.medium-logo {
width: 26px ;
height: 26px ;
border-radius: 50% ;
}
.medium-arrows {
width: 13px ;
margin: 0 2em ;
}
.medium-right {
display: flex ;
flex-direction: column ;
justify-content: space-between ;
height: 130px ;
text-align: initial ;
}
.noaccess {
justify-content: space-around ;
padding: 35px 0 ;
text-align: initial ;
}
.text-noaccess {
font-size: 110% ;
}
/* MEDIUM END */
/* SMALL */
.small-body {
width: 300px ;
height: 120px ;
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 ;
box-shadow: 0px -3px 57px rgba(0, 0, 0, 0.1) ;
border-radius: 20px ;
display: flex ;
align-items: center ;
padding: 10px ;
font-size: 12.35px ;
}
.small-header {
display: flex ;
flex-direction: column ;
}
.small-content {
display: flex ;
align-items: flex-end ;
}
.small-type {
display: flex ;
align-items: center ;
}
.small-text {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 200 ;
font-size: 0.7em ;
line-height: 1.4em ;
color: rgba(0, 0, 0, 0.5) ;
margin: 0px ;
max-height: 52.88px ;
text-overflow: ellipsis ;
overflow: hidden ;
}
.small-name-container {
display: flex ;
align-items: center ;
}
.small-name {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 700 ;
font-size: 1.4em ;
line-height: 1.75em ;
margin: 0 5px ;
}
.small-abrev {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 200 ;
font-size: 1.4em ;
line-height: 1.75em ;
}
.by-label {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 200 ;
font-size: 0.7em ;
line-height: 0.9em ;
}
.by {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 400 ;
font-size: 0.7em ;
line-height: 0.9em ;
}
.small-stamp {
width: 80px ;
margin-right: 10px ;
}
.small-position {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 300 ;
font-size: 0.8em ;
line-height: 1em ;
color: rgba(0, 0, 0, 0.5) ;
}
.small-button {
background: radial-gradient(
110.14% 356.77% at -8.3% -103.85%,
#8d61eb 0%,
#24a1d4 100%
) ;
border-radius: 26.822px ;
color: white ;
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 700 ;
font-size: 1em ;
line-height: 1.2em ;
padding: 6.25px 21px ;
border: none ;
display: flex ;
align-items: center ;
justify-content: center ;
margin-left: 1.75em ;
}
.small-button:hover {
cursor: pointer ;
}
.small-button span {
margin-right: 5px ;
}
.small-duration {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 500 ;
font-size: 0.8em ;
line-height: 1em ;
color: #6d71e7 ;
padding: 5.32px 17px ;
background: rgba(109, 113, 231, 0.1) ;
border-radius: 8.66899px ;
}
.small-percent {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 700 ;
font-size: 1.35em ;
line-height: 1.155em ;
}
.small-profit {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 400 ;
font-size: 1em ;
line-height: 1.25em ;
}
.small-access {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 700 ;
font-size: 1.4em ;
line-height: 1.65em ;
}
.small-access-text {
font-family: "Outfit", sans-serif ;
font-style: normal ;
font-weight: 300 ;
font-size: 0.8em ;
line-height: 1em ;
color: rgba(0, 0, 0, 0.5) ;
}
.small-logo {
width: 20px ;
height: 20px ;
border-radius: 50% ;
}
.small-arrows {
width: 13px ;
margin: 0 1em ;
}
.small-right {
display: flex ;
flex-direction: column ;
justify-content: space-between ;
height: 100px ;
text-align: initial ;
}
.noaccess {
justify-content: space-around ;
padding: 35px 0 ;
text-align: initial ;
}
.text-noaccess {
font-size: 110% ;
}
.hidden {
display: none ;
}
/* 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 </span>
<span class="by">${
strategy?.name?.toUpperCase() || creator?.name?.toUpperCase()
} </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"> 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,
}