@xgamesfun/solana 0.0.0-stage → 0.24.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.
Files changed (138) hide show
  1. package/DISCLAIMER.md +41 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +13 -0
  4. package/README.md +172 -2
  5. package/bin/xsolana.mjs +189 -0
  6. package/examples/artwork-auction.json +51 -0
  7. package/examples/blind-forge.json +128 -0
  8. package/examples/coin-flip-arena.json +103 -0
  9. package/examples/duel-arena.json +137 -0
  10. package/examples/elements-set.json +274 -0
  11. package/examples/event-badges.json +67 -0
  12. package/examples/expedition-guild.json +154 -0
  13. package/examples/fair-presale.json +48 -0
  14. package/examples/falling-drop.json +90 -0
  15. package/examples/guild-missions.json +137 -0
  16. package/examples/halving-seasons.json +107 -0
  17. package/examples/hero-trials.json +93 -0
  18. package/examples/ideas.json +789 -0
  19. package/examples/level-ladder.json +65 -0
  20. package/examples/merge-2048.json +128 -0
  21. package/examples/nft-raffle.json +33 -0
  22. package/examples/paper-hands-farm.json +44 -0
  23. package/examples/partner-vault.json +112 -0
  24. package/examples/sacrifice-raffle.json +118 -0
  25. package/examples/scorched-treasury.json +84 -0
  26. package/examples/shelter-fair.json +164 -0
  27. package/examples/spark-pity.json +153 -0
  28. package/examples/stakers-draw.json +118 -0
  29. package/examples/star-fleet.json +150 -0
  30. package/examples/starforce.json +116 -0
  31. package/examples/stud-farm.json +134 -0
  32. package/examples/team-vesting.json +70 -0
  33. package/examples/trade-in-shop.json +168 -0
  34. package/js/approve/details.mjs +263 -0
  35. package/js/approve/ed25519.mjs +36 -0
  36. package/js/approve/live-check.mjs +144 -0
  37. package/js/approve/page.html +86 -0
  38. package/js/approve/page.js +203 -0
  39. package/js/approve/server.mjs +726 -0
  40. package/js/chain/base58.js +73 -0
  41. package/js/chain/borsh.js +270 -0
  42. package/js/chain/bytes.js +141 -0
  43. package/js/chain/core.js +181 -0
  44. package/js/chain/curve.js +52 -0
  45. package/js/chain/lookup.js +279 -0
  46. package/js/chain/mint.js +96 -0
  47. package/js/chain/pda.js +66 -0
  48. package/js/chain/programs.js +102 -0
  49. package/js/chain/rpc.js +219 -0
  50. package/js/chain/sha256.js +68 -0
  51. package/js/chain/token.js +85 -0
  52. package/js/chain/token2022.js +247 -0
  53. package/js/chain/tx.js +224 -0
  54. package/js/client/accounts.js +679 -0
  55. package/js/client/compressed.js +46 -0
  56. package/js/client/grant.js +299 -0
  57. package/js/client/idl/loot.js +2 -0
  58. package/js/client/idl/loot.json +17206 -0
  59. package/js/client/index.js +10 -0
  60. package/js/client/ix.js +2887 -0
  61. package/js/client/pda.js +114 -0
  62. package/js/client/policy.js +69 -0
  63. package/js/client/random.js +70 -0
  64. package/js/client/sizes.js +297 -0
  65. package/js/client/traits.js +44 -0
  66. package/js/connect/connect.mjs +182 -0
  67. package/js/economy/check.mjs +2236 -0
  68. package/js/economy/cost.mjs +185 -0
  69. package/js/economy/examples.mjs +114 -0
  70. package/js/economy/explain.mjs +239 -0
  71. package/js/economy/guide.mjs +232 -0
  72. package/js/economy/legal.mjs +15 -0
  73. package/js/economy/live.mjs +130 -0
  74. package/js/economy/model.mjs +698 -0
  75. package/js/economy/plan.mjs +1155 -0
  76. package/js/economy/schema.json +3071 -0
  77. package/js/economy/secrets.mjs +60 -0
  78. package/js/economy/simulate.mjs +1019 -0
  79. package/js/economy/txsize.mjs +45 -0
  80. package/js/economy/validate.mjs +85 -0
  81. package/js/index.js +10 -0
  82. package/js/mcp/server.mjs +113 -0
  83. package/js/mcp/tools.mjs +485 -0
  84. package/js/play/index.js +2855 -0
  85. package/js/play/keys.js +167 -0
  86. package/js/results/index.js +184 -0
  87. package/js/results/wire.js +90 -0
  88. package/package.json +100 -4
  89. package/release.json +8 -0
  90. package/skills/xsolana-economy/SKILL.md +109 -0
  91. package/skills/xsolana-economy/references/after-launch.md +124 -0
  92. package/skills/xsolana-economy/references/apps.md +193 -0
  93. package/skills/xsolana-economy/references/sentence-to-spec.md +180 -0
  94. package/skills/xsolana-economy/references/telling-the-person.md +134 -0
  95. package/types/chain/base58.d.ts +10 -0
  96. package/types/chain/borsh.d.ts +23 -0
  97. package/types/chain/bytes.d.ts +45 -0
  98. package/types/chain/core.d.ts +52 -0
  99. package/types/chain/curve.d.ts +1 -0
  100. package/types/chain/lookup.d.ts +194 -0
  101. package/types/chain/mint.d.ts +25 -0
  102. package/types/chain/pda.d.ts +25 -0
  103. package/types/chain/programs.d.ts +65 -0
  104. package/types/chain/rpc.d.ts +68 -0
  105. package/types/chain/sha256.d.ts +1 -0
  106. package/types/chain/token.d.ts +141 -0
  107. package/types/chain/token2022.d.ts +53 -0
  108. package/types/chain/tx.d.ts +60 -0
  109. package/types/client/accounts.d.ts +318 -0
  110. package/types/client/compressed.d.ts +29 -0
  111. package/types/client/grant.d.ts +170 -0
  112. package/types/client/idl/loot.d.ts +4498 -0
  113. package/types/client/index.d.ts +9 -0
  114. package/types/client/ix.d.ts +5315 -0
  115. package/types/client/pda.d.ts +95 -0
  116. package/types/client/policy.d.ts +48 -0
  117. package/types/client/random.d.ts +26 -0
  118. package/types/client/sizes.d.ts +101 -0
  119. package/types/client/traits.d.ts +12 -0
  120. package/types/economy/check.d.mts +100 -0
  121. package/types/economy/cost.d.mts +69 -0
  122. package/types/economy/examples.d.mts +27 -0
  123. package/types/economy/explain.d.mts +19 -0
  124. package/types/economy/guide.d.mts +140 -0
  125. package/types/economy/legal.d.mts +12 -0
  126. package/types/economy/live.d.mts +124 -0
  127. package/types/economy/model.d.mts +431 -0
  128. package/types/economy/plan.d.mts +1014 -0
  129. package/types/economy/secrets.d.mts +4 -0
  130. package/types/economy/simulate.d.mts +164 -0
  131. package/types/economy/txsize.d.mts +17 -0
  132. package/types/economy/validate.d.mts +3 -0
  133. package/types/index.d.ts +9 -0
  134. package/types/mcp/tools.d.mts +635 -0
  135. package/types/play/index.d.ts +880 -0
  136. package/types/play/keys.d.ts +51 -0
  137. package/types/results/index.d.ts +155 -0
  138. package/types/results/wire.d.ts +122 -0
