FUCK YEAH! IT WORKS! FINALLY!
Dear Noor, Dear Ram, Please take into consideration I am Co-CEO and I am allowed to use language like this in commits messages. You should normally follow my lead, but not in this case. My advice is to not use language like this in commit messages. Yours trully, The G
This commit is contained in:
parent
118fd077b4
commit
90e9501fee
247
rewrite/Cargo.lock
generated
247
rewrite/Cargo.lock
generated
@ -1739,7 +1739,10 @@ dependencies = [
|
||||
"rand 0.8.5",
|
||||
"serde",
|
||||
"solana-client",
|
||||
"solana-program",
|
||||
"solana-sdk",
|
||||
"spl-associated-token-account 5.0.1",
|
||||
"spl-token",
|
||||
"tokio",
|
||||
"tokio-stream",
|
||||
"tonic",
|
||||
@ -3531,9 +3534,9 @@ dependencies = [
|
||||
"solana-config-program",
|
||||
"solana-sdk",
|
||||
"spl-token",
|
||||
"spl-token-2022",
|
||||
"spl-token-group-interface",
|
||||
"spl-token-metadata-interface",
|
||||
"spl-token-2022 4.0.0",
|
||||
"spl-token-group-interface 0.3.0",
|
||||
"spl-token-metadata-interface 0.4.0",
|
||||
"thiserror",
|
||||
"zstd 0.11.2+zstd.1.5.2",
|
||||
]
|
||||
@ -4137,12 +4140,12 @@ dependencies = [
|
||||
"serde_json",
|
||||
"solana-account-decoder",
|
||||
"solana-sdk",
|
||||
"spl-associated-token-account",
|
||||
"spl-associated-token-account 4.0.0",
|
||||
"spl-memo",
|
||||
"spl-token",
|
||||
"spl-token-2022",
|
||||
"spl-token-group-interface",
|
||||
"spl-token-metadata-interface",
|
||||
"spl-token-2022 4.0.0",
|
||||
"spl-token-group-interface 0.3.0",
|
||||
"spl-token-metadata-interface 0.4.0",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
@ -4220,6 +4223,35 @@ dependencies = [
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-zk-sdk"
|
||||
version = "2.0.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4e79f29e79240fd273db888ee2049c17c139f8ab485d3567bbe0bbe7ed42846f"
|
||||
dependencies = [
|
||||
"aes-gcm-siv",
|
||||
"base64 0.22.1",
|
||||
"bincode",
|
||||
"bytemuck",
|
||||
"bytemuck_derive",
|
||||
"curve25519-dalek",
|
||||
"itertools 0.12.1",
|
||||
"lazy_static",
|
||||
"merlin",
|
||||
"num-derive",
|
||||
"num-traits",
|
||||
"rand 0.7.3",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"sha3 0.9.1",
|
||||
"solana-program",
|
||||
"solana-sdk",
|
||||
"subtle",
|
||||
"thiserror",
|
||||
"zeroize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solana-zk-token-sdk"
|
||||
version = "2.0.11"
|
||||
@ -4294,10 +4326,35 @@ dependencies = [
|
||||
"num-traits",
|
||||
"solana-program",
|
||||
"spl-token",
|
||||
"spl-token-2022",
|
||||
"spl-token-2022 4.0.0",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-associated-token-account"
|
||||
version = "5.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "714b53f7312c2802c62f14bc8a07916c2c872761e3d6be97e99fd432be7799ca"
|
||||
dependencies = [
|
||||
"borsh 1.5.1",
|
||||
"num-derive",
|
||||
"num-traits",
|
||||
"solana-program",
|
||||
"spl-associated-token-account-client",
|
||||
"spl-token",
|
||||
"spl-token-2022 5.0.2",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-associated-token-account-client"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c5c1e2d53941ea7ebc4be3f86302a3c6c5178baa932bbc038468429e6900d36"
|
||||
dependencies = [
|
||||
"solana-program",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-discriminator"
|
||||
version = "0.3.0"
|
||||
@ -4356,6 +4413,20 @@ dependencies = [
|
||||
"spl-program-error",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-pod"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "00e38c99f09d58df06ca9a29fc0211786a4c34f4d099c1df27b1abaa206569a4"
|
||||
dependencies = [
|
||||
"borsh 1.5.1",
|
||||
"bytemuck",
|
||||
"bytemuck_derive",
|
||||
"solana-program",
|
||||
"solana-zk-sdk",
|
||||
"spl-program-error",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-program-error"
|
||||
version = "0.5.0"
|
||||
@ -4390,9 +4461,23 @@ dependencies = [
|
||||
"bytemuck",
|
||||
"solana-program",
|
||||
"spl-discriminator",
|
||||
"spl-pod",
|
||||
"spl-pod 0.3.1",
|
||||
"spl-program-error",
|
||||
"spl-type-length-value",
|
||||
"spl-type-length-value 0.5.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-tlv-account-resolution"
|
||||
version = "0.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "29ffc5c76926c1cbc8d92ac1d9341328308d15bae04a67da5a226e36d5bc395a"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"solana-program",
|
||||
"spl-discriminator",
|
||||
"spl-pod 0.4.0",
|
||||
"spl-program-error",
|
||||
"spl-type-length-value 0.6.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4425,12 +4510,74 @@ dependencies = [
|
||||
"solana-security-txt",
|
||||
"solana-zk-token-sdk",
|
||||
"spl-memo",
|
||||
"spl-pod",
|
||||
"spl-pod 0.3.1",
|
||||
"spl-token",
|
||||
"spl-token-group-interface",
|
||||
"spl-token-metadata-interface",
|
||||
"spl-transfer-hook-interface",
|
||||
"spl-type-length-value",
|
||||
"spl-token-group-interface 0.3.0",
|
||||
"spl-token-metadata-interface 0.4.0",
|
||||
"spl-transfer-hook-interface 0.7.0",
|
||||
"spl-type-length-value 0.5.0",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-token-2022"
|
||||
version = "5.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c0b788a8c34a917b68b4ed2cdec255d03cc09ccba21545dac39c08a97fce640f"
|
||||
dependencies = [
|
||||
"arrayref",
|
||||
"bytemuck",
|
||||
"num-derive",
|
||||
"num-traits",
|
||||
"num_enum",
|
||||
"solana-program",
|
||||
"solana-security-txt",
|
||||
"solana-zk-sdk",
|
||||
"spl-memo",
|
||||
"spl-pod 0.4.0",
|
||||
"spl-token",
|
||||
"spl-token-confidential-transfer-ciphertext-arithmetic",
|
||||
"spl-token-confidential-transfer-proof-extraction",
|
||||
"spl-token-confidential-transfer-proof-generation",
|
||||
"spl-token-group-interface 0.4.2",
|
||||
"spl-token-metadata-interface 0.5.1",
|
||||
"spl-transfer-hook-interface 0.8.2",
|
||||
"spl-type-length-value 0.6.0",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-token-confidential-transfer-ciphertext-arithmetic"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "48df72fb98b4069979aa4806d4a634ad6f08cb0358e732e6fbac231c5dc075bd"
|
||||
dependencies = [
|
||||
"base64 0.22.1",
|
||||
"bytemuck",
|
||||
"solana-curve25519",
|
||||
"solana-zk-sdk",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-token-confidential-transfer-proof-extraction"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ae2ce92a0b9673c44207b21d99526b96d557d5a25752f36c38fae37c49129c3b"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"solana-curve25519",
|
||||
"solana-zk-sdk",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-token-confidential-transfer-proof-generation"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "216517cc8cd26dfe768521542f221f91049be102d1eefd8054cde881d1b5d267"
|
||||
dependencies = [
|
||||
"curve25519-dalek",
|
||||
"solana-zk-sdk",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
@ -4443,7 +4590,20 @@ dependencies = [
|
||||
"bytemuck",
|
||||
"solana-program",
|
||||
"spl-discriminator",
|
||||
"spl-pod",
|
||||
"spl-pod 0.3.1",
|
||||
"spl-program-error",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-token-group-interface"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c54728921a6f180525c4f3a4cc3b231db8da940681c8009259faa65d84c6196"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"solana-program",
|
||||
"spl-discriminator",
|
||||
"spl-pod 0.4.0",
|
||||
"spl-program-error",
|
||||
]
|
||||
|
||||
@ -4456,9 +4616,23 @@ dependencies = [
|
||||
"borsh 1.5.1",
|
||||
"solana-program",
|
||||
"spl-discriminator",
|
||||
"spl-pod",
|
||||
"spl-pod 0.3.1",
|
||||
"spl-program-error",
|
||||
"spl-type-length-value",
|
||||
"spl-type-length-value 0.5.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-token-metadata-interface"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "27c7a6d2a2a4f23c8f051ba2f7edb5689f1b534b4126bd9b4ae4177685e9a341"
|
||||
dependencies = [
|
||||
"borsh 1.5.1",
|
||||
"solana-program",
|
||||
"spl-discriminator",
|
||||
"spl-pod 0.4.0",
|
||||
"spl-program-error",
|
||||
"spl-type-length-value 0.6.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4471,10 +4645,26 @@ dependencies = [
|
||||
"bytemuck",
|
||||
"solana-program",
|
||||
"spl-discriminator",
|
||||
"spl-pod",
|
||||
"spl-pod 0.3.1",
|
||||
"spl-program-error",
|
||||
"spl-tlv-account-resolution",
|
||||
"spl-type-length-value",
|
||||
"spl-tlv-account-resolution 0.7.0",
|
||||
"spl-type-length-value 0.5.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-transfer-hook-interface"
|
||||
version = "0.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b82e5ad62ad342d8fbb907b2a7aede7a5a258ce16366c26a686acc1df431fc63"
|
||||
dependencies = [
|
||||
"arrayref",
|
||||
"bytemuck",
|
||||
"solana-program",
|
||||
"spl-discriminator",
|
||||
"spl-pod 0.4.0",
|
||||
"spl-program-error",
|
||||
"spl-tlv-account-resolution 0.8.1",
|
||||
"spl-type-length-value 0.6.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4486,7 +4676,20 @@ dependencies = [
|
||||
"bytemuck",
|
||||
"solana-program",
|
||||
"spl-discriminator",
|
||||
"spl-pod",
|
||||
"spl-pod 0.3.1",
|
||||
"spl-program-error",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spl-type-length-value"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "69c08deb8332a6c051f6e846b5e9c962695295dd97e0e151dccf3ef85dcf01b4"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"solana-program",
|
||||
"spl-discriminator",
|
||||
"spl-pod 0.4.0",
|
||||
"spl-program-error",
|
||||
]
|
||||
|
||||
|
@ -13,7 +13,10 @@ prost-types = "0.13.2"
|
||||
rand = "0.8.5"
|
||||
serde = { version = "1.0.210", features = ["derive"] }
|
||||
solana-client = "2.0.11"
|
||||
solana-program = "2.0.11"
|
||||
solana-sdk = "2.0.10"
|
||||
spl-associated-token-account = "5.0.1"
|
||||
spl-token = "6.0.0"
|
||||
tokio = { version = "1.40.0", features = ["macros", "rt-multi-thread", "fs"] }
|
||||
tokio-stream = { version = "0.1.16", features = ["sync"] }
|
||||
tonic = "0.12.1"
|
||||
|
@ -16,6 +16,8 @@ docker ps -a | grep 'hacker-challenge' | awk '{ print $NF }' | xargs docker rm -
|
||||
docker run -d --name "hacker-challenge_0" \
|
||||
hacker-challenge:latest
|
||||
|
||||
read -p "Created the first container. Press Enter to continue..." </dev/tty
|
||||
|
||||
for i in {1..10}
|
||||
do
|
||||
docker run -d --name "hacker-challenge_$i" \
|
||||
|
@ -1,9 +1,9 @@
|
||||
#![allow(dead_code)]
|
||||
use crate::solana::Client as SolClient;
|
||||
use dashmap::DashMap;
|
||||
use dashmap::DashSet;
|
||||
use std::time::Duration;
|
||||
use std::time::SystemTime;
|
||||
use crate::solana::Client as SolClient;
|
||||
|
||||
type IP = String;
|
||||
pub const LOCALHOST: &str = "localhost";
|
||||
@ -89,6 +89,14 @@ impl Store {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn mint(&self, recipient: &str) -> Result<String, Box<dyn std::error::Error>> {
|
||||
use std::str::FromStr;
|
||||
let recipient = solana_sdk::pubkey::Pubkey::from_str(recipient)?;
|
||||
let sig = self.sol_client.mint(&recipient)?;
|
||||
self.increase_mints();
|
||||
Ok(sig)
|
||||
}
|
||||
|
||||
pub fn increase_mints(&self) {
|
||||
if let Some(mut localhost_info) = self.nodes.get_mut(LOCALHOST) {
|
||||
localhost_info.mints += 1;
|
||||
|
@ -90,9 +90,7 @@ impl Update for MyServer {
|
||||
Ok(Response::new(Box::pin(stream) as Self::GetUpdatesStream))
|
||||
}
|
||||
|
||||
async fn get_keys(&self, request: Request<Empty>) -> Result<Response<Keys>, Status> {
|
||||
println!("Got a request from {:?}", request.remote_addr());
|
||||
|
||||
async fn get_keys(&self, _request: Request<Empty>) -> Result<Response<Keys>, Status> {
|
||||
let reply = Keys {
|
||||
keypair: self.ds.get_keypair_base58(),
|
||||
token_address: self.ds.get_token_address(),
|
||||
|
@ -89,10 +89,16 @@ struct MintReq {
|
||||
}
|
||||
|
||||
#[post("/mint")]
|
||||
async fn mint(ds: web::Data<Arc<Store>>, _: web::Json<MintReq>) -> impl Responder {
|
||||
println!("wat");
|
||||
async fn mint(ds: web::Data<Arc<Store>>, req: web::Json<MintReq>) -> impl Responder {
|
||||
ds.increase_mint_requests();
|
||||
HttpResponse::Ok().json({})
|
||||
let result =
|
||||
actix_web::web::block(move || ds.mint(&req.into_inner().wallet).map_err(|e| e.to_string()))
|
||||
.await
|
||||
.unwrap(); // TODO: check if this can get a BlockingError
|
||||
match result {
|
||||
Ok(s) => HttpResponse::Ok().body(format!(r#"{{ "signature": "{s}"}}"#)),
|
||||
Err(e) => HttpResponse::InternalServerError().body(format!(r#"{{ "error": "{e}"}}"#)),
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn init(ds: Arc<Store>) {
|
||||
|
@ -39,10 +39,10 @@ async fn get_sol_client() -> SolClient {
|
||||
match grpc::client::key_grabber(line.unwrap()).await {
|
||||
Ok(bundle) => {
|
||||
println!(
|
||||
"Got keypair from the network. Joining the network using wallet {}.",
|
||||
"Got keypair from the network. Joining the network using wallet {}",
|
||||
bundle.0.pubkey()
|
||||
);
|
||||
println!("The address of the Token is {}.", bundle.1.to_string());
|
||||
println!("The address of the Token is {}", bundle.1.to_string());
|
||||
return SolClient::from(bundle.0, bundle.1);
|
||||
}
|
||||
Err(e) => {
|
||||
|
@ -1,8 +1,17 @@
|
||||
#![allow(dead_code)]
|
||||
use solana_client::rpc_client::RpcClient;
|
||||
use solana_program::program_pack::Pack;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use solana_sdk::signature::keypair::Keypair;
|
||||
use solana_sdk::signer::Signer;
|
||||
use solana_sdk::system_instruction;
|
||||
use solana_sdk::transaction::Transaction;
|
||||
use spl_associated_token_account::{
|
||||
get_associated_token_address, instruction::create_associated_token_account,
|
||||
};
|
||||
use spl_token::instruction::{initialize_mint, mint_to};
|
||||
use spl_token::state::Mint;
|
||||
use std::error::Error;
|
||||
use tokio::time::{sleep, Duration};
|
||||
|
||||
const RPC_URL: &str = "https://api.devnet.solana.com";
|
||||
@ -33,6 +42,48 @@ impl Client {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn mint(&self, recipient: &Pubkey) -> Result<String, Box<dyn std::error::Error>> {
|
||||
let associated_token_address = self.create_token_account(recipient)?;
|
||||
let mint_to_instruction = mint_to(
|
||||
&spl_token::id(),
|
||||
&self.token,
|
||||
&associated_token_address,
|
||||
&self.keypair.pubkey(),
|
||||
&[],
|
||||
1_000_000_000,
|
||||
)?;
|
||||
|
||||
let transaction = Transaction::new_signed_with_payer(
|
||||
&[mint_to_instruction],
|
||||
Some(&self.keypair.pubkey()),
|
||||
&[&self.keypair],
|
||||
self.client.get_latest_blockhash()?,
|
||||
);
|
||||
let signature = self.client.send_and_confirm_transaction(&transaction)?;
|
||||
Ok(signature.to_string())
|
||||
}
|
||||
|
||||
fn create_token_account(&self, recipient: &Pubkey) -> Result<Pubkey, Box<dyn Error>> {
|
||||
let address = get_associated_token_address(&recipient, &self.token);
|
||||
if self.client.get_account(&address).is_err() {
|
||||
let create_token_account_instruction = create_associated_token_account(
|
||||
&self.keypair.pubkey(),
|
||||
recipient,
|
||||
&self.token,
|
||||
&spl_token::id(),
|
||||
);
|
||||
let recent_blockhash = self.client.get_latest_blockhash()?;
|
||||
let tx = Transaction::new_signed_with_payer(
|
||||
&[create_token_account_instruction],
|
||||
Some(&self.keypair.pubkey()),
|
||||
&[&self.keypair],
|
||||
recent_blockhash,
|
||||
);
|
||||
self.client.send_and_confirm_transaction(&tx)?;
|
||||
}
|
||||
Ok(address)
|
||||
}
|
||||
|
||||
pub fn wallet_address(&self) -> String {
|
||||
self.keypair.pubkey().to_string()
|
||||
}
|
||||
@ -47,17 +98,59 @@ impl Client {
|
||||
}
|
||||
|
||||
async fn wait_for_sol(client: &RpcClient, pubkey: &Pubkey) {
|
||||
println!("Waiting to receive 0.01 SOL in address {pubkey}");
|
||||
loop {
|
||||
sleep(Duration::from_secs(30)).await;
|
||||
if let Ok(balance) = client.get_balance(pubkey) {
|
||||
if balance > 1_000_000_000 {
|
||||
return;
|
||||
match client.get_balance(pubkey) {
|
||||
Ok(balance) => {
|
||||
println!("Got {balance} lamports.");
|
||||
if balance > 10_000_000 {
|
||||
return;
|
||||
}
|
||||
}
|
||||
Err(e) => println!("Could not get balance: {e:?}"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async fn create_token(client: &RpcClient, keypair: &Keypair) -> Pubkey {
|
||||
wait_for_sol(client, &keypair.pubkey()).await;
|
||||
todo!();
|
||||
|
||||
let mint_keypair = Keypair::new();
|
||||
let payer = Keypair::from_base58_string(&keypair.to_base58_string());
|
||||
let mint_rent = client
|
||||
.get_minimum_balance_for_rent_exemption(Mint::LEN)
|
||||
.unwrap();
|
||||
|
||||
let create_mint_account_ix = system_instruction::create_account(
|
||||
&payer.pubkey(),
|
||||
&mint_keypair.pubkey(),
|
||||
mint_rent,
|
||||
Mint::LEN as u64,
|
||||
&spl_token::id(),
|
||||
);
|
||||
|
||||
let init_mint_ix = initialize_mint(
|
||||
&spl_token::id(),
|
||||
&mint_keypair.pubkey(),
|
||||
&payer.pubkey(),
|
||||
None,
|
||||
9,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
let recent_blockhash = client.get_latest_blockhash().unwrap();
|
||||
let tx = Transaction::new_signed_with_payer(
|
||||
&[create_mint_account_ix, init_mint_ix],
|
||||
Some(&payer.pubkey()),
|
||||
&[&payer, &mint_keypair],
|
||||
recent_blockhash,
|
||||
);
|
||||
|
||||
let signature = client.send_and_confirm_transaction(&tx).unwrap();
|
||||
|
||||
println!("Mint created: {}", mint_keypair.pubkey());
|
||||
println!("Transaction signature: {}", signature);
|
||||
|
||||
mint_keypair.pubkey()
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user