instructions.rs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. use anchor_cli::config::{Config, ConfigOverride};
  2. use anchor_client::solana_client::rpc_config::RpcSendTransactionConfig;
  3. use anchor_client::solana_sdk::commitment_config::CommitmentConfig;
  4. use anchor_client::solana_sdk::pubkey::Pubkey;
  5. use anchor_client::solana_sdk::signature::{read_keypair_file, Keypair};
  6. use anchor_client::solana_sdk::signer::Signer;
  7. use anchor_client::solana_sdk::system_program;
  8. use anchor_client::Client;
  9. use anyhow::{anyhow, Result};
  10. use std::rc::Rc;
  11. use world::{accounts, instruction, World, ID};
  12. fn setup_client(cfg_override: &ConfigOverride) -> Result<(Client<Rc<Keypair>>, Keypair)> {
  13. let cfg = Config::discover(cfg_override)?.expect("Not in workspace.");
  14. let wallet_path = cfg.provider.wallet.clone();
  15. let payer = read_keypair_file(wallet_path.to_string())
  16. .map_err(|e| anyhow!("Failed to read keypair file: {}", e))?;
  17. let payer_for_client =
  18. Keypair::from_bytes(&payer.to_bytes()).expect("Failed to create Keypair from bytes");
  19. let client = Client::new_with_options(
  20. cfg.provider.cluster.clone(),
  21. Rc::new(payer_for_client),
  22. CommitmentConfig::confirmed(),
  23. );
  24. Ok((client, payer))
  25. }
  26. fn parse_pubkey(input: &str, error_message: &str) -> Result<Pubkey> {
  27. input
  28. .parse::<Pubkey>()
  29. .map_err(|_| anyhow!(error_message.to_string()))
  30. }
  31. pub fn authorize(
  32. cfg_override: &ConfigOverride,
  33. world: String,
  34. new_authority: String,
  35. ) -> Result<()> {
  36. let world_pubkey = parse_pubkey(&world, "Invalid world public key")?;
  37. let new_authority_pubkey = parse_pubkey(&new_authority, "Invalid new authority public key")?;
  38. let (client, payer) = setup_client(cfg_override)?;
  39. let program = client.program(ID)?;
  40. let world_account = program.account::<World>(world_pubkey)?;
  41. let world_id = world_account.id;
  42. let signature = program
  43. .request()
  44. .accounts(accounts::AddAuthority {
  45. authority: payer.pubkey(),
  46. new_authority: new_authority_pubkey,
  47. system_program: system_program::ID,
  48. world: world_pubkey,
  49. })
  50. .args(instruction::AddAuthority { world_id })
  51. .signer(&payer)
  52. .send()?;
  53. println!(
  54. "Authority {} added to world {} with signature {}",
  55. new_authority, world, signature
  56. );
  57. Ok(())
  58. }
  59. pub fn deauthorize(
  60. cfg_override: &ConfigOverride,
  61. world: String,
  62. authority_to_delete: String,
  63. ) -> Result<()> {
  64. let world_pubkey = parse_pubkey(&world, "Invalid world public key")?;
  65. let authority_to_delete_pubkey =
  66. parse_pubkey(&authority_to_delete, "Invalid authority public key")?;
  67. let (client, payer) = setup_client(cfg_override)?;
  68. let program = client.program(ID)?;
  69. let world_account = program.account::<World>(world_pubkey)?;
  70. let world_id = world_account.id;
  71. let signature = program
  72. .request()
  73. .accounts(accounts::RemoveAuthority {
  74. authority: payer.pubkey(),
  75. authority_to_delete: authority_to_delete_pubkey,
  76. system_program: system_program::ID,
  77. world: world_pubkey,
  78. })
  79. .args(instruction::RemoveAuthority { world_id })
  80. .signer(&payer)
  81. .send_with_spinner_and_config(RpcSendTransactionConfig {
  82. skip_preflight: true,
  83. ..RpcSendTransactionConfig::default()
  84. })?;
  85. println!(
  86. "Authority {} removed from world {} with signature {}",
  87. authority_to_delete, world, signature
  88. );
  89. Ok(())
  90. }
  91. pub fn approve_system(
  92. cfg_override: &ConfigOverride,
  93. world: String,
  94. system_to_approve: String,
  95. ) -> Result<()> {
  96. let world_pubkey = parse_pubkey(&world, "Invalid world public key")?;
  97. let system_to_approve_pubkey = parse_pubkey(&system_to_approve, "Invalid system public key")?;
  98. let (client, payer) = setup_client(cfg_override)?;
  99. let program = client.program(ID)?;
  100. let signature = program
  101. .request()
  102. .accounts(accounts::ApproveSystem {
  103. authority: payer.pubkey(),
  104. system: system_to_approve_pubkey,
  105. world: world_pubkey,
  106. system_program: system_program::ID,
  107. })
  108. .args(instruction::ApproveSystem {})
  109. .signer(&payer)
  110. .send()?;
  111. println!(
  112. "System {} approved for world {} with signature {}",
  113. system_to_approve, world, signature
  114. );
  115. Ok(())
  116. }
  117. pub fn remove_system(
  118. cfg_override: &ConfigOverride,
  119. world: String,
  120. system_to_remove: String,
  121. ) -> Result<()> {
  122. let world_pubkey = parse_pubkey(&world, "Invalid world public key")?;
  123. let system_to_remove_pubkey = parse_pubkey(&system_to_remove, "Invalid system public key")?;
  124. let (client, payer) = setup_client(cfg_override)?;
  125. let program = client.program(ID)?;
  126. let signature = program
  127. .request()
  128. .accounts(accounts::RemoveSystem {
  129. authority: payer.pubkey(),
  130. system: system_to_remove_pubkey,
  131. world: world_pubkey,
  132. system_program: system_program::ID,
  133. })
  134. .args(instruction::RemoveSystem {})
  135. .signer(&payer)
  136. .send()?;
  137. println!(
  138. "System {} removed from world {} with signature {}",
  139. system_to_remove, world, signature
  140. );
  141. Ok(())
  142. }