Position.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. #pragma warning disable CS8600
  2. #pragma warning disable CS8604
  3. #pragma warning disable CS8618
  4. #pragma warning disable CS8603
  5. #pragma warning disable CS8625
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Numerics;
  10. using System.Threading.Tasks;
  11. using Solana.Unity;
  12. using Solana.Unity.Programs.Abstract;
  13. using Solana.Unity.Programs.Utilities;
  14. using Solana.Unity.Rpc;
  15. using Solana.Unity.Rpc.Builders;
  16. using Solana.Unity.Rpc.Core.Http;
  17. using Solana.Unity.Rpc.Core.Sockets;
  18. using Solana.Unity.Rpc.Types;
  19. using Solana.Unity.Wallet;
  20. using Position;
  21. using Position.Program;
  22. using Position.Errors;
  23. using Position.Accounts;
  24. using Position.Types;
  25. namespace Position
  26. {
  27. namespace Accounts
  28. {
  29. public partial class Entity
  30. {
  31. public static ulong ACCOUNT_DISCRIMINATOR => 1751670451238706478UL;
  32. public static ReadOnlySpan<byte> ACCOUNT_DISCRIMINATOR_BYTES => new byte[]{46, 157, 161, 161, 254, 46, 79, 24};
  33. public static string ACCOUNT_DISCRIMINATOR_B58 => "8oEQa6zH67R";
  34. public ulong Id { get; set; }
  35. public static Entity Deserialize(ReadOnlySpan<byte> _data)
  36. {
  37. int offset = 0;
  38. ulong accountHashValue = _data.GetU64(offset);
  39. offset += 8;
  40. if (accountHashValue != ACCOUNT_DISCRIMINATOR)
  41. {
  42. return null;
  43. }
  44. Entity result = new Entity();
  45. result.Id = _data.GetU64(offset);
  46. offset += 8;
  47. return result;
  48. }
  49. }
  50. public partial class Position
  51. {
  52. public static ulong ACCOUNT_DISCRIMINATOR => 15057574775701355690UL;
  53. public static ReadOnlySpan<byte> ACCOUNT_DISCRIMINATOR_BYTES => new byte[]{170, 188, 143, 228, 122, 64, 247, 208};
  54. public static string ACCOUNT_DISCRIMINATOR_B58 => "VZMoMoKgZQb";
  55. public long X { get; set; }
  56. public long Y { get; set; }
  57. public long Z { get; set; }
  58. public BoltMetadata BoltMetadata { get; set; }
  59. public static Position Deserialize(ReadOnlySpan<byte> _data)
  60. {
  61. int offset = 0;
  62. ulong accountHashValue = _data.GetU64(offset);
  63. offset += 8;
  64. if (accountHashValue != ACCOUNT_DISCRIMINATOR)
  65. {
  66. return null;
  67. }
  68. Position result = new Position();
  69. result.X = _data.GetS64(offset);
  70. offset += 8;
  71. result.Y = _data.GetS64(offset);
  72. offset += 8;
  73. result.Z = _data.GetS64(offset);
  74. offset += 8;
  75. offset += BoltMetadata.Deserialize(_data, offset, out var resultBoltMetadata);
  76. result.BoltMetadata = resultBoltMetadata;
  77. return result;
  78. }
  79. }
  80. public partial class SessionToken
  81. {
  82. public static ulong ACCOUNT_DISCRIMINATOR => 1081168673100727529UL;
  83. public static ReadOnlySpan<byte> ACCOUNT_DISCRIMINATOR_BYTES => new byte[]{233, 4, 115, 14, 46, 21, 1, 15};
  84. public static string ACCOUNT_DISCRIMINATOR_B58 => "fyZWTdUu1pS";
  85. public PublicKey Authority { get; set; }
  86. public PublicKey TargetProgram { get; set; }
  87. public PublicKey SessionSigner { get; set; }
  88. public long ValidUntil { get; set; }
  89. public static SessionToken Deserialize(ReadOnlySpan<byte> _data)
  90. {
  91. int offset = 0;
  92. ulong accountHashValue = _data.GetU64(offset);
  93. offset += 8;
  94. if (accountHashValue != ACCOUNT_DISCRIMINATOR)
  95. {
  96. return null;
  97. }
  98. SessionToken result = new SessionToken();
  99. result.Authority = _data.GetPubKey(offset);
  100. offset += 32;
  101. result.TargetProgram = _data.GetPubKey(offset);
  102. offset += 32;
  103. result.SessionSigner = _data.GetPubKey(offset);
  104. offset += 32;
  105. result.ValidUntil = _data.GetS64(offset);
  106. offset += 8;
  107. return result;
  108. }
  109. }
  110. }
  111. namespace Errors
  112. {
  113. public enum PositionErrorKind : uint
  114. {
  115. }
  116. }
  117. namespace Types
  118. {
  119. public partial class BoltMetadata
  120. {
  121. public PublicKey Authority { get; set; }
  122. public int Serialize(byte[] _data, int initialOffset)
  123. {
  124. int offset = initialOffset;
  125. _data.WritePubKey(Authority, offset);
  126. offset += 32;
  127. return offset - initialOffset;
  128. }
  129. public static int Deserialize(ReadOnlySpan<byte> _data, int initialOffset, out BoltMetadata result)
  130. {
  131. int offset = initialOffset;
  132. result = new BoltMetadata();
  133. result.Authority = _data.GetPubKey(offset);
  134. offset += 32;
  135. return offset - initialOffset;
  136. }
  137. }
  138. }
  139. public partial class PositionClient : TransactionalBaseClient<PositionErrorKind>
  140. {
  141. public PositionClient(IRpcClient rpcClient, IStreamingRpcClient streamingRpcClient, PublicKey programId = null) : base(rpcClient, streamingRpcClient, programId ?? new PublicKey(PositionProgram.ID))
  142. {
  143. }
  144. public async Task<Solana.Unity.Programs.Models.ProgramAccountsResultWrapper<List<Entity>>> GetEntitysAsync(string programAddress = PositionProgram.ID, Commitment commitment = Commitment.Confirmed)
  145. {
  146. var list = new List<Solana.Unity.Rpc.Models.MemCmp>{new Solana.Unity.Rpc.Models.MemCmp{Bytes = Entity.ACCOUNT_DISCRIMINATOR_B58, Offset = 0}};
  147. var res = await RpcClient.GetProgramAccountsAsync(programAddress, commitment, memCmpList: list);
  148. if (!res.WasSuccessful || !(res.Result?.Count > 0))
  149. return new Solana.Unity.Programs.Models.ProgramAccountsResultWrapper<List<Entity>>(res);
  150. List<Entity> resultingAccounts = new List<Entity>(res.Result.Count);
  151. resultingAccounts.AddRange(res.Result.Select(result => Entity.Deserialize(Convert.FromBase64String(result.Account.Data[0]))));
  152. return new Solana.Unity.Programs.Models.ProgramAccountsResultWrapper<List<Entity>>(res, resultingAccounts);
  153. }
  154. public async Task<Solana.Unity.Programs.Models.ProgramAccountsResultWrapper<List<Position.Accounts.Position>>> GetPositionsAsync(string programAddress = PositionProgram.ID, Commitment commitment = Commitment.Confirmed)
  155. {
  156. var list = new List<Solana.Unity.Rpc.Models.MemCmp>{new Solana.Unity.Rpc.Models.MemCmp{Bytes = Position.Accounts.Position.ACCOUNT_DISCRIMINATOR_B58, Offset = 0}};
  157. var res = await RpcClient.GetProgramAccountsAsync(programAddress, commitment, memCmpList: list);
  158. if (!res.WasSuccessful || !(res.Result?.Count > 0))
  159. return new Solana.Unity.Programs.Models.ProgramAccountsResultWrapper<List<Position.Accounts.Position>>(res);
  160. List<Position.Accounts.Position> resultingAccounts = new List<Position.Accounts.Position>(res.Result.Count);
  161. resultingAccounts.AddRange(res.Result.Select(result => Position.Accounts.Position.Deserialize(Convert.FromBase64String(result.Account.Data[0]))));
  162. return new Solana.Unity.Programs.Models.ProgramAccountsResultWrapper<List<Position.Accounts.Position>>(res, resultingAccounts);
  163. }
  164. public async Task<Solana.Unity.Programs.Models.ProgramAccountsResultWrapper<List<SessionToken>>> GetSessionTokensAsync(string programAddress = PositionProgram.ID, Commitment commitment = Commitment.Confirmed)
  165. {
  166. var list = new List<Solana.Unity.Rpc.Models.MemCmp>{new Solana.Unity.Rpc.Models.MemCmp{Bytes = SessionToken.ACCOUNT_DISCRIMINATOR_B58, Offset = 0}};
  167. var res = await RpcClient.GetProgramAccountsAsync(programAddress, commitment, memCmpList: list);
  168. if (!res.WasSuccessful || !(res.Result?.Count > 0))
  169. return new Solana.Unity.Programs.Models.ProgramAccountsResultWrapper<List<SessionToken>>(res);
  170. List<SessionToken> resultingAccounts = new List<SessionToken>(res.Result.Count);
  171. resultingAccounts.AddRange(res.Result.Select(result => SessionToken.Deserialize(Convert.FromBase64String(result.Account.Data[0]))));
  172. return new Solana.Unity.Programs.Models.ProgramAccountsResultWrapper<List<SessionToken>>(res, resultingAccounts);
  173. }
  174. public async Task<Solana.Unity.Programs.Models.AccountResultWrapper<Entity>> GetEntityAsync(string accountAddress, Commitment commitment = Commitment.Finalized)
  175. {
  176. var res = await RpcClient.GetAccountInfoAsync(accountAddress, commitment);
  177. if (!res.WasSuccessful)
  178. return new Solana.Unity.Programs.Models.AccountResultWrapper<Entity>(res);
  179. var resultingAccount = Entity.Deserialize(Convert.FromBase64String(res.Result.Value.Data[0]));
  180. return new Solana.Unity.Programs.Models.AccountResultWrapper<Entity>(res, resultingAccount);
  181. }
  182. public async Task<Solana.Unity.Programs.Models.AccountResultWrapper<Position.Accounts.Position>> GetPositionAsync(string accountAddress, Commitment commitment = Commitment.Finalized)
  183. {
  184. var res = await RpcClient.GetAccountInfoAsync(accountAddress, commitment);
  185. if (!res.WasSuccessful)
  186. return new Solana.Unity.Programs.Models.AccountResultWrapper<Position.Accounts.Position>(res);
  187. var resultingAccount = Position.Accounts.Position.Deserialize(Convert.FromBase64String(res.Result.Value.Data[0]));
  188. return new Solana.Unity.Programs.Models.AccountResultWrapper<Position.Accounts.Position>(res, resultingAccount);
  189. }
  190. public async Task<Solana.Unity.Programs.Models.AccountResultWrapper<SessionToken>> GetSessionTokenAsync(string accountAddress, Commitment commitment = Commitment.Finalized)
  191. {
  192. var res = await RpcClient.GetAccountInfoAsync(accountAddress, commitment);
  193. if (!res.WasSuccessful)
  194. return new Solana.Unity.Programs.Models.AccountResultWrapper<SessionToken>(res);
  195. var resultingAccount = SessionToken.Deserialize(Convert.FromBase64String(res.Result.Value.Data[0]));
  196. return new Solana.Unity.Programs.Models.AccountResultWrapper<SessionToken>(res, resultingAccount);
  197. }
  198. public async Task<SubscriptionState> SubscribeEntityAsync(string accountAddress, Action<SubscriptionState, Solana.Unity.Rpc.Messages.ResponseValue<Solana.Unity.Rpc.Models.AccountInfo>, Entity> callback, Commitment commitment = Commitment.Finalized)
  199. {
  200. SubscriptionState res = await StreamingRpcClient.SubscribeAccountInfoAsync(accountAddress, (s, e) =>
  201. {
  202. Entity parsingResult = null;
  203. if (e.Value?.Data?.Count > 0)
  204. parsingResult = Entity.Deserialize(Convert.FromBase64String(e.Value.Data[0]));
  205. callback(s, e, parsingResult);
  206. }, commitment);
  207. return res;
  208. }
  209. public async Task<SubscriptionState> SubscribePositionAsync(string accountAddress, Action<SubscriptionState, Solana.Unity.Rpc.Messages.ResponseValue<Solana.Unity.Rpc.Models.AccountInfo>, Position.Accounts.Position> callback, Commitment commitment = Commitment.Finalized)
  210. {
  211. SubscriptionState res = await StreamingRpcClient.SubscribeAccountInfoAsync(accountAddress, (s, e) =>
  212. {
  213. Position.Accounts.Position parsingResult = null;
  214. if (e.Value?.Data?.Count > 0)
  215. parsingResult = Position.Accounts.Position.Deserialize(Convert.FromBase64String(e.Value.Data[0]));
  216. callback(s, e, parsingResult);
  217. }, commitment);
  218. return res;
  219. }
  220. public async Task<SubscriptionState> SubscribeSessionTokenAsync(string accountAddress, Action<SubscriptionState, Solana.Unity.Rpc.Messages.ResponseValue<Solana.Unity.Rpc.Models.AccountInfo>, SessionToken> callback, Commitment commitment = Commitment.Finalized)
  221. {
  222. SubscriptionState res = await StreamingRpcClient.SubscribeAccountInfoAsync(accountAddress, (s, e) =>
  223. {
  224. SessionToken parsingResult = null;
  225. if (e.Value?.Data?.Count > 0)
  226. parsingResult = SessionToken.Deserialize(Convert.FromBase64String(e.Value.Data[0]));
  227. callback(s, e, parsingResult);
  228. }, commitment);
  229. return res;
  230. }
  231. protected override Dictionary<uint, ProgramError<PositionErrorKind>> BuildErrorsDictionary()
  232. {
  233. return new Dictionary<uint, ProgramError<PositionErrorKind>>{};
  234. }
  235. }
  236. namespace Program
  237. {
  238. public class DelegateAccounts
  239. {
  240. public PublicKey Payer { get; set; }
  241. public PublicKey Entity { get; set; }
  242. public PublicKey Account { get; set; }
  243. public PublicKey OwnerProgram { get; set; }
  244. public PublicKey Buffer { get; set; }
  245. public PublicKey DelegationRecord { get; set; }
  246. public PublicKey DelegationMetadata { get; set; }
  247. public PublicKey DelegationProgram { get; set; }
  248. public PublicKey SystemProgram { get; set; }
  249. }
  250. public class InitializeAccounts
  251. {
  252. public PublicKey Payer { get; set; }
  253. public PublicKey Data { get; set; }
  254. public PublicKey Entity { get; set; }
  255. public PublicKey Authority { get; set; }
  256. public PublicKey InstructionSysvarAccount { get; set; } = new PublicKey("Sysvar1nstructions1111111111111111111111111");
  257. public PublicKey SystemProgram { get; set; } = new PublicKey("11111111111111111111111111111111");
  258. }
  259. public class ProcessUndelegationAccounts
  260. {
  261. public PublicKey DelegatedAccount { get; set; }
  262. public PublicKey Buffer { get; set; }
  263. public PublicKey Payer { get; set; }
  264. public PublicKey SystemProgram { get; set; }
  265. }
  266. public class UndelegateAccounts
  267. {
  268. public PublicKey Payer { get; set; }
  269. public PublicKey DelegatedAccount { get; set; }
  270. public PublicKey MagicContext { get; set; } = new PublicKey("MagicContext1111111111111111111111111111111");
  271. public PublicKey MagicProgram { get; set; } = new PublicKey("Magic11111111111111111111111111111111111111");
  272. }
  273. public class UpdateAccounts
  274. {
  275. public PublicKey BoltComponent { get; set; }
  276. public PublicKey Authority { get; set; }
  277. public PublicKey InstructionSysvarAccount { get; set; } = new PublicKey("Sysvar1nstructions1111111111111111111111111");
  278. public PublicKey SessionToken { get; set; }
  279. }
  280. public static class PositionProgram
  281. {
  282. public const string ID = "Fn1JzzEdyb55fsyduWS94mYHizGhJZuhvjX6DVvrmGbQ";
  283. public static Solana.Unity.Rpc.Models.TransactionInstruction Delegate(DelegateAccounts accounts, uint commit_frequency_ms, PublicKey validator, PublicKey programId = null)
  284. {
  285. programId ??= new(ID);
  286. List<Solana.Unity.Rpc.Models.AccountMeta> keys = new()
  287. {Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.Payer, true), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.Entity, false), Solana.Unity.Rpc.Models.AccountMeta.Writable(accounts.Account, false), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.OwnerProgram, false), Solana.Unity.Rpc.Models.AccountMeta.Writable(accounts.Buffer, false), Solana.Unity.Rpc.Models.AccountMeta.Writable(accounts.DelegationRecord, false), Solana.Unity.Rpc.Models.AccountMeta.Writable(accounts.DelegationMetadata, false), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.DelegationProgram, false), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.SystemProgram, false)};
  288. byte[] _data = new byte[1200];
  289. int offset = 0;
  290. _data.WriteU64(9873113408189731674UL, offset);
  291. offset += 8;
  292. _data.WriteU32(commit_frequency_ms, offset);
  293. offset += 4;
  294. if (validator != null)
  295. {
  296. _data.WriteU8(1, offset);
  297. offset += 1;
  298. _data.WritePubKey(validator, offset);
  299. offset += 32;
  300. }
  301. else
  302. {
  303. _data.WriteU8(0, offset);
  304. offset += 1;
  305. }
  306. byte[] resultData = new byte[offset];
  307. Array.Copy(_data, resultData, offset);
  308. return new Solana.Unity.Rpc.Models.TransactionInstruction{Keys = keys, ProgramId = programId.KeyBytes, Data = resultData};
  309. }
  310. public static Solana.Unity.Rpc.Models.TransactionInstruction Initialize(InitializeAccounts accounts, PublicKey programId = null)
  311. {
  312. programId ??= new(ID);
  313. List<Solana.Unity.Rpc.Models.AccountMeta> keys = new()
  314. {Solana.Unity.Rpc.Models.AccountMeta.Writable(accounts.Payer, true), Solana.Unity.Rpc.Models.AccountMeta.Writable(accounts.Data, false), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.Entity, false), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.Authority, false), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.InstructionSysvarAccount, false), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.SystemProgram, false)};
  315. byte[] _data = new byte[1200];
  316. int offset = 0;
  317. _data.WriteU64(17121445590508351407UL, offset);
  318. offset += 8;
  319. byte[] resultData = new byte[offset];
  320. Array.Copy(_data, resultData, offset);
  321. return new Solana.Unity.Rpc.Models.TransactionInstruction{Keys = keys, ProgramId = programId.KeyBytes, Data = resultData};
  322. }
  323. public static Solana.Unity.Rpc.Models.TransactionInstruction ProcessUndelegation(ProcessUndelegationAccounts accounts, byte[][] account_seeds, PublicKey programId = null)
  324. {
  325. programId ??= new(ID);
  326. List<Solana.Unity.Rpc.Models.AccountMeta> keys = new()
  327. {Solana.Unity.Rpc.Models.AccountMeta.Writable(accounts.DelegatedAccount, false), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.Buffer, false), Solana.Unity.Rpc.Models.AccountMeta.Writable(accounts.Payer, false), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.SystemProgram, false)};
  328. byte[] _data = new byte[1200];
  329. int offset = 0;
  330. _data.WriteU64(12048014319693667524UL, offset);
  331. offset += 8;
  332. _data.WriteS32(account_seeds.Length, offset);
  333. offset += 4;
  334. foreach (var account_seedsElement in account_seeds)
  335. {
  336. _data.WriteS32(account_seedsElement.Length, offset);
  337. offset += 4;
  338. _data.WriteSpan(account_seedsElement, offset);
  339. offset += account_seedsElement.Length;
  340. }
  341. byte[] resultData = new byte[offset];
  342. Array.Copy(_data, resultData, offset);
  343. return new Solana.Unity.Rpc.Models.TransactionInstruction{Keys = keys, ProgramId = programId.KeyBytes, Data = resultData};
  344. }
  345. public static Solana.Unity.Rpc.Models.TransactionInstruction Undelegate(UndelegateAccounts accounts, PublicKey programId = null)
  346. {
  347. programId ??= new(ID);
  348. List<Solana.Unity.Rpc.Models.AccountMeta> keys = new()
  349. {Solana.Unity.Rpc.Models.AccountMeta.Writable(accounts.Payer, true), Solana.Unity.Rpc.Models.AccountMeta.Writable(accounts.DelegatedAccount, false), Solana.Unity.Rpc.Models.AccountMeta.Writable(accounts.MagicContext, false), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.MagicProgram, false)};
  350. byte[] _data = new byte[1200];
  351. int offset = 0;
  352. _data.WriteU64(17161644073433732227UL, offset);
  353. offset += 8;
  354. byte[] resultData = new byte[offset];
  355. Array.Copy(_data, resultData, offset);
  356. return new Solana.Unity.Rpc.Models.TransactionInstruction{Keys = keys, ProgramId = programId.KeyBytes, Data = resultData};
  357. }
  358. public static Solana.Unity.Rpc.Models.TransactionInstruction Update(UpdateAccounts accounts, byte[] data, PublicKey programId = null)
  359. {
  360. programId ??= new(ID);
  361. List<Solana.Unity.Rpc.Models.AccountMeta> keys = new()
  362. {Solana.Unity.Rpc.Models.AccountMeta.Writable(accounts.BoltComponent, false), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.Authority, true), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.InstructionSysvarAccount, false), Solana.Unity.Rpc.Models.AccountMeta.ReadOnly(accounts.SessionToken == null ? programId : accounts.SessionToken, false)};
  363. byte[] _data = new byte[1200];
  364. int offset = 0;
  365. _data.WriteU64(9222597562720635099UL, offset);
  366. offset += 8;
  367. _data.WriteS32(data.Length, offset);
  368. offset += 4;
  369. _data.WriteSpan(data, offset);
  370. offset += data.Length;
  371. byte[] resultData = new byte[offset];
  372. Array.Copy(_data, resultData, offset);
  373. return new Solana.Unity.Rpc.Models.TransactionInstruction{Keys = keys, ProgramId = programId.KeyBytes, Data = resultData};
  374. }
  375. }
  376. }
  377. }