@@ -76,9 +76,6 @@ export interface IDAO {
7676
7777 /** DAOs engaging BUILDER activity settings are stored off-chain */
7878 builderActivity ?: IBuilderActivity ;
79-
80- /** Symbol of DAO who absorbed this DAO */
81- absorberSymbol ?: string ;
8279}
8380
8481/** Organization activities supported by OS. */
@@ -135,9 +132,6 @@ export enum LifecyclePhase {
135132
136133 /** Vesting ended - token fully distributed */
137134 LIVE = "LIVE" ,
138-
139- /** Absorbed by other DAO running on Stability OS */
140- ABSORBED = "ABSORBED" ,
141135}
142136
143137/**
@@ -348,9 +342,6 @@ export class OS {
348342 /** Governance proposals. Can be created only at initialChain of DAO. */
349343 proposals : { [ proposalId : string ] : IProposal } = { } ;
350344
351- /** Absorbing deals */
352- absorbing : IAbsorbing [ ] = [ ] ;
353-
354345 /** Current user address */
355346 from : string = "0x00" ;
356347
@@ -369,8 +360,6 @@ export class OS {
369360 maxPvPFee : 100 ,
370361 minFundingDuration : 1 ,
371362 maxFundingDuration : 180 ,
372- // todo refactor, need percent of value
373- minAbsorbOfferUsd : 50000 , // 50k USD
374363 } ;
375364
376365 constructor ( chainId : string ) {
@@ -736,101 +725,6 @@ export class OS {
736725 throw new Error ( "NotFundingPhase" ) ;
737726 }
738727
739- /** @throws Error */
740- absorbingOffer (
741- absorberSymbol : string ,
742- absorbTargetSymbol : string ,
743- amount : number ,
744- ) {
745- this . _onlyOwnerOf ( absorberSymbol ) ;
746-
747- // absorb target must exist in this chain
748- /*const absorbTarget = */ this . getDao ( absorbTargetSymbol ) ;
749-
750- if ( amount < this . settings . minAbsorbOfferUsd ) {
751- throw new Error ( `TooLowAbsorbOfferAmount(${ amount } )` ) ;
752- }
753-
754- // transfer amount from absorber to OS contract for escrow
755-
756- // start voting for target DAO
757- this . absorbing . push ( {
758- absorberSymbol,
759- absorbTargetSymbol,
760- amount,
761- status : VotingStatus . VOTING ,
762- } ) ;
763-
764- this . _emit ( `Action ${ DAOAction . ABSORBING_OFFER } ` ) ;
765- }
766-
767- /** Approve absorbing offer after voting succeed */
768- /** @throws Error */
769- absorbingApprove ( absorberSymbol : string , absorbTargetSymbol : string ) {
770- this . _onlyOwnerOf ( absorbTargetSymbol ) ;
771- for ( let k = 0 ; k < this . absorbing . length ; k ++ ) {
772- const absorbing = this . absorbing [ k ] ;
773- if (
774- absorbing . absorberSymbol === absorberSymbol &&
775- absorbing . absorbTargetSymbol === absorbTargetSymbol &&
776- absorbing . status === VotingStatus . VOTING
777- ) {
778- const target = this . getDao ( absorbing . absorbTargetSymbol ) ;
779- for ( const symbol of Object . keys ( this . daos ) ) {
780- if ( symbol === absorberSymbol ) {
781- // absorb units
782- for ( const unit of target . units ) {
783- this . daos [ symbol ] . units . push ( unit ) ;
784- }
785- }
786- }
787-
788- for ( const symbol of Object . keys ( this . daos ) ) {
789- if ( symbol === absorbTargetSymbol ) {
790- // absorb units
791- this . daos [ symbol ] . units = [ ] ;
792- // set absorber
793- this . daos [ symbol ] . absorberSymbol = absorberSymbol ;
794- // change phase
795- this . daos [ symbol ] . phase = LifecyclePhase . ABSORBED ;
796- }
797- }
798-
799- // transfer offer amount to target DAO holders (airdrop/claim)
800-
801- this . absorbing [ k ] . status = VotingStatus . APPROVED ;
802-
803- this . _emit ( `Action ${ DAOAction . ABSORBING_APPROVE } ` ) ;
804-
805- this . _sendCrossChainMessage ( CROSS_CHAIN_MESSAGE . DAO_ABSORBED , {
806- absorberSymbol,
807- absorbTargetSymbol,
808- } ) ;
809-
810- return ;
811- }
812- }
813- throw new Error ( "AbsorbingOfferNotFound" ) ;
814- }
815-
816- /** Reject absorbing offer after voting succeed */
817- /** @throws Error */
818- absorbingReject ( absorberSymbol : string , absorbTargetSymbol : string ) {
819- this . _onlyOwnerOf ( absorbTargetSymbol ) ;
820- for ( let i = 0 ; i < this . absorbing . length ; i ++ ) {
821- if (
822- this . absorbing [ i ] . absorberSymbol === absorberSymbol &&
823- this . absorbing [ i ] . absorbTargetSymbol === absorbTargetSymbol &&
824- this . absorbing [ i ] . status === VotingStatus . VOTING
825- ) {
826- this . absorbing [ i ] . status = VotingStatus . REJECTED ;
827- this . _emit ( `Action ${ DAOAction . ABSORBING_REJECT } ` ) ;
828- return ;
829- }
830- }
831- throw new Error ( "AbsorbingOfferNotFound" ) ;
832- }
833-
834728 private _proposeAction (
835729 symbol : string ,
836730 action : DAOAction ,
@@ -889,6 +783,70 @@ export class OS {
889783 }
890784 }
891785
786+ /** OFF-CHAIN only **/
787+ /** @throws Error */
788+ roadmap ( symbol : string ) : IRoadmapItem [ ] {
789+ const dao : IDAO = this . getDao ( symbol ) ;
790+ const r : IRoadmapItem [ ] = [ ] ;
791+ let tgeRun = 0 ;
792+
793+ for ( const funding of dao . tokenomics . funding ) {
794+ if ( funding . type === FundingType . SEED ) {
795+ r . push ( {
796+ phase : LifecyclePhase . SEED ,
797+ start : funding . start ,
798+ end : funding . end ,
799+ } ) ;
800+ }
801+ if ( funding . type === FundingType . TGE ) {
802+ // if SEED was done
803+ if ( r . length > 0 ) {
804+ r . push ( {
805+ phase : LifecyclePhase . DEVELOPMENT ,
806+ start : ( r [ 0 ] . end as number ) + 1 ,
807+ end : funding . start - 1 ,
808+ } ) ;
809+ }
810+
811+ tgeRun = funding . claim || funding . end ;
812+ r . push ( {
813+ phase : LifecyclePhase . TGE ,
814+ start : funding . start ,
815+ end : tgeRun ,
816+ } ) ;
817+ }
818+ }
819+
820+ if ( dao . tokenomics . vesting ) {
821+ let vestingStart = this . blockTimestamp ;
822+ let vestingEnd = this . blockTimestamp ;
823+ for ( const vesting of dao . tokenomics . vesting ) {
824+ if ( vesting . start < vestingStart ) {
825+ vestingStart = vesting . start ;
826+ }
827+ if ( vesting . end > vestingEnd ) {
828+ vestingEnd = vesting . end ;
829+ }
830+ }
831+ r . push ( {
832+ phase : LifecyclePhase . LIVE_CLIFF ,
833+ start : tgeRun + 1 ,
834+ end : vestingStart - 1 ,
835+ } ) ;
836+ r . push ( {
837+ phase : LifecyclePhase . LIVE_VESTING ,
838+ start : vestingStart ,
839+ end : vestingEnd ,
840+ } ) ;
841+ r . push ( {
842+ phase : LifecyclePhase . LIVE ,
843+ start : vestingEnd + 1 ,
844+ } ) ;
845+ }
846+
847+ return r ;
848+ }
849+
892850 /** @throws Error */
893851 tasks ( symbol : string ) : ITask [ ] {
894852 const dao : IDAO = this . getDao ( symbol ) ;
@@ -974,7 +932,7 @@ export class OS {
974932 } else if ( dao . phase === LifecyclePhase . LIVE_VESTING ) {
975933 // distribute vesting funds to leverage token
976934 } else if ( dao . phase === LifecyclePhase . LIVE ) {
977- // lifetime revenue generating for DAO holders till possible absorbing
935+ // lifetime revenue generating for DAO holders ( till ABSORBED proposed feature)
978936 }
979937
980938 return r ;
@@ -1013,10 +971,6 @@ export class OS {
1013971 getDaoOwner ( symbol : string ) : string {
1014972 const dao = this . getDao ( symbol ) ;
1015973
1016- if ( dao . phase === LifecyclePhase . ABSORBED ) {
1017- return this . getDaoOwner ( dao . absorberSymbol as string ) as string ;
1018- }
1019-
1020974 if ( dao . phase === LifecyclePhase . DRAFT ) {
1021975 return dao . deployer ;
1022976 }
@@ -1142,9 +1096,6 @@ export enum DAOAction {
11421096 UPDATE_UNITS ,
11431097 UPDATE_FUNDING ,
11441098 UPDATE_VESTING ,
1145- ABSORBING_OFFER ,
1146- ABSORBING_APPROVE ,
1147- ABSORBING_REJECT ,
11481099}
11491100
11501101interface IOSSettings {
@@ -1162,14 +1113,6 @@ interface IOSSettings {
11621113 maxPvPFee : number ;
11631114 minFundingDuration : number ;
11641115 maxFundingDuration : number ;
1165- minAbsorbOfferUsd : number ;
1166- }
1167-
1168- interface IAbsorbing {
1169- status : VotingStatus ;
1170- absorberSymbol : string ;
1171- absorbTargetSymbol : string ;
1172- amount : number ;
11731116}
11741117
11751118enum VotingStatus {
@@ -1182,7 +1125,6 @@ enum CROSS_CHAIN_MESSAGE {
11821125 NEW_DAO_SYMBOL = 0 ,
11831126 DAO_RENAME_SYMBOL ,
11841127 DAO_BRIDGED ,
1185- DAO_ABSORBED ,
11861128}
11871129
11881130interface ITask {
@@ -1197,3 +1139,9 @@ interface IProposal {
11971139 payload : any ;
11981140 status : VotingStatus ;
11991141}
1142+
1143+ interface IRoadmapItem {
1144+ phase : LifecyclePhase ;
1145+ start : number ;
1146+ end ?: number ;
1147+ }
0 commit comments