@marinade.finance/bankrun-utils 2.4.3 → 2.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marinade.finance/bankrun-utils",
3
- "version": "2.4.3",
3
+ "version": "2.4.5",
4
4
  "description": "Bankrun library utilities",
5
5
  "repository": {
6
6
  "type": "git",
@@ -22,16 +22,16 @@
22
22
  "src"
23
23
  ],
24
24
  "devDependencies": {
25
- "@solana/web3.js": "^1.91.1",
26
- "@marinade.finance/web3js-common": "2.4.3",
27
- "solana-bankrun": "^0.2.0",
25
+ "@solana/web3.js": "^1.93.0",
26
+ "@marinade.finance/web3js-common": "2.4.5",
27
+ "solana-bankrun": "^0.3.0",
28
28
  "anchor-bankrun": "^0.3.0",
29
29
  "class-transformer": "^0.5.1"
30
30
  },
31
31
  "peerDependencies": {
32
- "@solana/web3.js": "^1.91.1",
33
- "@marinade.finance/web3js-common": "2.4.3",
34
- "solana-bankrun": "^0.2.0",
32
+ "@solana/web3.js": "^1.93.0",
33
+ "@marinade.finance/web3js-common": "2.4.5",
34
+ "solana-bankrun": "^0.3.0",
35
35
  "anchor-bankrun": "^0.3.0",
36
36
  "class-transformer": "^0.5.1"
37
37
  },
