@elemental-stv-core/sdk 0.6.0 → 0.7.0

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.
@@ -330,8 +330,7 @@ async function buildBaseToJlpRebalance(args) {
330
330
  address: stvAddress,
331
331
  baseMint,
332
332
  lendProgram: stv.lendProgram,
333
- strategies: stv.strategies,
334
- strategyCount: stv.strategyCount,
333
+ strategy: stv.strategy,
335
334
  };
336
335
  const depositCtx = await (0, remaining_accounts_1.buildDepositToStrategyContext)(connection, vaultInfo);
337
336
  // Derive the JLPD strategy's position PDA in p-STV Core
@@ -16,40 +16,40 @@ import { GlobalConfig, Stv, WithdrawRequest, ManagerRole } from "./types";
16
16
  */
17
17
  export declare function deserializeGlobalConfig(data: Buffer): GlobalConfig;
18
18
  /**
19
- * STV — per-vault state. Total 664 bytes.
19
+ * STV — per-vault state. Total 664 bytes (v2 layout).
20
20
  *
21
21
  * Layout (offsets include the 8-byte discriminator):
22
22
  * [ 0.. 8] discriminator (sha256("account:Stv")[..8])
23
23
  * [ 8.. 40] baseMint Pubkey
24
24
  * [ 40.. 72] evMint Pubkey
25
- * [ 72..104] strategy Pubkey (legacy single-strategy slot)
25
+ * [ 72..104] strategy Pubkey (immutable strategy program)
26
26
  * [104..136] feeReceiver Pubkey
27
27
  * [136..168] lendProgram Pubkey (zero pubkey if lend not opted-in)
28
- * [168..488] strategies[10] [Pubkey; 10] (whitelisted strategy programs)
29
- * [488..496] vaultId u64
30
- * [496..504] reservedBase u64 (base reserved for pending claims)
31
- * [504..512] requestedBase u64 (base requested via request_withdraw)
32
- * [512..520] vaultCapacity u64 (0 = uncapped)
33
- * [520..528] minDeposit u64
34
- * [528..536] hwm u64 (high-water mark for perf fees)
35
- * [536..544] lastFeeTs u64 (last fee crystallization timestamp)
36
- * [544..552] epochPps u64 (locked PPS for current epoch claims)
37
- * [552..560] lastNav u64 (snapshot for the rate-limit window)
38
- * [560..568] dailyWithdrawnBase u64 (rate-limit accumulator)
39
- * [568..572] nextEpochTs u32
40
- * [572..576] epochSec u32
41
- * [576..580] currentEpochId u32
42
- * [580..584] pendingWithdrawals u32
43
- * [584..588] withdrawWindowStart u32
44
- * [588..590] mgmtFeeBps u16
45
- * [590..592] perfFeeBps u16
46
- * [592..594] flags u16 (FLAG_PAUSED / DEPOSITS_DISABLED / …)
47
- * [594..596] dailyWithdrawLimitBps u16
48
- * [596..597] strategyCount u8
49
- * [597..598] version u8
50
- * [598..599] bump u8
51
- * [599..600] _padding [u8; 1]
52
- * [600..664] _reserved [u8; 64]
28
+ * [168..248] childVaults[10] [u64; 10] (allocator child vault IDs)
29
+ * [248..256] vaultId u64
30
+ * [256..264] reservedBase u64 (base reserved for pending claims)
31
+ * [264..272] requestedBase u64 (base requested via request_withdraw)
32
+ * [272..280] vaultCapacity u64 (0 = uncapped)
33
+ * [280..288] minDeposit u64
34
+ * [288..296] hwm u64 (high-water mark for perf fees)
35
+ * [296..304] lastFeeTs u64 (last fee crystallization timestamp)
36
+ * [304..312] epochPps u64 (locked PPS for current epoch claims)
37
+ * [312..320] lastNav u64 (snapshot for the rate-limit window)
38
+ * [320..328] dailyWithdrawnBase u64 (rate-limit accumulator)
39
+ * [328..332] nextEpochTs u32
40
+ * [332..336] epochSec u32
41
+ * [336..340] currentEpochId u32
42
+ * [340..344] pendingWithdrawals u32
43
+ * [344..348] withdrawWindowStart u32
44
+ * [348..350] mgmtFeeBps u16
45
+ * [350..352] perfFeeBps u16
46
+ * [352..354] flags u16 (FLAG_PAUSED / DEPOSITS_DISABLED / …)
47
+ * [354..356] dailyWithdrawLimitBps u16
48
+ * [356..357] childVaultCount u8
49
+ * [357..358] version u8
50
+ * [358..359] bump u8
51
+ * [359..360] _padding [u8; 1]
52
+ * [360..664] _reserved [u8; 304]
53
53
  */
