bolt.ts 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  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. })
  165. .rpc();
  166. });
  167. it("Initialize Original Component on Entity 2, trough the world instance", async () => {
  168. let componentEntity2 = FindComponentPda(
  169. boltComponentProgramOrigin.programId,
  170. entity2,
  171. "origin-component"
  172. );
  173. await worldProgram.methods
  174. .initializeComponent()
  175. .accounts({
  176. payer: provider.wallet.publicKey,
  177. data: componentEntity2,
  178. componentProgram: boltComponentProgramOrigin.programId,
  179. entity: entity2,
  180. })
  181. .rpc();
  182. });
  183. it("Initialize Position Component on Entity 1", async () => {
  184. componentPositionEntity1 = FindComponentPda(
  185. boltComponentPositionProgram.programId,
  186. entity1
  187. );
  188. console.log("Component Position E1: ", componentPositionEntity1.toBase58());
  189. await worldProgram.methods
  190. .initializeComponent()
  191. .accounts({
  192. payer: provider.wallet.publicKey,
  193. data: componentPositionEntity1,
  194. componentProgram: boltComponentPositionProgram.programId,
  195. entity: entity1,
  196. })
  197. .rpc();
  198. });
  199. it("Initialize Velocity Component on Entity 1", async () => {
  200. componentVelocityEntity1 = FindComponentPda(
  201. boltComponentVelocityProgram.programId,
  202. entity1,
  203. "component-velocity"
  204. );
  205. await worldProgram.methods
  206. .initializeComponent()
  207. .accounts({
  208. payer: provider.wallet.publicKey,
  209. data: componentVelocityEntity1,
  210. componentProgram: boltComponentVelocityProgram.programId,
  211. entity: entity1,
  212. })
  213. .rpc();
  214. });
  215. it("Initialize Position Component on Entity 2", async () => {
  216. componentPositionEntity2 = FindComponentPda(
  217. boltComponentPositionProgram.programId,
  218. entity2
  219. );
  220. await worldProgram.methods
  221. .initializeComponent()
  222. .accounts({
  223. payer: provider.wallet.publicKey,
  224. data: componentPositionEntity2,
  225. componentProgram: boltComponentPositionProgram.programId,
  226. entity: entity2,
  227. })
  228. .rpc();
  229. });
  230. it("Check Position on Entity 1 is default", async () => {
  231. expect(
  232. (
  233. await boltComponentPositionProgram.account.position.fetch(
  234. componentPositionEntity1
  235. )
  236. ).x.toNumber()
  237. ).to.equal(0);
  238. expect(
  239. (
  240. await boltComponentPositionProgram.account.position.fetch(
  241. componentPositionEntity1
  242. )
  243. ).y.toNumber()
  244. ).to.equal(0);
  245. expect(
  246. (
  247. await boltComponentPositionProgram.account.position.fetch(
  248. componentPositionEntity1
  249. )
  250. ).z.toNumber()
  251. ).to.equal(0);
  252. });
  253. it("Simple Movement System and Up direction on Entity 1", async () => {
  254. const args = {
  255. direction: Direction.Up,
  256. };
  257. await worldProgram.methods
  258. .apply(serializeArgs(args)) // Move Up
  259. .accounts({
  260. componentProgram: boltComponentPositionProgram.programId,
  261. boltSystem: systemSimpleMovement,
  262. boltComponent: componentPositionEntity1,
  263. })
  264. .rpc({ skipPreflight: true });
  265. expect(
  266. (
  267. await boltComponentPositionProgram.account.position.fetch(
  268. componentPositionEntity1
  269. )
  270. ).y.toNumber()
  271. ).to.equal(1);
  272. const componentData =
  273. await boltComponentPositionProgram.account.position.fetch(
  274. componentPositionEntity1
  275. );
  276. const x = componentData.x.toNumber();
  277. const y = componentData.y.toNumber();
  278. const z = componentData.z.toNumber();
  279. console.log("+-----------------------------+");
  280. console.log("| Movement System: Entity 1 |");
  281. console.log("+----------------+------------+");
  282. console.log("| Coordinate | Value |");
  283. console.log("+----------------+------------+");
  284. console.log(`| X Position | ${String(x).padEnd(10, " ")} |`);
  285. console.log("| | |");
  286. console.log(`| Y Position | ${String(y).padEnd(10, " ")} |`);
  287. console.log("| | |");
  288. console.log(`| Z Position | ${String(z).padEnd(10, " ")} |`);
  289. console.log("+----------------+------------+");
  290. console.log("| |");
  291. console.log("+-----------------------------+");
  292. });
  293. it("Simple Movement System and Right direction on Entity 1", async () => {
  294. const args = {
  295. direction: Direction.Right,
  296. };
  297. await worldProgram.methods
  298. .apply(serializeArgs(args)) // Move Right
  299. .accounts({
  300. componentProgram: boltComponentPositionProgram.programId,
  301. boltSystem: systemSimpleMovement,
  302. boltComponent: componentPositionEntity1,
  303. })
  304. .rpc({ skipPreflight: true });
  305. expect(
  306. (
  307. await boltComponentPositionProgram.account.position.fetch(
  308. componentPositionEntity1
  309. )
  310. ).y.toNumber()
  311. ).to.equal(1);
  312. expect(
  313. (
  314. await boltComponentPositionProgram.account.position.fetch(
  315. componentPositionEntity1
  316. )
  317. ).y.toNumber()
  318. ).to.equal(1);
  319. const componentData =
  320. await boltComponentPositionProgram.account.position.fetch(
  321. componentPositionEntity1
  322. );
  323. const x = componentData.x.toNumber();
  324. const y = componentData.y.toNumber();
  325. const z = componentData.z.toNumber();
  326. console.log("+-----------------------------+");
  327. console.log("| Movement System: Entity 1 |");
  328. console.log("+----------------+------------+");
  329. console.log("| Coordinate | Value |");
  330. console.log("+----------------+------------+");
  331. console.log(`| X Position | ${String(x).padEnd(10, " ")} |`);
  332. console.log("| | |");
  333. console.log(`| Y Position | ${String(y).padEnd(10, " ")} |`);
  334. console.log("| | |");
  335. console.log(`| Z Position | ${String(z).padEnd(10, " ")} |`);
  336. console.log("+----------------+------------+");
  337. console.log("| |");
  338. console.log("+-----------------------------+");
  339. });
  340. it("Fly System on Entity 1", async () => {
  341. await worldProgram.methods
  342. .apply(Buffer.alloc(0)) // Move Up
  343. .accounts({
  344. componentProgram: boltComponentPositionProgram.programId,
  345. boltSystem: systemFly,
  346. boltComponent: componentPositionEntity1,
  347. })
  348. .rpc();
  349. expect(
  350. (
  351. await boltComponentPositionProgram.account.position.fetch(
  352. componentPositionEntity1
  353. )
  354. ).z.toNumber()
  355. ).to.equal(1);
  356. const componentData =
  357. await boltComponentPositionProgram.account.position.fetch(
  358. componentPositionEntity1
  359. );
  360. const x = componentData.x.toNumber();
  361. const y = componentData.y.toNumber();
  362. const z = componentData.z.toNumber();
  363. console.log("+-----------------------------+");
  364. console.log("| Fly: Position Entity 1 |");
  365. console.log("+----------------+------------+");
  366. console.log("| Coordinate | Value |");
  367. console.log("+----------------+------------+");
  368. console.log(`| X Position | ${String(x).padEnd(10, " ")} |`);
  369. console.log("| | |");
  370. console.log(`| Y Position | ${String(y).padEnd(10, " ")} |`);
  371. console.log("| | |");
  372. console.log(`| Z Position | ${String(z).padEnd(10, " ")} |`);
  373. console.log("+----------------+------------+");
  374. console.log("| |");
  375. console.log("+-----------------------------+");
  376. });
  377. it("Apply Velocity on Entity 1", async () => {
  378. await worldProgram.methods
  379. .apply2(Buffer.alloc(0))
  380. .accounts({
  381. componentProgram1: boltComponentVelocityProgram.programId,
  382. componentProgram2: boltComponentPositionProgram.programId,
  383. boltSystem: applyVelocity,
  384. boltComponent1: componentVelocityEntity1,
  385. boltComponent2: componentPositionEntity1,
  386. })
  387. .remainingAccounts([
  388. {
  389. pubkey: componentPositionEntity1,
  390. isWritable: false,
  391. isSigner: false,
  392. },
  393. ])
  394. .rpc();
  395. console.log("Component Velocity: ", componentVelocityEntity1.toBase58());
  396. let componentData =
  397. await boltComponentVelocityProgram.account.velocity.fetch(
  398. componentVelocityEntity1
  399. );
  400. let x = componentData.x.toNumber();
  401. let y = componentData.y.toNumber();
  402. let z = componentData.z.toNumber();
  403. const tmp = componentData.lastApplied.toNumber();
  404. console.log("+-----------------------------+");
  405. console.log("| Apply Velocity: Velocity Entity 1 |");
  406. console.log("+----------------+------------+");
  407. console.log("| Coordinate | Value |");
  408. console.log("+----------------+------------+");
  409. console.log(`| X Position | ${String(x).padEnd(10, " ")} |`);
  410. console.log("| | |");
  411. console.log(`| Y Position | ${String(y).padEnd(10, " ")} |`);
  412. console.log("| | |");
  413. console.log(`| Z Position | ${String(z).padEnd(10, " ")} |`);
  414. console.log("| | |");
  415. console.log(`| Timestamp | ${String(tmp).padEnd(10, " ")} |`);
  416. console.log("+----------------+------------+");
  417. console.log("| |");
  418. console.log("+-----------------------------+");
  419. let positionData =
  420. await boltComponentPositionProgram.account.position.fetch(
  421. componentPositionEntity1
  422. );
  423. x = positionData.x.toNumber();
  424. y = positionData.y.toNumber();
  425. z = positionData.z.toNumber();
  426. console.log("+-----------------------------+");
  427. console.log("| Apply Velocity: Position Entity 1 |");
  428. console.log("+----------------+------------+");
  429. console.log("| Coordinate | Value |");
  430. console.log("+----------------+------------+");
  431. console.log(`| X Position | ${String(x).padEnd(10, " ")} |`);
  432. console.log("| | |");
  433. console.log(`| Y Position | ${String(y).padEnd(10, " ")} |`);
  434. console.log("| | |");
  435. console.log(`| Z Position | ${String(z).padEnd(10, " ")} |`);
  436. console.log("+----------------+------------+");
  437. console.log("| |");
  438. console.log("+-----------------------------+");
  439. });
  440. });