-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.ts
275 lines (212 loc) · 9.7 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
import { VersionedTransaction, Keypair, SystemProgram, Transaction, Connection, ComputeBudgetProgram, TransactionInstruction, TransactionMessage, LAMPORTS_PER_SOL, sendAndConfirmTransaction } from "@solana/web3.js"
import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet";
import { AnchorProvider } from "@coral-xyz/anchor";
import { openAsBlob } from "fs";
import base58 from "bs58"
import { DESCRIPTION, FILE, PRIVATE_KEY, RPC_ENDPOINT, RPC_WEBSOCKET_ENDPOINT, TELEGRAM, TOKEN_CREATE_ON, TOKEN_NAME, TOKEN_SHOW_NAME, TOKEN_SYMBOL, TWITTER, WEBSITE, SWAP_AMOUNT } from "./constants"
import { readJson, saveDataToFile, sleep } from "./utils"
import { PumpFunSDK } from "./src/pumpfun";
import { jitoWithAxios } from "./src/jitoWithAxios";
const commitment = "confirmed"
const connection = new Connection(RPC_ENDPOINT, {
wsEndpoint: RPC_WEBSOCKET_ENDPOINT, commitment
})
const mainKp = Keypair.fromSecretKey(base58.decode(PRIVATE_KEY))
const versionedTxs: VersionedTransaction[] = []
const mintKp = Keypair.generate()
const mintAddress = mintKp.publicKey
let sdk = new PumpFunSDK(new AnchorProvider(connection, new NodeWallet(new Keypair()), { commitment }));
const mode = "JITO_MODE"
const main = async () => {
console.log("======================= Bot start ========================")
try {
console.log("======================== Token Create =========================")
console.log(await connection.getBalance(mainKp.publicKey) / 10 ** 9, "SOL in main keypair")
saveDataToFile([base58.encode(mintKp.secretKey)], "mint.json")
let tokenCreationIxs = await createTokenTx()
if (!tokenCreationIxs) {
console.log("creation instruction not retrieved")
return
}
const ixs: TransactionInstruction[] = [
ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 70_000 }),
ComputeBudgetProgram.setComputeUnitLimit({ units: 150_000 })
]
ixs.push(
tokenCreationIxs,
),
console.log(`Token contract link: https://solscan.io/token/${mintAddress}`)
const tokenCreateRecentBlockhash = (await connection.getLatestBlockhash().catch(async () => {
return await connection.getLatestBlockhash().catch(getLatestBlockhashError => {
console.log({ getLatestBlockhashError })
return null
})
}))?.blockhash;
if (!tokenCreateRecentBlockhash) return { Err: "Failed to prepare transaction" }
const tokenCreateTransaction = new VersionedTransaction(
new TransactionMessage({
payerKey: mainKp.publicKey,
recentBlockhash: tokenCreateRecentBlockhash,
instructions: ixs,
}).compileToV0Message()
);
tokenCreateTransaction.sign([mainKp, mintKp])
console.log(await connection.simulateTransaction(tokenCreateTransaction, { sigVerify: true }))
versionedTxs.push(tokenCreateTransaction)
} catch (error) {
console.log("Token mint error");
}
for (let i = 0; i < 3; i++) {
const buyerKp = Keypair.generate();
saveDataToFile([base58.encode(buyerKp.secretKey)], "data2.json")
console.log("buyer=============>", base58.encode(buyerKp.secretKey));
try {
console.log("============================= Buyer airdrop start ==========================");
const mainKpBalance = (await connection.getBalance(mainKp.publicKey)) / LAMPORTS_PER_SOL;
console.log("mainKp Balance:", mainKpBalance);
const ixs: TransactionInstruction[] = [
ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 7_000 }),
ComputeBudgetProgram.setComputeUnitLimit({ units: 15_000 })
]
// const solAmountLamports = solAmount!.raw.toNumber(); // Convert to lamports
// console.log(solAmount!.raw.toString())
const solAmountLamports = 0.005 * 10 ** 9; // Convert to lamports
console.log("airdrop amount", solAmountLamports)
ixs.push(
SystemProgram.transfer({
fromPubkey: mainKp.publicKey, // Sender's public key
toPubkey: buyerKp.publicKey, // Buyer's public key
lamports: (solAmountLamports + 0.002 * 10 ** 9),
}))
const airdropRecentBlockhash = (await connection.getLatestBlockhash().catch(async () => {
return await connection.getLatestBlockhash().catch(getLatestBlockhashError => {
console.log({ getLatestBlockhashError })
return null
})
}))?.blockhash;
if (!airdropRecentBlockhash) return { Err: "Failed to prepare transaction" }
const solAirdropTransaction = new VersionedTransaction(
new TransactionMessage({
payerKey: mainKp.publicKey,
recentBlockhash: airdropRecentBlockhash,
instructions: ixs,
}).compileToV0Message()
);
solAirdropTransaction.sign([mainKp])
console.log(await connection.simulateTransaction(solAirdropTransaction, { sigVerify: true }))
versionedTxs.push(solAirdropTransaction)
} catch (error) {
console.log("==================== Aridrop failed =====================")
}
try {
console.log("============= Buyer buy token =================")
// token account rent is 0.00203SOL
console.log("Buyer keypair :", buyerKp.publicKey.toBase58());
const buyerBalance = (await connection.getBalance(buyerKp.publicKey)) / LAMPORTS_PER_SOL
console.log("buyer keypair balance : ", buyerBalance)
const tokenBuyix = await makeBuyIx(buyerKp, Math.floor(SWAP_AMOUNT * 10 ** 9))
if (!tokenBuyix) {
console.log("Token buy instruction not retrieved")
return
}
const ixs: TransactionInstruction[] = [
ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 70_000 }),
ComputeBudgetProgram.setComputeUnitLimit({ units: 150_000 })
]
ixs.push(...tokenBuyix);
const buyRecentBlockhash = (await connection.getLatestBlockhash().catch(async () => {
return await connection.getLatestBlockhash().catch(getLatestBlockhashError => {
console.log({ getLatestBlockhashError })
return null
})
}))?.blockhash;
if (!buyRecentBlockhash) return { Err: "Failed to prepare transaction" }
const tokenBuyTransaction = new VersionedTransaction(
new TransactionMessage({
payerKey: buyerKp.publicKey,
recentBlockhash: buyRecentBlockhash,
instructions: ixs,
}).compileToV0Message()
);
tokenBuyTransaction.sign([buyerKp])
console.log(await connection.simulateTransaction(tokenBuyTransaction, { sigVerify: true }))
versionedTxs.push(tokenBuyTransaction)
} catch (error) {
console.log("================ Token buy fail ==============")
console.log("Error in buy ", error)
}
}
if (mode == "JITO_MODE") {
console.log("======================== create and buy ========================")
let result;
while (1) {
result = await jitoWithAxios(versionedTxs, mainKp)
if (result.confirmed) {
console.log("Bundle signature: ", result.jitoTxsignature)
break;
}
}
} else {
for (let i = 0; i < versionedTxs.length; i++) {
const latestBlockhash = await connection.getLatestBlockhash()
const sig = await connection.sendRawTransaction(versionedTxs[i].serialize())
const confirmation = await connection.confirmTransaction({
signature: sig,
lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
blockhash: latestBlockhash.blockhash,
},
"confirmed"
)
if (confirmation.value.err) {
console.log("Confrimtaion error")
} else {
console.log(`transaction: https://solscan.io/tx/${sig} `);
}
}
}
}
// create token instructions
const createTokenTx = async () => {
try {
const tokenInfo = {
name: TOKEN_NAME,
symbol: TOKEN_SYMBOL,
description: DESCRIPTION,
showName: TOKEN_SHOW_NAME,
createOn: TOKEN_CREATE_ON,
twitter: TWITTER,
telegram: TELEGRAM,
website: WEBSITE,
file: await openAsBlob(FILE),
};
let tokenMetadata = await sdk.createTokenMetadata(tokenInfo);
if (tokenMetadata.metadataUri) {
let createIx = await sdk.getCreateInstructions(
mainKp.publicKey,
tokenInfo.name,
tokenInfo.symbol,
tokenMetadata.metadataUri,
mintKp
);
return createIx;
} else {
console.log("================ TokenMEtadata error ===============")
return
}
} catch (error) {
console.error(error)
}
}
// make buy instructions
const makeBuyIx = async (kp: Keypair, buyAmount: number) => {
let buyIx = await sdk.getBuyInstructionsBySolAmount(
kp.publicKey,
mintAddress,
BigInt(buyAmount),
BigInt(10000000),
commitment
);
console.log("Buyamount:", buyAmount);
return buyIx
}
main()