@@ -1 +1 @@
1
- {"version":3,"file":"bankrun.js","sourceRoot":"","sources":["../../../../../packages/lib/bankrun-utils/src/bankrun.ts"],"names":[],"mappings":";;;AAGO,KAAK,UAAU,cAAc,CAClC,QAAyB,EACzB,OAAkB;IAElB,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAC1E,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAA;AAChC,CAAC;AAND,wCAMC;AAED,oGAAoG;AACvF,QAAA,uBAAuB,GAAG,EAAE,CAAA;AACzC,4FAA4F;AAC5F,SAAgB,WAAW,CAAC,QAAyB,EAAE,KAAa;IAClE,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACjC,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,GACxD,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAA;IAC9C,IAAI,UAAkB,CAAA;IACtB,IAAI,WAAW,IAAI,gBAAgB,EAAE;QACnC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,GAAG,+BAAuB,CAAC,CAAA;KAChE;SAAM;QACL,UAAU;YACR,CAAC,WAAW,GAAG,gBAAgB,CAAC,GAAG,aAAa,GAAG,eAAe,CAAA;KACrE;IACD,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;AACzC,CAAC;AAZD,kCAYC;AAEM,KAAK,UAAU,eAAe,CAAC,QAAyB;IAC7D,MAAM,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;AACpC,CAAC;AAFD,0CAEC;AAEM,KAAK,UAAU,eAAe,CACnC,QAAyB,EACzB,UAAkB;IAElB,MAAM,SAAS,GAAG,CAAC,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC,GAAG,UAAU,CAAA;IAC7D,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;AAClC,CAAC;AAND,0CAMC;AAEM,KAAK,UAAU,YAAY,CAAC,QAAyB;IAC1D,OAAO,MAAM,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;AACtE,CAAC;AAFD,oCAEC;AAEM,KAAK,UAAU,cAAc,CAAC,QAAyB;IAC5D,MAAM,WAAW,GAAG,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAA;IACxE,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AACtD,CAAC;AAHD,wCAGC"}
1
+ {"version":3,"file":"bankrun.js","sourceRoot":"","sources":["../../../../../packages/lib/bankrun-utils/src/bankrun.ts"],"names":[],"mappings":";;;AAGO,KAAK,UAAU,cAAc,CAClC,QAAyB,EACzB,OAAkB;IAElB,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAC1E,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAA;AAChC,CAAC;AAND,wCAMC;AAED,oGAAoG;AACvF,QAAA,uBAAuB,GAAG,EAAE,CAAA;AACzC,4FAA4F;AAC5F,SAAgB,WAAW,CAAC,QAAyB,EAAE,KAAa;IAClE,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IACjC,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,GACxD,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAA;IAC9C,IAAI,UAAkB,CAAA;IACtB,IAAI,WAAW,IAAI,gBAAgB,EAAE,CAAC;QACpC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,GAAG,+BAAuB,CAAC,CAAA;IACjE,CAAC;SAAM,CAAC;QACN,UAAU;YACR,CAAC,WAAW,GAAG,gBAAgB,CAAC,GAAG,aAAa,GAAG,eAAe,CAAA;IACtE,CAAC;IACD,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;AACzC,CAAC;AAZD,kCAYC;AAEM,KAAK,UAAU,eAAe,CAAC,QAAyB;IAC7D,MAAM,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;AACpC,CAAC;AAFD,0CAEC;AAEM,KAAK,UAAU,eAAe,CACnC,QAAyB,EACzB,UAAkB;IAElB,MAAM,SAAS,GAAG,CAAC,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC,GAAG,UAAU,CAAA;IAC7D,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;AAClC,CAAC;AAND,0CAMC;AAEM,KAAK,UAAU,YAAY,CAAC,QAAyB;IAC1D,OAAO,MAAM,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;AACtE,CAAC;AAFD,oCAEC;AAEM,KAAK,UAAU,cAAc,CAAC,QAAyB;IAC5D,MAAM,WAAW,GAAG,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAA;IACxE,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AACtD,CAAC;AAHD,wCAGC"}
@@ -1 +1 @@
1
- {"version":3,"file":"extendedProvider.js","sourceRoot":"","sources":["../../../../../packages/lib/bankrun-utils/src/extendedProvider.ts"],"names":[],"mappings":";;;AAAA,mEAIwC;AACxC,6CAOwB;AACxB,mDAAgD;AAGhD,MAAa,uBACX,SAAQ,gCAAe;IAGvB,KAAK,CAAC,MAAM,CACV,OAAsC,EACtC,GAAG,IAIA;QAEH,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACzC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;QACf,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IAC3D,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAA;IAC9B,CAAC;CACF;AApBD,0DAoBC;AAEM,KAAK,UAAU,kBAAkB,CACtC,QAAyB;IAEzB,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAA;IAClE,MAAM,oBAAoB,GAAG,CAC3B,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAC7B,CAAA;IACX,OAAO,IAAI,qBAAW,CAAC;QACrB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS;QACnC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,aAAa;QACzC,oBAAoB;KACrB,CAAC,CAAA;AACJ,CAAC;AAZD,gDAYC;AAEM,KAAK,UAAU,gBAAgB,CACpC,QAAyB,EACzB,OAAsC,EACtC,GAAG,IAIA;IAEH,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IAC7C,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;IACf,OAAO,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;AACpD,CAAC;AAZD,4CAYC;AAEM,KAAK,UAAU,cAAc,CAClC,QAAyB,EACzB,OAAsC,EACtC,EAAe;IAEf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,IAAI,IAAA,gCAAgB,EAAC,MAAM,CAAC,EAAE;YAC5B,MAAM,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;SACjC;aAAM,IAAI,MAAM,YAAY,iBAAO,IAAI,WAAW,IAAI,MAAM,EAAE;YAC7D,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;SACvB;aAAM;YACL,MAAM,IAAI,KAAK,CACb,6DAA6D,GAAG,MAAM,CACvE,CAAA;SACF;KACF;IACD,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAA;AAClE,CAAC;AAjBD,wCAiBC"}
1
+ {"version":3,"file":"extendedProvider.js","sourceRoot":"","sources":["../../../../../packages/lib/bankrun-utils/src/extendedProvider.ts"],"names":[],"mappings":";;;AAAA,mEAIwC;AACxC,6CAOwB;AACxB,mDAAgD;AAGhD,MAAa,uBACX,SAAQ,gCAAe;IAGvB,KAAK,CAAC,MAAM,CACV,OAAsC,EACtC,GAAG,IAIA;QAEH,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAA;QACzC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;QACf,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;IAC3D,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAA;IAC9B,CAAC;CACF;AApBD,0DAoBC;AAEM,KAAK,UAAU,kBAAkB,CACtC,QAAyB;IAEzB,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,kBAAkB,EAAE,CAAA;IAClE,MAAM,oBAAoB,GAAG,CAC3B,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAC7B,CAAA;IACX,OAAO,IAAI,qBAAW,CAAC;QACrB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS;QACnC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,aAAa;QACzC,oBAAoB;KACrB,CAAC,CAAA;AACJ,CAAC;AAZD,gDAYC;AAEM,KAAK,UAAU,gBAAgB,CACpC,QAAyB,EACzB,OAAsC,EACtC,GAAG,IAIA;IAEH,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IAC7C,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAA;IACf,OAAO,MAAM,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;AACpD,CAAC;AAZD,4CAYC;AAEM,KAAK,UAAU,cAAc,CAClC,QAAyB,EACzB,OAAsC,EACtC,EAAe;IAEf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAA,gCAAgB,EAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;QAClC,CAAC;aAAM,IAAI,MAAM,YAAY,iBAAO,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;YAC9D,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CACb,6DAA6D,GAAG,MAAM,CACvE,CAAA;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAA;AAClE,CAAC;AAjBD,wCAiBC"}
package/src/testInit.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { PublicKey } from '@solana/web3.js';
2
- import { AccountInfoBytes, AddedAccount } from 'solana-bankrun';
2
+ import { AccountInfoBytes, AddedAccount, AddedProgram } from 'solana-bankrun';
3
3
  import 'reflect-metadata';