@@ -0,0 +1,60 @@
1
+ // Nothing secret ever goes in an economy: it is public. These patterns catch a key, a keypair file, a seed phrase
2
+ // or a keyed RPC link before it is saved or published. Pure.
3
+ import { isSignature } from '../chain/base58.js';
4
+
5
+ /** The names only a credential goes by. */
6
+ const CREDENTIAL_ONLY = 'api[-_ ]?key|apikey|private[-_ ]?key|secret[-_ ]?key|seed[-_ ]?phrase|mnemonic|access[-_ ]?token|auth[-_ ]?token';
7
+ /** Every name a credential goes by, ordinary words ("secret", "bearer") included: a field named so holds one. */
8
+ const CREDENTIAL = `${CREDENTIAL_ONLY}|secret|bearer`;
9
+
10
+ const SECRET_PATTERNS = [
11
+ // a 64-byte Solana secret key in base58 (signatures are the same length; the spec keeps those in their own field)
12
+ /(^|[^1-9A-HJ-NP-Za-km-z])[1-9A-HJ-NP-Za-km-z]{86,90}($|[^1-9A-HJ-NP-Za-km-z])/,
13
+ // a keypair file's byte array
14
+ /\[\s*\d{1,3}(\s*,\s*\d{1,3}){31,}\s*\]/,
15
+ // key=value or key: value for a name only a credential goes by ("api_key: …", "private key = …")
16
+ new RegExp(`\\b(${CREDENTIAL_ONLY})\\b\\s*[=:]`, 'i'),
17
+ // "secret" is an ordinary word too ("Secret: Blade"): with = or : after it, only a value that looks like a key (a
18
+ // run of 16 or more key characters) or a seed phrase (12 or more lower-case words)
19
+ /\bsecret\b\s*[=:]\s*["'`]?([A-Za-z0-9+/_.~-]{16,}|([a-z]{3,8}\s+){11,}[a-z]{3,8}\b)/i,
20
+ // a bearer token as an Authorization header carries it
21
+ /\bbearer\s+[A-Za-z0-9+/_.~-]{16,}/i,
22
+ // a credential in a URL query, by a name only a credential goes by ("?api-key=…", "?access_token=…")
23
+ /[?&](api[-_]?key|apikey|access[-_]?token|auth[-_]?token|private[-_]?key|secret[-_]?key|client[-_]?secret)=/i,
24
+ // or by a name a link also uses for ordinary things ("?token=12", "?sig=", "?key=hero"), with a value that looks like
25
+ // a key: a run of 16 or more key characters
26
+ /[?&](key|token|secret|auth|sig|signature)=[A-Za-z0-9+/_.~%-]{16,}/i,
27
+ // RPC providers that put the key in the path
28
+ /\b(helius-rpc\.com|quiknode\.pro|alchemy\.com\/v2|ankr\.com\/[a-z]+\/[0-9a-f]{32})/i,
29
+ // PEM blocks
30
+ /-----BEGIN [A-Z ]*PRIVATE KEY-----/,
31
+ ];
32
+
33
+ /** Whether a string looks like it carries a key, a token or a keyed RPC URL. */
34
+ export const secretLike = (value) => typeof value === 'string' && SECRET_PATTERNS.some((p) => p.test(value));
35
+
36
+ const MNEMONIC_LENGTHS = new Set([12, 15, 18, 21, 24]);
37
+ /** A seed phrase: 12 to 24 lower-case words of 3 to 8 letters and nothing else (no sentence is only such words). */
38
+ const seedPhrase = (s) => {
39
+ const words = s.trim().split(/\s+/);
40
+ return MNEMONIC_LENGTHS.has(words.length) && words.every((w) => /^[a-z]{3,8}$/.test(w));
41
+ };
42
+
43
+ /** A field's name that is a credential's: "apiKey", "private_key", "seed phrase", "my-secret". */
44
+ const CREDENTIAL_FIELD = new RegExp(`\\b(${CREDENTIAL})$`, 'i');
45
+ /** Whether a field holds anything: a string with more than spaces, a number, a list or an object that is not empty. */
46
+ const filled = (v) => (typeof v === 'string' ? v.trim() !== '' : Array.isArray(v) ? v.length > 0 : v !== null && v !== undefined && (typeof v !== 'object' || Object.keys(v).length > 0));
47
+
48
+ /** Every place in `value` that looks like a key, a seed phrase or a keypair file. */
49
+ export function findSecrets(value, path = 'economy') {
50
+ if (typeof value === 'string') return secretLike(value) || seedPhrase(value) ? [path] : [];
51
+ if (Array.isArray(value)) {
52
+ if (value.length >= 32 && value.every((n) => Number.isInteger(n) && n >= 0 && n <= 255)) return [path];
53
+ return value.flatMap((v, i) => findSecrets(v, `${path}[${i}]`));
54
+ }
55
+ // A transaction's signature is as long as a key; the spec keeps signatures in fields named "signature" only. A field
56
+ // named for a credential ("apiKey", "privateKey", "mnemonic", …) that holds something is one.
57
+ if (value && typeof value === 'object')
58
+ return Object.entries(value).flatMap(([k, v]) => (k === 'signature' && isSignature(v) ? [] : [...(CREDENTIAL_FIELD.test(k) && filled(v) ? [`${path}.${k}`] : []), ...findSecrets(v, `${path}.${k}`)]));
59
+ return [];
60
+ }