Position.cs 22 KB

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