UNPKG

@ixily/activ

Version:

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

1,049 lines (997 loc) 33.3 kB
import BigNumber from 'bignumber.js' import { IMessDbView } from '../../' import { CONTRACT_INTERFACES as CI, CONTRACT_INTERFACES, IChain, IPortfolioView, IPortfolioViewEntry, IStrategyChain, IdeaCreatedEvent, MyIdeaKeys, copyObj, LogModule as log, uniqueKeyJoin, uniqueKeySplit, } from '../../../../../' interface Creator { creatorWallet: string strategies: Set<string> strategiesByOldest: string[] createdIdeasIndexesByOldest: string[] } interface IRebalanceMap { index: number reference: string ideaIndexes: string[] } interface MyContractDb { contractUniqueKey: string // unique, chain: IChain contractAddress: string creators: Map<string, Creator> creatorsByOldest: string[] userAccessStrategies: Map<string, Set<string>> userSubscribedToStrategies: Map<string, Set<string>> userAccessIdeaNfts: Map<string, Set<number>> userAccessIdeaIndexesByOldest: Map<string, string[]> userAccessIdeaKeysByStrategy: Map<string, Map<string, Set<number>>> publicStrategies: Set<string> publicStrategiesByOldest: string[] publicStrategiesFilled: Map<string, CONTRACT_INTERFACES.ITradeIdeaStrategy> ideaIndexByOldest: string[] publicIdeaIndexByOldest: string[] ideaIndexByStrategyByOldest: Map<string, string[]> ideaIndexToKeys: Map<string, MyIdeaKeys> ideaIndexToData: Map<string, CONTRACT_INTERFACES.ITradeIdea> allocationStrategyPortfolios: Map<string, IPortfolioView | 'ENCRYPTED'> allocationRebalances: Map<string, IRebalanceMap[]> } export interface MyDbViewState { contractDbs: Map<string, MyContractDb> contractsByOldest: string[] } const state: MyDbViewState = { contractDbs: new Map<string, MyContractDb>(), contractsByOldest: [] as string[], } const getContractsInMemoryState = (): MyDbViewState => { return state } const setContractsInMemoryState = (_state: MyDbViewState) => { state.contractDbs = _state.contractDbs state.contractsByOldest = _state.contractsByOldest } const reduce = async ( contractUniqueKey: string, newIdeaEvent: IdeaCreatedEvent, strategyChain: IStrategyChain, strategyCache: CONTRACT_INTERFACES.IStrategyState, ): Promise<void> => { // console.log('++++++++++++++++++++++++++++++++++++++') // console.log('++++++++++++++++++++++++++++++++++++++') // console.log('++++++++++++++++++++++++++++++++++++++') log.dev('+reducing+') log.dev('contractUniqueKey') log.dev(contractUniqueKey) // log.dev('newIdeaEvent') // log.dev(newIdeaEvent) const decomposed = uniqueKeySplit(contractUniqueKey) const chain = decomposed[0] as IChain const contractAddress = decomposed[1] log.dev('contractAddress') log.dev(contractAddress) log.dev('chain') log.dev(chain) const nftId = newIdeaEvent.nftId // unique within contract const strategyUniqueKey = uniqueKeyJoin([ chain, contractAddress, newIdeaEvent.creatorAddress, newIdeaEvent.strategyKey, ]) const ideaIndex = uniqueKeyJoin([chain, contractAddress, '' + nftId]) const myIdeaKeys: MyIdeaKeys = { ideaIndex, strategyUniqueKey, chain, nftId, contractAddress, strategyKey: newIdeaEvent.strategyKey, stageKey: newIdeaEvent.stageKey, ideaKey: newIdeaEvent.ideaKey, } let myContractDb = state.contractDbs.get(contractUniqueKey) if (myContractDb === undefined) { myContractDb = { contractUniqueKey, chain, contractAddress, creators: new Map<string, Creator>(), creatorsByOldest: [] as string[], userAccessStrategies: new Map<string, Set<string>>(), userSubscribedToStrategies: new Map<string, Set<string>>(), userAccessIdeaNfts: new Map<string, Set<number>>(), userAccessIdeaIndexesByOldest: new Map<string, string[]>(), userAccessIdeaKeysByStrategy: new Map< string, Map<string, Set<number>> >(), publicStrategies: new Set<string>(), publicStrategiesByOldest: [] as string[], publicStrategiesFilled: new Map< string, CONTRACT_INTERFACES.ITradeIdeaStrategy >(), ideaIndexByOldest: [], publicIdeaIndexByOldest: [], ideaIndexByStrategyByOldest: new Map<string, string[]>(), ideaIndexToKeys: new Map<string, MyIdeaKeys>(), ideaIndexToData: new Map<string, CONTRACT_INTERFACES.ITradeIdea>(), allocationStrategyPortfolios: new Map< string, IPortfolioView | 'ENCRYPTED' >(), allocationRebalances: new Map<string, IRebalanceMap[]>(), } log.dev('setting up state.contractDbs') log.dev('contractUniqueKey') log.dev(contractUniqueKey) log.dev('myContractDb') log.dev(myContractDb) state.contractDbs.set(contractUniqueKey, myContractDb) state.contractsByOldest.push(contractUniqueKey) log.dev('state.contractsByOldest') log.dev(state.contractsByOldest) } myContractDb = state.contractDbs.get(contractUniqueKey)! myContractDb.publicStrategiesFilled.set( strategyUniqueKey, strategyCache.strategy, ) let creator = myContractDb.creators.get(newIdeaEvent.creatorAddress) if (!creator) { myContractDb.creatorsByOldest.push(newIdeaEvent.creatorAddress) myContractDb.creators.set(newIdeaEvent.creatorAddress, { creatorWallet: newIdeaEvent.creatorAddress, strategies: new Set<string>(), strategiesByOldest: [] as string[], createdIdeasIndexesByOldest: [] as string[], }) } creator = myContractDb.creators.get(newIdeaEvent.creatorAddress)! if (!creator.strategies.has(strategyUniqueKey)) { creator.strategies.add(strategyUniqueKey) creator.strategiesByOldest.push(strategyUniqueKey) } creator.createdIdeasIndexesByOldest.push(ideaIndex) const stg = myContractDb.ideaIndexByStrategyByOldest.get(strategyUniqueKey) if (!stg) { myContractDb.ideaIndexByStrategyByOldest.set(strategyUniqueKey, [ ideaIndex, ]) } else { stg.push(ideaIndex) } if (!myContractDb.ideaIndexToKeys.has(ideaIndex)) { myContractDb.ideaIndexToKeys.set(ideaIndex, myIdeaKeys) myContractDb.ideaIndexByOldest.push(ideaIndex) } const idea = strategyChain.ideas.find( (idea) => idea.ideaKey === newIdeaEvent.ideaKey, ) const ideaStage = idea!.stages.find( (ideaStage) => ideaStage.ideaStageKey === newIdeaEvent.stageKey, ) const openSeaIdea = ideaStage!.ideaStage myContractDb.ideaIndexToData.set(ideaIndex, openSeaIdea) const accessors = openSeaIdea.access?.wallets const addSubscriber = (subscriber: string) => { if (subscriber !== newIdeaEvent.creatorAddress) { let userSubscribedToStrategies = myContractDb!.userSubscribedToStrategies.get(subscriber) if (userSubscribedToStrategies === undefined) { myContractDb!.userSubscribedToStrategies.set( subscriber, new Set<string>(), ) userSubscribedToStrategies = myContractDb!.userSubscribedToStrategies.get(subscriber)! } userSubscribedToStrategies.add(strategyUniqueKey) } } const addAccessor = (accessor: string) => { let userAccessStrategies = myContractDb!.userAccessStrategies.get(accessor) if (userAccessStrategies === undefined) { myContractDb!.userAccessStrategies.set(accessor, new Set<string>()) userAccessStrategies = myContractDb!.userAccessStrategies.get(accessor)! } userAccessStrategies.add(strategyUniqueKey) if (!myContractDb!.userAccessIdeaNfts.has(accessor)) { myContractDb!.userAccessIdeaNfts.set(accessor, new Set<number>()) myContractDb!.userAccessIdeaIndexesByOldest.set(accessor, []) myContractDb!.userAccessIdeaKeysByStrategy.set( accessor, new Map<string, Set<number>>(), ) } const userAccessIdeaNfts = myContractDb!.userAccessIdeaNfts.get(accessor)! if (!userAccessIdeaNfts.has(nftId)) { userAccessIdeaNfts.add(nftId) myContractDb!.userAccessIdeaIndexesByOldest .get(accessor)! .push(ideaIndex) } const userAccessIdeaKeysByStrategy = myContractDb!.userAccessIdeaKeysByStrategy.get(accessor)! if (!userAccessIdeaKeysByStrategy.has(strategyUniqueKey)) { userAccessIdeaKeysByStrategy.set( strategyUniqueKey, new Set<number>(), ) } // console.log('well done') const stgSet = userAccessIdeaKeysByStrategy.get(strategyUniqueKey)! stgSet.add(newIdeaEvent.ideaKey) } addAccessor(newIdeaEvent.creatorAddress) if (accessors !== undefined) { // console.log('test') for (const accessor of accessors) { addAccessor(accessor) addSubscriber(accessor) } // console.log(openSeaIdea.idea) // console.log('openSeaIea.idea') // console.log('fasdjfhsdujkhfjklashfljkahsdjkhlasdjkfajklshflj') // console.log('fasdjfhsdujkhfjklashfljkahsdjkhlasdjkfajklshflj') // console.log('fasdjfhsdujkhfjklashfljkahsdjkhlasdjkfajklshflj') if (typeof openSeaIdea.idea !== 'string') { if (openSeaIdea.idea.kind === 'close') { // console.log(openSeaIdea.idea) // console.log('openSeaIea.idea') if (!myContractDb.publicStrategies.has(strategyUniqueKey)) { myContractDb.publicStrategies.add(strategyUniqueKey) myContractDb.publicStrategiesByOldest.push( strategyUniqueKey, ) } myContractDb.publicIdeaIndexByOldest.push(ideaIndex) } } } else { // console.log('the case') if (!myContractDb.publicStrategies.has(strategyUniqueKey)) { myContractDb.publicStrategies.add(strategyUniqueKey) myContractDb.publicStrategiesByOldest.push(strategyUniqueKey) } myContractDb.publicIdeaIndexByOldest.push(ideaIndex) } // console.log('===================================') // console.log('===================================') if (openSeaIdea.strategy.ordersType === 'ALLOCATION') { // process allocation if (!myContractDb.allocationStrategyPortfolios.has(strategyUniqueKey)) { myContractDb.allocationStrategyPortfolios.set(strategyUniqueKey, { strategyKey: strategyUniqueKey, totalEntries: 0, totalAllocation: 0, entries: [], }) } if ( myContractDb.allocationStrategyPortfolios.get(strategyUniqueKey) !== 'ENCRYPTED' ) { const hasEncryption = openSeaIdea.access !== undefined if (hasEncryption) { myContractDb.allocationStrategyPortfolios.set( strategyUniqueKey, 'ENCRYPTED', ) } else { const innerIdea = openSeaIdea.idea as CI.ITradeIdeaIdea const portfolio = myContractDb.allocationStrategyPortfolios.get( strategyUniqueKey, )! as IPortfolioView // console.log('+++++++++++++++++++++++++++++++++++') // console.log('++++++++++++ CALC PORTFOLIO +++++++') // console.log('+++++++++++++++++++++++++++++++++++') // console.log('PRIOR STEP: ') // console.log('portfolio.totalEntries') // console.log(portfolio.totalEntries) // console.log('portfolio.totalAllocation') // console.log(portfolio.totalAllocation) // console.log('portfolio.entries') // console.log(portfolio.entries) // console.log('STEP:') // console.log('innerIdea') // console.log(innerIdea) if (innerIdea.kind === 'open') { portfolio.totalEntries++ const portEntry: IPortfolioViewEntry = { reference: openSeaIdea.content.reference, pricing: openSeaIdea.pricing, price: innerIdea.priceInfo!.price!, notes: innerIdea.notes.commentary, title: innerIdea.title, asset: innerIdea.asset, direction: innerIdea.trade?.direction, allocation: innerIdea.trade!.allocation!, } portfolio.entries.push(portEntry) portfolio.totalAllocation = +BigNumber( portfolio.totalAllocation, ) .plus(portEntry.allocation) .toFixed(2) } else if (innerIdea.kind === 'adjust') { const portEntry = portfolio.entries.find( (entry) => entry.asset.ticker === innerIdea.asset.ticker, )! portfolio.totalAllocation = +BigNumber( portfolio.totalAllocation, ) .minus(portEntry.allocation) .toFixed(2) portEntry.reference = openSeaIdea.content.reference portEntry.price = innerIdea.priceInfo!.price! portEntry.notes = innerIdea.notes.commentary portEntry.title = innerIdea.title || portEntry.title portEntry.asset = innerIdea.asset portEntry.direction = innerIdea.trade?.direction || portEntry.direction if (innerIdea.adjustment!.kind === 'increase') { portEntry.allocation = +BigNumber(portEntry.allocation) .plus( BigNumber(portEntry.allocation).times( BigNumber( innerIdea.adjustment!.percentage, ).dividedBy(100), ), ) .toFixed(2) } else { portEntry.allocation = +BigNumber(portEntry.allocation) .minus( BigNumber(portEntry.allocation).times( BigNumber( innerIdea.adjustment!.percentage, ).dividedBy(100), ), ) .toFixed(2) } portfolio.totalAllocation = +BigNumber( portfolio.totalAllocation, ) .plus(portEntry.allocation) .toFixed(2) } else if (innerIdea.kind === 'close') { const portEntryIndex = portfolio.entries.findIndex( (entry) => entry.asset.ticker === innerIdea.asset.ticker, ) if (portEntryIndex !== -1) { portfolio.totalAllocation = +BigNumber( portfolio.totalAllocation, ) .minus(portfolio.entries[portEntryIndex].allocation) .toFixed(2) portfolio.entries.splice(portEntryIndex, 1) portfolio.totalEntries-- } } // console.log('AFTER STEP:') // console.log('portfolio.totalEntries') // console.log(portfolio.totalEntries) // console.log('portfolio.totalAllocation') // console.log(portfolio.totalAllocation) // console.log('portfolio.entries') // console.log(portfolio.entries) // console.log('----------------------------') // console.log('----------------------------') // console.log('----------------------------') // await rest(3000) } } // console.log('_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_') // console.log('_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_') // console.log('_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_') // console.log('_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_') // console.log('openSeaIdea.idea as CI.ITradeIdeaIdea') // console.log(openSeaIdea.idea as CI.ITradeIdeaIdea) // console.log('openSeaIdea.content.reference') // console.log(openSeaIdea.content.reference) // process rebalances const allocationRebalances = myContractDb.allocationRebalances.get(strategyUniqueKey) if (allocationRebalances === undefined) { const allocationRebalances = [] allocationRebalances.push({ index: 0, reference: openSeaIdea.content.reference, ideaIndexes: [ideaIndex], }) myContractDb.allocationRebalances.set( strategyUniqueKey, allocationRebalances, ) } else { const lastOne = allocationRebalances[allocationRebalances.length - 1] // console.log('lastOne') // console.log(lastOne) if (openSeaIdea.content.reference === lastOne.reference) { lastOne.ideaIndexes.push(ideaIndex) } else { allocationRebalances.push({ index: allocationRebalances.length, reference: openSeaIdea.content.reference, ideaIndexes: [ideaIndex], }) } } // await rest(3000) } log.dev('-reduced-') } const listAllContracts = async (): Promise<string[]> => { // console.log('I HAVE BEEN') // console.log('I HAVE BEEN') // console.log('state.contractsByOldest') // console.log(state.contractsByOldest) return [...state.contractsByOldest] } const listAllStrategiesByContractAndUser = async ( uniqueContractKey: string, userWallet: string, ): Promise<string[]> => { // console.log('uniqueContractKey') // console.log(uniqueContractKey) // console.log('userWallet') // console.log(userWallet) // throw new Error('check') const allStrategies = [ ...(await listContractCreatorStrategies(uniqueContractKey, userWallet)), ...(await listContractUserWithAccessibleIdeasStrategies( uniqueContractKey, userWallet, )), ...(await listContractWithPublicIdeasStrategies(uniqueContractKey)), ] // filterOfDuplications without losing order const seen = new Set() const filtered = allStrategies.filter((item) => { if (!seen.has(item)) { seen.add(item) return true } return false }) return [...filtered] } const getStrategyLastIdea = async ( uniqueStrategyReference: string, ): Promise<CONTRACT_INTERFACES.ITradeIdea> => { const decomposed = uniqueKeySplit(uniqueStrategyReference) const uniqueContractKey = uniqueKeyJoin([decomposed[0], decomposed[1]]) const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { throw new Error( `Contract not found for strategy: ${uniqueStrategyReference}`, ) } const stg = myContractDb.ideaIndexByStrategyByOldest.get( uniqueStrategyReference, ) if (!stg) { throw new Error(`Strategy not found: ${uniqueStrategyReference}`) } const lastIdeaIndex = stg[stg.length - 1] const ideaData = myContractDb.ideaIndexToData.get(lastIdeaIndex) if (!ideaData) { throw new Error(`Idea not found: ${lastIdeaIndex}`) } return copyObj(ideaData) } const getStrategy = async ( uniqueStrategyReference: string, ): Promise<CONTRACT_INTERFACES.ITradeIdeaStrategy> => { const decomposed = uniqueKeySplit(uniqueStrategyReference) const uniqueContractKey = uniqueKeyJoin([decomposed[0], decomposed[1]]) const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { throw new Error( `Contract not found for strategy: ${uniqueStrategyReference}`, ) } const stg = myContractDb.publicStrategiesFilled.get(uniqueStrategyReference) if (!stg) { throw new Error(`Strategy not found: ${uniqueStrategyReference}`) } return copyObj(stg!) } const getStrategyCreator = async ( uniqueStrategyReference: string, ): Promise<CONTRACT_INTERFACES.ITradeIdeaCreator> => { const lastIdea = await getStrategyLastIdea(uniqueStrategyReference) return lastIdea.creator } const getCreator = async ( uniqueContractKey: string, creatorWallet: string, ): Promise<CONTRACT_INTERFACES.ITradeIdeaCreator> => { const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { throw new Error(`Contract not found for creator: ${uniqueContractKey}`) } // console.log('creatorWallet') // console.log(creatorWallet) // console.log('myContractDb.creators') // console.log(myContractDb.creators) const creator = myContractDb.creators.get(creatorWallet) if (!creator) { throw new Error(`Creator not found: ${creatorWallet}`) } const lastIdea = creator.createdIdeasIndexesByOldest[ creator.createdIdeasIndexesByOldest.length - 1 ] const ideaData = myContractDb.ideaIndexToData.get(lastIdea) if (!ideaData) { throw new Error(`Idea not found: ${lastIdea}`) } return copyObj(ideaData.creator) } const getStrategyWithCreator = async ( uniqueStrategyReference: string, ): Promise<{ strategy: CONTRACT_INTERFACES.ITradeIdeaStrategy creator: CONTRACT_INTERFACES.ITradeIdeaCreator }> => { const lastIdea = await getStrategyLastIdea(uniqueStrategyReference) return copyObj({ strategy: await getStrategy(uniqueStrategyReference), creator: lastIdea.creator, }) } const listContractWithPublicIdeasStrategies = async ( uniqueContractKey: string, ): Promise<string[]> => { // console.log('uniqueContractKey') // console.log(uniqueContractKey) // console.log('state.contractDbs') // console.log(state.contractDbs) // console.log('dfhjasdfjkdhsflkasdhfjkhasdjk') // console.log('dfhjasdfjkdhsflkasdhfjkhasdjk') const myContractDb = state.contractDbs.get(uniqueContractKey) // console.log('myContractDb') // console.log(myContractDb) if (myContractDb === undefined) { return [] } // console.log('myContractDb.publicStrategiesByOldest') // console.log(myContractDb.publicStrategiesByOldest) // throw new Error('fads') return [...myContractDb.publicStrategiesByOldest] } const listAllIdeasIndexesByStrategy = async ( uniqueStrategyKey: string, ): Promise<string[]> => { const decomposed = uniqueKeySplit(uniqueStrategyKey) const uniqueContractKey = uniqueKeyJoin([decomposed[0], decomposed[1]]) const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { throw new Error(`Contract not found strategy: ${uniqueStrategyKey}`) } const stg = myContractDb.ideaIndexByStrategyByOldest.get(uniqueStrategyKey) if (stg === undefined) { return [] } return copyObj(stg) } const listAllIdeasKeysByStrategy = async ( uniqueStrategyKey: string, ): Promise<MyIdeaKeys[]> => { const decomposed = uniqueKeySplit(uniqueStrategyKey) const uniqueContractKey = uniqueKeyJoin([decomposed[0], decomposed[1]]) const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { throw new Error(`Contract not found strategy: ${uniqueStrategyKey}`) } const stg = myContractDb.ideaIndexByStrategyByOldest.get(uniqueStrategyKey) if (stg === undefined) { return [] } return [...stg.map((each) => myContractDb.ideaIndexToKeys.get(each)!)] } const listAllIdeasIndexesByContract = async ( uniqueContractKey: string, ): Promise<string[]> => { const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { return [] } return [...myContractDb.ideaIndexByOldest] } const listAllPublicIdeasIndexesByContract = async ( uniqueContractKey: string, ): Promise<string[]> => { const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { return [] } return [...myContractDb.publicIdeaIndexByOldest] } const listCreatedByIdeasIndexesByContract = async ( uniqueContractKey: string, creatorWallet: string, ): Promise<string[]> => { const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { return [] } const creator = myContractDb.creators.get(creatorWallet) if (creator === undefined) { return [] } return [...creator.createdIdeasIndexesByOldest] } const listOwnedByIdeasIndexesByContract = async ( uniqueContractKey: string, ownerWallet: string, ): Promise<string[]> => { const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { return [] } const ownerNfts = myContractDb.userAccessIdeaIndexesByOldest.get(ownerWallet) if (ownerNfts === undefined) { return [] } return [...ownerNfts] } const listOwnedByIdeasKeysByContract = async ( uniqueContractKey: string, ownerWallet: string, ): Promise<MyIdeaKeys[]> => { const indexes = await listOwnedByIdeasIndexesByContract( uniqueContractKey, ownerWallet, ) const myContractDb = state.contractDbs.get(uniqueContractKey)! return [ ...indexes.map((each) => { return myContractDb.ideaIndexToKeys.get(each)! }), ] } const getIdeaKeys = async (ideaIndex: string): Promise<MyIdeaKeys> => { const decomposed = uniqueKeySplit(ideaIndex) const uniqueContractKey = uniqueKeyJoin([decomposed[0], decomposed[1]]) const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { throw new Error(`Contract not found for idea: ${ideaIndex}`) } const myIdeaKeys = myContractDb.ideaIndexToKeys.get(ideaIndex) if (myIdeaKeys === undefined) { throw new Error(`Idea not found: ${ideaIndex}`) } return copyObj(myIdeaKeys) } const getIdeaData = async ( ideaIndex: string, ): Promise<CONTRACT_INTERFACES.ITradeIdea> => { const decomposed = uniqueKeySplit(ideaIndex) const uniqueContractKey = uniqueKeyJoin([decomposed[0], decomposed[1]]) const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { throw new Error(`Contract not found for idea: ${ideaIndex}`) } const ideaData = myContractDb.ideaIndexToData.get(ideaIndex) if (ideaData === undefined) { throw new Error(`Idea not found: ${ideaIndex}`) } return copyObj(ideaData) } const listContractCreatorStrategies = async ( uniqueContractKey: string, creatorWallet: string, ): Promise<string[]> => { const contractDb = state.contractDbs.get(uniqueContractKey) if (!contractDb) throw new Error( 'No contractDb found for uniqueContractKey: ' + uniqueContractKey, ) const creator = contractDb.creators.get(creatorWallet) if (!creator) throw new Error('No creator found for creatorWallet: ' + creatorWallet) // console.log('creator.strategiesByOldest') // console.log(creator.strategiesByOldest) // throw new Error('check') return [...creator.strategiesByOldest] } const listContractUserWithAccessibleIdeasStrategies = async ( uniqueContractKey: string, userWallet: string, ): Promise<string[]> => { const contractDb = state.contractDbs.get(uniqueContractKey) if (!contractDb) throw new Error( 'No contractDb found for uniqueContractKey: ' + uniqueContractKey, ) // console.log(userWallet) const userAccessStrategies = contractDb.userAccessStrategies.get(userWallet) // console.log('userAccessStrategies') // console.log(userAccessStrategies) if (userAccessStrategies === undefined) return [] return Array.from(userAccessStrategies) } const listContractUserSubscribedToIdeasStrategies = async ( uniqueContractKey: string, userWallet: string, ): Promise<string[]> => { const contractDb = state.contractDbs.get(uniqueContractKey) if (!contractDb) throw new Error( 'No contractDb found for uniqueContractKey: ' + uniqueContractKey, ) const userAccessStrategies = contractDb.userSubscribedToStrategies.get(userWallet) if (userAccessStrategies === undefined) return [] return Array.from(userAccessStrategies) } const listContractUserAccessibleIdeas = async ( uniqueContractKey: string, userWallet: string, ): Promise<number[]> => { const contractDb = state.contractDbs.get(uniqueContractKey) if (!contractDb) throw new Error( 'No contractDb found for uniqueContractKey: ' + uniqueContractKey, ) const userAccessIdeaNfts = contractDb.userAccessIdeaNfts.get(userWallet) if (userAccessIdeaNfts === undefined) return [] as number[] return Array.from(userAccessIdeaNfts) } const listContractUserAccessibleIdeasByStrategy = async ( uniqueContractKey: string, userWallet: string, uniqueStrategyKey: string, ): Promise<number[]> => { const contractDb = state.contractDbs.get(uniqueContractKey) if (!contractDb) throw new Error( 'No contractDb found for uniqueContractKey: ' + uniqueContractKey, ) const userAccessIdeaKeysByStrategy = contractDb.userAccessIdeaKeysByStrategy.get(userWallet) if (userAccessIdeaKeysByStrategy === undefined) return [] as number[] const userAccessIdeaKeys = userAccessIdeaKeysByStrategy.get(uniqueStrategyKey) if (userAccessIdeaKeys === undefined) return [] as number[] return Array.from(userAccessIdeaKeys) } const getStrategyPortfolio = async ( uniqueStrategyReference: string, ): Promise<IPortfolioView | 'ENCRYPTED'> => { const decomposed = uniqueKeySplit(uniqueStrategyReference) const uniqueContractKey = uniqueKeyJoin([decomposed[0], decomposed[1]]) const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { throw new Error( `Contract not found for strategy: ${uniqueStrategyReference}`, ) } const portfolio = myContractDb.allocationStrategyPortfolios.get( uniqueStrategyReference, ) if (portfolio === undefined) { throw new Error(`Strategy not found: ${uniqueStrategyReference}`) } return copyObj(portfolio) } const getStrategyRebalances = async ( uniqueStrategyReference: string, ): Promise<IRebalanceMap[]> => { const decomposed = uniqueKeySplit(uniqueStrategyReference) const uniqueContractKey = uniqueKeyJoin([decomposed[0], decomposed[1]]) const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { throw new Error( `Contract not found for strategy: ${uniqueStrategyReference}`, ) } const rebalances = myContractDb.allocationRebalances.get( uniqueStrategyReference, ) if (rebalances === undefined) { throw new Error(`Strategy not found: ${uniqueStrategyReference}`) } return copyObj(rebalances) } const getStrategyRebalance = async ( uniqueStrategyReference: string, rebalanceReference: string, ): Promise<IRebalanceMap> => { const decomposed = uniqueKeySplit(uniqueStrategyReference) const uniqueContractKey = uniqueKeyJoin([decomposed[0], decomposed[1]]) const myContractDb = state.contractDbs.get(uniqueContractKey) if (myContractDb === undefined) { throw new Error( `Contract not found for strategy: ${uniqueStrategyReference}`, ) } const rebalances = myContractDb.allocationRebalances.get( uniqueStrategyReference, ) if (rebalances === undefined) { throw new Error(`Strategy not found: ${uniqueStrategyReference}`) } const rebalance = rebalances.find( (rebalance) => rebalance.reference === rebalanceReference, ) if (rebalance === undefined) { throw new Error(`Rebalance not found: ${rebalanceReference}`) } return copyObj(rebalance) } const getStrategyRebalancesInPeriod = async ( uniqueStrategyReference: string, startDate: number, endDate: number, ): Promise<IRebalanceMap[]> => { const rebalances = await getStrategyRebalances(uniqueStrategyReference) // First we filter out rebalances which reference cannot be parsed as a unix timestamp // Then we include the parset timestamp on each rebalance const isUnixTimestampString = (str: string) => { const parsed = parseInt(str) if (isNaN(parsed)) return false return parsed.toString() === str } const rebalanceParsed = rebalances .filter((rebalance) => isUnixTimestampString(rebalance.reference)) .map((rebalance) => { return { ...rebalance, timestamp: parseInt(rebalance.reference), } }) // now we filter ones between the dates const rebalancesInPeriod = rebalanceParsed.filter( (rebalance) => rebalance.timestamp >= startDate && rebalance.timestamp <= endDate, ) return rebalancesInPeriod } interface IContractsInMemoryDbView extends IMessDbView { listAllContracts: () => Promise<string[]> listAllStrategiesByContractAndUser: ( uniqueContractKey: string, userWallet: string, ) => Promise<string[]> getStrategyLastIdea: ( uniqueStrategyReference: string, ) => Promise<CONTRACT_INTERFACES.ITradeIdea> getStrategy: ( uniqueStrategyReference: string, ) => Promise<CONTRACT_INTERFACES.ITradeIdeaStrategy> getStrategyCreator: ( uniqueStrategyReference: string, ) => Promise<CONTRACT_INTERFACES.ITradeIdeaCreator> getCreator: ( uniqueContractKey: string, creatorWallet: string, ) => Promise<CONTRACT_INTERFACES.ITradeIdeaCreator> getStrategyWithCreator: (uniqueStrategyReference: string) => Promise<{ strategy: CONTRACT_INTERFACES.ITradeIdeaStrategy creator: CONTRACT_INTERFACES.ITradeIdeaCreator }> listAllIdeasIndexesByStrategy: ( uniqueStrategyKey: string, ) => Promise<string[]> listAllIdeasKeysByStrategy: ( uniqueStrategyKey: string, ) => Promise<MyIdeaKeys[]> listAllIdeasIndexesByContract: ( uniqueContractKey: string, ) => Promise<string[]> listAllPublicIdeasIndexesByContract: ( uniqueContractKey: string, ) => Promise<string[]> listCreatedByIdeasIndexesByContract: ( uniqueContractKey: string, creatorWallet: string, ) => Promise<string[]> listOwnedByIdeasIndexesByContract: ( uniqueContractKey: string, ownerWallet: string, ) => Promise<string[]> listOwnedByIdeasKeysByContract: ( uniqueContractKey: string, ownerWallet: string, ) => Promise<MyIdeaKeys[]> getIdeaKeys: (ideaIndex: string) => Promise<MyIdeaKeys> getIdeaData: (ideaIndex: string) => Promise<CONTRACT_INTERFACES.ITradeIdea> listContractCreatorStrategies: ( uniqueContractKey: string, creatorWallet: string, ) => Promise<string[]> listContractUserWithAccessibleIdeasStrategies: ( uniqueContractKey: string, userWallet: string, ) => Promise<string[]> listContractUserSubscribedToIdeasStrategies: ( uniqueContractKey: string, userWallet: string, ) => Promise<string[]> listContractUserAccessibleIdeas: ( uniqueContractKey: string, userWallet: string, ) => Promise<number[]> listContractUserAccessibleIdeasByStrategy: ( uniqueContractKey: string, userWallet: string, uniqueStrategyKey: string, ) => Promise<number[]> listContractWithPublicIdeasStrategies: ( uniqueContractKey: string, ) => Promise<string[]> getStrategyPortfolio: ( uniqueStrategyReference: string, ) => Promise<IPortfolioView | 'ENCRYPTED'> getStrategyRebalances: ( uniqueStrategyReference: string, ) => Promise<IRebalanceMap[]> getStrategyRebalance: ( uniqueStrategyReference: string, rebalanceReference: string, ) => Promise<IRebalanceMap> getStrategyRebalancesInPeriod: ( uniqueStrategyReference: string, startDate: number, endDate: number, ) => Promise<IRebalanceMap[]> } const contractsInMemoryDbView: IContractsInMemoryDbView = { reduce, getStrategyLastIdea, getStrategy, getStrategyCreator, getCreator, getStrategyWithCreator, listAllStrategiesByContractAndUser, listAllIdeasIndexesByStrategy, listAllIdeasKeysByStrategy, listAllIdeasIndexesByContract, listAllPublicIdeasIndexesByContract, listCreatedByIdeasIndexesByContract, listOwnedByIdeasIndexesByContract, listOwnedByIdeasKeysByContract, getIdeaKeys, getIdeaData, listAllContracts, listContractWithPublicIdeasStrategies, listContractCreatorStrategies, listContractUserWithAccessibleIdeasStrategies, listContractUserSubscribedToIdeasStrategies, listContractUserAccessibleIdeasByStrategy, listContractUserAccessibleIdeas, getStrategyPortfolio, getStrategyRebalances, getStrategyRebalance, getStrategyRebalancesInPeriod, } export { IContractsInMemoryDbView, contractsInMemoryDbView, getContractsInMemoryState, setContractsInMemoryState, }