bolt.ts 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487
  1. import * as anchor from "@coral-xyz/anchor";
  2. import { Program } from "@coral-xyz/anchor";
  3. import { PublicKey } from "@solana/web3.js";
  4. import { ComponentPosition } from "../target/types/component_position";
  5. import { ComponentVelocity } from "../target/types/component_velocity";
  6. import { BoltComponent } from "../target/types/bolt_component";
  7. import { SystemSimpleMovement } from "../target/types/system_simple_movement";
  8. import { SystemFly } from "../target/types/system_fly";
  9. import { SystemApplyVelocity } from "../target/types/system_apply_velocity";
  10. import { World } from "../target/types/world";
  11. import { expect } from "chai";
  12. import BN from "bn.js";
  13. import {
  14. FindComponentPda,
  15. FindEntityPda,
  16. FindWorldPda,
  17. FindWorldRegistryPda,
  18. } from "../clients/bolt-sdk";
  19. enum Direction {
  20. Left = "Left",
  21. Right = "Right",
  22. Up = "Up",
  23. Down = "Down",
  24. }
  25. function serializeArgs(args: any = {}) {
  26. const jsonString = JSON.stringify(args);
  27. const encoder = new TextEncoder();
  28. const binaryData = encoder.encode(jsonString);
  29. return Buffer.from(
  30. binaryData.buffer,
  31. binaryData.byteOffset,
  32. binaryData.byteLength
  33. );
  34. }
  35. describe("bolt", () => {
  36. const provider = anchor.AnchorProvider.env();
  37. anchor.setProvider(provider);
  38. const worldProgram = anchor.workspace.World as Program<World>;
  39. const boltComponentPositionProgram = anchor.workspace
  40. .ComponentPosition as Program<ComponentPosition>;
  41. const boltComponentVelocityProgram = anchor.workspace
  42. .ComponentVelocity as Program<ComponentVelocity>;
  43. const boltComponentProgramOrigin = anchor.workspace
  44. .BoltComponent as Program<BoltComponent>;
  45. const systemSimpleMovement = (
  46. anchor.workspace.SystemSimpleMovement as Program<SystemSimpleMovement>
  47. ).programId;
  48. const systemFly = (anchor.workspace.SystemFly as Program<SystemFly>)
  49. .programId;
  50. const applyVelocity = (
  51. anchor.workspace.SystemApplyVelocity as Program<SystemApplyVelocity>
  52. ).programId;
  53. let entity1: PublicKey;
  54. let entity2: PublicKey;
  55. let componentPositionEntity1: PublicKey;
  56. let componentPositionEntity2: PublicKey;
  57. let componentVelocityEntity1: PublicKey;
  58. it("InitializeWorldsRegistry", async () => {
  59. const registryPda = FindWorldRegistryPda(worldProgram.programId);
  60. await worldProgram.methods
  61. .initializeRegistry()
  62. .accounts({
  63. registry: registryPda,
  64. payer: provider.wallet.publicKey,
  65. })
  66. .rpc();
  67. });
  68. it("InitializeNewWorld", async () => {
  69. const registryPda = FindWorldRegistryPda(worldProgram.programId);
  70. const worldPda = FindWorldPda(new BN(0), worldProgram.programId);
  71. await worldProgram.methods
  72. .initializeNewWorld()
  73. .accounts({
  74. world: worldPda,
  75. registry: registryPda,
  76. payer: provider.wallet.publicKey,
  77. })
  78. .rpc();
  79. });
  80. it("InitializeNewWorld 2", async () => {
  81. const registryPda = FindWorldRegistryPda(worldProgram.programId);
  82. const worldPda = FindWorldPda(new BN(1), worldProgram.programId);
  83. await worldProgram.methods
  84. .initializeNewWorld()
  85. .accounts({
  86. world: worldPda,
  87. registry: registryPda,
  88. payer: provider.wallet.publicKey,
  89. })
  90. .rpc();
  91. });
  92. it("Add entity 1", async () => {
  93. const worldPda = FindWorldPda(new BN(0), worldProgram.programId);
  94. entity1 = FindEntityPda(new BN(0), new BN(0), null, worldProgram.programId);
  95. await worldProgram.methods
  96. .addEntity(null)
  97. .accounts({
  98. world: worldPda,
  99. entity: entity1,
  100. payer: provider.wallet.publicKey,
  101. })
  102. .rpc();
  103. });
  104. it("Add entity 2", async () => {
  105. const worldPda = FindWorldPda(new BN(0), worldProgram.programId);
  106. entity2 = FindEntityPda(new BN(0), new BN(1), null, worldProgram.programId);
  107. await worldProgram.methods
  108. .addEntity(null)
  109. .accounts({
  110. world: worldPda,
  111. entity: entity2,
  112. payer: provider.wallet.publicKey,
  113. })
  114. .rpc();
  115. });
  116. it("Add entity 3", async () => {
  117. const worldPda = FindWorldPda(new BN(0), worldProgram.programId);
  118. const entityPda = FindEntityPda(
  119. new BN(0),
  120. new BN(2),
  121. null,
  122. worldProgram.programId
  123. );
  124. await worldProgram.methods
  125. .addEntity(null)
  126. .accounts({
  127. world: worldPda,
  128. entity: entityPda,
  129. payer: provider.wallet.publicKey,
  130. })
  131. .rpc();
  132. });
  133. it("Add entity 4 with extra seeds", async () => {
  134. const worldPda = FindWorldPda(new BN(0), worldProgram.programId);
  135. const seed = "extra-seed";
  136. let entity3 = FindEntityPda(
  137. new BN(0),
  138. new BN(3),
  139. seed,
  140. worldProgram.programId
  141. );
  142. await worldProgram.methods
  143. .addEntity(seed)
  144. .accounts({
  145. world: worldPda,
  146. entity: entity3,
  147. payer: provider.wallet.publicKey,
  148. })
  149. .rpc();
  150. });
  151. it("Initialize Original Component on Entity 1, trough the world instance", async () => {
  152. let componentEntity1 = FindComponentPda(
  153. boltComponentProgramOrigin.programId,
  154. entity1,
  155. "origin-component"
  156. );
  157. await worldProgram.methods
  158. .initializeComponent()
  159. .accounts({
  160. payer: provider.wallet.publicKey,
  161. data: componentEntity1,
  162. componentProgram: boltComponentProgramOrigin.programId,
  163. entity: entity1,
  164. authority: provider.wallet.publicKey,
  165. })
  166. .rpc();
  167. });
  168. it("Initialize Original Component on Entity 2, trough the world instance", async () => {
  169. let componentEntity2 = FindComponentPda(
  170. boltComponentProgramOrigin.programId,
  171. entity2,
  172. "origin-component"
  173. );
  174. await worldProgram.methods
  175. .initializeComponent()
  176. .accounts({
  177. payer: provider.wallet.publicKey,
  178. data: componentEntity2,
  179. componentProgram: boltComponentProgramOrigin.programId,
  180. entity: entity2,
  181. authority: provider.wallet.publicKey,
  182. })
  183. .rpc();
  184. });
  185. it("Initialize Position Component on Entity 1", async () => {
  186. componentPositionEntity1 = FindComponentPda(
  187. boltComponentPositionProgram.programId,
  188. entity1
  189. );
  190. console.log("Component Position E1: ", componentPositionEntity1.toBase58());
  191. await worldProgram.methods
  192. .initializeComponent()
  193. .accounts({
  194. payer: provider.wallet.publicKey,
  195. data: componentPositionEntity1,
  196. componentProgram: boltComponentPositionProgram.programId,
  197. entity: entity1,
  198. authority: boltComponentPositionProgram.programId,
  199. })
  200. .rpc({ skipPreflight: true });
  201. });
  202. it("Initialize Velocity Component on Entity 1", async () => {
  203. componentVelocityEntity1 = FindComponentPda(
  204. boltComponentVelocityProgram.programId,
  205. entity1,
  206. "component-velocity"
  207. );
  208. await worldProgram.methods
  209. .initializeComponent()
  210. .accounts({
  211. payer: provider.wallet.publicKey,
  212. data: componentVelocityEntity1,
  213. componentProgram: boltComponentVelocityProgram.programId,
  214. entity: entity1,
  215. authority: boltComponentVelocityProgram.programId,
  216. })
  217. .rpc();
  218. });
  219. it("Initialize Position Component on Entity 2", async () => {
  220. componentPositionEntity2 = FindComponentPda(
  221. boltComponentPositionProgram.programId,
  222. entity2
  223. );
  224. await worldProgram.methods
  225. .initializeComponent()
  226. .accounts({
  227. payer: provider.wallet.publicKey,
  228. data: componentPositionEntity2,
  229. componentProgram: boltComponentPositionProgram.programId,
  230. entity: entity2,
  231. authority: boltComponentPositionProgram.programId,
  232. })
  233. .rpc();
  234. });
  235. it("Check Position on Entity 1 is default", async () => {
  236. expect(
  237. (
  238. await boltComponentPositionProgram.account.position.fetch(
  239. componentPositionEntity1
  240. )
  241. ).x.toNumber()
  242. ).to.equal(0);
  243. expect(
  244. (
  245. await boltComponentPositionProgram.account.position.fetch(
  246. componentPositionEntity1
  247. )
  248. ).y.toNumber()
  249. ).to.equal(0);
  250. expect(
  251. (
  252. await boltComponentPositionProgram.account.position.fetch(
  253. componentPositionEntity1
  254. )
  255. ).z.toNumber()
  256. ).to.equal(0);
  257. });
  258. it("Simple Movement System and Up direction on Entity 1", async () => {
  259. const args = {
  260. direction: Direction.Up,
  261. };
  262. await worldProgram.methods
  263. .apply(serializeArgs(args)) // Move Up
  264. .accounts({
  265. componentProgram: boltComponentPositionProgram.programId,
  266. boltSystem: systemSimpleMovement,
  267. boltComponent: componentPositionEntity1,
  268. })
  269. .rpc();
  270. expect(
  271. (
  272. await boltComponentPositionProgram.account.position.fetch(
  273. componentPositionEntity1
  274. )
  275. ).y.toNumber()
  276. ).to.equal(1);
  277. const componentData =
  278. await boltComponentPositionProgram.account.position.fetch(
  279. componentPositionEntity1
  280. );
  281. const x = componentData.x.toNumber();
  282. const y = componentData.y.toNumber();
  283. const z = componentData.z.toNumber();
  284. console.log("+-----------------------------+");
  285. console.log("| Movement System: Entity 1 |");
  286. console.log("+----------------+------------+");
  287. console.log("| Coordinate | Value |");
  288. console.log("+----------------+------------+");
  289. console.log(`| X Position | ${String(x).padEnd(10, " ")} |`);
  290. console.log("| | |");
  291. console.log(`| Y Position | ${String(y).padEnd(10, " ")} |`);
  292. console.log("| | |");
  293. console.log(`| Z Position | ${String(z).padEnd(10, " ")} |`);
  294. console.log("+----------------+------------+");
  295. console.log("| |");
  296. console.log("+-----------------------------+");
  297. console.log("Component Position: ", componentPositionEntity1.toString());
  298. });
  299. it("Simple Movement System and Right direction on Entity 1", async () => {
  300. const args = {
  301. direction: Direction.Right,
  302. };
  303. await worldProgram.methods
  304. .apply(serializeArgs(args)) // Move Right
  305. .accounts({
  306. componentProgram: boltComponentPositionProgram.programId,
  307. boltSystem: systemSimpleMovement,
  308. boltComponent: componentPositionEntity1,
  309. })
  310. .rpc({ skipPreflight: true });
  311. expect(
  312. (
  313. await boltComponentPositionProgram.account.position.fetch(
  314. componentPositionEntity1
  315. )
  316. ).y.toNumber()
  317. ).to.equal(1);
  318. expect(
  319. (
  320. await boltComponentPositionProgram.account.position.fetch(
  321. componentPositionEntity1
  322. )
  323. ).y.toNumber()
  324. ).to.equal(1);
  325. const componentData =
  326. await boltComponentPositionProgram.account.position.fetch(
  327. componentPositionEntity1
  328. );
  329. const x = componentData.x.toNumber();
  330. const y = componentData.y.toNumber();
  331. const z = componentData.z.toNumber();
  332. console.log("+-----------------------------+");
  333. console.log("| Movement System: Entity 1 |");
  334. console.log("+----------------+------------+");
  335. console.log("| Coordinate | Value |");
  336. console.log("+----------------+------------+");
  337. console.log(`| X Position | ${String(x).padEnd(10, " ")} |`);
  338. console.log("| | |");
  339. console.log(`| Y Position | ${String(y).padEnd(10, " ")} |`);
  340. console.log("| | |");
  341. console.log(`| Z Position | ${String(z).padEnd(10, " ")} |`);
  342. console.log("+----------------+------------+");
  343. console.log("| |");
  344. console.log("+-----------------------------+");
  345. });
  346. it("Fly System on Entity 1", async () => {
  347. await worldProgram.methods
  348. .apply(Buffer.alloc(0)) // Move Up
  349. .accounts({
  350. componentProgram: boltComponentPositionProgram.programId,
  351. boltSystem: systemFly,
  352. boltComponent: componentPositionEntity1,
  353. })
  354. .rpc();
  355. expect(
  356. (
  357. await boltComponentPositionProgram.account.position.fetch(
  358. componentPositionEntity1
  359. )
  360. ).z.toNumber()
  361. ).to.equal(1);
  362. const componentData =
  363. await boltComponentPositionProgram.account.position.fetch(
  364. componentPositionEntity1
  365. );
  366. const x = componentData.x.toNumber();
  367. const y = componentData.y.toNumber();
  368. const z = componentData.z.toNumber();
  369. console.log("+-----------------------------+");
  370. console.log("| Fly: Position Entity 1 |");
  371. console.log("+----------------+------------+");
  372. console.log("| Coordinate | Value |");
  373. console.log("+----------------+------------+");
  374. console.log(`| X Position | ${String(x).padEnd(10, " ")} |`);
  375. console.log("| | |");
  376. console.log(`| Y Position | ${String(y).padEnd(10, " ")} |`);
  377. console.log("| | |");
  378. console.log(`| Z Position | ${String(z).padEnd(10, " ")} |`);
  379. console.log("+----------------+------------+");
  380. console.log("| |");
  381. console.log("+-----------------------------+");
  382. });
  383. it("Apply Velocity on Entity 1", async () => {
  384. await worldProgram.methods
  385. .apply2(Buffer.alloc(0))
  386. .accounts({
  387. componentProgram1: boltComponentVelocityProgram.programId,
  388. componentProgram2: boltComponentPositionProgram.programId,
  389. boltSystem: applyVelocity,
  390. boltComponent1: componentVelocityEntity1,
  391. boltComponent2: componentPositionEntity1,
  392. })
  393. .remainingAccounts([
  394. {
  395. pubkey: componentPositionEntity1,
  396. isWritable: false,
  397. isSigner: false,
  398. },
  399. ])
  400. .rpc();
  401. console.log("Component Velocity: ", componentVelocityEntity1.toBase58());
  402. let componentData =
  403. await boltComponentVelocityProgram.account.velocity.fetch(
  404. componentVelocityEntity1
  405. );
  406. let x = componentData.x.toNumber();
  407. let y = componentData.y.toNumber();
  408. let z = componentData.z.toNumber();
  409. const tmp = componentData.lastApplied.toNumber();
  410. console.log("+-----------------------------+");
  411. console.log("| Apply Velocity: Velocity Entity 1 |");
  412. console.log("+----------------+------------+");
  413. console.log("| Coordinate | Value |");
  414. console.log("+----------------+------------+");
  415. console.log(`| X Position | ${String(x).padEnd(10, " ")} |`);
  416. console.log("| | |");
  417. console.log(`| Y Position | ${String(y).padEnd(10, " ")} |`);
  418. console.log("| | |");
  419. console.log(`| Z Position | ${String(z).padEnd(10, " ")} |`);
  420. console.log("| | |");
  421. console.log(`| Timestamp | ${String(tmp).padEnd(10, " ")} |`);
  422. console.log("+----------------+------------+");
  423. console.log("| |");
  424. console.log("+-----------------------------+");
  425. let positionData =
  426. await boltComponentPositionProgram.account.position.fetch(
  427. componentPositionEntity1
  428. );
  429. x = positionData.x.toNumber();
  430. y = positionData.y.toNumber();
  431. z = positionData.z.toNumber();
  432. console.log("+-----------------------------+");
  433. console.log("| Apply Velocity: Position Entity 1 |");
  434. console.log("+----------------+------------+");
  435. console.log("| Coordinate | Value |");
  436. console.log("+----------------+------------+");
  437. console.log(`| X Position | ${String(x).padEnd(10, " ")} |`);
  438. console.log("| | |");
  439. console.log(`| Y Position | ${String(y).padEnd(10, " ")} |`);
  440. console.log("| | |");
  441. console.log(`| Z Position | ${String(z).padEnd(10, " ")} |`);
  442. console.log("+----------------+------------+");
  443. console.log("| |");
  444. console.log("+-----------------------------+");
  445. });
  446. });