@indiegems/gem-web-sdk 23.3.0 → 24.0.1
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/CHANGELOG.md +40 -1
- package/dist/conformance.d.ts +5 -2
- package/dist/function.d.ts +22 -1
- package/dist/game.d.ts +1588 -1466
- package/dist/gem-web-sdk.bridge.js +2 -2
- package/dist/gem-web-sdk.conformance.js +3 -3
- package/dist/gem-web-sdk.esm.js +3 -3
- package/dist/gem-web-sdk.function.js +3 -3
- package/dist/gem-web-sdk.game.js +3 -3
- package/dist/gem-web-sdk.min.js +3 -3
- package/dist/gem-web-sdk.sdk.js +3 -3
- package/dist/gem-web-sdk.server.js +2 -2
- package/dist/index.d.ts +5 -0
- package/dist/sdk.d.ts +1598 -1464
- package/dist/server.d.ts +44 -1
- package/docs/api/api-reference-function.md +194 -44
- package/docs/api/api-reference-game.md +722 -32
- package/docs/api/api-reference-server.md +477 -3
- package/docs/api/reference.json +1786 -99
- package/docs/arcade-and-store.md +166 -63
- package/docs/arcade-economy.md +184 -184
- package/docs/changelog.md +40 -1
- package/docs/deprecation-policy.md +2 -0
- package/docs/getting-started.md +1 -1
- package/docs/inventory-and-catalogs.md +247 -76
- package/docs/manifest.json +20 -20
- package/docs/platform-rules.md +36 -27
- package/docs/player-sign-in.md +20 -11
- package/docs/rewarded-ads.md +1 -1
- package/docs/server-bundles.md +9 -7
- package/package.json +1 -1
- package/schema/bridge.v1.json +56 -7
package/docs/manifest.json
CHANGED
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
"file": "arcade-and-store.md",
|
|
21
|
-
"sha256": "
|
|
22
|
-
"updated": "2026-11-
|
|
21
|
+
"sha256": "73e77f3bd0124f69d53b42714fb24c7d128dd1be97e203fc3a353a8eb4e3c05a",
|
|
22
|
+
"updated": "2026-11-11T01:56:34Z"
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
25
|
"file": "arcade-avatars.md",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"file": "arcade-economy.md",
|
|
31
|
-
"sha256": "
|
|
32
|
-
"updated": "2026-11-
|
|
31
|
+
"sha256": "6fadbb07d8a6ab44cb231b12a6ba89ce65a46bf42841bff932d3813aa4e0931a",
|
|
32
|
+
"updated": "2026-11-11T01:56:34Z"
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
"file": "async-opponents.md",
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
50
|
"file": "changelog.md",
|
|
51
|
-
"sha256": "
|
|
52
|
-
"updated": "2026-11-
|
|
51
|
+
"sha256": "1df1bb9edeb1db3a6e69f2625b091e3a06b6e3ca7accb7e6c22a392dbf95ba3c",
|
|
52
|
+
"updated": "2026-11-11T13:36:03Z"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
"file": "daily-challenges.md",
|
|
@@ -63,8 +63,8 @@
|
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
65
|
"file": "deprecation-policy.md",
|
|
66
|
-
"sha256": "
|
|
67
|
-
"updated": "2026-
|
|
66
|
+
"sha256": "4622fbf889603436d753013296e9aa8f9edd460ebdae91e4e8594698ea5a0500",
|
|
67
|
+
"updated": "2026-11-10T21:45:26Z"
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
70
|
"file": "friends.md",
|
|
@@ -78,8 +78,8 @@
|
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
80
|
"file": "getting-started.md",
|
|
81
|
-
"sha256": "
|
|
82
|
-
"updated": "2026-11-
|
|
81
|
+
"sha256": "d740cfa7dd54f089399b3a83f29442f12337afa88309c997d598f583f5c9f113",
|
|
82
|
+
"updated": "2026-11-11T13:36:03Z"
|
|
83
83
|
},
|
|
84
84
|
{
|
|
85
85
|
"file": "graphics-route.md",
|
|
@@ -88,8 +88,8 @@
|
|
|
88
88
|
},
|
|
89
89
|
{
|
|
90
90
|
"file": "inventory-and-catalogs.md",
|
|
91
|
-
"sha256": "
|
|
92
|
-
"updated": "2026-11-
|
|
91
|
+
"sha256": "22998fb3ff26d4f9f29d2a73ce6db0ccf42ca2b635f171023a2e2214bbea4b1a",
|
|
92
|
+
"updated": "2026-11-11T01:56:34Z"
|
|
93
93
|
},
|
|
94
94
|
{
|
|
95
95
|
"file": "leaderboards.md",
|
|
@@ -113,18 +113,18 @@
|
|
|
113
113
|
},
|
|
114
114
|
{
|
|
115
115
|
"file": "platform-rules.md",
|
|
116
|
-
"sha256": "
|
|
117
|
-
"updated": "2026-
|
|
116
|
+
"sha256": "e9cb3cf1945002d182d917b0f3f7cfdf26f41de9ec9cd34a47c487cb4c615152",
|
|
117
|
+
"updated": "2026-11-11T01:56:34Z"
|
|
118
118
|
},
|
|
119
119
|
{
|
|
120
120
|
"file": "player-sign-in.md",
|
|
121
|
-
"sha256": "
|
|
122
|
-
"updated": "2026-11-
|
|
121
|
+
"sha256": "ebdaa0a35815c72148bd72f529b5ecee264c2eeb703e73fdfc277066be63fab4",
|
|
122
|
+
"updated": "2026-11-11T01:30:40Z"
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
125
|
"file": "rewarded-ads.md",
|
|
126
|
-
"sha256": "
|
|
127
|
-
"updated": "2026-11-
|
|
126
|
+
"sha256": "505a6addbac54b9a154ca0b1afd727d319ba35f5f2a9b24d9835ac2a9104ded8",
|
|
127
|
+
"updated": "2026-11-11T01:56:34Z"
|
|
128
128
|
},
|
|
129
129
|
{
|
|
130
130
|
"file": "room-shapes.md",
|
|
@@ -143,8 +143,8 @@
|
|
|
143
143
|
},
|
|
144
144
|
{
|
|
145
145
|
"file": "server-bundles.md",
|
|
146
|
-
"sha256": "
|
|
147
|
-
"updated": "2026-11-
|
|
146
|
+
"sha256": "8e18e0c918476d0bd4ca83a56fa8274dccb9c4f344c6eba566e3067104dc912d",
|
|
147
|
+
"updated": "2026-11-11T13:36:03Z"
|
|
148
148
|
},
|
|
149
149
|
{
|
|
150
150
|
"file": "serverless-functions-js.md",
|
package/docs/platform-rules.md
CHANGED
|
@@ -326,41 +326,50 @@ longer one, are in [`server-bundles.md`](server-bundles.md#how-long-your-server-
|
|
|
326
326
|
|
|
327
327
|
## 8. A player's Boost is for display, never a gate
|
|
328
328
|
|
|
329
|
-
Decided by the platform on **2026-09-26**,
|
|
329
|
+
Decided by the platform on **2026-09-26**, restated for VIP on **2026-11-10**, and a contract
|
|
330
|
+
rather than an implementation fact.
|
|
330
331
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
and holdings cap are raised by the same tier. It **never** touches achievement points. The platform applies all of
|
|
334
|
-
it on its own side, when it pays: a game does nothing to make a boost work, and cannot make one
|
|
335
|
-
work harder.
|
|
332
|
+
**Gate on the pass, never on the boost.** What a player paid for is unlocked by the pass, and the
|
|
333
|
+
multiplier it brings is only ever shown.
|
|
336
334
|
|
|
337
|
-
A
|
|
338
|
-
|
|
335
|
+
A player's earnings multiplier comes from **VIP**, a pass that pays +50% Coins, or from a **Boost**
|
|
336
|
+
bought before the Boost was retired. The platform applies it on its own side, when it pays: every
|
|
337
|
+
Coins grant is multiplied, and the earning limits with it. It **never** touches achievement points.
|
|
338
|
+
A game does nothing to make it work, and cannot make it work harder.
|
|
339
|
+
|
|
340
|
+
A game **may show** it. `gem.player.boost` carries each currency's multiplier and the whole days
|
|
341
|
+
left, so a reward screen can say "+50% Coins"; see
|
|
339
342
|
[what a game must do](what-a-game-must-do.md#the-signed-in-players-boost-show-it-never-gate-on-it).
|
|
340
|
-
|
|
341
|
-
|
|
343
|
+
To show what a payout will be, use `gem.gameConfig.preview`, never your own arithmetic on the
|
|
344
|
+
multiplier. A dedicated server can read the same multiplier for a player in its match
|
|
345
|
+
(`gem.match.playerBoost`), and the same rule holds there.
|
|
342
346
|
|
|
343
|
-
A game **must not gate** anything on
|
|
347
|
+
A game **must not gate** anything on the multiplier:
|
|
344
348
|
|
|
345
349
|
- **No content or power behind it.** No level, item, character, mode, stat, difficulty setting or
|
|
346
|
-
extra attempt may depend on whether the player
|
|
347
|
-
the same game.
|
|
348
|
-
- **No prices that depend on it**, and no discount or surcharge keyed on
|
|
349
|
-
- **No matchmaking on it.** Never exclude, separate or wait on a player because of
|
|
350
|
-
- **No nagging.** No "you're not boosted" loops, interstitials or countdown pressure.
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
350
|
+
extra attempt may depend on whether, or by how much, the player earns faster. A player at 1x and a
|
|
351
|
+
player at 1.5x play the same game.
|
|
352
|
+
- **No prices that depend on it**, and no discount or surcharge keyed on it.
|
|
353
|
+
- **No matchmaking on it.** Never exclude, separate or wait on a player because of it.
|
|
354
|
+
- **No nagging.** No "you're not boosted" loops, interstitials or countdown pressure.
|
|
355
|
+
|
|
356
|
+
**What VIP unlocks goes behind the pass.** A VIP room, a VIP roll or a VIP track is a
|
|
357
|
+
`requires: [{ kind: 'holds_pass', pass: 'vip' }]` on the item, recipe, bonus or track, which the
|
|
358
|
+
platform checks when it runs; or a decision your function or server makes from its pass read
|
|
359
|
+
(`gem.me.passes` in a function, `gem.match.playerPasses` on a server). The browser's
|
|
360
|
+
`gem.me.passes` draws the door; it never opens it. Offer VIP only before a reward, by the rules in
|
|
361
|
+
[inventory-and-catalogs.md](inventory-and-catalogs.md#offering-vip-before-a-reward-the-upsell).
|
|
362
|
+
|
|
363
|
+
Three reasons not to gate on the multiplier, any one of which would be enough. It is **advisory**:
|
|
364
|
+
the browser value is pushed on connect and on change, so it can lag, and the platform's own figure
|
|
365
|
+
is what pays. It is **forgeable** inside your page, so a gate on it is a gate anyone can open. And it
|
|
366
|
+
**is not the purchase**: a player can hold an old Boost without VIP, so a gate on the multiplier
|
|
367
|
+
opens for the wrong player and stays shut for none.
|
|
358
368
|
|
|
359
369
|
It carries **a day count, never an instant — and capped at 7**, so `7` means "7 or more" — and
|
|
360
|
-
nothing about the tier, the price or whether the player paid at all
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
paid. Show `7` as "7+ days", never as an end date.
|
|
370
|
+
nothing about the tier, the price or whether the player paid at all. A second-precision expiry
|
|
371
|
+
would be a near-unique value per player that two games could join on, and an exact day count would
|
|
372
|
+
jump by a purchase's term the moment the player paid. Show `7` as "7+ days", never as an end date.
|
|
364
373
|
|
|
365
374
|
## Where the rest of it is
|
|
366
375
|
|
package/docs/player-sign-in.md
CHANGED
|
@@ -56,17 +56,26 @@ signs up in place, and when the game is disconnected. It returns a function that
|
|
|
56
56
|
|
|
57
57
|
### Gating a sign-up gift
|
|
58
58
|
|
|
59
|
-
If your game gives a gift for signing up, offer it only while
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
`
|
|
69
|
-
|
|
59
|
+
If your game gives a gift for signing up, offer it only while **`gem.player.isGuest`** is `true`:
|
|
60
|
+
|
|
61
|
+
```js
|
|
62
|
+
const gem = createGem({
|
|
63
|
+
// Runs for each pushed player, again when a guest signs up in place.
|
|
64
|
+
onPlayer: (player) => (signUpGift.hidden = !player.isGuest),
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`isGuest` is `true` only when the Arcade says the player is a guest it can sign up here. It is
|
|
69
|
+
`false` for a full account, where the Arcade offers no sign-up, and on an older Arcade that does not
|
|
70
|
+
say, so a gift gated on it never reaches a player who already has an account. On such an older
|
|
71
|
+
Arcade no gift shows at all: the safe way to be wrong.
|
|
72
|
+
|
|
73
|
+
Use it rather than `signInAvailable`, which reads `true` for every player on an older Arcade (it
|
|
74
|
+
keeps a sign-in button working there), and rather than `gem.store.offers()` answering
|
|
75
|
+
`sign_in_required`, which no longer means a guest: a current Arcade answers a guest's `offers()`
|
|
76
|
+
with `ok`, because a guest can buy, and signs them up first. Pressing the ask answers `signed_in`
|
|
77
|
+
for a player who was signed in all along too, so that answer is no proof of a sign-up either; what
|
|
78
|
+
the gift pays is granted by your function or server, which reads the account itself.
|
|
70
79
|
|
|
71
80
|
## 1. Save before you ask
|
|
72
81
|
|
package/docs/rewarded-ads.md
CHANGED
|
@@ -213,7 +213,7 @@ the player then did, so **branch on your inventory, never on the outcome**, as f
|
|
|
213
213
|
The upload refuses it, and `ad: false` with no `platform_prices` too, since then nothing unlocks
|
|
214
214
|
the placement.
|
|
215
215
|
- **Each currency's spend scope applies,** as it does to an item's price
|
|
216
|
-
([`inventory-and-catalogs.md`](inventory-and-catalogs.md#what-coins-
|
|
216
|
+
([`inventory-and-catalogs.md`](inventory-and-catalogs.md#what-coins-may-buy-the-spend-scope)):
|
|
217
217
|
where Coins may price cosmetics only, a Coin price on a placement that grants anything else is
|
|
218
218
|
refused. Gems may price any placement. `gemctl platform config` lists which currencies your
|
|
219
219
|
game may price in, and each one's spend scope: author against it, never against a list you
|
package/docs/server-bundles.md
CHANGED
|
@@ -80,8 +80,8 @@ To check the download yourself: the package npm serves is, byte for byte, the fi
|
|
|
80
80
|
also publishes on its download host, with the hash beside it:
|
|
81
81
|
|
|
82
82
|
```bash
|
|
83
|
-
curl -fsSL -O https://downloads.gemarcade.com/sdk/
|
|
84
|
-
curl -fsSL https://downloads.gemarcade.com/sdk/
|
|
83
|
+
curl -fsSL -O https://downloads.gemarcade.com/sdk/v24.0.1/gem-web-sdk.tgz
|
|
84
|
+
curl -fsSL https://downloads.gemarcade.com/sdk/v24.0.1/gem-web-sdk.tgz.sri
|
|
85
85
|
openssl dgst -sha384 -binary gem-web-sdk.tgz | openssl base64 -A
|
|
86
86
|
```
|
|
87
87
|
|
|
@@ -829,11 +829,13 @@ The short version: the browser half is what a player's **session** can do, and t
|
|
|
829
829
|
what a **match** can do. `gem.rooms.join()` has no meaning to a process that exists because a match
|
|
830
830
|
was already allocated.
|
|
831
831
|
|
|
832
|
-
**`gem.me.passes` is browser and function only
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
832
|
+
**`gem.me.passes` is browser and function only, and `gem.match.playerPasses(playerId)` is the
|
|
833
|
+
server's.** Both routes behind a player's passes and Boost in your match require the allocation
|
|
834
|
+
nonce, which never enters your bundle, so the platform half of the runtime makes the read for you,
|
|
835
|
+
as it does `gem.match.end()`: `gem.match.playerPasses(playerId)` for what to gate on, and
|
|
836
|
+
`gem.match.playerBoost(playerId)` for display only. Each throws on a runtime image that predates it
|
|
837
|
+
and on a listen host. [arcade-and-store.md](arcade-and-store.md#on-a-dedicated-server) has the
|
|
838
|
+
details.
|
|
837
839
|
|
|
838
840
|
**Rooms are the case where those two answers differ**, so they are worth stating separately rather
|
|
839
841
|
than filed under "browser-only". `gem.rooms` — join, leave, ready up, quick-join — is a player
|
package/package.json
CHANGED
package/schema/bridge.v1.json
CHANGED
|
@@ -6043,7 +6043,7 @@
|
|
|
6043
6043
|
"transport": "port",
|
|
6044
6044
|
"$comment": [
|
|
6045
6045
|
"Ask what the Arcade Store sells to this player, here, for real money:",
|
|
6046
|
-
"
|
|
6046
|
+
"Coin packs, Boosts, passes and bundles. Gated by the `store` capability.",
|
|
6047
6047
|
"Answered by `gem.storeOffersResult`.",
|
|
6048
6048
|
"",
|
|
6049
6049
|
"WHY THE PARENT ANSWERS IT. The price a player pays depends on the",
|
|
@@ -6057,9 +6057,13 @@
|
|
|
6057
6057
|
"",
|
|
6058
6058
|
"A READ, NOT AN ACT: no activation, no mutex. Per-session state comes",
|
|
6059
6059
|
"back as a reason: `store_off` where the store is withheld (an age or",
|
|
6060
|
-
"region policy, a TV, an in-app browser that takes no payment)
|
|
6061
|
-
"
|
|
6062
|
-
"
|
|
6060
|
+
"region policy, a TV, an in-app browser that takes no payment).",
|
|
6061
|
+
"",
|
|
6062
|
+
"A GUEST IS ANSWERED `ok`, with what the store would sell them:",
|
|
6063
|
+
"buying takes a guest through sign-up first, in the parent's own",
|
|
6064
|
+
"chrome, and back to the offer. An",
|
|
6065
|
+
"older parent answered a guest `sign_in_required`, and a frame must",
|
|
6066
|
+
"still read that as nothing for sale."
|
|
6063
6067
|
],
|
|
6064
6068
|
"fields": {
|
|
6065
6069
|
"requestId": {
|
|
@@ -6090,6 +6094,23 @@
|
|
|
6090
6094
|
"instead, and a purchase of that offer is answered `declined` /",
|
|
6091
6095
|
"`cancelled`.",
|
|
6092
6096
|
"",
|
|
6097
|
+
"WHAT A PASS SAYS, AND WHAT IT MUST NOT. A pass offer names its",
|
|
6098
|
+
"offering slug in `pass` and the earning",
|
|
6099
|
+
"multipliers it carries in `earnMultipliers`, so a game can find VIP by",
|
|
6100
|
+
"slug and preview what it would add without naming a SKU or a number.",
|
|
6101
|
+
"A parent lists a pass only where it would open that pass's sheet: an",
|
|
6102
|
+
"offering with `visible_to_games`, to a player who has not declined",
|
|
6103
|
+
"its sheet twice today. For a KNOWN MINOR it leaves the pass out",
|
|
6104
|
+
"exactly as if it were not on sale - the same `ok`, the same other",
|
|
6105
|
+
"offers, no reason - so a game can never tell a minor from a pass that",
|
|
6106
|
+
"is not sold here. A holder still sees it: the sheet adds time.",
|
|
6107
|
+
"",
|
|
6108
|
+
"COIN PACKS ARE `gem_pack`. The kind enum is closed (a fifth value",
|
|
6109
|
+
"would be refused whole by an N-1 frame), so a pack of any platform",
|
|
6110
|
+
"currency crosses as `gem_pack` with `grant` naming the currency, and",
|
|
6111
|
+
"the SDK reports a pack whose `grant.currency` is not GEMS as",
|
|
6112
|
+
"`coin_pack`.",
|
|
6113
|
+
"",
|
|
6093
6114
|
"THE NAMES ARE THE PLATFORM'S, not a game developer's: the Arcade",
|
|
6094
6115
|
"Store's own catalog copy, which is why `name` and `description` sit",
|
|
6095
6116
|
"outside an `untrusted` object.",
|
|
@@ -6131,7 +6152,7 @@
|
|
|
6131
6152
|
"kind": {
|
|
6132
6153
|
"kind": "enum",
|
|
6133
6154
|
"values": ["gem_pack", "boost", "pass", "bundle"],
|
|
6134
|
-
"$comment": "What sort of thing it is. A new sort of SKU is left out of this list by the parent, never sent as a fifth value: an N-1 frame would refuse the whole message."
|
|
6155
|
+
"$comment": "What sort of thing it is. A new sort of SKU is left out of this list by the parent, never sent as a fifth value: an N-1 frame would refuse the whole message. `gem_pack` is a pack of ANY platform currency, Coins included: `grant` says which."
|
|
6135
6156
|
},
|
|
6136
6157
|
"name": {
|
|
6137
6158
|
"kind": "string",
|
|
@@ -6158,12 +6179,12 @@
|
|
|
6158
6179
|
"grant": {
|
|
6159
6180
|
"kind": "object",
|
|
6160
6181
|
"optional": true,
|
|
6161
|
-
"$comment": "For a
|
|
6182
|
+
"$comment": "For a currency pack (`gem_pack`): the currency and amount it grants. Absent for every other kind.",
|
|
6162
6183
|
"fields": {
|
|
6163
6184
|
"currency": {
|
|
6164
6185
|
"kind": "string",
|
|
6165
6186
|
"maxLength": 32,
|
|
6166
|
-
"$comment": "The platform currency's exact slug, e.g.
|
|
6187
|
+
"$comment": "The platform currency's exact slug, e.g. ARCADE_TICKETS for Coins."
|
|
6167
6188
|
},
|
|
6168
6189
|
"amount": {
|
|
6169
6190
|
"kind": "int",
|
|
@@ -6172,6 +6193,34 @@
|
|
|
6172
6193
|
"$comment": "How much of it."
|
|
6173
6194
|
}
|
|
6174
6195
|
}
|
|
6196
|
+
},
|
|
6197
|
+
"pass": {
|
|
6198
|
+
"kind": "string",
|
|
6199
|
+
"maxLength": 64,
|
|
6200
|
+
"optional": true,
|
|
6201
|
+
"$comment": "For a pass, or a bundle carrying one: the pass's offering slug, e.g. `vip` - the slug `gem.me.passes` and a `holds_pass` requirement name. Absent for everything else, and from an older parent. Additive: no `v` bump."
|
|
6202
|
+
},
|
|
6203
|
+
"earnMultipliers": {
|
|
6204
|
+
"kind": "array",
|
|
6205
|
+
"maxItems": 8,
|
|
6206
|
+
"optional": true,
|
|
6207
|
+
"$comment": "For an offer that makes the player earn a platform currency faster while held - a pass with the `earn_boost` feature, or a Boost: one entry per currency, as `gem.player`'s `boost.multipliers` carry them. Absent or empty when it boosts nothing. The platform's multiplier, never a game's: the preview reads it to say what holding the pass would add.",
|
|
6208
|
+
"items": {
|
|
6209
|
+
"kind": "object",
|
|
6210
|
+
"fields": {
|
|
6211
|
+
"currencySlug": {
|
|
6212
|
+
"kind": "string",
|
|
6213
|
+
"maxLength": 32,
|
|
6214
|
+
"$comment": "The currency's slug, e.g. ARCADE_TICKETS."
|
|
6215
|
+
},
|
|
6216
|
+
"multiplierBp": {
|
|
6217
|
+
"kind": "int",
|
|
6218
|
+
"min": 10000,
|
|
6219
|
+
"max": 1000000,
|
|
6220
|
+
"$comment": "Basis points: 10000 is 1x, 15000 is 1.5x. gem-api clamps what it applies to 10x."
|
|
6221
|
+
}
|
|
6222
|
+
}
|
|
6223
|
+
}
|
|
6175
6224
|
}
|
|
6176
6225
|
}
|
|
6177
6226
|
}
|