54
54
  export declare function deserializeStv(data: Buffer): Stv;
55
55
  /**
@@ -54,40 +54,40 @@ function deserializeGlobalConfig(data) {
54
54
  };
55
55
  }
56
56
  /**
57
- * STV — per-vault state. Total 664 bytes.
57
+ * STV — per-vault state. Total 664 bytes (v2 layout).
58
58
  *
59
59
  * Layout (offsets include the 8-byte discriminator):
60
60
  * [ 0.. 8] discriminator (sha256("account:Stv")[..8])
61
61
  * [ 8.. 40] baseMint Pubkey
62
62
  * [ 40.. 72] evMint Pubkey
63
- * [ 72..104] strategy Pubkey (legacy single-strategy slot)
63
+ * [ 72..104] strategy Pubkey (immutable strategy program)
64
64
  * [104..136] feeReceiver Pubkey
65
65
  * [136..168] lendProgram Pubkey (zero pubkey if lend not opted-in)
66
- * [168..488] strategies[10] [Pubkey; 10] (whitelisted strategy programs)
67
- * [488..496] vaultId u64
68
- * [496..504] reservedBase u64 (base reserved for pending claims)
69
- * [504..512] requestedBase u64 (base requested via request_withdraw)
70
- * [512..520] vaultCapacity u64 (0 = uncapped)
71
- * [520..528] minDeposit u64
72
- * [528..536] hwm u64 (high-water mark for perf fees)
73
- * [536..544] lastFeeTs u64 (last fee crystallization timestamp)
74
- * [544..552] epochPps u64 (locked PPS for current epoch claims)
75
- * [552..560] lastNav u64 (snapshot for the rate-limit window)
76
- * [560..568] dailyWithdrawnBase u64 (rate-limit accumulator)
77
- * [568..572] nextEpochTs u32
78
- * [572..576] epochSec u32
79
- * [576..580] currentEpochId u32
80
- * [580..584] pendingWithdrawals u32
81
- * [584..588] withdrawWindowStart u32
82
- * [588..590] mgmtFeeBps u16
83
- * [590..592] perfFeeBps u16
84
- * [592..594] flags u16 (FLAG_PAUSED / DEPOSITS_DISABLED / …)
85
- * [594..596] dailyWithdrawLimitBps u16
86
- * [596..597] strategyCount u8
87
- * [597..598] version u8
88
- * [598..599] bump u8
89
- * [599..600] _padding [u8; 1]
90
- * [600..664] _reserved [u8; 64]
66
+ * [168..248] childVaults[10] [u64; 10] (allocator child vault IDs)
67
+ * [248..256] vaultId u64
68
+ * [256..264] reservedBase u64 (base reserved for pending claims)
69
+ * [264..272] requestedBase u64 (base requested via request_withdraw)
70
+ * [272..280] vaultCapacity u64 (0 = uncapped)
71
+ * [280..288] minDeposit u64
72
+ * [288..296] hwm u64 (high-water mark for perf fees)
73
+ * [296..304] lastFeeTs u64 (last fee crystallization timestamp)
74
+ * [304..312] epochPps u64 (locked PPS for current epoch claims)
75
+ * [312..320] lastNav u64 (snapshot for the rate-limit window)
76
+ * [320..328] dailyWithdrawnBase u64 (rate-limit accumulator)
77
+ * [328..332] nextEpochTs u32
78
+ * [332..336] epochSec u32
79
+ * [336..340] currentEpochId u32
80
+ * [340..344] pendingWithdrawals u32
81
+ * [344..348] withdrawWindowStart u32
82
+ * [348..350] mgmtFeeBps u16
83
+ * [350..352] perfFeeBps u16
84
+ * [352..354] flags u16 (FLAG_PAUSED / DEPOSITS_DISABLED / …)
85
+ * [354..356] dailyWithdrawLimitBps u16
86
+ * [356..357] childVaultCount u8
87
+ * [357..358] version u8
88
+ * [358..359] bump u8
89
+ * [359..360] _padding [u8; 1]
90
+ * [360..664] _reserved [u8; 304]
91
91
  */
