DelegateComponent.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #pragma warning disable CS1591
  2. #pragma warning disable CS1998
  3. using Solana.Unity.Programs;
  4. using Solana.Unity.Rpc;
  5. using Solana.Unity.Rpc.Models;
  6. using Solana.Unity.Rpc.Types;
  7. using Solana.Unity.Wallet;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using World.Program;
  13. namespace Bolt {
  14. public partial class World {
  15. public class DelegateComponentInstruction {
  16. public PublicKey Pda { get; set; }
  17. public TransactionInstruction Instruction { get; set; }
  18. }
  19. public static async Task<DelegateComponentInstruction> DelegateComponent(PublicKey payer, PublicKey entity, PublicKey componentId, string seed = "") {
  20. var account = WorldProgram.FindComponentPda(componentId, entity, seed);
  21. var bufferPda = WorldProgram.FindBufferPda(account, componentId);
  22. var delegationRecord = WorldProgram.FindDelegationProgramPda("delegation", account);
  23. var delegationMetadata = WorldProgram.FindDelegationProgramPda("delegation-metadata", account);
  24. byte[] discriminator = new byte[] { 90, 147, 75, 178, 85, 88, 4, 137 };
  25. uint commitFrequencyMs = 0;
  26. byte[] commitFrequencyBytes = BitConverter.GetBytes(commitFrequencyMs);
  27. if (!BitConverter.IsLittleEndian) Array.Reverse(commitFrequencyBytes);
  28. var validator = new byte[1];
  29. validator[0] = 0;
  30. var data = new byte[discriminator.Length + commitFrequencyBytes.Length + validator.Length];
  31. Array.Copy(discriminator, data, discriminator.Length);
  32. Array.Copy(commitFrequencyBytes, 0, data, discriminator.Length, commitFrequencyBytes.Length);
  33. Array.Copy(validator, 0, data, discriminator.Length + commitFrequencyBytes.Length, validator.Length);
  34. TransactionInstruction instruction = new TransactionInstruction() {
  35. ProgramId = componentId,
  36. Keys = new List<AccountMeta>() {
  37. AccountMeta.ReadOnly(payer, true),
  38. AccountMeta.ReadOnly(entity, false),
  39. AccountMeta.Writable(account, false),
  40. AccountMeta.ReadOnly(componentId, false),
  41. AccountMeta.Writable(bufferPda, false),
  42. AccountMeta.Writable(delegationRecord, false),
  43. AccountMeta.Writable(delegationMetadata, false),
  44. AccountMeta.ReadOnly(WorldProgram.DelegationProgram, false),
  45. AccountMeta.ReadOnly(SystemProgram.ProgramIdKey, false),
  46. },
  47. Data = data,
  48. };
  49. return new DelegateComponentInstruction() {
  50. Pda = WorldProgram.FindDelegationProgramPda(seed, entity),
  51. Instruction = instruction,
  52. };
  53. }
  54. }
  55. }