@zemyth/raise-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +416 -0
- package/dist/accounts/index.cjs +258 -0
- package/dist/accounts/index.cjs.map +1 -0
- package/dist/accounts/index.d.cts +115 -0
- package/dist/accounts/index.d.ts +115 -0
- package/dist/accounts/index.js +245 -0
- package/dist/accounts/index.js.map +1 -0
- package/dist/constants/index.cjs +174 -0
- package/dist/constants/index.cjs.map +1 -0
- package/dist/constants/index.d.cts +143 -0
- package/dist/constants/index.d.ts +143 -0
- package/dist/constants/index.js +158 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/errors/index.cjs +177 -0
- package/dist/errors/index.cjs.map +1 -0
- package/dist/errors/index.d.cts +83 -0
- package/dist/errors/index.d.ts +83 -0
- package/dist/errors/index.js +170 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.cjs +2063 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +680 -0
- package/dist/index.d.ts +680 -0
- package/dist/index.js +1926 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions/index.cjs +852 -0
- package/dist/instructions/index.cjs.map +1 -0
- package/dist/instructions/index.d.cts +452 -0
- package/dist/instructions/index.d.ts +452 -0
- package/dist/instructions/index.js +809 -0
- package/dist/instructions/index.js.map +1 -0
- package/dist/pdas/index.cjs +241 -0
- package/dist/pdas/index.cjs.map +1 -0
- package/dist/pdas/index.d.cts +171 -0
- package/dist/pdas/index.d.ts +171 -0
- package/dist/pdas/index.js +217 -0
- package/dist/pdas/index.js.map +1 -0
- package/dist/types/index.cjs +44 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.cts +229 -0
- package/dist/types/index.d.ts +229 -0
- package/dist/types/index.js +39 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +130 -0
- package/src/accounts/index.ts +329 -0
- package/src/client.ts +715 -0
- package/src/constants/index.ts +205 -0
- package/src/errors/index.ts +222 -0
- package/src/events/index.ts +256 -0
- package/src/index.ts +253 -0
- package/src/instructions/index.ts +1504 -0
- package/src/pdas/index.ts +404 -0
- package/src/types/index.ts +267 -0
- package/src/utils/index.ts +277 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/constants/index.ts","../../src/pdas/index.ts","../../src/instructions/index.ts"],"names":["PublicKey","BN","minDeadline"],"mappings":";;;;;;;AAWO,IAAM,KAAA,GAAQ;AAAA,EACnB,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA,EACZ,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EAEP,UAAA,EAAY,YAAA;AAAA,EAGZ,YAAA,EAAc,cAAA;AAAA,EACd,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW;AACb,CAAA;;;ACPA,SAAS,SAAS,KAAA,EAA0D;AAE1E,EAAA,IAAI,KAAA,IAAS,OAAQ,KAAA,CAAa,WAAA,KAAgB,UAAA,EAAY;AAC5D,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAI,EAAA,CAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAC7B;AASO,SAAS,aAAA,CAAc,WAAiC,SAAA,EAAiC;AAC9F,EAAA,MAAM,WAAA,GAAc,SAAS,SAAS,CAAA;AACtC,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG,WAAA,CAAY,WAAA,CAAY,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IACrE;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AASO,SAAS,YAAA,CAAa,WAAiC,SAAA,EAAiC;AAC7F,EAAA,MAAM,WAAA,GAAc,SAAS,SAAS,CAAA;AACtC,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,EAAG,WAAA,CAAY,WAAA,CAAY,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IACpE;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAUO,SAAS,eAAA,CACd,UAAA,EACA,cAAA,EACA,SAAA,EACW;AACX,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB;AAAA,MACE,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAAA,MAC3B,WAAW,QAAA,EAAS;AAAA,MACpB,MAAA,CAAO,IAAA,CAAK,CAAC,cAAc,CAAC;AAAA,KAC9B;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAUO,SAAS,gBAAA,CACd,UAAA,EACA,OAAA,EACA,SAAA,EACW;AACX,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB;AAAA,MACE,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,MAC5B,WAAW,QAAA,EAAS;AAAA,MACpB,QAAQ,QAAA;AAAS,KACnB;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAWO,SAAS,UAAA,CACd,YAAA,EACA,QAAA,EACA,WAAA,EACA,SAAA,EACW;AACX,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,YAAA,CAAa,QAAA,EAAS,EAAG,QAAA,CAAS,UAAS,EAAG,MAAA,CAAO,KAAK,CAAC,WAAW,CAAC,CAAC,CAAA;AAAA,IAClG;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAUO,SAAS,mBAAA,CACd,UAAA,EACA,UAAA,EACA,SAAA,EACW;AACX,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB;AAAA,MACE,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA;AAAA,MACvB,WAAW,QAAA,EAAS;AAAA,MACpB,MAAA,CAAO,IAAA,CAAK,CAAC,UAAU,CAAC;AAAA;AAAA,KAC1B;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AASO,SAAS,eAAA,CACd,YACA,SAAA,EACW;AACX,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,OAAO,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,EAAG,UAAA,CAAW,UAAU,CAAA;AAAA,IACrD;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AA6BO,SAAS,gBAAA,CACd,YACA,SAAA,EACW;AACX,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,EAAG,UAAA,CAAW,UAAU,CAAA;AAAA,IAClD;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAgCO,SAAS,kBAAkB,SAAA,EAAiC;AACjE,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,YAAY,CAAC,CAAA;AAAA,IAChC;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAWO,SAAS,aAAA,CACd,SAAA,EACA,QAAA,EACA,eAAA,EACA,SAAA,EACqB;AAErB,EAAA,MAAM,WAAA,GAAc,SAAS,SAAS,CAAA;AACtC,EAAA,MAAM,OAAA,GAAU,SAAS,eAAe,CAAA;AACxC,EAAA,OAAO,SAAA,CAAU,sBAAA;AAAA,IACf;AAAA,MACE,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,MAC1B,WAAA,CAAY,WAAA,CAAY,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,MACvC,SAAS,QAAA,EAAS;AAAA,MAClB,OAAA,CAAQ,WAAA,CAAY,MAAA,EAAQ,IAAA,EAAM,CAAC;AAAA;AAAA,KACrC;AAAA,IACA;AAAA,GACF;AACF;AAQO,SAAS,uBAAuB,SAAA,EAA2C;AAChF,EAAA,OAAO,SAAA,CAAU,sBAAA;AAAA,IACf,CAAC,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,IAC7B;AAAA,GACF;AACF;AAsBO,SAAS,gBAAA,CAAiB,YAAuB,SAAA,EAAiC;AACvF,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,EAAG,UAAA,CAAW,UAAU,CAAA;AAAA,IACjD;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,eAAA,CAAgB,YAAuB,SAAA,EAAiC;AACtF,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,EAAG,UAAA,CAAW,UAAU,CAAA;AAAA,IACjD;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,oBAAA,CAAqB,YAAuB,SAAA,EAAiC;AAC3F,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAA,EAAG,UAAA,CAAW,UAAU,CAAA;AAAA,IACtD;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,mBAAA,CAAoB,YAAuB,SAAA,EAAiC;AAC1F,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,EAAG,UAAA,CAAW,UAAU,CAAA;AAAA,IACrD;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,kBAAA,CAAmB,YAAuB,SAAA,EAAiC;AACzF,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,EAAG,UAAA,CAAW,UAAU,CAAA;AAAA,IACpD;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,kBAAA,CAAmB,YAAuB,SAAA,EAAiC;AACzF,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,EAAG,UAAA,CAAW,UAAU,CAAA;AAAA,IACrD;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,mBAAA,CAAoB,YAAuB,SAAA,EAAiC;AAC1F,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,EAAG,UAAA,CAAW,UAAU,CAAA;AAAA,IACrD;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,iBAAA,CAAkB,YAAuB,SAAA,EAAiC;AACxF,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA,EAAG,UAAA,CAAW,UAAU,CAAA;AAAA,IACpD;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,oBAAA,CAAqB,YAAuB,SAAA,EAAiC;AAC3F,EAAA,MAAM,CAAC,GAAG,CAAA,GAAI,SAAA,CAAU,sBAAA;AAAA,IACtB,CAAC,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAA,EAAG,UAAA,CAAW,UAAU,CAAA;AAAA,IACtD;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AChXA,IAAM,yBAAA,GAA4B,IAAIA,SAAAA,CAAU,6CAA6C,CAAA;AAO7F,SAAS,gBAAgB,KAAA,EAA+D;AACtF,EAAA,IAAI,iBAAiBA,SAAAA,EAAW;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAIA,SAAAA,CAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AACpC;AAQA,SAAS,WAAW,OAAA,EAA0B;AAC5C,EAAA,OAAO,OAAA,CAAQ,OAAA;AACjB;AAKA,SAAS,oBAAoB,OAAA,EAA0B;AACrD,EAAA,OAAO,OAAA,CAAQ,OAAA;AACjB;AASA,eAAsB,eAAA,CACpB,OAAA,EACA,KAAA,EACA,KAAA,EACiB;AACjB,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,eAAA,GACA,QAAA,CAAS;AAAA,IACR,KAAA;AAAA,IACA;AAAA,GACD,EACA,GAAA,EAAI;AACT;AAKA,eAAsB,aAAA,CACpB,OAAA,EACA,YAAA,EACA,QAAA,EACiB;AACjB,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,aAAA,GACA,QAAA,CAAS;AAAA,IACR,WAAW,YAAA,CAAa,SAAA;AAAA,IACxB;AAAA,GACD,CAAA,CACA,OAAA,CAAQ,CAAC,YAAY,CAAC,EACtB,GAAA,EAAI;AACT;AAKA,eAAsB,WAAA,CACpB,SACA,YAAA,EACiB;AACjB,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,WAAA,GACA,QAAA,CAAS;AAAA,IACR;AAAA,GACD,EACA,GAAA,EAAI;AACT;AAmDO,SAAS,cAAc,MAAA,EAA0B;AACtD,EAAA,MAAM,QAAQ,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AACjC,EAAA,MAAM,QAAQ,MAAA,CAAO,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAC7C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,KAAA;AACT;AAOO,IAAM,kCAAA,GAAqC;AAC3C,IAAM,iCAAA,GAAoC;AAG1C,IAAM,6BAAA,GAAgC;AAStC,SAAS,iBAAA,CAAkB,WAAA,EAAqB,KAAA,GAAiB,KAAA,EAAW;AACjF,EAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAC/C,EAAA,MAAM,WAAA,GAAc,QAAQ,iCAAA,GAAoC,kCAAA;AAChE,EAAA,MAAM,aAAA,GAAgB,WAAA,GAAc,EAAA,GAAK,EAAA,GAAK,EAAA;AAG9C,EAAA,MAAM,eAAA,GAAkB,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,eAAe,WAAW,CAAA;AAGxE,EAAA,MAAM,cAAc,UAAA,GAAa,6BAAA;AACjC,EAAA,OAAO,IAAIC,EAAAA,CAAG,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,WAAW,CAAC,CAAA;AACtD;AAQO,SAAS,WAAA,CAAY,QAAiB,KAAA,EAAW;AACtD,EAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAC/C,EAAA,MAAM,WAAA,GAAc,QAAQ,iCAAA,GAAoC,kCAAA;AAChE,EAAA,OAAO,IAAIA,EAAAA,CAAG,UAAA,GAAa,WAAA,GAAc,CAAC,CAAA;AAC5C;AASO,SAAS,gBAAA,CACd,QAAA,EACA,KAAA,GAAiB,KAAA,EACmB;AACpC,EAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAC/C,EAAA,MAAM,eAAA,GAAkB,SAAS,QAAA,EAAS;AAC1C,EAAA,MAAM,WAAA,GAAc,QAAQ,iCAAA,GAAoC,kCAAA;AAEhE,EAAA,MAAMC,eAAc,UAAA,GAAa,WAAA;AACjC,EAAA,MAAM,cAAc,UAAA,GAAa,6BAAA;AAEjC,EAAA,IAAI,kBAAkBA,YAAAA,EAAa;AACjC,IAAA,MAAM,OAAA,GAAU,QAAQ,YAAA,GAAe,QAAA;AACvC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,6BAA6B,OAAO,CAAA,SAAA;AAAA,KAC7C;AAAA,EACF;AAEA,EAAA,IAAI,kBAAkB,WAAA,EAAa;AACjC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AASA,eAAsB,iBAAA,CACpB,OAAA,EACA,IAAA,EAWA,OAAA,EACiB;AACjB,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,iBAAA,CAAkB;AAAA,IACjB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,UAAA,EAAY;AAAA,MACV,WAAA,EAAa,KAAK,UAAA,CAAW,WAAA;AAAA,MAC7B,WAAA,EAAa,KAAK,UAAA,CAAW,WAAA;AAAA,MAC7B,qBAAA,EAAuB,KAAK,UAAA,CAAW,qBAAA;AAAA,MACvC,oBAAA,EAAsB,KAAK,UAAA,CAAW,oBAAA;AAAA,MACtC,mBAAA,EAAqB,KAAK,UAAA,CAAW,mBAAA;AAAA,MACrC,oBAAA,EAAsB,IAAA,CAAK,UAAA,CAAW,oBAAA,IAAwB,IAAA;AAAA,MAC9D,qBAAA,EAAuB,IAAA,CAAK,UAAA,CAAW,qBAAA,IAAyB,IAAA;AAAA,MAChE,aAAA,EAAe,IAAA,CAAK,UAAA,CAAW,aAAA,IAAiB,IAAA;AAAA,MAChD,qBAAA,EAAuB,IAAA,CAAK,UAAA,CAAW,qBAAA,IAAyB,IAAA;AAAA,MAChE,WAAA,EAAa,IAAA,CAAK,UAAA,CAAW,WAAA,IAAe;AAAA,KAC9C;AAAA,IACA,oBAAoB,IAAA,CAAK;AAAA,GAC1B,EACA,QAAA,CAAS;AAAA,IACR;AAAA,GACD,EACA,GAAA,EAAI;AACT;AAKA,eAAsB,iBAAA,CACpB,OAAA,EACA,SAAA,EACA,OAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,SAAA,EAAW,OAAA,CAAQ,SAAS,CAAA;AAE7D,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,iBAAA,GACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT;AAAA,GACD,EACA,GAAA,EAAI;AACT;AAMA,eAAsB,cAAA,CACpB,OAAA,EACA,IAAA,EAKA,YAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACpE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACpE,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAC5E,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAC1E,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACxE,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACxE,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAC1E,EAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAEtE,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,cAAA,GACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,UAAA,EAAY,aAAA;AAAA,IACZ,SAAA,EAAW,YAAA;AAAA,IACX,cAAA,EAAgB,iBAAA;AAAA,IAChB,aAAA,EAAe,gBAAA;AAAA,IACf,YAAA,EAAc,eAAA;AAAA,IACd,YAAA,EAAc,eAAA;AAAA,IACd,aAAA,EAAe,gBAAA;AAAA,IACf,WAAA,EAAa,cAAA;AAAA,IACb,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,WAAW,YAAA,CAAa,SAAA;AAAA,IACxB,OAAO,YAAA,CAAa;AAAA,GACrB,CAAA,CACA,OAAA,CAAQ,CAAC,YAAY,CAAC,EACtB,GAAA,EAAI;AACT;AASA,eAAsB,eAAA,CACpB,OAAA,EACA,IAAA,EAMA,OAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,eAAe,eAAA,CAAgB,UAAA,EAAY,IAAA,CAAK,cAAA,EAAgB,QAAQ,SAAS,CAAA;AAEvF,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,eAAA,CAAgB;AAAA,IACf,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,aAAa,IAAA,CAAK;AAAA,GACnB,EACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,SAAA,EAAW,YAAA;AAAA,IACX;AAAA,GACD,EACA,GAAA,EAAI;AACT;AAKA,eAAsB,eAAA,CACpB,OAAA,EACA,SAAA,EACA,cAAA,EACA,OAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,SAAA,EAAW,OAAA,CAAQ,SAAS,CAAA;AAC7D,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,UAAA,EAAY,cAAA,EAAgB,QAAQ,SAAS,CAAA;AAElF,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,eAAA,GACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,SAAA,EAAW,YAAA;AAAA,IACX;AAAA,GACD,EACA,GAAA,EAAI;AACT;AAQA,eAAsB,eAAA,CACpB,OAAA,EACA,IAAA,EAMA,KAAA,EACiB;AAEjB,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAElD,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,eAAe,eAAA,CAAgB,UAAA,EAAY,IAAA,CAAK,cAAA,EAAgB,QAAQ,SAAS,CAAA;AACvF,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,aAAA,EAAe,QAAQ,SAAS,CAAA;AAInF,EAAA,MAAM,YAAY,MAAM,mBAAA,CAAoB,OAAO,CAAA,CAAE,SAAA,CAAU,MAAM,YAAY,CAAA;AACjF,EAAA,MAAM,WAAA,GAAc,UAAU,WAAA,IAAe,CAAA;AAC7C,EAAA,MAAM,UAAU,UAAA,CAAW,YAAA,EAAc,KAAA,EAAO,WAAA,EAAa,QAAQ,SAAS,CAAA;AAG9E,EAAA,MAAM,eAAA,GAAkB,6BAAA;AAAA,IACtB,aAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,eAAA,CAAgB,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA,CACvC,QAAA,CAAS;AAAA,IACR,SAAA,EAAW,YAAA;AAAA,IACX,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,IAAA,EAAM,OAAA;AAAA,IACN,OAAA,EAAS,aAAA;AAAA,IACT,eAAA;AAAA,IACA;AAAA,GACD,EACA,GAAA,EAAI;AACT;AAKA,eAAsB,cAAA,CACpB,OAAA,EACA,SAAA,EACA,cAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,SAAA,EAAW,OAAA,CAAQ,SAAS,CAAA;AAC7D,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,UAAA,EAAY,cAAA,EAAgB,QAAQ,SAAS,CAAA;AAElF,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,cAAA,GACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACZ,EACA,GAAA,EAAI;AACT;AAcA,eAAsB,mBAAA,CACpB,OAAA,EACA,IAAA,EAUA,OAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,eAAe,eAAA,CAAgB,UAAA,EAAY,IAAA,CAAK,cAAA,EAAgB,QAAQ,SAAS,CAAA;AACvF,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAChE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACpE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACpE,EAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAGtE,EAAA,MAAM,mBAAmB,IAAA,CAAK,gBAAA,KAC3B,KAAK,qBAAA,CAAsB,EAAA,CAAG,IAAID,EAAAA,CAAG,CAAC,CAAC,CAAA,GACpC,gBAAgB,UAAA,EAAY,IAAA,CAAK,iBAAiB,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAA,GACtE,IAAA,CAAA;AAEN,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,mBAAA,CAAoB,EAAE,uBAAuB,IAAA,CAAK,qBAAA,EAAuB,CAAA,CACzE,QAAA,CAAS;AAAA,IACR,SAAA,EAAW,YAAA;AAAA,IACX,OAAA,EAAS,UAAA;AAAA,IACT,OAAA;AAAA,IACA,eAAe,IAAA,CAAK,kBAAA;AAAA,IACpB,oBAAoB,IAAA,CAAK,kBAAA;AAAA,IACzB,SAAA;AAAA,IACA,UAAA,EAAY,aAAA;AAAA,IACZ,UAAA,EAAY,aAAA;AAAA,IACZ,WAAA,EAAa,cAAA;AAAA,IACb,aAAA,EAAe,gBAAA;AAAA,IACf,eAAe,aAAA,CAAc,SAAA;AAAA,IAC7B,YAAA,EAAc;AAAA,GACf,EACA,GAAA,EAAI;AACT;AAUA,eAAsB,iBAAA,CACpB,OAAA,EACA,IAAA,EAIA,OAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,eAAe,eAAA,CAAgB,UAAA,EAAY,IAAA,CAAK,cAAA,EAAgB,QAAQ,SAAS,CAAA;AAEvF,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,iBAAA,GACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,SAAA,EAAW,YAAA;AAAA,IACX;AAAA,GACD,EACA,GAAA,EAAI;AACT;AASA,eAAsB,oBAAA,CACpB,OAAA,EACA,IAAA,EAMA,OAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,eAAe,eAAA,CAAgB,UAAA,EAAY,IAAA,CAAK,cAAA,EAAgB,QAAQ,SAAS,CAAA;AAEvF,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,oBAAA,CAAqB;AAAA,IACpB,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,UAAU,IAAA,CAAK;AAAA,GAChB,EACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,SAAA,EAAW,YAAA;AAAA,IACX;AAAA,GACD,EACA,GAAA,EAAI;AACT;AASA,eAAsB,uBAAA,CACpB,OAAA,EACA,IAAA,EAMA,OAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,eAAe,eAAA,CAAgB,UAAA,EAAY,IAAA,CAAK,cAAA,EAAgB,QAAQ,SAAS,CAAA;AAEvF,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,uBAAA,CAAwB;AAAA,IACvB,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,aAAa,IAAA,CAAK;AAAA,GACnB,EACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,SAAA,EAAW,YAAA;AAAA,IACX;AAAA,GACD,EACA,GAAA,EAAI;AACT;AASA,SAAS,eAAe,IAAA,EAA4B;AAClD,EAAA,MAAM,CAAC,GAAG,CAAA,GAAID,SAAAA,CAAU,sBAAA;AAAA,IACtB;AAAA,MACE,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,MACtB,0BAA0B,QAAA,EAAS;AAAA,MACnC,KAAK,QAAA;AAAS,KAChB;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAKA,SAAS,oBAAoB,IAAA,EAA4B;AACvD,EAAA,MAAM,CAAC,GAAG,CAAA,GAAIA,SAAAA,CAAU,sBAAA;AAAA,IACtB;AAAA,MACE,MAAA,CAAO,KAAK,UAAU,CAAA;AAAA,MACtB,0BAA0B,QAAA,EAAS;AAAA,MACnC,KAAK,QAAA,EAAS;AAAA,MACd,MAAA,CAAO,KAAK,SAAS;AAAA,KACvB;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,GAAA;AACT;AAQA,eAAsB,MAAA,CACpB,OAAA,EACA,IAAA,EAOA,QAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAGlE,EAAA,MAAM,CAAC,OAAO,CAAA,GAAI,aAAA,CAAc,IAAA,CAAK,WAAW,QAAA,EAAU,IAAA,CAAK,eAAA,EAAiB,OAAA,CAAQ,SAAS,CAAA;AAGjG,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,EAAS,QAAQ,SAAS,CAAA;AAG7E,EAAA,MAAM,kBAAA,GAAqB,6BAAA,CAA8B,OAAA,EAAS,QAAQ,CAAA;AAG1E,EAAA,MAAM,eAAA,GAAkB,eAAe,OAAO,CAAA;AAC9C,EAAA,MAAM,aAAA,GAAgB,oBAAoB,OAAO,CAAA;AAGjD,EAAA,MAAM,CAAC,gBAAgB,CAAA,GAAI,sBAAA,CAAuB,QAAQ,SAAS,CAAA;AAGnE,EAAA,MAAM,iBAAA,GAAoB,eAAA,CAAgB,UAAA,EAAY,CAAA,EAAG,QAAQ,SAAS,CAAA;AAI1E,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,MAAA,CAAO,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA,CAC9B,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,cAAA,EAAgB,iBAAA;AAAA,IAChB,OAAA;AAAA,IACA,UAAA,EAAY,aAAA;AAAA,IACZ,kBAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,oBAAoB,IAAA,CAAK,kBAAA;AAAA,IACzB,sBAAsB,IAAA,CAAK,oBAAA;AAAA,IAC3B,gBAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA,EAAc,gBAAA;AAAA,IACd,sBAAA,EAAwB,2BAAA;AAAA,IACxB,eAAe,aAAA,CAAc,SAAA;AAAA,IAC7B,IAAA,EAAM,kBAAA;AAAA,IACN,oBAAA,EAAsB,yBAAA;AAAA,IACtB,kBAAA,EAAoB;AAAA,GACrB,EACA,eAAA,CAAgB;AAAA,IACf,oBAAA,CAAqB,mBAAA,CAAoB,EAAE,KAAA,EAAO,KAAS;AAAA,GAC5D,EACA,GAAA,EAAI;AACT;AAKA,eAAsB,gBAAA,CACpB,OAAA,EACA,IAAA,EAOA,QAAA,EACiB;AACjB,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,aAAA,EAAe,QAAQ,SAAS,CAAA;AACnF,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAEhE,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,gBAAA,GACA,QAAA,CAAS;AAAA,IACR,QAAA;AAAA,IACA,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,OAAA,EAAS,aAAA;AAAA,IACT,oBAAoB,IAAA,CAAK,kBAAA;AAAA,IACzB,eAAe,IAAA,CAAK,kBAAA;AAAA,IACpB,qBAAqB,IAAA,CAAK,mBAAA;AAAA,IAC1B;AAAA,GACD,EACA,GAAA,EAAI;AACT;AASA,eAAsB,YAAA,CACpB,OAAA,EACA,IAAA,EAKA,OAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAGlE,EAAA,MAAM,iBAAiB,MAAM,mBAAA,CAAoB,OAAO,CAAA,CAAE,OAAA,CAAQ,MAAM,UAAU,CAAA;AAClF,EAAA,MAAM,UAAA,GAAa,eAAe,UAAA,IAAc,CAAA;AAGhD,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,UAAA,EAAY,UAAA,EAAY,QAAQ,SAAS,CAAA;AAEtF,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,YAAA,CAAa;AAAA,IACZ,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,eAAe,IAAA,CAAK;AAAA,GACrB,EACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,OAAA;AAAA,IACA,aAAA,EAAe,gBAAA;AAAA,IACf,eAAe,aAAA,CAAc,SAAA;AAAA,IAC7B,KAAA,EAAO;AAAA,GACR,EACA,GAAA,EAAI;AACT;AAKA,eAAsB,YAAA,CACpB,OAAA,EACA,SAAA,EACA,YAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,SAAA,EAAW,OAAA,CAAQ,SAAS,CAAA;AAI7D,EAAA,MAAM,iBAAiB,MAAM,mBAAA,CAAoB,OAAO,CAAA,CAAE,OAAA,CAAQ,MAAM,UAAU,CAAA;AAGlF,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,IAAA,gBAAA,GAAmB,cAAA,CAAe,WAAA;AAAA,EACpC,CAAA,MAAO;AAEL,IAAA,MAAM,UAAA,GAAa,eAAe,UAAA,IAAc,CAAA;AAChD,IAAA,gBAAA,GAAmB,mBAAA,CAAoB,UAAA,EAAY,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAAA,EAClF;AAEA,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,YAAA,GACA,QAAA,CAAS;AAAA,IACR,WAAW,YAAA,CAAa,SAAA;AAAA,IACxB,OAAA,EAAS,UAAA;AAAA,IACT,aAAA,EAAe;AAAA,GAChB,CAAA,CACA,OAAA,CAAQ,CAAC,YAAY,CAAC,EACtB,GAAA,EAAI;AACT;AAKA,eAAsB,iBAAA,CACpB,OAAA,EACA,IAAA,EAQA,QAAA,EACiB;AACjB,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,aAAA,EAAe,QAAQ,SAAS,CAAA;AACnF,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAEhE,EAAA,MAAM,mBAAmB,mBAAA,CAAoB,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,QAAQ,SAAS,CAAA;AAE3F,EAAA,MAAM,kBAAA,GAAqB,6BAAA;AAAA,IACzB,aAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,IAChE,MAAA,EAAQ,gBAAgB,MAAM,CAAA;AAAA,IAC9B,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd,CAAE,CAAA;AAEF,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,iBAAA,GACA,QAAA,CAAS;AAAA,IACR,QAAA;AAAA,IACA,OAAA,EAAS,UAAA;AAAA,IACT,aAAA,EAAe,gBAAA;AAAA,IACf,UAAA,EAAY,aAAA;AAAA,IACZ,OAAA,EAAS,aAAA;AAAA,IACT,kBAAA;AAAA,IACA,oBAAoB,IAAA,CAAK,kBAAA;AAAA,IACzB,sBAAsB,IAAA,CAAK,oBAAA;AAAA,IAC3B,MAAA,EAAQ;AAAA,GACT,CAAA,CACA,iBAAA,CAAkB,iBAAiB,EACnC,GAAA,EAAI;AACT;AASA,eAAsB,aAAA,CACpB,OAAA,EACA,IAAA,EAKA,SAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAElE,EAAA,MAAM,mBAAmB,mBAAA,CAAoB,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,QAAQ,SAAS,CAAA;AAI3F,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,IAChE,MAAA;AAAA,IACA,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd,CAAE,CAAA;AAEF,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,aAAA,GACA,QAAA,CAAS;AAAA,IACR,SAAA;AAAA,IACA,OAAA,EAAS,UAAA;AAAA,IACT,aAAA,EAAe;AAAA,GAChB,CAAA,CACA,iBAAA,CAAkB,iBAAiB,EACnC,GAAA,EAAI;AACT;AASA,eAAsB,UAAA,CACpB,OAAA,EACA,IAAA,EAKA,OAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAElE,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,UAAA,CAAW;AAAA,IACV,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,WAAW,IAAA,CAAK;AAAA,GACjB,EACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT;AAAA,GACD,EACA,GAAA,EAAI;AACT;AAKA,eAAsB,aAAA,CACpB,OAAA,EACA,IAAA,EAMA,OAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAElE,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,aAAA,CAAc,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA,CACrC,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,qBAAqB,IAAA,CAAK,mBAAA;AAAA,IAC1B;AAAA,GACD,EACA,GAAA,EAAI;AACT;AAKA,eAAsB,WAAA,CACpB,OAAA,EACA,IAAA,EAOA,QAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,gBAAgB,gBAAA,CAAiB,UAAA,EAAY,IAAA,CAAK,OAAA,EAAS,QAAQ,SAAS,CAAA;AAClF,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAEpE,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,WAAA,GACA,QAAA,CAAS;AAAA,IACR,QAAA;AAAA,IACA,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,oBAAoB,IAAA,CAAK,kBAAA;AAAA,IACzB,mBAAmB,IAAA,CAAK,iBAAA;AAAA,IACxB,sBAAsB,IAAA,CAAK,oBAAA;AAAA,IAC3B,aAAA;AAAA,IACA,YAAA,EAAc;AAAA,GACf,EACA,GAAA,EAAI;AACT;AAKA,eAAsB,UAAA,CACpB,OAAA,EACA,IAAA,EAIA,QAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,gBAAgB,gBAAA,CAAiB,UAAA,EAAY,IAAA,CAAK,OAAA,EAAS,QAAQ,SAAS,CAAA;AAElF,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,UAAA,GACA,QAAA,CAAS;AAAA,IACR,SAAA,EAAW,YAAA;AAAA,IACX,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,SAAS,IAAA,CAAK,OAAA;AAAA,IACd;AAAA,GACD,EACA,GAAA,EAAI;AACT;AAKA,eAAsB,eAAA,CACpB,SACA,IAAA,EAIiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAElE,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,eAAA,GACA,QAAA,CAAS;AAAA,IACR,SAAA,EAAW,YAAA;AAAA,IACX,OAAA,EAAS,UAAA;AAAA,IACT,qBAAqB,IAAA,CAAK;AAAA,GAC3B,EACA,GAAA,EAAI;AACT;AASA,eAAsB,gBAAA,CACpB,OAAA,EACA,SAAA,EACA,cAAA,GAAyB,CAAA,EACR;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,SAAA,EAAW,OAAA,CAAQ,SAAS,CAAA;AAC7D,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,UAAA,EAAY,cAAA,EAAgB,QAAQ,SAAS,CAAA;AAElF,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,gBAAA,GACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACZ,EACA,GAAA,EAAI;AACT;AAQA,eAAsB,WAAA,CACpB,OAAA,EACA,IAAA,EAQA,QAAA,EACiB;AACjB,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,aAAA,EAAe,QAAQ,SAAS,CAAA;AAInF,EAAA,MAAM,cAAA,GAAiB,KAAK,cAAA,IAAkB,CAAA;AAC9C,EAAA,MAAM,oBAAoB,EAAC;AAC3B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,EAAgB,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,UAAA,EAAY,CAAA,EAAG,QAAQ,SAAS,CAAA;AACrE,IAAA,iBAAA,CAAkB,IAAA,CAAK;AAAA,MACrB,MAAA,EAAQ,YAAA;AAAA,MACR,UAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,WAAA,GACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,OAAA,EAAS,aAAA;AAAA,IACT,oBAAoB,IAAA,CAAK,kBAAA;AAAA,IACzB,QAAA;AAAA,IACA,sBAAsB,IAAA,CAAK,mBAAA;AAAA,IAC3B,oBAAoB,IAAA,CAAK;AAAA,GAC1B,CAAA,CACA,iBAAA,CAAkB,iBAAiB,EACnC,GAAA,EAAI;AACT;AAgBA,eAAsB,mBAAA,CACpB,OAAA,EACA,IAAA,EASA,QAAA,EACiB;AACjB,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACpE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,aAAA,EAAe,QAAQ,SAAS,CAAA;AACnF,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAC1E,EAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAG5E,EAAA,MAAM,kBAAA,GAAqB,6BAAA;AAAA,IACzB,aAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,mBAAA,CAAoB,EAAE,gBAAgB,IAAA,CAAK,cAAA,EAAgB,CAAA,CAC3D,QAAA,CAAS;AAAA,IACR,QAAA;AAAA,IACA,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,UAAA,EAAY,aAAA;AAAA,IACZ,OAAA,EAAS,aAAA;AAAA,IACT,kBAAA;AAAA,IACA,aAAA,EAAe,gBAAA;AAAA,IACf,sBAAsB,IAAA,CAAK,oBAAA;AAAA,IAC3B,cAAA,EAAgB,iBAAA;AAAA,IAChB,YAAA,EAAc;AAAA,GACf,EACA,GAAA,EAAI;AACT;AAcA,eAAsB,gBAAA,CACpB,OAAA,EACA,IAAA,EASA,KAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACpE,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAC1E,EAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAG5E,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAAA,IAC1D,EAAE,MAAA,EAAQ,GAAA,CAAI,eAAe,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAK;AAAA,IAC/D,EAAE,MAAA,EAAQ,GAAA,CAAI,sBAAsB,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA;AAAK,GACvE,CAAA;AAED,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,gBAAA,CAAiB,EAAE,gBAAgB,IAAA,CAAK,cAAA,EAAgB,CAAA,CACxD,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,aAAA,EAAe,gBAAA;AAAA,IACf,cAAA,EAAgB,iBAAA;AAAA,IAChB,KAAA;AAAA,IACA,YAAA,EAAc;AAAA,GACf,CAAA,CACA,iBAAA,CAAkB,iBAAiB,EACnC,GAAA,EAAI;AACT;AAQA,eAAsB,oBAAA,CACpB,OAAA,EACA,IAAA,EAIA,KAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAEpE,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,oBAAA,CAAqB,EAAE,gBAAgB,IAAA,CAAK,cAAA,EAAgB,CAAA,CAC5D,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ;AAAA,GACD,EACA,GAAA,EAAI;AACT;AAWA,eAAsB,qBAAA,CACpB,OAAA,EACA,IAAA,EAQA,QAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,gBAAgB,gBAAA,CAAiB,UAAA,EAAY,IAAA,CAAK,OAAA,EAAS,QAAQ,SAAS,CAAA;AAClF,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAEhE,EAAA,MAAM,qBAAqB,IAAA,CAAK,iBAAA,IAAqB,EAAC,EAAG,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,IACxE,MAAA;AAAA,IACA,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd,CAAE,CAAA;AAEF,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,qBAAA,GACA,eAAA,CAAgB;AAAA,IACf,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,oBAAoB,IAAA,CAAK,kBAAA;AAAA,IACzB,oBAAoB,IAAA,CAAK,kBAAA;AAAA,IACzB,sBAAsB,IAAA,CAAK,oBAAA;AAAA,IAC3B,SAAA;AAAA,IACA;AAAA,GACD,CAAA,CACA,iBAAA,CAAkB,iBAAiB,EACnC,GAAA,EAAI;AACT;AAaA,eAAsB,wBAAA,CACpB,OAAA,EACA,IAAA,EAGA,KAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACpE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACpE,EAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAE5E,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,wBAAA,GACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,UAAA,EAAY,aAAA;AAAA,IACZ,cAAA,EAAgB,iBAAA;AAAA,IAChB,KAAA;AAAA,IACA,eAAe,aAAA,CAAc;AAAA,GAC9B,EACA,GAAA,EAAI;AACT;AAQA,eAAsB,iBAAA,CACpB,OAAA,EACA,IAAA,EAKA,OAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACpE,EAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAC5E,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACxE,EAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAE5E,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,iBAAA,GACA,QAAA,CAAS;AAAA,IACR,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,cAAA,EAAgB,iBAAA;AAAA,IAChB,YAAA,EAAc,eAAA;AAAA,IACd,cAAA,EAAgB,iBAAA;AAAA,IAChB,qBAAqB,IAAA,CAAK,mBAAA;AAAA,IAC1B,OAAA;AAAA,IACA,YAAA,EAAc;AAAA,GACf,EACA,GAAA,EAAI;AACT;AAaA,eAAsB,yBAAA,CACpB,OAAA,EACA,IAAA,EAGA,YAAA,EACiB;AACjB,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACpE,EAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,OAAA,CAAQ,SAAS,CAAA;AAE1D,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,yBAAA,GACA,QAAA,CAAS;AAAA,IACR,OAAO,YAAA,CAAa,SAAA;AAAA,IACpB,WAAA,EAAa,cAAA;AAAA,IACb,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACb,CAAA,CACA,OAAA,CAAQ,CAAC,YAAY,CAAC,EACtB,GAAA,EAAI;AACT;AAQA,eAAsB,iBAAA,CACpB,OAAA,EACA,IAAA,EAQA,OAAA,EACiB;AACjB,EAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,SAAA,EAAW,QAAQ,SAAS,CAAA;AAClE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AACpE,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,UAAA,EAAY,aAAA,EAAe,QAAQ,SAAS,CAAA;AACnF,EAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAC1E,EAAA,MAAM,iBAAA,GAAoB,oBAAA,CAAqB,UAAA,EAAY,OAAA,CAAQ,SAAS,CAAA;AAG5E,EAAA,MAAM,iBAAA,GAAoB,6BAAA;AAAA,IACxB,aAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,UAAA,CAAW,OAAO,CAAA,CACtB,iBAAA,CAAkB,EAAE,gBAAgB,IAAA,CAAK,cAAA,EAAgB,CAAA,CACzD,QAAA,CAAS;AAAA,IACR,OAAA;AAAA,IACA,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,aAAA;AAAA,IACZ,UAAA,EAAY,aAAA;AAAA,IACZ,OAAA,EAAS,aAAA;AAAA,IACT,iBAAA;AAAA,IACA,aAAA,EAAe,gBAAA;AAAA,IACf,qBAAqB,IAAA,CAAK,mBAAA;AAAA,IAC1B,cAAA,EAAgB,iBAAA;AAAA,IAChB,YAAA,EAAc;AAAA,GACf,EACA,GAAA,EAAI;AACT","file":"index.js","sourcesContent":["/**\n * Raise Constants\n *\n * Mirrors the on-chain program constants for client-side validation\n * and display purposes.\n */\n\n// =============================================================================\n// PDA Seeds\n// =============================================================================\n\nexport const SEEDS = {\n PROJECT: 'project',\n MILESTONE: 'milestone',\n INVESTMENT: 'investment',\n VOTE: 'vote',\n ESCROW: 'escrow',\n PIVOT: 'pivot',\n PIVOT_PROPOSAL: 'pivot_proposal',\n TGE_ESCROW: 'tge_escrow',\n TGE_ESCROW_VAULT: 'tge_escrow_vault',\n SCAM_REPORT: 'scam_report',\n ADMIN_CONFIG: 'admin-config',\n NFT_MINT: 'nft_mint',\n AUTHORITY: 'authority',\n} as const;\n\n// =============================================================================\n// Validation Constants\n// =============================================================================\n\nexport const VALIDATION = {\n /** Minimum number of milestones per project */\n MIN_MILESTONES: 2,\n /** Maximum number of milestones per project */\n MAX_MILESTONES: 10,\n /** Milestone percentages must sum to this value */\n MILESTONE_PERCENTAGE_SUM: 100,\n /** Maximum funding buffer (110% of goal) */\n MAX_FUNDING_BUFFER_PERCENT: 110,\n /** Maximum metadata URI length */\n MAX_METADATA_URI_LENGTH: 200,\n /** Maximum pivot description length */\n MAX_PIVOT_DESCRIPTION_LEN: 256,\n /** Maximum pivot vision length */\n MAX_PIVOT_VISION_LEN: 512,\n /** Maximum pivot justification length */\n MAX_PIVOT_JUSTIFICATION_LEN: 512,\n} as const;\n\n// =============================================================================\n// Timing Constants (in seconds)\n// =============================================================================\n\nexport const TIMING = {\n /** Production voting period (14 days) */\n VOTING_PERIOD_SECONDS: 1_209_600,\n /** Production hold period (7 days) */\n HOLD_PERIOD_SECONDS: 604_800,\n /** Inactivity timeout (90 days) */\n INACTIVITY_TIMEOUT_SECONDS: 7_776_000,\n /** Abandonment timeout (90 days) */\n ABANDONMENT_TIMEOUT_SECONDS: 7_776_000,\n /** Refund window (14 days) */\n REFUND_WINDOW_SECONDS: 1_209_600,\n /** Pivot withdrawal window (7 days) */\n PIVOT_WITHDRAWAL_WINDOW_SECONDS: 604_800,\n /** Minimum TGE date (15 days from now) */\n TGE_MIN_DAYS: 1_296_000,\n /** Maximum TGE date (90 days from now) */\n TGE_MAX_DAYS: 7_776_000,\n /** Post-TGE holdback period (30 days) */\n POST_TGE_HOLDBACK_DAYS: 2_592_000,\n} as const;\n\n// =============================================================================\n// Tier Configuration Constraints\n// =============================================================================\n\nexport const TIER_CONSTRAINTS = {\n /** Minimum number of tiers */\n MIN_TIERS: 1,\n /** Maximum number of tiers */\n MAX_TIERS: 10,\n /** Minimum tier amount (10 USDC in lamports) */\n MIN_TIER_AMOUNT: 10_000_000n,\n /** Minimum max_lots per tier */\n MIN_TIER_MAX_LOTS: 1,\n /** Minimum token ratio */\n MIN_TIER_TOKEN_RATIO: 1n,\n /** Minimum vote multiplier (100 = 1.0x) */\n MIN_TIER_VOTE_MULTIPLIER: 100,\n} as const;\n\n// =============================================================================\n// Investment Tiers (Legacy - kept for backwards compatibility)\n// =============================================================================\n\nexport enum InvestmentTier {\n Bronze = 'Bronze',\n Silver = 'Silver',\n Gold = 'Gold',\n Platinum = 'Platinum',\n Diamond = 'Diamond',\n}\n\n/** Investment tier minimum amounts in USDC lamports (6 decimals) - LEGACY */\nexport const TIER_MINIMUMS = {\n [InvestmentTier.Bronze]: 100_000_000n, // 100 USDC\n [InvestmentTier.Silver]: 500_000_000n, // 500 USDC\n [InvestmentTier.Gold]: 1_000_000_000n, // 1,000 USDC\n [InvestmentTier.Platinum]: 5_000_000_000n, // 5,000 USDC\n [InvestmentTier.Diamond]: 10_000_000_000n, // 10,000 USDC\n} as const;\n\n/** Vote weight multipliers (scaled by 100) - LEGACY */\nexport const TIER_VOTE_MULTIPLIERS = {\n [InvestmentTier.Bronze]: 100, // 1.0x\n [InvestmentTier.Silver]: 120, // 1.2x\n [InvestmentTier.Gold]: 150, // 1.5x\n [InvestmentTier.Platinum]: 200, // 2.0x\n [InvestmentTier.Diamond]: 300, // 3.0x\n} as const;\n\n/** Token allocation multipliers (same as vote multipliers) - LEGACY */\nexport const TIER_TOKEN_MULTIPLIERS = {\n [InvestmentTier.Bronze]: 100,\n [InvestmentTier.Silver]: 120,\n [InvestmentTier.Gold]: 150,\n [InvestmentTier.Platinum]: 200,\n [InvestmentTier.Diamond]: 300,\n} as const;\n\n/** Get tier from investment amount (in lamports) - LEGACY, use project.tiers instead */\nexport function getTierFromAmount(amount: bigint): InvestmentTier {\n if (amount >= TIER_MINIMUMS[InvestmentTier.Diamond]) return InvestmentTier.Diamond;\n if (amount >= TIER_MINIMUMS[InvestmentTier.Platinum]) return InvestmentTier.Platinum;\n if (amount >= TIER_MINIMUMS[InvestmentTier.Gold]) return InvestmentTier.Gold;\n if (amount >= TIER_MINIMUMS[InvestmentTier.Silver]) return InvestmentTier.Silver;\n return InvestmentTier.Bronze;\n}\n\n/** Get vote multiplier for an investment amount - LEGACY */\nexport function getVoteMultiplier(amount: bigint): number {\n const tier = getTierFromAmount(amount);\n return TIER_VOTE_MULTIPLIERS[tier] / 100;\n}\n\n/** Get token multiplier for an investment amount - LEGACY */\nexport function getTokenMultiplier(amount: bigint): number {\n const tier = getTierFromAmount(amount);\n return TIER_TOKEN_MULTIPLIERS[tier] / 100;\n}\n\n/**\n * Find matching tier index for an investment amount (threshold-based)\n * Returns the highest tier where amount >= tier.amount\n */\nexport function findTierIndex(tiers: Array<{ amount: bigint }>, amount: bigint): number | null {\n for (let i = tiers.length - 1; i >= 0; i--) {\n if (amount >= tiers[i].amount) {\n return i;\n }\n }\n return null;\n}\n\n// =============================================================================\n// Voting and Governance\n// =============================================================================\n\nexport const GOVERNANCE = {\n /** Scam report threshold (30%) */\n SCAM_THRESHOLD_PERCENT: 30,\n /** Consecutive milestone failures before exit window eligible */\n CONSECUTIVE_FAILURES_THRESHOLD: 3,\n /** Milestone approval threshold (>50% weighted approval per whitepaper voting.md:100-101) */\n MILESTONE_APPROVAL_THRESHOLD_PERCENT: 50,\n} as const;\n\n// =============================================================================\n// NFT Constants\n// =============================================================================\n\nexport const NFT = {\n /** NFT symbol */\n SYMBOL: 'SNI',\n /** NFT name prefix */\n NAME_PREFIX: 'Raise Investment #',\n /** Royalty basis points (2%) */\n ROYALTY_BASIS_POINTS: 200,\n} as const;\n\n// =============================================================================\n// USDC Constants\n// =============================================================================\n\nexport const USDC = {\n /** USDC decimals */\n DECIMALS: 6,\n /** Convert USDC to lamports */\n toAmount: (usdc: number): bigint => BigInt(Math.floor(usdc * 10 ** 6)),\n /** Convert lamports to USDC */\n fromAmount: (lamports: bigint): number => Number(lamports) / 10 ** 6,\n} as const;\n","/**\n * Raise PDA Derivation Helpers\n *\n * All PDA derivation functions for the Raise program.\n * PDAs are deterministic addresses derived from seeds and program ID.\n */\n\nimport { PublicKey } from '@solana/web3.js';\nimport { BN } from '@coral-xyz/anchor';\nimport { SEEDS } from '../constants/index.js';\n\n/**\n * Ensure value is a proper BN instance\n * This handles cases where BN objects lose their prototype chain\n * (e.g., when passing through React state or JSON serialization)\n *\n * Uses duck typing instead of instanceof to handle different BN module instances\n */\nfunction ensureBN(value: BN | number | string | { toString(): string }): BN {\n // Duck typing: if it has toArrayLike, it's BN-like and we can use it\n if (value && typeof (value as BN).toArrayLike === 'function') {\n return value as BN;\n }\n // Always create a fresh BN from the SDK's imported BN class\n return new BN(String(value));\n}\n\n/**\n * Derive Project PDA from project ID\n *\n * @param projectId - Unique project identifier\n * @param programId - Raise program ID\n * @returns Project account PDA\n */\nexport function getProjectPDA(projectId: BN | number | string, programId: PublicKey): PublicKey {\n const projectIdBN = ensureBN(projectId);\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.PROJECT), projectIdBN.toArrayLike(Buffer, 'le', 8)],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Escrow PDA from project ID\n *\n * @param projectId - Project identifier\n * @param programId - Raise program ID\n * @returns Escrow account PDA\n */\nexport function getEscrowPDA(projectId: BN | number | string, programId: PublicKey): PublicKey {\n const projectIdBN = ensureBN(projectId);\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.ESCROW), projectIdBN.toArrayLike(Buffer, 'le', 8)],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Milestone PDA from project PDA and milestone index\n *\n * @param projectPda - Project account PDA\n * @param milestoneIndex - Milestone index (0-based)\n * @param programId - Raise program ID\n * @returns Milestone account PDA\n */\nexport function getMilestonePDA(\n projectPda: PublicKey,\n milestoneIndex: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.MILESTONE),\n projectPda.toBuffer(),\n Buffer.from([milestoneIndex]),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Investment PDA from project PDA and NFT mint\n *\n * @param projectPda - Project account PDA\n * @param nftMint - Investment NFT mint address\n * @param programId - Raise program ID\n * @returns Investment account PDA\n */\nexport function getInvestmentPDA(\n projectPda: PublicKey,\n nftMint: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.INVESTMENT),\n projectPda.toBuffer(),\n nftMint.toBuffer(),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Vote PDA from milestone PDA, voter key, and voting round\n *\n * @param milestonePda - Milestone account PDA\n * @param voterKey - Voter's public key\n * @param votingRound - Current voting round (0 initially, incremented on resubmit)\n * @param programId - Raise program ID\n * @returns Vote account PDA\n */\nexport function getVotePDA(\n milestonePda: PublicKey,\n voterKey: PublicKey,\n votingRound: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.VOTE), milestonePda.toBuffer(), voterKey.toBuffer(), Buffer.from([votingRound])],\n programId\n );\n return pda;\n}\n\n/**\n * Derive PivotProposal PDA from project PDA and pivot count\n *\n * @param projectPda - Project account PDA\n * @param pivotCount - Current pivot count from project account\n * @param programId - Raise program ID\n * @returns PivotProposal account PDA\n */\nexport function getPivotProposalPDA(\n projectPda: PublicKey,\n pivotCount: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.PIVOT), // Use PIVOT seed, not PIVOT_PROPOSAL\n projectPda.toBuffer(),\n Buffer.from([pivotCount]), // pivot_count is u8 (1 byte) on-chain\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive TgeEscrow PDA from project PDA\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns TgeEscrow account PDA\n */\nexport function getTgeEscrowPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.TGE_ESCROW), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive TgeEscrowVault PDA from project PDA\n * Used for holding 10% USDC holdback from final milestone\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns TgeEscrowVault PDA\n */\nexport function getTgeEscrowVaultPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.TGE_ESCROW_VAULT), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive TokenVault PDA from project PDA\n * Used for holding project tokens for investor distribution\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns TokenVault PDA\n */\nexport function getTokenVaultPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('token_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive ScamReport PDA from project PDA and NFT mint\n *\n * @param projectPda - Project account PDA\n * @param nftMint - Reporter's NFT mint address\n * @param programId - Raise program ID\n * @returns ScamReport account PDA\n */\nexport function getScamReportPDA(\n projectPda: PublicKey,\n nftMint: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.SCAM_REPORT),\n projectPda.toBuffer(),\n nftMint.toBuffer(),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive AdminConfig PDA (global admin authority)\n *\n * @param programId - Raise program ID\n * @returns AdminConfig account PDA\n */\nexport function getAdminConfigPDA(programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.ADMIN_CONFIG)],\n programId\n );\n return pda;\n}\n\n/**\n * Derive NFT Mint PDA\n *\n * @param projectId - Project identifier\n * @param investor - Investor's public key\n * @param investmentCount - Investment count (u64 in Rust, 8 bytes LE)\n * @param programId - Raise program ID\n * @returns NFT Mint PDA and bump\n */\nexport function getNftMintPDA(\n projectId: BN | number | string,\n investor: PublicKey,\n investmentCount: BN | number,\n programId: PublicKey\n): [PublicKey, number] {\n // Ensure both values are proper BN instances (handles prototype chain issues)\n const projectIdBN = ensureBN(projectId);\n const countBN = ensureBN(investmentCount);\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.NFT_MINT),\n projectIdBN.toArrayLike(Buffer, 'le', 8),\n investor.toBuffer(),\n countBN.toArrayLike(Buffer, 'le', 8), // u64 is 8 bytes LE\n ],\n programId\n );\n}\n\n/**\n * Derive Program Authority PDA\n *\n * @param programId - Raise program ID\n * @returns Program authority PDA and bump\n */\nexport function getProgramAuthorityPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.AUTHORITY)],\n programId\n );\n}\n\n/**\n * Helper to derive all PDAs for a project\n *\n * @param projectId - Project identifier\n * @param programId - Raise program ID\n * @returns Object with project and escrow PDAs\n */\nexport function getProjectPDAs(projectId: BN, programId: PublicKey) {\n const project = getProjectPDA(projectId, programId);\n const escrow = getEscrowPDA(projectId, programId);\n return { project, escrow };\n}\n\n// =============================================================================\n// ZTM v2.0 PDAs\n// =============================================================================\n\n/**\n * Derive Tokenomics PDA from project PDA\n */\nexport function getTokenomicsPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('tokenomics'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Token Mint PDA from project PDA\n */\nexport function getTokenMintPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('token_mint'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Vault Authority PDA from project PDA\n */\nexport function getVaultAuthorityPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('vault_authority'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Investor Vault PDA from project PDA\n */\nexport function getInvestorVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('investor_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Founder Vault PDA from project PDA\n */\nexport function getFounderVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('founder_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive LP Token Vault PDA from project PDA\n */\nexport function getLpTokenVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('lp_token_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Treasury Vault PDA from project PDA\n */\nexport function getTreasuryVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('treasury_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive LP USDC Vault PDA from project PDA\n */\nexport function getLpUsdcVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('lp_usdc_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Founder Vesting PDA from project PDA\n */\nexport function getFounderVestingPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('founder_vesting'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n","/**\n * Raise Instruction Builders\n *\n * All instruction builder functions for the Raise program.\n * These return transaction signatures when called with RPC.\n */\n\nimport { Program, BN } from '@coral-xyz/anchor';\nimport { PublicKey, Keypair, SYSVAR_INSTRUCTIONS_PUBKEY, SYSVAR_RENT_PUBKEY, SYSVAR_CLOCK_PUBKEY, SystemProgram, ComputeBudgetProgram } from '@solana/web3.js';\nimport {\n getProjectPDA,\n getEscrowPDA,\n getMilestonePDA,\n getInvestmentPDA,\n getVotePDA,\n getPivotProposalPDA,\n getTgeEscrowPDA,\n getTokenVaultPDA,\n getNftMintPDA,\n getProgramAuthorityPDA,\n getAdminConfigPDA,\n // ZTM v2.0 PDAs\n getTokenomicsPDA,\n getTokenMintPDA,\n getVaultAuthorityPDA,\n getInvestorVaultPDA,\n getFounderVaultPDA,\n getLpTokenVaultPDA,\n getTreasuryVaultPDA,\n getLpUsdcVaultPDA,\n getFounderVestingPDA,\n} from '../pdas/index.js';\nimport { getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID } from '@solana/spl-token';\n\n// Metaplex Token Metadata Program ID\nconst TOKEN_METADATA_PROGRAM_ID = new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s');\n\n/**\n * Ensure value is a proper PublicKey instance.\n * Handles cases where PublicKey objects lose their prototype chain\n * (e.g., when passing through React state or JSON serialization).\n */\nfunction ensurePublicKey(value: PublicKey | string | { toString(): string }): PublicKey {\n if (value instanceof PublicKey) {\n return value;\n }\n // Handle string or object with toString method\n return new PublicKey(String(value));\n}\n\n// Generic type for any Anchor program\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyProgram = Program<any>;\n\n// Helper to get methods namespace - bypasses deep type instantiation\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getMethods(program: AnyProgram): any {\n return program.methods;\n}\n\n// Helper to get account namespace for fetching accounts\n// Used by voteOnMilestone to fetch milestone.voting_round for vote PDA\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getAccountNamespace(program: AnyProgram): any {\n return program.account;\n}\n\n// =============================================================================\n// Admin Instructions\n// =============================================================================\n\n/**\n * Initialize admin config (deploy-time only)\n */\nexport async function initializeAdmin(\n program: AnyProgram,\n admin: PublicKey,\n payer: PublicKey\n): Promise<string> {\n return getMethods(program)\n .initializeAdmin()\n .accounts({\n admin,\n payer,\n })\n .rpc();\n}\n\n/**\n * Propose admin transfer to new admin\n */\nexport async function transferAdmin(\n program: AnyProgram,\n adminKeypair: Keypair,\n newAdmin: PublicKey\n): Promise<string> {\n return getMethods(program)\n .transferAdmin()\n .accounts({\n authority: adminKeypair.publicKey,\n newAdmin,\n })\n .signers([adminKeypair])\n .rpc();\n}\n\n/**\n * Accept admin transfer\n */\nexport async function acceptAdmin(\n program: AnyProgram,\n newAuthority: PublicKey\n): Promise<string> {\n return getMethods(program)\n .acceptAdmin()\n .accounts({\n newAuthority,\n })\n .rpc();\n}\n\n// =============================================================================\n// Project Instructions\n// =============================================================================\n\n/**\n * TierConfig input type for initializeProject\n * Matches the on-chain TierConfig struct\n */\ninterface TierConfigInput {\n /** USDC amount per lot */\n amount: BN;\n /** Maximum lots available */\n maxLots: number;\n /** Token allocation per $1 invested */\n tokenRatio: BN;\n /** Vote weight multiplier (basis points, 100 = 1.0x) */\n voteMultiplier: number;\n}\n\n/**\n * TokenomicsArgs input type for initializeProject (ZTM v2.0)\n * Matches the on-chain TokenomicsArgs struct\n */\nexport interface TokenomicsInput {\n /** Token symbol as 8-byte array (2-8 chars uppercase, padded with 0s) */\n tokenSymbol: number[];\n /** Total token supply */\n totalSupply: BN;\n /** Investor allocation in basis points (e.g., 4000 = 40%) */\n investorAllocationBps: number;\n /** LP token allocation in basis points */\n lpTokenAllocationBps: number;\n /** LP USDC allocation in basis points (min 500 = 5% of raised USDC) */\n lpUsdcAllocationBps: number;\n /** Founder allocation in basis points (optional) */\n founderAllocationBps?: number | null;\n /** Treasury allocation in basis points (optional) */\n treasuryAllocationBps?: number | null;\n /** Founder wallet for vesting (required if founder_allocation_bps > 0) */\n founderWallet?: PublicKey | null;\n /** Vesting duration in months (required if founder_allocation_bps > 0) */\n vestingDurationMonths?: number | null;\n /** Cliff period in months (optional) */\n cliffMonths?: number | null;\n}\n\n/**\n * Helper to convert string symbol to 8-byte array\n */\nexport function symbolToBytes(symbol: string): number[] {\n const bytes = new Array(8).fill(0);\n const chars = symbol.toUpperCase().slice(0, 8);\n for (let i = 0; i < chars.length; i++) {\n bytes[i] = chars.charCodeAt(i);\n }\n return bytes;\n}\n\n// =============================================================================\n// Deadline Constants and Helpers\n// =============================================================================\n\n/** Minimum deadline duration from current time (7 days in production, 60s in dev) */\nexport const MIN_DEADLINE_DURATION_SECONDS_PROD = 604_800; // 7 days\nexport const MIN_DEADLINE_DURATION_SECONDS_DEV = 60; // 60 seconds\n\n/** Maximum deadline duration from current time (1 year) */\nexport const MAX_DEADLINE_DURATION_SECONDS = 31_536_000; // 365 days\n\n/**\n * Calculate a valid milestone deadline\n *\n * @param daysFromNow - Number of days from now to set deadline\n * @param isDev - Use dev mode (60s min) or production mode (7 days min)\n * @returns BN timestamp for the deadline\n */\nexport function calculateDeadline(daysFromNow: number, isDev: boolean = false): BN {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const minDuration = isDev ? MIN_DEADLINE_DURATION_SECONDS_DEV : MIN_DEADLINE_DURATION_SECONDS_PROD;\n const daysInSeconds = daysFromNow * 24 * 60 * 60;\n\n // Ensure deadline is at least minimum duration from now\n const deadlineSeconds = nowSeconds + Math.max(daysInSeconds, minDuration);\n\n // Cap at maximum duration\n const maxDeadline = nowSeconds + MAX_DEADLINE_DURATION_SECONDS;\n return new BN(Math.min(deadlineSeconds, maxDeadline));\n}\n\n/**\n * Create a deadline that's the minimum allowed duration from now\n *\n * @param isDev - Use dev mode (60s min) or production mode (7 days min)\n * @returns BN timestamp for the minimum valid deadline\n */\nexport function minDeadline(isDev: boolean = false): BN {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const minDuration = isDev ? MIN_DEADLINE_DURATION_SECONDS_DEV : MIN_DEADLINE_DURATION_SECONDS_PROD;\n return new BN(nowSeconds + minDuration + 1); // +1 for safety margin\n}\n\n/**\n * Validate a deadline is within allowed bounds\n *\n * @param deadline - BN timestamp to validate\n * @param isDev - Use dev mode (60s min) or production mode (7 days min)\n * @returns { valid: boolean, error?: string }\n */\nexport function validateDeadline(\n deadline: BN,\n isDev: boolean = false\n): { valid: boolean; error?: string } {\n const nowSeconds = Math.floor(Date.now() / 1000);\n const deadlineSeconds = deadline.toNumber();\n const minDuration = isDev ? MIN_DEADLINE_DURATION_SECONDS_DEV : MIN_DEADLINE_DURATION_SECONDS_PROD;\n\n const minDeadline = nowSeconds + minDuration;\n const maxDeadline = nowSeconds + MAX_DEADLINE_DURATION_SECONDS;\n\n if (deadlineSeconds < minDeadline) {\n const minDays = isDev ? '60 seconds' : '7 days';\n return {\n valid: false,\n error: `Deadline must be at least ${minDays} from now`,\n };\n }\n\n if (deadlineSeconds > maxDeadline) {\n return {\n valid: false,\n error: 'Deadline must be within 1 year from now',\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Initialize a new project with founder-configured tiers and tokenomics (ZTM v2.0)\n *\n * @param milestone1Deadline - Unix timestamp for M1 deadline (required)\n * Must be >= current_time + MIN_DEADLINE_DURATION_SECONDS (7 days prod, 60s dev)\n * Must be <= current_time + MAX_DEADLINE_DURATION_SECONDS (1 year)\n */\nexport async function initializeProject(\n program: AnyProgram,\n args: {\n projectId: BN;\n fundingGoal: BN;\n metadataUri: string;\n /** Founder-configured tiers (1-10 tiers, sorted ascending by amount) */\n tiers: TierConfigInput[];\n /** ZTM v2.0: Tokenomics configuration */\n tokenomics: TokenomicsInput;\n /** Milestone 1 deadline - Unix timestamp (required) */\n milestone1Deadline: BN;\n },\n founder: PublicKey\n): Promise<string> {\n return getMethods(program)\n .initializeProject({\n projectId: args.projectId,\n fundingGoal: args.fundingGoal,\n metadataUri: args.metadataUri,\n tiers: args.tiers,\n tokenomics: {\n tokenSymbol: args.tokenomics.tokenSymbol,\n totalSupply: args.tokenomics.totalSupply,\n investorAllocationBps: args.tokenomics.investorAllocationBps,\n lpTokenAllocationBps: args.tokenomics.lpTokenAllocationBps,\n lpUsdcAllocationBps: args.tokenomics.lpUsdcAllocationBps,\n founderAllocationBps: args.tokenomics.founderAllocationBps ?? null,\n treasuryAllocationBps: args.tokenomics.treasuryAllocationBps ?? null,\n founderWallet: args.tokenomics.founderWallet ?? null,\n vestingDurationMonths: args.tokenomics.vestingDurationMonths ?? null,\n cliffMonths: args.tokenomics.cliffMonths ?? null,\n },\n milestone1Deadline: args.milestone1Deadline,\n })\n .accounts({\n founder,\n })\n .rpc();\n}\n\n/**\n * Submit project for approval\n */\nexport async function submitForApproval(\n program: AnyProgram,\n projectId: BN,\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n return getMethods(program)\n .submitForApproval()\n .accounts({\n project: projectPda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Approve project (admin only)\n * ZTM v2.0: This now deploys the token and creates all vaults\n */\nexport async function approveProject(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** USDC mint address (for creating lp_usdc_vault) */\n usdcMint: PublicKey;\n },\n adminKeypair: Keypair\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const tokenMintPda = getTokenMintPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const founderVaultPda = getFounderVaultPDA(projectPda, program.programId);\n const lpTokenVaultPda = getLpTokenVaultPDA(projectPda, program.programId);\n const treasuryVaultPda = getTreasuryVaultPDA(projectPda, program.programId);\n const lpUsdcVaultPda = getLpUsdcVaultPDA(projectPda, program.programId);\n\n return getMethods(program)\n .approveProject()\n .accounts({\n project: projectPda,\n tokenomics: tokenomicsPda,\n tokenVault: tokenVaultPda,\n tokenMint: tokenMintPda,\n vaultAuthority: vaultAuthorityPda,\n investorVault: investorVaultPda,\n founderVault: founderVaultPda,\n lpTokenVault: lpTokenVaultPda,\n treasuryVault: treasuryVaultPda,\n lpUsdcVault: lpUsdcVaultPda,\n usdcMint: args.usdcMint,\n authority: adminKeypair.publicKey,\n payer: adminKeypair.publicKey,\n })\n .signers([adminKeypair])\n .rpc();\n}\n\n// =============================================================================\n// Milestone Instructions\n// =============================================================================\n\n/**\n * Create a milestone for a project\n */\nexport async function createMilestone(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n percentage: number;\n description: string;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .createMilestone({\n milestoneIndex: args.milestoneIndex,\n percentage: args.percentage,\n description: args.description,\n })\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Submit milestone for review\n */\nexport async function submitMilestone(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number,\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n\n return getMethods(program)\n .submitMilestone()\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Vote on a milestone\n *\n * Automatically fetches the milestone to get the current voting_round\n * for proper vote PDA derivation. This supports re-voting after milestone failure.\n */\nexport async function voteOnMilestone(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n nftMint: PublicKey | string;\n choice: { good: object } | { bad: object };\n },\n voter: PublicKey\n): Promise<string> {\n // Ensure nftMint is a proper PublicKey (handles React state serialization)\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n\n // Fetch milestone to get current voting_round for vote PDA derivation\n // This enables re-voting after milestone failure and resubmit\n const milestone = await getAccountNamespace(program).milestone.fetch(milestonePda);\n const votingRound = milestone.votingRound ?? 0;\n const votePda = getVotePDA(milestonePda, voter, votingRound, program.programId);\n\n // Get voter's NFT token account (ATA)\n const voterNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n voter,\n false, // allowOwnerOffCurve\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .voteOnMilestone({ choice: args.choice })\n .accounts({\n milestone: milestonePda,\n project: projectPda,\n investment: investmentPda,\n vote: votePda,\n nftMint: nftMintPubkey,\n voterNftAccount,\n voter,\n })\n .rpc();\n}\n\n/**\n * Finalize voting on a milestone\n */\nexport async function finalizeVoting(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n\n return getMethods(program)\n .finalizeVoting()\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n })\n .rpc();\n}\n\n/**\n * Claim milestone funds (for founders)\n *\n * ZTM v2.0: Transfers USDC from escrow to founder's account.\n * - Regular milestones: Full payout to founder (no LP deduction)\n * - Final milestone: LP USDC reserved for PCL, triggers MAE\n *\n * @param nextMilestoneDeadline - Deadline for next milestone (required for non-final milestones)\n * Must be >= current_time + MIN_DEADLINE_DURATION_SECONDS (7 days prod, 60s dev)\n * Must be <= current_time + MAX_DEADLINE_DURATION_SECONDS (1 year)\n * Set to BN(0) for final milestone claims (no next milestone exists)\n */\nexport async function claimMilestoneFunds(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n founderUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n /** Deadline for next milestone - required for non-final milestones, use BN(0) for final */\n nextMilestoneDeadline: BN;\n /** Next milestone PDA - required for non-final milestones */\n nextMilestonePda?: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n const escrowPda = getEscrowPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const lpUsdcVaultPda = getLpUsdcVaultPDA(projectPda, program.programId);\n\n // For non-final milestones, derive next milestone PDA if not provided\n const nextMilestonePda = args.nextMilestonePda ??\n (args.nextMilestoneDeadline.gt(new BN(0))\n ? getMilestonePDA(projectPda, args.milestoneIndex + 1, program.programId)\n : null);\n\n return getMethods(program)\n .claimMilestoneFunds({ nextMilestoneDeadline: args.nextMilestoneDeadline })\n .accounts({\n milestone: milestonePda,\n project: projectPda,\n founder,\n projectEscrow: args.escrowTokenAccount,\n founderUsdcAccount: args.founderUsdcAccount,\n escrowPda,\n tokenVault: tokenVaultPda,\n tokenomics: tokenomicsPda,\n lpUsdcVault: lpUsdcVaultPda,\n nextMilestone: nextMilestonePda,\n systemProgram: SystemProgram.programId,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Resubmit a failed milestone for rework (Failed → InProgress)\n *\n * This allows founders to iterate on a failed milestone by transitioning it\n * back to InProgress state with cleared voting state for a fresh voting cycle.\n * The consecutive_failures counter is NOT reset (tracked at project level).\n * Unlimited rework attempts are allowed.\n */\nexport async function resubmitMilestone(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .resubmitMilestone()\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Set milestone deadline for founder to commit submission date\n *\n * Founders must set deadlines for milestones to provide visibility to investors.\n * Deadline must be at least 7 days from now and at most 1 year from now.\n * Can only be set on Proposed, Approved, or InProgress milestones.\n */\nexport async function setMilestoneDeadline(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n /** Unix timestamp for the deadline */\n deadline: BN;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .setMilestoneDeadline({\n milestoneIndex: args.milestoneIndex,\n deadline: args.deadline,\n })\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Extend milestone deadline (max 3 extensions per milestone)\n *\n * Founders can extend a deadline up to 3 times before it passes.\n * Must be called BEFORE the current deadline passes.\n * New deadline must be later than current deadline.\n */\nexport async function extendMilestoneDeadline(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n /** New deadline timestamp (must be > current deadline) */\n newDeadline: BN;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, args.milestoneIndex, program.programId);\n\n return getMethods(program)\n .extendMilestoneDeadline({\n milestoneIndex: args.milestoneIndex,\n newDeadline: args.newDeadline,\n })\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n founder,\n })\n .rpc();\n}\n\n// =============================================================================\n// Investment Instructions\n// =============================================================================\n\n/**\n * Derive Metaplex metadata PDA\n */\nfunction getMetadataPDA(mint: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from('metadata'),\n TOKEN_METADATA_PROGRAM_ID.toBuffer(),\n mint.toBuffer(),\n ],\n TOKEN_METADATA_PROGRAM_ID\n );\n return pda;\n}\n\n/**\n * Derive Metaplex master edition PDA\n */\nfunction getMasterEditionPDA(mint: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from('metadata'),\n TOKEN_METADATA_PROGRAM_ID.toBuffer(),\n mint.toBuffer(),\n Buffer.from('edition'),\n ],\n TOKEN_METADATA_PROGRAM_ID\n );\n return pda;\n}\n\n/**\n * Invest in a project\n *\n * This creates an investment NFT and transfers USDC to the project escrow.\n * The investmentCount should be fetched from the project account before calling.\n */\nexport async function invest(\n program: AnyProgram,\n args: {\n projectId: BN;\n amount: BN;\n investorTokenAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n investmentCount: number; // Must be fetched from project.investmentCount\n },\n investor: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n\n // Derive NFT mint PDA using seeds: [NFT_MINT_SEED, project_id, investor, investment_count]\n const [nftMint] = getNftMintPDA(args.projectId, investor, args.investmentCount, program.programId);\n\n // Derive investment PDA using seeds: [INVESTMENT_SEED, project, nft_mint]\n const investmentPda = getInvestmentPDA(projectPda, nftMint, program.programId);\n\n // Derive investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(nftMint, investor);\n\n // Derive Metaplex metadata and master edition PDAs\n const metadataAccount = getMetadataPDA(nftMint);\n const masterEdition = getMasterEditionPDA(nftMint);\n\n // Derive program authority PDA\n const [programAuthority] = getProgramAuthorityPDA(program.programId);\n\n // BUG-1 FIX: Derive first milestone PDA (index 0) for state transition when funded\n const firstMilestonePda = getMilestonePDA(projectPda, 0, program.programId);\n\n // Add compute budget instruction to handle heavy NFT+metadata operations\n // Metaplex NFT minting requires significantly more than the default 200k CU\n return getMethods(program)\n .invest({ amount: args.amount })\n .accounts({\n project: projectPda,\n firstMilestone: firstMilestonePda,\n nftMint: nftMint,\n investment: investmentPda,\n investorNftAccount: investorNftAccount,\n metadataAccount: metadataAccount,\n masterEdition: masterEdition,\n escrowTokenAccount: args.escrowTokenAccount,\n investorTokenAccount: args.investorTokenAccount,\n programAuthority: programAuthority,\n investor,\n tokenProgram: TOKEN_PROGRAM_ID,\n associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID,\n systemProgram: SystemProgram.programId,\n rent: SYSVAR_RENT_PUBKEY,\n tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID,\n sysvarInstructions: SYSVAR_INSTRUCTIONS_PUBKEY,\n })\n .preInstructions([\n ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }),\n ])\n .rpc();\n}\n\n/**\n * Cancel investment within 24-hour cooling-off period\n */\nexport async function cancelInvestment(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const escrowPda = getEscrowPDA(args.projectId, program.programId);\n\n return getMethods(program)\n .cancelInvestment()\n .accounts({\n investor,\n project: projectPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount: args.investorNftAccount,\n projectEscrow: args.escrowTokenAccount,\n investorUsdcAccount: args.investorUsdcAccount,\n escrowPda,\n })\n .rpc();\n}\n\n// =============================================================================\n// Pivot Instructions\n// =============================================================================\n\n/**\n * Propose a pivot\n */\nexport async function proposePivot(\n program: AnyProgram,\n args: {\n projectId: BN;\n newMetadataUri: string;\n newMilestones: Array<{ percentage: number; description: string }>;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n\n // Fetch project to get current pivot_count\n const projectAccount = await getAccountNamespace(program).project.fetch(projectPda);\n const pivotCount = projectAccount.pivotCount || 0;\n\n // Derive pivot proposal PDA using pivot_count\n const pivotProposalPda = getPivotProposalPDA(projectPda, pivotCount, program.programId);\n\n return getMethods(program)\n .proposePivot({\n newMetadataUri: args.newMetadataUri,\n newMilestones: args.newMilestones,\n })\n .accounts({\n project: projectPda,\n founder,\n pivotProposal: pivotProposalPda,\n systemProgram: SystemProgram.programId,\n clock: SYSVAR_CLOCK_PUBKEY,\n })\n .rpc();\n}\n\n/**\n * Approve pivot proposal (admin only)\n */\nexport async function approvePivot(\n program: AnyProgram,\n projectId: BN,\n adminKeypair: Keypair\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n\n // Fetch project to get the active pivot proposal\n // The active_pivot field contains the actual pivot proposal pubkey\n const projectAccount = await getAccountNamespace(program).project.fetch(projectPda);\n\n // Use the active_pivot directly if available, otherwise derive from pivot_count\n let pivotProposalPda: PublicKey;\n if (projectAccount.activePivot) {\n pivotProposalPda = projectAccount.activePivot;\n } else {\n // Fallback to deriving from pivot_count (pivot_count is NOT incremented until finalize)\n const pivotCount = projectAccount.pivotCount || 0;\n pivotProposalPda = getPivotProposalPDA(projectPda, pivotCount, program.programId);\n }\n\n return getMethods(program)\n .approvePivot()\n .accounts({\n moderator: adminKeypair.publicKey,\n project: projectPda,\n pivotProposal: pivotProposalPda,\n })\n .signers([adminKeypair])\n .rpc();\n}\n\n/**\n * Withdraw from pivot during 7-day window\n */\nexport async function withdrawFromPivot(\n program: AnyProgram,\n args: {\n projectId: BN;\n pivotCount: number; // Current pivot_count from project\n nftMint: PublicKey;\n investorTokenAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n milestoneAccounts: PublicKey[]; // All milestone PDAs for calculating unreleased funds\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const escrowPda = getEscrowPDA(args.projectId, program.programId);\n // Active pivot is at pivotCount (incremented only AFTER finalization)\n const pivotProposalPda = getPivotProposalPDA(projectPda, args.pivotCount, program.programId);\n // Get investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n investor,\n false,\n TOKEN_PROGRAM_ID\n );\n\n // Pass milestone accounts as remaining accounts for unreleased funds calculation\n const remainingAccounts = args.milestoneAccounts.map((pubkey) => ({\n pubkey: ensurePublicKey(pubkey),\n isSigner: false,\n isWritable: false,\n }));\n\n return getMethods(program)\n .withdrawFromPivot()\n .accounts({\n investor,\n project: projectPda,\n pivotProposal: pivotProposalPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount,\n escrowTokenAccount: args.escrowTokenAccount,\n investorTokenAccount: args.investorTokenAccount,\n escrow: escrowPda,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n/**\n * Finalize pivot after 7-day window\n *\n * IMPORTANT: When old_milestone_count == new_milestone_count, the milestone PDAs are\n * the same and get reinitialized in-place. In this case, only pass the milestone\n * accounts once (not twice as old+new).\n */\nexport async function finalizePivot(\n program: AnyProgram,\n args: {\n projectId: BN;\n pivotCount: number; // Current pivot_count from project (active pivot is at pivotCount)\n milestoneAccounts: PublicKey[]; // All milestone PDAs (reused when old_count == new_count)\n },\n authority: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n // Active pivot is at pivotCount (incremented only AFTER finalization)\n const pivotProposalPda = getPivotProposalPDA(projectPda, args.pivotCount, program.programId);\n\n // Pass milestone accounts as remaining accounts\n // When old_count == new_count, these are reinitialized in-place\n const remainingAccounts = args.milestoneAccounts.map((pubkey) => ({\n pubkey,\n isSigner: false,\n isWritable: true,\n }));\n\n return getMethods(program)\n .finalizePivot()\n .accounts({\n authority,\n project: projectPda,\n pivotProposal: pivotProposalPda,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n// =============================================================================\n// TGE Instructions\n// =============================================================================\n\n/**\n * Set TGE date and token mint\n */\nexport async function setTgeDate(\n program: AnyProgram,\n args: {\n projectId: BN;\n tgeDate: BN;\n tokenMint: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n\n return getMethods(program)\n .setTgeDate({\n tgeDate: args.tgeDate,\n tokenMint: args.tokenMint,\n })\n .accounts({\n project: projectPda,\n founder,\n })\n .rpc();\n}\n\n/**\n * Deposit tokens for investor distribution\n */\nexport async function depositTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n amount: BN;\n tokenMint: PublicKey;\n founderTokenAccount: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n\n return getMethods(program)\n .depositTokens({ amount: args.amount })\n .accounts({\n project: projectPda,\n tokenMint: args.tokenMint,\n founderTokenAccount: args.founderTokenAccount,\n founder,\n })\n .rpc();\n}\n\n/**\n * Claim project tokens using Investment NFT\n */\nexport async function claimTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorTokenAccount: PublicKey;\n projectTokenVault: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, args.nftMint, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n\n return getMethods(program)\n .claimTokens()\n .accounts({\n investor,\n project: projectPda,\n investment: investmentPda,\n investorNftAccount: args.investorNftAccount,\n projectTokenVault: args.projectTokenVault,\n investorTokenAccount: args.investorTokenAccount,\n tokenVaultPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Report scam during 30-day post-TGE window\n */\nexport async function reportScam(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n },\n reporter: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tgeEscrowPda = getTgeEscrowPDA(projectPda, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, args.nftMint, program.programId);\n\n return getMethods(program)\n .reportScam()\n .accounts({\n tgeEscrow: tgeEscrowPda,\n project: projectPda,\n investment: investmentPda,\n nftMint: args.nftMint,\n reporter,\n })\n .rpc();\n}\n\n/**\n * Release 10% holdback to founder after 30 days\n */\nexport async function releaseHoldback(\n program: AnyProgram,\n args: {\n projectId: BN;\n founderTokenAccount: PublicKey;\n }\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tgeEscrowPda = getTgeEscrowPDA(projectPda, program.programId);\n\n return getMethods(program)\n .releaseHoldback()\n .accounts({\n tgeEscrow: tgeEscrowPda,\n project: projectPda,\n founderTokenAccount: args.founderTokenAccount,\n })\n .rpc();\n}\n\n// =============================================================================\n// Abandonment Instructions\n// =============================================================================\n\n/**\n * Check for abandonment (90 days inactivity)\n */\nexport async function checkAbandonment(\n program: AnyProgram,\n projectId: BN,\n milestoneIndex: number = 0\n): Promise<string> {\n const projectPda = getProjectPDA(projectId, program.programId);\n const milestonePda = getMilestonePDA(projectPda, milestoneIndex, program.programId);\n\n return getMethods(program)\n .checkAbandonment()\n .accounts({\n project: projectPda,\n milestone: milestonePda,\n })\n .rpc();\n}\n\n/**\n * Claim refund after abandonment\n *\n * @param milestoneCount - Number of milestones in the project (used to derive milestone PDAs for remainingAccounts)\n * The program calculates unreleased funds by iterating through milestone accounts.\n */\nexport async function claimRefund(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n investorUsdcAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n milestoneCount?: number; // If not provided, defaults to 1\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n\n // Derive milestone PDAs and pass as remainingAccounts\n // The program iterates through these to calculate unreleased funds\n const milestoneCount = args.milestoneCount ?? 1;\n const remainingAccounts = [];\n for (let i = 0; i < milestoneCount; i++) {\n const milestonePda = getMilestonePDA(projectPda, i, program.programId);\n remainingAccounts.push({\n pubkey: milestonePda,\n isWritable: false,\n isSigner: false,\n });\n }\n\n return getMethods(program)\n .claimRefund()\n .accounts({\n project: projectPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount: args.investorNftAccount,\n investor,\n investorTokenAccount: args.investorUsdcAccount,\n escrowTokenAccount: args.escrowTokenAccount,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n// =============================================================================\n// ZTM v2.0 Token Distribution Instructions\n// =============================================================================\n\n/**\n * Claim investor tokens from a passed milestone (whitepaper: manual claim model)\n *\n * ZTM v2.0: Per whitepaper, investors manually claim their tokens after a milestone passes.\n * This replaces the batch distribution model with investor-initiated per-NFT claims.\n *\n * @param milestoneIndex - The milestone index to claim tokens from\n * @param nftMint - The NFT mint that proves investment ownership\n * @param investorTokenAccount - Investor's token account to receive claimed tokens\n */\nexport async function claimInvestorTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Milestone index to claim tokens from */\n milestoneIndex: number;\n /** NFT mint that proves investment ownership */\n nftMint: PublicKey;\n /** Investor's token account to receive claimed tokens */\n investorTokenAccount: PublicKey;\n },\n investor: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Get investor's NFT token account (ATA)\n const investorNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n investor,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .claimInvestorTokens({ milestoneIndex: args.milestoneIndex })\n .accounts({\n investor,\n project: projectPda,\n tokenVault: tokenVaultPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n investorNftAccount,\n investorVault: investorVaultPda,\n investorTokenAccount: args.investorTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n/**\n * Distribute tokens to NFT holders for a milestone\n *\n * ZTM v2.0: Called by cranker after finalize_voting sets distribution_pending = true.\n * Processes batch of investments, transferring unlocked tokens to NFT holders.\n *\n * @deprecated Use claimInvestorTokens instead (whitepaper manual claim model)\n *\n * @param investments - Array of { investmentPda, investorTokenAccount } pairs\n * Each pair represents an investor's investment and their token account to receive tokens.\n * Max batch size: 10 investments per call.\n */\nexport async function distributeTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n /** Investment and token account pairs to process */\n investments: Array<{\n investmentPda: PublicKey;\n investorTokenAccount: PublicKey;\n }>;\n },\n payer: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Build remaining accounts: (Investment, TokenAccount) pairs\n const remainingAccounts = args.investments.flatMap((inv) => [\n { pubkey: inv.investmentPda, isSigner: false, isWritable: true },\n { pubkey: inv.investorTokenAccount, isSigner: false, isWritable: true },\n ]);\n\n return getMethods(program)\n .distributeTokens({ milestoneIndex: args.milestoneIndex })\n .accounts({\n project: projectPda,\n tokenVault: tokenVaultPda,\n investorVault: investorVaultPda,\n vaultAuthority: vaultAuthorityPda,\n payer,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n/**\n * Complete token distribution for a milestone\n *\n * ZTM v2.0: Marks distribution as complete after all batches have been processed.\n * Permissionless - anyone can call this to finalize a distribution.\n */\nexport async function completeDistribution(\n program: AnyProgram,\n args: {\n projectId: BN;\n milestoneIndex: number;\n },\n payer: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n\n return getMethods(program)\n .completeDistribution({ milestoneIndex: args.milestoneIndex })\n .accounts({\n project: projectPda,\n tokenVault: tokenVaultPda,\n payer,\n })\n .rpc();\n}\n\n// =============================================================================\n// Exit Window Instructions\n// =============================================================================\n\n/**\n * Claim exit window refund during 3-failure voluntary exit window\n * Per whitepaper: 3 consecutive failures trigger 7-day voluntary exit window\n * Investors can claim proportional share of unreleased USDC escrow funds\n */\nexport async function claimExitWindowRefund(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n investorNftAccount: PublicKey;\n escrowTokenAccount: PublicKey;\n investorTokenAccount: PublicKey;\n milestoneAccounts?: PublicKey[];\n },\n investor: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, args.nftMint, program.programId);\n const escrowPda = getEscrowPDA(args.projectId, program.programId);\n\n const remainingAccounts = (args.milestoneAccounts || []).map((pubkey) => ({\n pubkey,\n isSigner: false,\n isWritable: false,\n }));\n\n return getMethods(program)\n .claimExitWindowRefund()\n .accountsPartial({\n project: projectPda,\n investment: investmentPda,\n nftMint: args.nftMint,\n investorNftAccount: args.investorNftAccount,\n escrowTokenAccount: args.escrowTokenAccount,\n investorTokenAccount: args.investorTokenAccount,\n escrowPda,\n investor,\n })\n .remainingAccounts(remainingAccounts)\n .rpc();\n}\n\n// =============================================================================\n// ZTM v2.0 Founder Vesting Instructions\n// =============================================================================\n\n/**\n * Initialize founder vesting after MAE (Market Access Event)\n *\n * ZTM v2.0: Creates FounderVesting PDA with vesting schedule from Tokenomics.\n * Must be called after project reaches Completed state (all milestones done).\n * Permissionless - anyone can pay to initialize.\n */\nexport async function initializeFounderVesting(\n program: AnyProgram,\n args: {\n projectId: BN;\n },\n payer: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenomicsPda = getTokenomicsPDA(projectPda, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const founderVestingPda = getFounderVestingPDA(projectPda, program.programId);\n\n return getMethods(program)\n .initializeFounderVesting()\n .accounts({\n project: projectPda,\n tokenomics: tokenomicsPda,\n tokenVault: tokenVaultPda,\n founderVesting: founderVestingPda,\n payer,\n systemProgram: SystemProgram.programId,\n })\n .rpc();\n}\n\n/**\n * Claim vested tokens from founder vault\n *\n * ZTM v2.0: Founder claims tokens based on linear vesting schedule.\n * Requires cliff period to pass before any tokens can be claimed.\n */\nexport async function claimVestedTokens(\n program: AnyProgram,\n args: {\n projectId: BN;\n /** Founder's token account to receive vested tokens */\n founderTokenAccount: PublicKey;\n },\n founder: PublicKey\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const founderVestingPda = getFounderVestingPDA(projectPda, program.programId);\n const founderVaultPda = getFounderVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n return getMethods(program)\n .claimVestedTokens()\n .accounts({\n project: projectPda,\n tokenVault: tokenVaultPda,\n founderVesting: founderVestingPda,\n founderVault: founderVaultPda,\n vaultAuthority: vaultAuthorityPda,\n founderTokenAccount: args.founderTokenAccount,\n founder,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n\n// =============================================================================\n// ZTM v2.0 Circuit Breaker Instructions\n// =============================================================================\n\n/**\n * Force complete a stuck distribution (admin only)\n *\n * ZTM v2.0: Circuit breaker for when token distribution is stuck for >7 days.\n * Marks distribution as complete so project can continue.\n * Affected investors can use claimMissedUnlock to get their tokens.\n */\nexport async function forceCompleteDistribution(\n program: AnyProgram,\n args: {\n projectId: BN;\n },\n adminKeypair: Keypair\n): Promise<string> {\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const adminConfigPda = getAdminConfigPDA(program.programId);\n\n return getMethods(program)\n .forceCompleteDistribution()\n .accounts({\n admin: adminKeypair.publicKey,\n adminConfig: adminConfigPda,\n project: projectPda,\n tokenVault: tokenVaultPda,\n })\n .signers([adminKeypair])\n .rpc();\n}\n\n/**\n * Claim missed token unlock after force-complete distribution\n *\n * ZTM v2.0: Allows investors to claim tokens they missed during a stuck\n * distribution that was force-completed by admin.\n */\nexport async function claimMissedUnlock(\n program: AnyProgram,\n args: {\n projectId: BN;\n nftMint: PublicKey;\n /** Milestone index to claim for */\n milestoneIndex: number;\n /** Claimer's token account to receive tokens */\n claimerTokenAccount: PublicKey;\n },\n claimer: PublicKey\n): Promise<string> {\n const nftMintPubkey = ensurePublicKey(args.nftMint);\n const projectPda = getProjectPDA(args.projectId, program.programId);\n const tokenVaultPda = getTokenVaultPDA(projectPda, program.programId);\n const investmentPda = getInvestmentPDA(projectPda, nftMintPubkey, program.programId);\n const investorVaultPda = getInvestorVaultPDA(projectPda, program.programId);\n const vaultAuthorityPda = getVaultAuthorityPDA(projectPda, program.programId);\n\n // Get claimer's NFT token account (ATA)\n const claimerNftAccount = getAssociatedTokenAddressSync(\n nftMintPubkey,\n claimer,\n false,\n TOKEN_PROGRAM_ID\n );\n\n return getMethods(program)\n .claimMissedUnlock({ milestoneIndex: args.milestoneIndex })\n .accounts({\n claimer,\n project: projectPda,\n tokenVault: tokenVaultPda,\n investment: investmentPda,\n nftMint: nftMintPubkey,\n claimerNftAccount,\n investorVault: investorVaultPda,\n claimerTokenAccount: args.claimerTokenAccount,\n vaultAuthority: vaultAuthorityPda,\n tokenProgram: TOKEN_PROGRAM_ID,\n })\n .rpc();\n}\n"]}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var web3_js = require('@solana/web3.js');
|
|
4
|
+
var anchor = require('@coral-xyz/anchor');
|
|
5
|
+
|
|
6
|
+
// src/pdas/index.ts
|
|
7
|
+
|
|
8
|
+
// src/constants/index.ts
|
|
9
|
+
var SEEDS = {
|
|
10
|
+
PROJECT: "project",
|
|
11
|
+
MILESTONE: "milestone",
|
|
12
|
+
INVESTMENT: "investment",
|
|
13
|
+
VOTE: "vote",
|
|
14
|
+
ESCROW: "escrow",
|
|
15
|
+
PIVOT: "pivot",
|
|
16
|
+
TGE_ESCROW: "tge_escrow",
|
|
17
|
+
TGE_ESCROW_VAULT: "tge_escrow_vault",
|
|
18
|
+
SCAM_REPORT: "scam_report",
|
|
19
|
+
ADMIN_CONFIG: "admin-config",
|
|
20
|
+
NFT_MINT: "nft_mint",
|
|
21
|
+
AUTHORITY: "authority"
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// src/pdas/index.ts
|
|
25
|
+
function ensureBN(value) {
|
|
26
|
+
if (value && typeof value.toArrayLike === "function") {
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
return new anchor.BN(String(value));
|
|
30
|
+
}
|
|
31
|
+
function getProjectPDA(projectId, programId) {
|
|
32
|
+
const projectIdBN = ensureBN(projectId);
|
|
33
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
34
|
+
[Buffer.from(SEEDS.PROJECT), projectIdBN.toArrayLike(Buffer, "le", 8)],
|
|
35
|
+
programId
|
|
36
|
+
);
|
|
37
|
+
return pda;
|
|
38
|
+
}
|
|
39
|
+
function getEscrowPDA(projectId, programId) {
|
|
40
|
+
const projectIdBN = ensureBN(projectId);
|
|
41
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
42
|
+
[Buffer.from(SEEDS.ESCROW), projectIdBN.toArrayLike(Buffer, "le", 8)],
|
|
43
|
+
programId
|
|
44
|
+
);
|
|
45
|
+
return pda;
|
|
46
|
+
}
|
|
47
|
+
function getMilestonePDA(projectPda, milestoneIndex, programId) {
|
|
48
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
49
|
+
[
|
|
50
|
+
Buffer.from(SEEDS.MILESTONE),
|
|
51
|
+
projectPda.toBuffer(),
|
|
52
|
+
Buffer.from([milestoneIndex])
|
|
53
|
+
],
|
|
54
|
+
programId
|
|
55
|
+
);
|
|
56
|
+
return pda;
|
|
57
|
+
}
|
|
58
|
+
function getInvestmentPDA(projectPda, nftMint, programId) {
|
|
59
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
60
|
+
[
|
|
61
|
+
Buffer.from(SEEDS.INVESTMENT),
|
|
62
|
+
projectPda.toBuffer(),
|
|
63
|
+
nftMint.toBuffer()
|
|
64
|
+
],
|
|
65
|
+
programId
|
|
66
|
+
);
|
|
67
|
+
return pda;
|
|
68
|
+
}
|
|
69
|
+
function getVotePDA(milestonePda, voterKey, votingRound, programId) {
|
|
70
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
71
|
+
[Buffer.from(SEEDS.VOTE), milestonePda.toBuffer(), voterKey.toBuffer(), Buffer.from([votingRound])],
|
|
72
|
+
programId
|
|
73
|
+
);
|
|
74
|
+
return pda;
|
|
75
|
+
}
|
|
76
|
+
function getPivotProposalPDA(projectPda, pivotCount, programId) {
|
|
77
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
78
|
+
[
|
|
79
|
+
Buffer.from(SEEDS.PIVOT),
|
|
80
|
+
// Use PIVOT seed, not PIVOT_PROPOSAL
|
|
81
|
+
projectPda.toBuffer(),
|
|
82
|
+
Buffer.from([pivotCount])
|
|
83
|
+
// pivot_count is u8 (1 byte) on-chain
|
|
84
|
+
],
|
|
85
|
+
programId
|
|
86
|
+
);
|
|
87
|
+
return pda;
|
|
88
|
+
}
|
|
89
|
+
function getTgeEscrowPDA(projectPda, programId) {
|
|
90
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
91
|
+
[Buffer.from(SEEDS.TGE_ESCROW), projectPda.toBuffer()],
|
|
92
|
+
programId
|
|
93
|
+
);
|
|
94
|
+
return pda;
|
|
95
|
+
}
|
|
96
|
+
function getTgeEscrowVaultPDA(projectPda, programId) {
|
|
97
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
98
|
+
[Buffer.from(SEEDS.TGE_ESCROW_VAULT), projectPda.toBuffer()],
|
|
99
|
+
programId
|
|
100
|
+
);
|
|
101
|
+
return pda;
|
|
102
|
+
}
|
|
103
|
+
function getTokenVaultPDA(projectPda, programId) {
|
|
104
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
105
|
+
[Buffer.from("token_vault"), projectPda.toBuffer()],
|
|
106
|
+
programId
|
|
107
|
+
);
|
|
108
|
+
return pda;
|
|
109
|
+
}
|
|
110
|
+
function getScamReportPDA(projectPda, nftMint, programId) {
|
|
111
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
112
|
+
[
|
|
113
|
+
Buffer.from(SEEDS.SCAM_REPORT),
|
|
114
|
+
projectPda.toBuffer(),
|
|
115
|
+
nftMint.toBuffer()
|
|
116
|
+
],
|
|
117
|
+
programId
|
|
118
|
+
);
|
|
119
|
+
return pda;
|
|
120
|
+
}
|
|
121
|
+
function getAdminConfigPDA(programId) {
|
|
122
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
123
|
+
[Buffer.from(SEEDS.ADMIN_CONFIG)],
|
|
124
|
+
programId
|
|
125
|
+
);
|
|
126
|
+
return pda;
|
|
127
|
+
}
|
|
128
|
+
function getNftMintPDA(projectId, investor, investmentCount, programId) {
|
|
129
|
+
const projectIdBN = ensureBN(projectId);
|
|
130
|
+
const countBN = ensureBN(investmentCount);
|
|
131
|
+
return web3_js.PublicKey.findProgramAddressSync(
|
|
132
|
+
[
|
|
133
|
+
Buffer.from(SEEDS.NFT_MINT),
|
|
134
|
+
projectIdBN.toArrayLike(Buffer, "le", 8),
|
|
135
|
+
investor.toBuffer(),
|
|
136
|
+
countBN.toArrayLike(Buffer, "le", 8)
|
|
137
|
+
// u64 is 8 bytes LE
|
|
138
|
+
],
|
|
139
|
+
programId
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
function getProgramAuthorityPDA(programId) {
|
|
143
|
+
return web3_js.PublicKey.findProgramAddressSync(
|
|
144
|
+
[Buffer.from(SEEDS.AUTHORITY)],
|
|
145
|
+
programId
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
function getProjectPDAs(projectId, programId) {
|
|
149
|
+
const project = getProjectPDA(projectId, programId);
|
|
150
|
+
const escrow = getEscrowPDA(projectId, programId);
|
|
151
|
+
return { project, escrow };
|
|
152
|
+
}
|
|
153
|
+
function getTokenomicsPDA(projectPda, programId) {
|
|
154
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
155
|
+
[Buffer.from("tokenomics"), projectPda.toBuffer()],
|
|
156
|
+
programId
|
|
157
|
+
);
|
|
158
|
+
return pda;
|
|
159
|
+
}
|
|
160
|
+
function getTokenMintPDA(projectPda, programId) {
|
|
161
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
162
|
+
[Buffer.from("token_mint"), projectPda.toBuffer()],
|
|
163
|
+
programId
|
|
164
|
+
);
|
|
165
|
+
return pda;
|
|
166
|
+
}
|
|
167
|
+
function getVaultAuthorityPDA(projectPda, programId) {
|
|
168
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
169
|
+
[Buffer.from("vault_authority"), projectPda.toBuffer()],
|
|
170
|
+
programId
|
|
171
|
+
);
|
|
172
|
+
return pda;
|
|
173
|
+
}
|
|
174
|
+
function getInvestorVaultPDA(projectPda, programId) {
|
|
175
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
176
|
+
[Buffer.from("investor_vault"), projectPda.toBuffer()],
|
|
177
|
+
programId
|
|
178
|
+
);
|
|
179
|
+
return pda;
|
|
180
|
+
}
|
|
181
|
+
function getFounderVaultPDA(projectPda, programId) {
|
|
182
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
183
|
+
[Buffer.from("founder_vault"), projectPda.toBuffer()],
|
|
184
|
+
programId
|
|
185
|
+
);
|
|
186
|
+
return pda;
|
|
187
|
+
}
|
|
188
|
+
function getLpTokenVaultPDA(projectPda, programId) {
|
|
189
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
190
|
+
[Buffer.from("lp_token_vault"), projectPda.toBuffer()],
|
|
191
|
+
programId
|
|
192
|
+
);
|
|
193
|
+
return pda;
|
|
194
|
+
}
|
|
195
|
+
function getTreasuryVaultPDA(projectPda, programId) {
|
|
196
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
197
|
+
[Buffer.from("treasury_vault"), projectPda.toBuffer()],
|
|
198
|
+
programId
|
|
199
|
+
);
|
|
200
|
+
return pda;
|
|
201
|
+
}
|
|
202
|
+
function getLpUsdcVaultPDA(projectPda, programId) {
|
|
203
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
204
|
+
[Buffer.from("lp_usdc_vault"), projectPda.toBuffer()],
|
|
205
|
+
programId
|
|
206
|
+
);
|
|
207
|
+
return pda;
|
|
208
|
+
}
|
|
209
|
+
function getFounderVestingPDA(projectPda, programId) {
|
|
210
|
+
const [pda] = web3_js.PublicKey.findProgramAddressSync(
|
|
211
|
+
[Buffer.from("founder_vesting"), projectPda.toBuffer()],
|
|
212
|
+
programId
|
|
213
|
+
);
|
|
214
|
+
return pda;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
exports.getAdminConfigPDA = getAdminConfigPDA;
|
|
218
|
+
exports.getEscrowPDA = getEscrowPDA;
|
|
219
|
+
exports.getFounderVaultPDA = getFounderVaultPDA;
|
|
220
|
+
exports.getFounderVestingPDA = getFounderVestingPDA;
|
|
221
|
+
exports.getInvestmentPDA = getInvestmentPDA;
|
|
222
|
+
exports.getInvestorVaultPDA = getInvestorVaultPDA;
|
|
223
|
+
exports.getLpTokenVaultPDA = getLpTokenVaultPDA;
|
|
224
|
+
exports.getLpUsdcVaultPDA = getLpUsdcVaultPDA;
|
|
225
|
+
exports.getMilestonePDA = getMilestonePDA;
|
|
226
|
+
exports.getNftMintPDA = getNftMintPDA;
|
|
227
|
+
exports.getPivotProposalPDA = getPivotProposalPDA;
|
|
228
|
+
exports.getProgramAuthorityPDA = getProgramAuthorityPDA;
|
|
229
|
+
exports.getProjectPDA = getProjectPDA;
|
|
230
|
+
exports.getProjectPDAs = getProjectPDAs;
|
|
231
|
+
exports.getScamReportPDA = getScamReportPDA;
|
|
232
|
+
exports.getTgeEscrowPDA = getTgeEscrowPDA;
|
|
233
|
+
exports.getTgeEscrowVaultPDA = getTgeEscrowVaultPDA;
|
|
234
|
+
exports.getTokenMintPDA = getTokenMintPDA;
|
|
235
|
+
exports.getTokenVaultPDA = getTokenVaultPDA;
|
|
236
|
+
exports.getTokenomicsPDA = getTokenomicsPDA;
|
|
237
|
+
exports.getTreasuryVaultPDA = getTreasuryVaultPDA;
|
|
238
|
+
exports.getVaultAuthorityPDA = getVaultAuthorityPDA;
|
|
239
|
+
exports.getVotePDA = getVotePDA;
|
|
240
|
+
//# sourceMappingURL=index.cjs.map
|
|
241
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/constants/index.ts","../../src/pdas/index.ts"],"names":["BN","PublicKey"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Raise Constants\n *\n * Mirrors the on-chain program constants for client-side validation\n * and display purposes.\n */\n\n// =============================================================================\n// PDA Seeds\n// =============================================================================\n\nexport const SEEDS = {\n PROJECT: 'project',\n MILESTONE: 'milestone',\n INVESTMENT: 'investment',\n VOTE: 'vote',\n ESCROW: 'escrow',\n PIVOT: 'pivot',\n PIVOT_PROPOSAL: 'pivot_proposal',\n TGE_ESCROW: 'tge_escrow',\n TGE_ESCROW_VAULT: 'tge_escrow_vault',\n SCAM_REPORT: 'scam_report',\n ADMIN_CONFIG: 'admin-config',\n NFT_MINT: 'nft_mint',\n AUTHORITY: 'authority',\n} as const;\n\n// =============================================================================\n// Validation Constants\n// =============================================================================\n\nexport const VALIDATION = {\n /** Minimum number of milestones per project */\n MIN_MILESTONES: 2,\n /** Maximum number of milestones per project */\n MAX_MILESTONES: 10,\n /** Milestone percentages must sum to this value */\n MILESTONE_PERCENTAGE_SUM: 100,\n /** Maximum funding buffer (110% of goal) */\n MAX_FUNDING_BUFFER_PERCENT: 110,\n /** Maximum metadata URI length */\n MAX_METADATA_URI_LENGTH: 200,\n /** Maximum pivot description length */\n MAX_PIVOT_DESCRIPTION_LEN: 256,\n /** Maximum pivot vision length */\n MAX_PIVOT_VISION_LEN: 512,\n /** Maximum pivot justification length */\n MAX_PIVOT_JUSTIFICATION_LEN: 512,\n} as const;\n\n// =============================================================================\n// Timing Constants (in seconds)\n// =============================================================================\n\nexport const TIMING = {\n /** Production voting period (14 days) */\n VOTING_PERIOD_SECONDS: 1_209_600,\n /** Production hold period (7 days) */\n HOLD_PERIOD_SECONDS: 604_800,\n /** Inactivity timeout (90 days) */\n INACTIVITY_TIMEOUT_SECONDS: 7_776_000,\n /** Abandonment timeout (90 days) */\n ABANDONMENT_TIMEOUT_SECONDS: 7_776_000,\n /** Refund window (14 days) */\n REFUND_WINDOW_SECONDS: 1_209_600,\n /** Pivot withdrawal window (7 days) */\n PIVOT_WITHDRAWAL_WINDOW_SECONDS: 604_800,\n /** Minimum TGE date (15 days from now) */\n TGE_MIN_DAYS: 1_296_000,\n /** Maximum TGE date (90 days from now) */\n TGE_MAX_DAYS: 7_776_000,\n /** Post-TGE holdback period (30 days) */\n POST_TGE_HOLDBACK_DAYS: 2_592_000,\n} as const;\n\n// =============================================================================\n// Tier Configuration Constraints\n// =============================================================================\n\nexport const TIER_CONSTRAINTS = {\n /** Minimum number of tiers */\n MIN_TIERS: 1,\n /** Maximum number of tiers */\n MAX_TIERS: 10,\n /** Minimum tier amount (10 USDC in lamports) */\n MIN_TIER_AMOUNT: 10_000_000n,\n /** Minimum max_lots per tier */\n MIN_TIER_MAX_LOTS: 1,\n /** Minimum token ratio */\n MIN_TIER_TOKEN_RATIO: 1n,\n /** Minimum vote multiplier (100 = 1.0x) */\n MIN_TIER_VOTE_MULTIPLIER: 100,\n} as const;\n\n// =============================================================================\n// Investment Tiers (Legacy - kept for backwards compatibility)\n// =============================================================================\n\nexport enum InvestmentTier {\n Bronze = 'Bronze',\n Silver = 'Silver',\n Gold = 'Gold',\n Platinum = 'Platinum',\n Diamond = 'Diamond',\n}\n\n/** Investment tier minimum amounts in USDC lamports (6 decimals) - LEGACY */\nexport const TIER_MINIMUMS = {\n [InvestmentTier.Bronze]: 100_000_000n, // 100 USDC\n [InvestmentTier.Silver]: 500_000_000n, // 500 USDC\n [InvestmentTier.Gold]: 1_000_000_000n, // 1,000 USDC\n [InvestmentTier.Platinum]: 5_000_000_000n, // 5,000 USDC\n [InvestmentTier.Diamond]: 10_000_000_000n, // 10,000 USDC\n} as const;\n\n/** Vote weight multipliers (scaled by 100) - LEGACY */\nexport const TIER_VOTE_MULTIPLIERS = {\n [InvestmentTier.Bronze]: 100, // 1.0x\n [InvestmentTier.Silver]: 120, // 1.2x\n [InvestmentTier.Gold]: 150, // 1.5x\n [InvestmentTier.Platinum]: 200, // 2.0x\n [InvestmentTier.Diamond]: 300, // 3.0x\n} as const;\n\n/** Token allocation multipliers (same as vote multipliers) - LEGACY */\nexport const TIER_TOKEN_MULTIPLIERS = {\n [InvestmentTier.Bronze]: 100,\n [InvestmentTier.Silver]: 120,\n [InvestmentTier.Gold]: 150,\n [InvestmentTier.Platinum]: 200,\n [InvestmentTier.Diamond]: 300,\n} as const;\n\n/** Get tier from investment amount (in lamports) - LEGACY, use project.tiers instead */\nexport function getTierFromAmount(amount: bigint): InvestmentTier {\n if (amount >= TIER_MINIMUMS[InvestmentTier.Diamond]) return InvestmentTier.Diamond;\n if (amount >= TIER_MINIMUMS[InvestmentTier.Platinum]) return InvestmentTier.Platinum;\n if (amount >= TIER_MINIMUMS[InvestmentTier.Gold]) return InvestmentTier.Gold;\n if (amount >= TIER_MINIMUMS[InvestmentTier.Silver]) return InvestmentTier.Silver;\n return InvestmentTier.Bronze;\n}\n\n/** Get vote multiplier for an investment amount - LEGACY */\nexport function getVoteMultiplier(amount: bigint): number {\n const tier = getTierFromAmount(amount);\n return TIER_VOTE_MULTIPLIERS[tier] / 100;\n}\n\n/** Get token multiplier for an investment amount - LEGACY */\nexport function getTokenMultiplier(amount: bigint): number {\n const tier = getTierFromAmount(amount);\n return TIER_TOKEN_MULTIPLIERS[tier] / 100;\n}\n\n/**\n * Find matching tier index for an investment amount (threshold-based)\n * Returns the highest tier where amount >= tier.amount\n */\nexport function findTierIndex(tiers: Array<{ amount: bigint }>, amount: bigint): number | null {\n for (let i = tiers.length - 1; i >= 0; i--) {\n if (amount >= tiers[i].amount) {\n return i;\n }\n }\n return null;\n}\n\n// =============================================================================\n// Voting and Governance\n// =============================================================================\n\nexport const GOVERNANCE = {\n /** Scam report threshold (30%) */\n SCAM_THRESHOLD_PERCENT: 30,\n /** Consecutive milestone failures before exit window eligible */\n CONSECUTIVE_FAILURES_THRESHOLD: 3,\n /** Milestone approval threshold (>50% weighted approval per whitepaper voting.md:100-101) */\n MILESTONE_APPROVAL_THRESHOLD_PERCENT: 50,\n} as const;\n\n// =============================================================================\n// NFT Constants\n// =============================================================================\n\nexport const NFT = {\n /** NFT symbol */\n SYMBOL: 'SNI',\n /** NFT name prefix */\n NAME_PREFIX: 'Raise Investment #',\n /** Royalty basis points (2%) */\n ROYALTY_BASIS_POINTS: 200,\n} as const;\n\n// =============================================================================\n// USDC Constants\n// =============================================================================\n\nexport const USDC = {\n /** USDC decimals */\n DECIMALS: 6,\n /** Convert USDC to lamports */\n toAmount: (usdc: number): bigint => BigInt(Math.floor(usdc * 10 ** 6)),\n /** Convert lamports to USDC */\n fromAmount: (lamports: bigint): number => Number(lamports) / 10 ** 6,\n} as const;\n","/**\n * Raise PDA Derivation Helpers\n *\n * All PDA derivation functions for the Raise program.\n * PDAs are deterministic addresses derived from seeds and program ID.\n */\n\nimport { PublicKey } from '@solana/web3.js';\nimport { BN } from '@coral-xyz/anchor';\nimport { SEEDS } from '../constants/index.js';\n\n/**\n * Ensure value is a proper BN instance\n * This handles cases where BN objects lose their prototype chain\n * (e.g., when passing through React state or JSON serialization)\n *\n * Uses duck typing instead of instanceof to handle different BN module instances\n */\nfunction ensureBN(value: BN | number | string | { toString(): string }): BN {\n // Duck typing: if it has toArrayLike, it's BN-like and we can use it\n if (value && typeof (value as BN).toArrayLike === 'function') {\n return value as BN;\n }\n // Always create a fresh BN from the SDK's imported BN class\n return new BN(String(value));\n}\n\n/**\n * Derive Project PDA from project ID\n *\n * @param projectId - Unique project identifier\n * @param programId - Raise program ID\n * @returns Project account PDA\n */\nexport function getProjectPDA(projectId: BN | number | string, programId: PublicKey): PublicKey {\n const projectIdBN = ensureBN(projectId);\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.PROJECT), projectIdBN.toArrayLike(Buffer, 'le', 8)],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Escrow PDA from project ID\n *\n * @param projectId - Project identifier\n * @param programId - Raise program ID\n * @returns Escrow account PDA\n */\nexport function getEscrowPDA(projectId: BN | number | string, programId: PublicKey): PublicKey {\n const projectIdBN = ensureBN(projectId);\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.ESCROW), projectIdBN.toArrayLike(Buffer, 'le', 8)],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Milestone PDA from project PDA and milestone index\n *\n * @param projectPda - Project account PDA\n * @param milestoneIndex - Milestone index (0-based)\n * @param programId - Raise program ID\n * @returns Milestone account PDA\n */\nexport function getMilestonePDA(\n projectPda: PublicKey,\n milestoneIndex: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.MILESTONE),\n projectPda.toBuffer(),\n Buffer.from([milestoneIndex]),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Investment PDA from project PDA and NFT mint\n *\n * @param projectPda - Project account PDA\n * @param nftMint - Investment NFT mint address\n * @param programId - Raise program ID\n * @returns Investment account PDA\n */\nexport function getInvestmentPDA(\n projectPda: PublicKey,\n nftMint: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.INVESTMENT),\n projectPda.toBuffer(),\n nftMint.toBuffer(),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Vote PDA from milestone PDA, voter key, and voting round\n *\n * @param milestonePda - Milestone account PDA\n * @param voterKey - Voter's public key\n * @param votingRound - Current voting round (0 initially, incremented on resubmit)\n * @param programId - Raise program ID\n * @returns Vote account PDA\n */\nexport function getVotePDA(\n milestonePda: PublicKey,\n voterKey: PublicKey,\n votingRound: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.VOTE), milestonePda.toBuffer(), voterKey.toBuffer(), Buffer.from([votingRound])],\n programId\n );\n return pda;\n}\n\n/**\n * Derive PivotProposal PDA from project PDA and pivot count\n *\n * @param projectPda - Project account PDA\n * @param pivotCount - Current pivot count from project account\n * @param programId - Raise program ID\n * @returns PivotProposal account PDA\n */\nexport function getPivotProposalPDA(\n projectPda: PublicKey,\n pivotCount: number,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.PIVOT), // Use PIVOT seed, not PIVOT_PROPOSAL\n projectPda.toBuffer(),\n Buffer.from([pivotCount]), // pivot_count is u8 (1 byte) on-chain\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive TgeEscrow PDA from project PDA\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns TgeEscrow account PDA\n */\nexport function getTgeEscrowPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.TGE_ESCROW), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive TgeEscrowVault PDA from project PDA\n * Used for holding 10% USDC holdback from final milestone\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns TgeEscrowVault PDA\n */\nexport function getTgeEscrowVaultPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.TGE_ESCROW_VAULT), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive TokenVault PDA from project PDA\n * Used for holding project tokens for investor distribution\n *\n * @param projectPda - Project account PDA\n * @param programId - Raise program ID\n * @returns TokenVault PDA\n */\nexport function getTokenVaultPDA(\n projectPda: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('token_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive ScamReport PDA from project PDA and NFT mint\n *\n * @param projectPda - Project account PDA\n * @param nftMint - Reporter's NFT mint address\n * @param programId - Raise program ID\n * @returns ScamReport account PDA\n */\nexport function getScamReportPDA(\n projectPda: PublicKey,\n nftMint: PublicKey,\n programId: PublicKey\n): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.SCAM_REPORT),\n projectPda.toBuffer(),\n nftMint.toBuffer(),\n ],\n programId\n );\n return pda;\n}\n\n/**\n * Derive AdminConfig PDA (global admin authority)\n *\n * @param programId - Raise program ID\n * @returns AdminConfig account PDA\n */\nexport function getAdminConfigPDA(programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.ADMIN_CONFIG)],\n programId\n );\n return pda;\n}\n\n/**\n * Derive NFT Mint PDA\n *\n * @param projectId - Project identifier\n * @param investor - Investor's public key\n * @param investmentCount - Investment count (u64 in Rust, 8 bytes LE)\n * @param programId - Raise program ID\n * @returns NFT Mint PDA and bump\n */\nexport function getNftMintPDA(\n projectId: BN | number | string,\n investor: PublicKey,\n investmentCount: BN | number,\n programId: PublicKey\n): [PublicKey, number] {\n // Ensure both values are proper BN instances (handles prototype chain issues)\n const projectIdBN = ensureBN(projectId);\n const countBN = ensureBN(investmentCount);\n return PublicKey.findProgramAddressSync(\n [\n Buffer.from(SEEDS.NFT_MINT),\n projectIdBN.toArrayLike(Buffer, 'le', 8),\n investor.toBuffer(),\n countBN.toArrayLike(Buffer, 'le', 8), // u64 is 8 bytes LE\n ],\n programId\n );\n}\n\n/**\n * Derive Program Authority PDA\n *\n * @param programId - Raise program ID\n * @returns Program authority PDA and bump\n */\nexport function getProgramAuthorityPDA(programId: PublicKey): [PublicKey, number] {\n return PublicKey.findProgramAddressSync(\n [Buffer.from(SEEDS.AUTHORITY)],\n programId\n );\n}\n\n/**\n * Helper to derive all PDAs for a project\n *\n * @param projectId - Project identifier\n * @param programId - Raise program ID\n * @returns Object with project and escrow PDAs\n */\nexport function getProjectPDAs(projectId: BN, programId: PublicKey) {\n const project = getProjectPDA(projectId, programId);\n const escrow = getEscrowPDA(projectId, programId);\n return { project, escrow };\n}\n\n// =============================================================================\n// ZTM v2.0 PDAs\n// =============================================================================\n\n/**\n * Derive Tokenomics PDA from project PDA\n */\nexport function getTokenomicsPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('tokenomics'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Token Mint PDA from project PDA\n */\nexport function getTokenMintPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('token_mint'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Vault Authority PDA from project PDA\n */\nexport function getVaultAuthorityPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('vault_authority'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Investor Vault PDA from project PDA\n */\nexport function getInvestorVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('investor_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Founder Vault PDA from project PDA\n */\nexport function getFounderVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('founder_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive LP Token Vault PDA from project PDA\n */\nexport function getLpTokenVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('lp_token_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Treasury Vault PDA from project PDA\n */\nexport function getTreasuryVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('treasury_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive LP USDC Vault PDA from project PDA\n */\nexport function getLpUsdcVaultPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('lp_usdc_vault'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n\n/**\n * Derive Founder Vesting PDA from project PDA\n */\nexport function getFounderVestingPDA(projectPda: PublicKey, programId: PublicKey): PublicKey {\n const [pda] = PublicKey.findProgramAddressSync(\n [Buffer.from('founder_vesting'), projectPda.toBuffer()],\n programId\n );\n return pda;\n}\n"]}
|