92
92
  function deserializeStv(data) {
93
93
  if (data.length < constants_1.STV_SIZE) {
@@ -97,9 +97,9 @@ function deserializeStv(data) {
97
97
  if (!disc.equals(constants_1.DISC_STV)) {
98
98
  throw new Error(`Invalid Stv discriminator`);
99
99
  }
100
- const strategies = [];
100
+ const childVaults = [];
101
101
  for (let i = 0; i < constants_1.MAX_STRATEGIES; i++) {
102
- strategies.push((0, buffer_1.readPubkey)(data, 168 + i * 32));
102
+ childVaults.push((0, buffer_1.readU64)(data, 168 + i * 8));
103
103
  }
104
104
  return {
105
105
  baseMint: (0, buffer_1.readPubkey)(data, 8),
@@ -107,29 +107,29 @@ function deserializeStv(data) {
107
107
  strategy: (0, buffer_1.readPubkey)(data, 72),
108
108
  feeReceiver: (0, buffer_1.readPubkey)(data, 104),
109
109
  lendProgram: (0, buffer_1.readPubkey)(data, 136),
110
- strategies,
111
- vaultId: (0, buffer_1.readU64)(data, 488),
112
- reservedBase: (0, buffer_1.readU64)(data, 496),
113
- requestedBase: (0, buffer_1.readU64)(data, 504),
114
- vaultCapacity: (0, buffer_1.readU64)(data, 512),
115
- minDeposit: (0, buffer_1.readU64)(data, 520),
116
- hwm: (0, buffer_1.readU64)(data, 528),
117
- lastFeeTs: (0, buffer_1.readU64)(data, 536),
118
- epochPps: (0, buffer_1.readU64)(data, 544),
119
- lastNav: (0, buffer_1.readU64)(data, 552),
120
- dailyWithdrawnBase: (0, buffer_1.readU64)(data, 560),
121
- nextEpochTs: (0, buffer_1.readU32)(data, 568),
122
- epochSec: (0, buffer_1.readU32)(data, 572),
123
- currentEpochId: (0, buffer_1.readU32)(data, 576),
124
- pendingWithdrawals: (0, buffer_1.readU32)(data, 580),
125
- withdrawWindowStart: (0, buffer_1.readU32)(data, 584),
126
- mgmtFeeBps: (0, buffer_1.readU16)(data, 588),
127
- perfFeeBps: (0, buffer_1.readU16)(data, 590),
128
- flags: (0, buffer_1.readU16)(data, 592),
129
- dailyWithdrawLimitBps: (0, buffer_1.readU16)(data, 594),
130
- strategyCount: (0, buffer_1.readU8)(data, 596),
131
- version: (0, buffer_1.readU8)(data, 597),
132
- bump: (0, buffer_1.readU8)(data, 598),
110
+ childVaults,
111
+ vaultId: (0, buffer_1.readU64)(data, 248),
112
+ reservedBase: (0, buffer_1.readU64)(data, 256),
113
+ requestedBase: (0, buffer_1.readU64)(data, 264),
114
+ vaultCapacity: (0, buffer_1.readU64)(data, 272),
115
+ minDeposit: (0, buffer_1.readU64)(data, 280),
116
+ hwm: (0, buffer_1.readU64)(data, 288),
117
+ lastFeeTs: (0, buffer_1.readU64)(data, 296),
118
+ epochPps: (0, buffer_1.readU64)(data, 304),
119
+ lastNav: (0, buffer_1.readU64)(data, 312),
120
+ dailyWithdrawnBase: (0, buffer_1.readU64)(data, 320),
121
+ nextEpochTs: (0, buffer_1.readU32)(data, 328),
122
+ epochSec: (0, buffer_1.readU32)(data, 332),
123
+ currentEpochId: (0, buffer_1.readU32)(data, 336),
124
+ pendingWithdrawals: (0, buffer_1.readU32)(data, 340),
125
+ withdrawWindowStart: (0, buffer_1.readU32)(data, 344),
126
+ mgmtFeeBps: (0, buffer_1.readU16)(data, 348),
127
+ perfFeeBps: (0, buffer_1.readU16)(data, 350),
128
+ flags: (0, buffer_1.readU16)(data, 352),
129
+ dailyWithdrawLimitBps: (0, buffer_1.readU16)(data, 354),
130
+ childVaultCount: (0, buffer_1.readU8)(data, 356),
131
+ version: (0, buffer_1.readU8)(data, 357),
132
+ bump: (0, buffer_1.readU8)(data, 358),
133
133
  };
134
134
  }
135
135
  /**
@@ -56,6 +56,7 @@ export declare const FLAG_ALLOCATOR = 32;
56
56
  */
57
57
  export declare const CFG_FLAG_GLOBAL_PAUSED = 1;
58
58
  export { PPS_DECIMALS, BPS_DENOMINATOR, STALENESS_THRESHOLD } from "../common/constants";
59
+ export declare const MAX_CHILD_VAULTS = 10;
59
60
  export declare const MAX_STRATEGIES = 10;
60
61
  export declare const FEE_CAP_BPS = 9900;
61
62
  export declare const GLOBAL_CONFIG_SIZE = 56;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BPS_DENOMINATOR = exports.PPS_DECIMALS = exports.CFG_FLAG_GLOBAL_PAUSED = exports.FLAG_ALLOCATOR = exports.FLAG_TEST_MODE = exports.FLAG_REBALANCE_DISABLED = exports.FLAG_WITHDRAWALS_DISABLED = exports.FLAG_DEPOSITS_DISABLED = exports.FLAG_PAUSED = exports.EVT_LEND_MIGRATED = exports.EVT_WITHDRAW_OVERRIDE_CLAIMED = exports.EVT_MANAGER_REMOVED = exports.EVT_MANAGER_ADDED = exports.EVT_STV_CLOSED = exports.EVT_FEES_SETTLED = exports.EVT_EPOCH_ADVANCED = exports.EVT_EPOCH_PROCESSED = exports.EVT_WITHDRAWN_FROM_STRATEGY = exports.EVT_DEPOSITED_TO_STRATEGY = exports.EVT_WITHDRAW_CLAIMED = exports.EVT_WITHDRAW_REQUEST_INCREASED = exports.EVT_WITHDRAW_REQUESTED = exports.EVT_DEPOSITED = exports.EVT_STV_UPDATED = exports.EVT_STV_CREATED = exports.EVT_CONFIG_UPDATED = exports.EVT_CONFIG_INITIALIZED = exports.IX_MIGRATE_LEND = exports.IX_OVERRIDE_CLAIM_WITHDRAW = exports.IX_REMOVE_MANAGER = exports.IX_ADD_MANAGER = exports.IX_CLOSE_STV = exports.IX_WITHDRAW_FROM_STRATEGY = exports.IX_DEPOSIT_TO_STRATEGY = exports.IX_PROCESS_EPOCH = exports.IX_CLAIM_WITHDRAW = exports.IX_REQUEST_WITHDRAW = exports.IX_DEPOSIT = exports.IX_INIT_OR_UPDATE_STV = exports.IX_INIT_OR_UPDATE_CONFIG = exports.DISC_MANAGER_ROLE = exports.DISC_WITHDRAW_REQUEST = exports.DISC_STV = exports.DISC_GLOBAL_CONFIG = exports.MANAGER_SEED = exports.WITHDRAW_REQUEST_SEED = exports.EV_MINT_SEED = exports.STV_SEED = exports.CONFIG_SEED = exports.PROGRAM_ID = void 0;
4
- exports.MANAGER_ROLE_SIZE = exports.WITHDRAW_REQUEST_SIZE = exports.STV_SIZE = exports.GLOBAL_CONFIG_SIZE = exports.FEE_CAP_BPS = exports.MAX_STRATEGIES = exports.STALENESS_THRESHOLD = void 0;
4
+ exports.MANAGER_ROLE_SIZE = exports.WITHDRAW_REQUEST_SIZE = exports.STV_SIZE = exports.GLOBAL_CONFIG_SIZE = exports.FEE_CAP_BPS = exports.MAX_STRATEGIES = exports.MAX_CHILD_VAULTS = exports.STALENESS_THRESHOLD = void 0;
5
5
  const web3_js_1 = require("@solana/web3.js");
6
6
  // ---------------------------------------------------------------------------
7
7
  // Program ID
@@ -94,7 +94,8 @@ var constants_2 = require("../common/constants");
94
94
  Object.defineProperty(exports, "PPS_DECIMALS", { enumerable: true, get: function () { return constants_2.PPS_DECIMALS; } });
95
95
  Object.defineProperty(exports, "BPS_DENOMINATOR", { enumerable: true, get: function () { return constants_2.BPS_DENOMINATOR; } });
96
96
  Object.defineProperty(exports, "STALENESS_THRESHOLD", { enumerable: true, get: function () { return constants_2.STALENESS_THRESHOLD; } });
97
- exports.MAX_STRATEGIES = 10;
97
+ exports.MAX_CHILD_VAULTS = 10;
98
+ exports.MAX_STRATEGIES = exports.MAX_CHILD_VAULTS; // backward compat
98
99
  exports.FEE_CAP_BPS = 9900;
99
100
  // ---------------------------------------------------------------------------
100
101
  // Account Sizes
@@ -54,7 +54,7 @@ function parseEventsFromLogs(logs, programId = constants_1.PROGRAM_ID) {
54
54
  * StvUpdated [0..1] disc | [1..9] vaultId | [9..41] feeReceiver |
55
55
  * [41..43] flags | [43..45] mgmtFeeBps | [45..47] perfFeeBps |
56
56
  * [47..55] vaultCapacity | [55..63] minDeposit |
57
- * [63..64] strategyCount | [64..96] lendProgram
57
+ * [63..64] childVaultCount | [64..96] lendProgram
58
58
  * Deposited [0..1] disc | [1..9] vaultId | [9..41] user |
59
59
  * [41..49] amount | [49..57] sharesMinted | [57..65] pps
60
60
  * WithdrawRequested [0..1] disc | [1..9] vaultId | [9..41] user |
@@ -100,7 +100,7 @@ function parseEventBuffer(data) {
100
100
  name: "StvUpdated", vaultId: (0, buffer_1.readU64)(data, 1), feeReceiver: (0, buffer_1.readPubkey)(data, 9),
101
101
  flags: (0, buffer_1.readU16)(data, 41), mgmtFeeBps: (0, buffer_1.readU16)(data, 43),
102
102
  perfFeeBps: (0, buffer_1.readU16)(data, 45), vaultCapacity: (0, buffer_1.readU64)(data, 47), minDeposit: (0, buffer_1.readU64)(data, 55),
103
- strategyCount: data[63], lendProgram: (0, buffer_1.readPubkey)(data, 64),
103
+ childVaultCount: data[63], lendProgram: (0, buffer_1.readPubkey)(data, 64),
104
104
  } : null;
105
105
  case constants_1.EVT_DEPOSITED:
106
106
  return data.length >= 65 ? {
@@ -17,10 +17,8 @@ export interface VaultInfo {
17
17
  baseMint: PublicKey;
18
18
  /** Lend program (PublicKey.default if not active) */
19
19
  lendProgram: PublicKey;
20
- /** Strategy program keys (10-element array) */
21
- strategies: PublicKey[];
22
- /** Number of active strategies */
23
- strategyCount: number;
20
+ /** Immutable strategy program (PublicKey.default if none) */
21
+ strategy: PublicKey;
24
22
  }
25
23
  export interface DepositContext {
26
24
  remainingAccounts: AccountMeta[];
@@ -47,24 +47,17 @@ function buildFixedLendAccounts(lendProgram, baseMint, stvAddress) {
47
47
  }
48
48
  /**
49
49
  * Build strategy pair accounts for NAV computation.
50
- * For each active strategy: [strategy_state, stv_position, strategy_program (deduplicated)]
50
+ * Strategy-locked vaults have a single strategy: [strategy_state, stv_position].
51
51
  */
52
52
  function buildStrategyPairAccounts(vault) {
53
- const accounts = [];
54
- if (vault.strategyCount === 0)
55
- return accounts;
56
- for (let i = 0; i < vault.strategyCount; i++) {
57
- const strategyProgram = vault.strategies[i];
58
- if (isDefault(strategyProgram))
59
- continue;
60
- const [stratState] = web3_js_1.PublicKey.findProgramAddressSync([STRATEGY_STATE_SEED, vault.baseMint.toBuffer()], strategyProgram);
61
- const [stratPos] = web3_js_1.PublicKey.findProgramAddressSync([POSITION_SEED, vault.address.toBuffer()], strategyProgram);
62
- accounts.push({ pubkey: stratState, isSigner: false, isWritable: true }, { pubkey: stratPos, isSigner: false, isWritable: true });
63
- // Note: strategy program is NOT added to remaining_accounts.
64
- // The on-chain code expects exactly 2 accounts per strategy (state + position).
65
- // The strategy program resolves from the transaction's account list via invoke_signed.
66
- }
67
- return accounts;
53
+ if (isDefault(vault.strategy))
54
+ return [];
55
+ const [stratState] = web3_js_1.PublicKey.findProgramAddressSync([STRATEGY_STATE_SEED, vault.baseMint.toBuffer()], vault.strategy);
56
+ const [stratPos] = web3_js_1.PublicKey.findProgramAddressSync([POSITION_SEED, vault.address.toBuffer()], vault.strategy);
57
+ return [
58
+ { pubkey: stratState, isSigner: false, isWritable: true },
59
+ { pubkey: stratPos, isSigner: false, isWritable: true },
60
+ ];
68
61
  }
69
62
  /**
70
63
  */
@@ -136,19 +129,10 @@ async function buildDepositContext(connection, vault, payer) {
136
129
  // Skip auto-route if account resolution fails
137
130
  }
138
131
  }
139
- // 4. Strategy programs (after auto-route, for CPI resolution)
140
- // These must be in the transaction but are NOT counted as auto-route or strategy pairs.
141
- // The on-chain code uses auto_route_count to bound the auto-route slice.
142
- const seenPrograms = new Set();
143
- for (let i = 0; i < vault.strategyCount; i++) {
144
- const prog = vault.strategies[i];
145
- if (isDefault(prog))
146
- continue;
147
- const key = prog.toBase58();
148
- if (!seenPrograms.has(key)) {
149
- seenPrograms.add(key);
150
- remainingAccounts.push({ pubkey: prog, isSigner: false, isWritable: false });
151
- }
132
+ // 4. Strategy program (after auto-route, for CPI resolution)
133
+ // Must be in the transaction but NOT counted as auto-route or strategy pairs.
134
+ if (!isDefault(vault.strategy)) {
135
+ remainingAccounts.push({ pubkey: vault.strategy, isSigner: false, isWritable: false });
152
136
  }
153
137
  return { remainingAccounts, protocolAumCount, autoRouteCount, preInstructions };
154
138
  }
@@ -13,7 +13,7 @@ export interface Stv {
13
13
  strategy: PublicKey;
14
14
  feeReceiver: PublicKey;
15
15
  lendProgram: PublicKey;
16
- strategies: PublicKey[];
16
+ childVaults: BN[];
17
17
  vaultId: BN;
18
18
  reservedBase: BN;
19
19
  requestedBase: BN;
@@ -33,7 +33,7 @@ export interface Stv {
33
33
  perfFeeBps: number;
34
34
  flags: number;
35
35
  dailyWithdrawLimitBps: number;
36
- strategyCount: number;
36
+ childVaultCount: number;
37
37
  version: number;
38
38
  bump: number;
39
39
  }
@@ -81,7 +81,7 @@ export interface StvUpdatedEvent {
81
81
  perfFeeBps: number;
82
82
  vaultCapacity: BN;
83
83
  minDeposit: BN;
84
- strategyCount: number;
84
+ childVaultCount: number;
85
85
  lendProgram: PublicKey;
86
86
  }
87
87
  export interface DepositedEvent {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elemental-stv-core/sdk",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "TypeScript SDK for Elemental Vaults — p-STV Core, Elemental Lend, JLPD Strategy",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [