From 56d7d7f47b6bc13d2362576396a22bd45b09c69b Mon Sep 17 00:00:00 2001 From: Kollan House Date: Thu, 12 Mar 2026 11:29:39 -0600 Subject: [PATCH 1/2] init commit for P2P launch --- scripts/assets/P2P/P2P.json | 6 ++ scripts/assets/P2P/P2P.png | Bin 0 -> 3387 bytes scripts/v0.7/launchP2P.ts | 115 ++++++++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 scripts/assets/P2P/P2P.json create mode 100644 scripts/assets/P2P/P2P.png create mode 100644 scripts/v0.7/launchP2P.ts diff --git a/scripts/assets/P2P/P2P.json b/scripts/assets/P2P/P2P.json new file mode 100644 index 000000000..c0448b005 --- /dev/null +++ b/scripts/assets/P2P/P2P.json @@ -0,0 +1,6 @@ +{ + "name": "P2P Protocol", + "symbol": "P2P", + "description": "Futarchy Ownership, Protocol Governance and Trust Staking token of the P2P Protocol", + "image": "https://raw.githubusercontent.com/metaDAOproject/programs/refs/heads/develop/scripts/assets/P2P/P2P.png" +} \ No newline at end of file diff --git a/scripts/assets/P2P/P2P.png b/scripts/assets/P2P/P2P.png new file mode 100644 index 0000000000000000000000000000000000000000..257f8773918251129b3ee2af5ef61dbf5352621c GIT binary patch literal 3387 zcmZ`)cQhQz8sD`+^d)+%C_zMBBnYBJC##oSy~e7`s;fkgLdy00`3pLAs}*c@@rs(Biw9m^mSZc00ayNT^HALv$yf41CW!+FGC3jd*CrQF$}X~ zl%|Z92-~YK_cm^e-V*!gh}25_ZH~9003lM+ZLiBp!DxuV-KqiK**6wmcIMfz6N~{C z@42$klTy%EaG3BAV-|Yxv)C%!1A=FoiKE7**IbhNOELokt83|M56$K6=k|_wj)T}#eJZ*;_rn2S60za0xACiHWGVANk zJ6tk6d`QKStTl6vTvw-X5KUZqXd%yU`|h%pd~RXdEHmZolD43C*a1GXD3J$Es&3orp8TfUNv(BrNT2ry8>2`LClM^S(t$&l6y#o=>EnB?l{M9uF5L zBWuehhAx7>ce@Brn}uC$b`o9|>uK!_)no_q;a{xGDxya;m=r@G0VMt1mfxQmyr@#} zgPN>jwaZJb6LvBABYP}sqqA8#FHfIfCl!U~a*FUTpux$*4y zueaqlygzOnR!+Q>Q`O_FJ6&iboVoOot}V(2k}4^#6{{{;6_{rmly2gHmP9F9feoG) zdkkFB?ul%Nuos=L1@Ok1Z4`k~j`Uv|qf;%>N?DjyjU!>-JBH_DQT?MUFlkq$@d($l z&haFP!`J)+plAY6e@G4I75r9$ZRJwg*TWps0TuIH@5}^v;(8zK&rr9;!N2_8)pu&{Gpl8wCleLYc+@i7X~(_9-aSOjO=tt|X7nrwS#qmg6mH1>fj>)`Zc@9daNg z{DSowlDUkd1j|_E`vxH_HT5#<)78-`uetc?hnA0Z zRm)XNt2L)({3&}&`tP0HC4BzNp}vssu|AWE5?yqn8Cxm#mC2ACejk;@7{fGwcGfE) zA?tcL73!LbjMoo=T}%k3gMS|y+0AX1)23%!h(T|U&R+qH>~uezGTx^}PF#HQwC0;;GKVTlYIwhM6gDT~3f>KoV<7ix&ZAj@ zRb9}gHdLy2FnM&L+i!mg~PpAMNtIna$u~ zl4>b@YE+{I{Jkid$}Id33TZkc1&G>S`kUBO1v1D-8bO6x6B=faLJPwtrm1clx7v;4 z;(1qBE5P&X=;x_Q+~hbJ&~`T+9tjT#OowGgy+Y4vX_@Sfes!AX-46m?#FpI{y=O9PY17^{_&K);JP}Wx;+d1w#_dh^sqY?;xRtAeR;Z=Uq z@(HgZOn16lm-^57ATm)Jw0-x6bKZ=lp5#<-ttBt?ba@U~IhuNnO9BtL=t|-$ES43& z*?+?G59YL%**#6=e>Jwgoxe)xc zxj27YSLev#wg7vZ-i&}R&JYQjaeR)o@(p>kfR${SnKLt;2vj?1s>PJs3mF`(UxZZ} zFR*e{cyhFOjjLY7w7+W-J&JBiqG4TfjobdUkldO)1%QulRXm!X(^~SI{j2Bui95BJ z4T02e)f9{77vqM+fmpI*o3Lw-vy2=+x*XP3*bxFq%ob{XHNIexPY6l>v5fs8gg1>i zd6)saA0xYKct~eeVi_7#S8q#{0Zi`kZ7u zH^5iUW+tHfxv;3IgYq_;Mblw@@5S|$7-Yc*tVy6{`}$V(zTJb*qIDFj80<=b@-sV> zC#qiG&Th*1@sHp#gn27Co4mYu0f&NlfH8|Z{SY=<5p07z(TKZzQAT?u1d@9w6v zs-h2S$V!YuhV4$(J>*m6yIl))_<9IxQze~ItXXC`q>9@dx_~ow)DJE#YCjtfzW)Bn ztwg_!GF%)dX}--;l((8&s(KbDbX4>D>D^$4<8Fq zfwoMO;IB}PRfAB=$$aNZtCif+N=BzwQ1c((Mhv~U>;?8~RH|l(Y^?d9M9PQ5Whv_E zIMT5xdqH`lP^A(bqW-`cqj1;UHDRPi)6Dv%93R;5i3NocnoKt@`@KiOPpf&SNxHxC zx5Qp@z^UazC$-dve*fB$T81@F@c^yL^tT5?kLLqen%bxxPA(J?k8~4#DlXvwsgS!I zT15Zz=6)WwW-lW?n^03=M^mA?hJOX8&QE)g*4hRnlE&Lqw?eE0ueCh1ucar zZ`TF+ozvDmRW9niCq)y|ug8n=kMh>jiQZMT@%G?xxq-H`~CzVNPb%4{K^;}LNQavzecSfKSct8VvRo8YXv~4!epb zNs@jIt=U zYUi+p`<3$A@Op3l=cf_; z8o$L$-Uz&FDX?gt*dCsjbklZp*iEC}igV~Q zy^sLPb3aS9y7|L=qgYLxli({o2Mu&TpDyKnFU>DGqGXMPY{uQ(a!|Zrj|_;HDNlhu zPgbi|T`!v9j9zX{q#(>!G0$2~t5cnOk5y7Ud)TVqpxPMA928k}<)f6;Kt2>@B4Xyd YxDts8)McGi#MQ7$+>_sVN;DAqAMGka6951J literal 0 HcmV?d00001 diff --git a/scripts/v0.7/launchP2P.ts b/scripts/v0.7/launchP2P.ts new file mode 100644 index 000000000..5d68160ac --- /dev/null +++ b/scripts/v0.7/launchP2P.ts @@ -0,0 +1,115 @@ +import * as anchor from "@coral-xyz/anchor"; +import { + LaunchpadClient, + getLaunchAddr, + getLaunchSignerAddr, +} from "@metadaoproject/futarchy/v0.7"; +import { PublicKey, SystemProgram, Transaction } from "@solana/web3.js"; +import BN from "bn.js"; +import * as token from "@solana/spl-token"; + +const provider = anchor.AnchorProvider.env(); +const payer = provider.wallet["payer"]; + +const LAUNCH_AUTHORITY = payer.publicKey; + +const TEAM_ADDRESS = new PublicKey( + "63miwxnMci7L76tWBGFfmHjbm199MKiteiWrNY1ShQhV", +); // P2P team address + +// Launch details +const MIN_GOAL = 6_000_000; // 6M USDC + +const SPENDING_MEMBERS = [ + new PublicKey("G4vHnTW7PSgTtHAYwmrBvUydWGmz8Bd2px9XYAsBQWgu"), + new PublicKey("6fwrmfLPCQJmF47LdoLTBBojtw8Qbq2wicRyDpzsQjBk"), + new PublicKey("CTDAar2UbkpVq21u8RRvzWT3rtjvoeV2PFZp7PdiMZWg"), +]; +const SPENDING_LIMIT = 175_000; // 175k USDC + +const PERFORMANCE_PACKAGE_GRANTEE = TEAM_ADDRESS; +const PERFORMANCE_PACKAGE_TOKEN_AMOUNT = 7_740_000; // 7.74M P2P +const PERFORMANCE_PACKAGE_UNLOCK_MONTHS = 12; // 12 months + +// Additional carveout details +const ADDITIONAL_CARVEOUT = 5_160_000; // 5.16M P2P +const ADDITIONAL_CARVEOUT_RECIPIENT = new PublicKey( + "BzZhwMzoY5ikk9mWBejb3dKbYXCYZ6eJhijk71WfvTYt", +); // MetaDAO P2P Launch Custody Multisig + +const TOKEN_SEED = "ltSNHJR5jLfmx0Zs"; +const TOKEN_NAME = "P2P Protocol"; +const TOKEN_SYMBOL = "P2P"; +const TOKEN_URI = + "https://raw.githubusercontent.com/metaDAOproject/programs/refs/heads/develop/scripts/assets/P2P/P2P.json"; + +const secondsPerDay = 86_400; +const numberOfDays = 4; +const launchDurationSeconds = secondsPerDay * numberOfDays; // 4 days + +const launchpad: LaunchpadClient = LaunchpadClient.createClient({ provider }); + +export const launch = async () => { + const lamports = await provider.connection.getMinimumBalanceForRentExemption( + token.MINT_SIZE, + ); + + const TOKEN = await PublicKey.createWithSeed( + payer.publicKey, + TOKEN_SEED, + token.TOKEN_PROGRAM_ID, + ); + console.log("Token address:", TOKEN.toBase58()); + + const [launch] = getLaunchAddr(undefined, TOKEN); + const [launchSigner] = getLaunchSignerAddr(undefined, launch); + + const tx = new Transaction().add( + SystemProgram.createAccountWithSeed({ + fromPubkey: payer.publicKey, + newAccountPubkey: TOKEN, + basePubkey: payer.publicKey, + seed: TOKEN_SEED, + lamports: lamports, + space: token.MINT_SIZE, + programId: token.TOKEN_PROGRAM_ID, + }), + token.createInitializeMint2Instruction(TOKEN, 6, launchSigner, null), + ); + tx.recentBlockhash = ( + await provider.connection.getLatestBlockhash() + ).blockhash; + tx.feePayer = payer.publicKey; + tx.sign(payer); + + const txHash = await provider.connection.sendRawTransaction(tx.serialize()); + await provider.connection.confirmTransaction(txHash, "confirmed"); + + const launchIx = await launchpad + .initializeLaunchIx({ + tokenName: TOKEN_NAME, + tokenSymbol: TOKEN_SYMBOL, + tokenUri: TOKEN_URI, + minimumRaiseAmount: new BN(MIN_GOAL * 10 ** 6), + baseMint: TOKEN, + monthlySpendingLimitAmount: new BN(SPENDING_LIMIT * 10 ** 6), + monthlySpendingLimitMembers: SPENDING_MEMBERS, + performancePackageGrantee: PERFORMANCE_PACKAGE_GRANTEE, + performancePackageTokenAmount: new BN( + PERFORMANCE_PACKAGE_TOKEN_AMOUNT * 10 ** 6, + ), + monthsUntilInsidersCanUnlock: PERFORMANCE_PACKAGE_UNLOCK_MONTHS, + secondsForLaunch: launchDurationSeconds, + teamAddress: TEAM_ADDRESS, + additionalTokensAmount: ADDITIONAL_CARVEOUT + ? new BN(ADDITIONAL_CARVEOUT * 10 ** 6) + : undefined, + additionalTokensRecipient: ADDITIONAL_CARVEOUT_RECIPIENT, + launchAuthority: LAUNCH_AUTHORITY, + }) + .rpc(); + + console.log("Launch initialized, P2P for you and for me!", launchIx); +}; + +launch().catch(console.error); From 5033e531b36824beae6c37fb2febb800a2e44434 Mon Sep 17 00:00:00 2001 From: Kollan House Date: Thu, 12 Mar 2026 11:57:23 -0600 Subject: [PATCH 2/2] updated for sim and atomic transaction --- scripts/v0.7/launchP2P.ts | 87 +++++++++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 22 deletions(-) diff --git a/scripts/v0.7/launchP2P.ts b/scripts/v0.7/launchP2P.ts index 5d68160ac..5713e5021 100644 --- a/scripts/v0.7/launchP2P.ts +++ b/scripts/v0.7/launchP2P.ts @@ -4,7 +4,12 @@ import { getLaunchAddr, getLaunchSignerAddr, } from "@metadaoproject/futarchy/v0.7"; -import { PublicKey, SystemProgram, Transaction } from "@solana/web3.js"; +import { + ComputeBudgetProgram, + PublicKey, + SystemProgram, + Transaction, +} from "@solana/web3.js"; import BN from "bn.js"; import * as token from "@solana/spl-token"; @@ -64,26 +69,22 @@ export const launch = async () => { const [launch] = getLaunchAddr(undefined, TOKEN); const [launchSigner] = getLaunchSignerAddr(undefined, launch); - const tx = new Transaction().add( - SystemProgram.createAccountWithSeed({ - fromPubkey: payer.publicKey, - newAccountPubkey: TOKEN, - basePubkey: payer.publicKey, - seed: TOKEN_SEED, - lamports: lamports, - space: token.MINT_SIZE, - programId: token.TOKEN_PROGRAM_ID, - }), - token.createInitializeMint2Instruction(TOKEN, 6, launchSigner, null), + const createTokenAccountIx = SystemProgram.createAccountWithSeed({ + fromPubkey: payer.publicKey, + newAccountPubkey: TOKEN, + basePubkey: payer.publicKey, + seed: TOKEN_SEED, + lamports: lamports, + space: token.MINT_SIZE, + programId: token.TOKEN_PROGRAM_ID, + }); + + const initializeMintIx = token.createInitializeMint2Instruction( + TOKEN, + 6, + launchSigner, + null, ); - tx.recentBlockhash = ( - await provider.connection.getLatestBlockhash() - ).blockhash; - tx.feePayer = payer.publicKey; - tx.sign(payer); - - const txHash = await provider.connection.sendRawTransaction(tx.serialize()); - await provider.connection.confirmTransaction(txHash, "confirmed"); const launchIx = await launchpad .initializeLaunchIx({ @@ -107,9 +108,51 @@ export const launch = async () => { additionalTokensRecipient: ADDITIONAL_CARVEOUT_RECIPIENT, launchAuthority: LAUNCH_AUTHORITY, }) - .rpc(); + .instruction(); + + const tx = new Transaction().add( + createTokenAccountIx, + initializeMintIx, + launchIx, + ); + const { blockhash } = await provider.connection.getLatestBlockhash(); + tx.recentBlockhash = blockhash; + tx.feePayer = payer.publicKey; + tx.sign(payer); + const simulation = await provider.connection.simulateTransaction(tx); + + if (simulation.value.err) { + console.error("Transaction simulation failed:", simulation.value.err); + throw new Error( + `Simulation failed: ${JSON.stringify(simulation.value.err)}`, + ); + } + + const computeUnitsUsed = simulation.value.unitsConsumed || 200_000; + // Add 20% buffer to the compute units + const computeUnitsWithBuffer = Math.floor(computeUnitsUsed * 1.2); + + console.log(`Simulated compute units: ${computeUnitsUsed}`); + console.log(`Setting compute unit limit: ${computeUnitsWithBuffer}`); + + // Rebuild transaction with compute budget + const finalTx = new Transaction().add( + ComputeBudgetProgram.setComputeUnitLimit({ units: computeUnitsWithBuffer }), + createTokenAccountIx, + initializeMintIx, + launchIx, + ); + + finalTx.recentBlockhash = blockhash; + finalTx.feePayer = payer.publicKey; + finalTx.sign(payer); + + const txHash = await provider.connection.sendRawTransaction( + finalTx.serialize(), + ); + await provider.connection.confirmTransaction(txHash, "confirmed"); - console.log("Launch initialized, P2P for you and for me!", launchIx); + console.log("Launch initialized, P2P for you and for me!", txHash); }; launch().catch(console.error);