Skip to content

Commit fc808bf

Browse files
committed
Merge branch 'main' of https://github.com/stabilitydao/stability into mttn3773-dev
2 parents c9b7ab9 + 3fba2f1 commit fc808bf

File tree

4 files changed

+111
-175
lines changed

4 files changed

+111
-175
lines changed

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@stabilitydao/stability",
3-
"version": "0.57.3",
3+
"version": "0.58.1",
44
"description": "Stability Operating System Library",
55
"main": "out/index.js",
66
"types": "out/index.d.ts",
@@ -41,6 +41,5 @@
4141
"ts-node": "^10.9.2",
4242
"typescript": "^5.4.5",
4343
"viem": "^2.40.0"
44-
},
45-
"packageManager": "yarn@4.10.3+sha512.c38cafb5c7bb273f3926d04e55e1d8c9dfa7d9c3ea1f36a4868fa028b9e5f72298f0b7f401ad5eb921749eb012eb1c3bb74bf7503df3ee43fd600d14a018266f"
44+
}
4645
}

src/daos.ts

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -191,18 +191,22 @@ export const daos: IDAO[] = [
191191
},
192192
{
193193
phase: LifecyclePhase.DRAFT,
194-
name: "DeFi Builder",
195-
symbol: "BUILDER",
196-
socials: [],
197-
activity: [Activity.BUILDER, Activity.SAAS_OPERATOR],
194+
name: "Host Dev",
195+
symbol: "HOST",
196+
socials: ["https://t.me/dao_host"],
197+
activity: [
198+
Activity.BUILDER,
199+
Activity.SAAS_OPERATOR,
200+
Activity.DEFI_PROTOCOL_OPERATOR,
201+
],
198202
images: {
199203
token: "/builder.png",
200204
},
201205
deployments: {},
202206
units: [
203207
{
204208
unitId: "os",
205-
name: "Stability OS",
209+
name: "dao.host",
206210
status: UnitStatus.BUILDING,
207211
revenueShare: 100,
208212
type: UnitType.SAAS,
@@ -224,16 +228,25 @@ export const daos: IDAO[] = [
224228
pvpFee: 100,
225229
},
226230
tokenomics: {
227-
initialChain: ChainName.PLASMA,
231+
initialChain: ChainName.ETHEREUM,
228232
funding: [
229233
{
230234
type: FundingType.SEED,
231-
start: 1772323200,
232-
end: 1785456000,
233-
minRaise: 10000,
235+
start: 1768521600, // Friday, 16 January 2026
236+
end: 1776211200, // Wednesday, 15 April 2026
237+
minRaise: 40000,
234238
maxRaise: 500000,
235239
raised: 0,
236240
},
241+
{
242+
type: FundingType.TGE,
243+
start: 1793577600, // Monday, 2 November 2026
244+
end: 1794182399, // Sunday, 8 November 2026, 23:59:59
245+
claim: 1794268800, // Tuesday, 10 November 2026
246+
minRaise: 400000,
247+
maxRaise: 1200000,
248+
raised: 0,
249+
},
237250
],
238251
},
239252
deployer: "0x0",

src/os.ts

Lines changed: 71 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -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

11501101
interface 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

11751118
enum 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

11881130
interface 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

Comments
 (0)