4
4
  import { BankrunExtendedProvider } from './extendedProvider';
5
5
  export declare class JsonAccountData {
@@ -14,5 +14,38 @@ export declare class JsonAccount {
14
14
  account: JsonAccountData;
15
15
  }
16
16
  export declare function toAccountInfoBytes(jsonAccount: JsonAccount): AccountInfoBytes;
17
- export declare function loadAccountsFromJson(directory: string): AddedAccount[];
18
- export declare function testInit(accountDirs?: string[]): Promise<BankrunExtendedProvider>;
17
+ export declare function loadAccountsFromDirectory(directory: string): AddedAccount[];
18
+ export declare function loadAccountFromJson(jsonPath: string): AddedAccount;
19
+ export type ProgramInputData = {
20
+ name: string;
21
+ path?: string;
22
+ pubkey: PublicKey;
23
+ };
24
+ export declare function loadPrograms(programs: ProgramInputData[]): AddedProgram[];
25
+ export declare function calculateRentExemption(dataSize: number): number;
26
+ /**
27
+ * Initializing the test with bankrun.
28
+ *
29
+ * @param accountDirs - expecting directory paths with '.json' files with account data within
30
+ * @param accounts - expecting JSON files provided with account data (one may override the pubkey of the account)
31
+ * @param programs - expecting the program data to be loaded, the program data is taken based on the provided name which has to be aligned with filename with suffix '.so'
32
+ * this came from how the solana-test-program loads the program data, on top of that it's possible to define path
33
+ * and some copy operation is done further.
34
+ * The 'name' and 'pubkey' is required as it's the way how the program is loaded in solana-test-program.
35
+ * The 'pubkey' is the pubkey the program will be registered at.
36
+ * The 'name' is used as target filename that is searched or 'path' copied to.
37
+ * The 'path' is optional and when provided the file is copied to place where the solana-test-program looks for the program data.
38
+ * see: https://github.com/solana-labs/solana/blob/v1.18.14/program-test/src/lib.rs#L428
39
+ */
40
+ export declare function testInit({ accountDirs, accounts, programs, }: {
41
+ accountDirs?: string[];
42
+ accounts?: {
43
+ pubkey?: PublicKey;
44
+ path: string;
45
+ }[];
46
+ programs?: {
47
+ name: string;
48
+ path?: string;
49
+ pubkey: PublicKey;
50
+ }[];
51
+ }): Promise<BankrunExtendedProvider>;
package/src/testInit.js CHANGED
@@ -5,17 +5,14 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
5
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
- var __importDefault = (this && this.__importDefault) || function (mod) {
9
- return (mod && mod.__esModule) ? mod : { "default": mod };
10
- };
11
8
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.testInit = exports.loadAccountsFromJson = exports.toAccountInfoBytes = exports.JsonAccount = exports.JsonAccountData = void 0;
9
+ exports.testInit = exports.calculateRentExemption = exports.loadPrograms = exports.loadAccountFromJson = exports.loadAccountsFromDirectory = exports.toAccountInfoBytes = exports.JsonAccount = exports.JsonAccountData = void 0;
13
10
  const web3_js_1 = require("@solana/web3.js");
14
11
  const solana_bankrun_1 = require("solana-bankrun");
15
12
  require("reflect-metadata");
16
13
  const class_transformer_1 = require("class-transformer");
17
14
  const fs_1 = require("fs");
18
- const path_1 = __importDefault(require("path"));
15
+ const path_1 = require("path");
19
16
  const extendedProvider_1 = require("./extendedProvider");
20
17
  // note: VsCode error:
21
18
  // https://github.com/microsoft/TypeScript/issues/52396#issuecomment-1409152884
@@ -64,30 +61,152 @@ function toAccountInfoBytes(jsonAccount) {
64
61
  };
65
62
  }
66
63
  exports.toAccountInfoBytes = toAccountInfoBytes;
67
- function loadAccountsFromJson(directory) {
64
+ function loadAccountsFromDirectory(directory) {
68
65
  const accounts = [];
69
- for (const jsonFile of (0, fs_1.readdirSync)(directory).filter(f => f.endsWith('.json'))) {
70
- const jsonPath = path_1.default.join(directory, jsonFile);
71
- const fileBuffer = (0, fs_1.readFileSync)(jsonPath);
72
- const parsedData = JSON.parse(fileBuffer.toString());
73
- const jsonAccount = (0, class_transformer_1.plainToInstance)(JsonAccount, parsedData);
74
- accounts.push(jsonAccount);
66
+ for (const jsonFile of (0, fs_1.readdirSync)(directory, {
67
+ recursive: true,
68
+ encoding: null,
69
+ }).filter(f => f.endsWith('.json'))) {
70
+ const jsonPath = (0, path_1.join)(directory, jsonFile);
71
+ const loadedAccount = loadAccountFromJson(jsonPath);
72
+ accounts.push(loadedAccount);
73
+ }
74
+ return accounts;
75
+ }
76
+ exports.loadAccountsFromDirectory = loadAccountsFromDirectory;
77
+ function loadAccountFromJson(jsonPath) {
78
+ const fileBuffer = (0, fs_1.readFileSync)(jsonPath);
79
+ const parsedData = JSON.parse(fileBuffer.toString());
80
+ const jsonAccount = (0, class_transformer_1.plainToInstance)(JsonAccount, parsedData);
81
+ return {
82
+ address: jsonAccount.pubkey,
83
+ info: toAccountInfoBytes(jsonAccount),
84
+ };
85
+ }
86
+ exports.loadAccountFromJson = loadAccountFromJson;
87
+ function loadPrograms(programs) {
88
+ const addedPrograms = [];
89
+ let hookDeleteDir = false;
90
+ const hookDeleteProgramNames = [];
91
+ // programs that should be loaded just by name based on the rules of the solana-test-program
92
+ programs
93
+ .filter(p => p.path === undefined)
94
+ .forEach(p => {
95
+ addedPrograms.push({
96
+ name: p.name,
97
+ programId: p.pubkey,
98
+ });
99
+ });
100
+ // programs that provided the path would be copied to the fixtures directory where
101
+ // the solana-test-program looks for the program data
102
+ // see: https://github.com/solana-labs/solana/blob/v1.18.14/program-test/src/lib.rs#L428
103
+ const fixturesPath = (0, path_1.join)(process.cwd(), 'tests', 'fixtures');
104
+ if (!(0, fs_1.existsSync)(fixturesPath)) {
105
+ (0, fs_1.mkdirSync)(fixturesPath, { recursive: true });
106
+ hookDeleteDir = true;
107
+ }
108
+ for (const { pubkey, path, name } of programs.filter(p => p.path !== undefined)) {
109
+ const programPath = path;
110
+ if (!(0, fs_1.existsSync)(programPath)) {
111
+ console.error(`bankrun startup: program ${pubkey.toBase58()} at path ${programPath} does not exist cannot be loaded`);
112
+ continue;
113
+ }
114
+ const fixturesProgramSoPath = (0, path_1.join)(fixturesPath, `${name}.so`);
115
+ if ((0, fs_1.existsSync)(fixturesProgramSoPath)) {
116
+ console.log(`bankrun startup: skipping to upload the program ${pubkey.toBase58()} from path ${path} to ${fixturesProgramSoPath} as it already exists`);
117
+ }
118
+ else {
119
+ console.debug('bankrun startup: copying program', fixturesProgramSoPath, 'to', fixturesProgramSoPath);
120
+ (0, fs_1.cpSync)(programPath, fixturesProgramSoPath);
121
+ hookDeleteProgramNames.push(fixturesProgramSoPath);
122
+ }
123
+ addedPrograms.push({
124
+ name,
125
+ programId: pubkey,
126
+ });
75
127
  }
76
- return accounts.map(jsonAccount => {
77
- return {
78
- address: jsonAccount.pubkey,
79
- info: toAccountInfoBytes(jsonAccount),
80
- };
128
+ // TODO: exit hooks somehow does not work in jest
129
+ registerCleanup(() => {
130
+ hookDeleteProgramNames.forEach(p => {
131
+ console.log('Deleting program file', p);
132
+ (0, fs_1.rmSync)(p);
133
+ });
134
+ if (hookDeleteDir) {
135
+ console.log('Deleting fixtures directory', fixturesPath);
136
+ (0, fs_1.rmSync)(fixturesPath, { recursive: true, force: true });
137
+ }
138
+ hookDeleteProgramNames.length = 0;
139
+ hookDeleteDir = false;
81
140
  });
141
+ return addedPrograms;
142
+ }
143
+ exports.loadPrograms = loadPrograms;
144
+ function registerCleanup(
145
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
146
+ exitHandler) {
147
+ // do something when app is closing
148
+ process.on('exit', exitHandler.bind(null, { cleanup: true }));
149
+ process.on('beforeExit', exitHandler.bind(null, { cleanup: true }));
150
+ process.on('disconnect', exitHandler.bind(null, { cleanup: true }));
151
+ process.on('terminate', exitHandler.bind(null, { cleanup: true }));
152
+ // catches ctrl+c event
153
+ process.on('SIGINT', exitHandler.bind(null, { exit: true }));
154
+ process.on('SIGQUIT', exitHandler.bind(null, { exit: true }));
155
+ // catches "kill pid" (for example: nodemon restart)
156
+ process.on('SIGUSR1', exitHandler.bind(null, { exit: true }));
157
+ process.on('SIGUSR2', exitHandler.bind(null, { exit: true }));
158
+ // catches uncaught exceptions
159
+ process.on('uncaughtException', exitHandler.bind(null, { exit: true }));
82
160
  }
83
- exports.loadAccountsFromJson = loadAccountsFromJson;
84
- // consider using as accountDirs: ./fixtures/accounts/
85
- async function testInit(accountDirs) {
161
+ /*
162
+ * This is a bit of assumption. The base data is taken from `solana rent` calls.
163
+ * Cannot find the real code of the getMinimumBalanceForRentExemption function.
164
+ *
165
+ * solana rent -um 0
166
+ * > Rent-exempt minimum: 0.00089088 SOL
167
+ * solana rent -um 1
168
+ * > Rent-exempt minimum: 0.00089784 SOL
169
+ */
170
+ function calculateRentExemption(dataSize) {
171
+ const basePaymentLamports = 890880;
172
+ const perByteLamports = 6960;
173
+ return basePaymentLamports + perByteLamports * dataSize;
174
+ }
175
+ exports.calculateRentExemption = calculateRentExemption;
176
+ /**
177
+ * Initializing the test with bankrun.
178
+ *
179
+ * @param accountDirs - expecting directory paths with '.json' files with account data within
180
+ * @param accounts - expecting JSON files provided with account data (one may override the pubkey of the account)
181
+ * @param programs - expecting the program data to be loaded, the program data is taken based on the provided name which has to be aligned with filename with suffix '.so'
182
+ * this came from how the solana-test-program loads the program data, on top of that it's possible to define path
183
+ * and some copy operation is done further.
184
+ * The 'name' and 'pubkey' is required as it's the way how the program is loaded in solana-test-program.
185
+ * The 'pubkey' is the pubkey the program will be registered at.
186
+ * The 'name' is used as target filename that is searched or 'path' copied to.
187
+ * The 'path' is optional and when provided the file is copied to place where the solana-test-program looks for the program data.
188
+ * see: https://github.com/solana-labs/solana/blob/v1.18.14/program-test/src/lib.rs#L428
189
+ */
190
+ async function testInit({ accountDirs, accounts, programs, }) {
86
191
  let additionalAccounts = [];
192
+ let additionalPrograms = [];
87
193
  if (accountDirs !== undefined) {
88
- additionalAccounts = accountDirs.flatMap(dir => loadAccountsFromJson(dir));
194
+ additionalAccounts = accountDirs.flatMap(loadAccountsFromDirectory);
195
+ }
196
+ if (accounts !== undefined) {
197
+ additionalAccounts.push(...accounts.flatMap(acc => {
198
+ const accountData = loadAccountFromJson(acc.path);
199
+ if (acc.pubkey !== undefined) {
200
+ // rewriting the address when passed in
201
+ accountData.address = acc.pubkey;
202
+ }
203
+ return accountData;
204
+ }));
205
+ }
206
+ if (programs !== undefined) {
207
+ additionalPrograms = loadPrograms(programs);
89
208
  }
90
- const context = await (0, solana_bankrun_1.startAnchor)('./', [], additionalAccounts);
209
+ const context = await (0, solana_bankrun_1.startAnchor)('./', additionalPrograms, additionalAccounts);
91
210
  return new extendedProvider_1.BankrunExtendedProvider(context);
92
211
  }
93
212
  exports.testInit = testInit;
@@ -1 +1 @@
1
- {"version":3,"file":"testInit.js","sourceRoot":"","sources":["../../../../../packages/lib/bankrun-utils/src/testInit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"testInit.js","sourceRoot":"","sources":["../../../../../packages/lib/bankrun-utils/src/testInit.ts"],"names":[],"mappings":"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"}