hive-stream 3.0.2 → 3.0.4

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 (202) hide show
  1. package/DOCUMENTATION.md +50 -2
  2. package/README.md +282 -4
  3. package/dist/adapters/base.adapter.d.ts +5 -0
  4. package/dist/adapters/base.adapter.js +9 -0
  5. package/dist/adapters/base.adapter.js.map +1 -1
  6. package/dist/adapters/mongodb.adapter.d.ts +6 -6
  7. package/dist/adapters/mongodb.adapter.js +36 -21
  8. package/dist/adapters/mongodb.adapter.js.map +1 -1
  9. package/dist/adapters/postgresql.adapter.d.ts +7 -0
  10. package/dist/adapters/postgresql.adapter.js +46 -19
  11. package/dist/adapters/postgresql.adapter.js.map +1 -1
  12. package/dist/adapters/sqlite.adapter.d.ts +4 -0
  13. package/dist/adapters/sqlite.adapter.js +10 -0
  14. package/dist/adapters/sqlite.adapter.js.map +1 -1
  15. package/dist/api.d.ts +13 -3
  16. package/dist/api.js +96 -62
  17. package/dist/api.js.map +1 -1
  18. package/dist/builders.d.ts +176 -0
  19. package/dist/builders.js +727 -0
  20. package/dist/builders.js.map +1 -0
  21. package/dist/config.d.ts +16 -1
  22. package/dist/config.js +95 -3
  23. package/dist/config.js.map +1 -1
  24. package/dist/contracts/auctionhouse.contract.d.ts +4 -0
  25. package/dist/contracts/auctionhouse.contract.js +234 -0
  26. package/dist/contracts/auctionhouse.contract.js.map +1 -0
  27. package/dist/contracts/booking.contract.d.ts +4 -0
  28. package/dist/contracts/booking.contract.js +225 -0
  29. package/dist/contracts/booking.contract.js.map +1 -0
  30. package/dist/contracts/bountyboard.contract.d.ts +4 -0
  31. package/dist/contracts/bountyboard.contract.js +233 -0
  32. package/dist/contracts/bountyboard.contract.js.map +1 -0
  33. package/dist/contracts/bundlemarketplace.contract.d.ts +4 -0
  34. package/dist/contracts/bundlemarketplace.contract.js +195 -0
  35. package/dist/contracts/bundlemarketplace.contract.js.map +1 -0
  36. package/dist/contracts/charitymatch.contract.d.ts +4 -0
  37. package/dist/contracts/charitymatch.contract.js +172 -0
  38. package/dist/contracts/charitymatch.contract.js.map +1 -0
  39. package/dist/contracts/coinflip.contract.js +25 -22
  40. package/dist/contracts/coinflip.contract.js.map +1 -1
  41. package/dist/contracts/crowdfund.contract.d.ts +4 -0
  42. package/dist/contracts/crowdfund.contract.js +290 -0
  43. package/dist/contracts/crowdfund.contract.js.map +1 -0
  44. package/dist/contracts/dcabot.contract.d.ts +4 -0
  45. package/dist/contracts/dcabot.contract.js +217 -0
  46. package/dist/contracts/dcabot.contract.js.map +1 -0
  47. package/dist/contracts/dice.contract.js +25 -22
  48. package/dist/contracts/dice.contract.js.map +1 -1
  49. package/dist/contracts/domainregistry.contract.d.ts +4 -0
  50. package/dist/contracts/domainregistry.contract.js +232 -0
  51. package/dist/contracts/domainregistry.contract.js.map +1 -0
  52. package/dist/contracts/exchange.contract.js +209 -168
  53. package/dist/contracts/exchange.contract.js.map +1 -1
  54. package/dist/contracts/fanclub.contract.d.ts +4 -0
  55. package/dist/contracts/fanclub.contract.js +193 -0
  56. package/dist/contracts/fanclub.contract.js.map +1 -0
  57. package/dist/contracts/giftcard.contract.d.ts +4 -0
  58. package/dist/contracts/giftcard.contract.js +158 -0
  59. package/dist/contracts/giftcard.contract.js.map +1 -0
  60. package/dist/contracts/grantrounds.contract.d.ts +4 -0
  61. package/dist/contracts/grantrounds.contract.js +265 -0
  62. package/dist/contracts/grantrounds.contract.js.map +1 -0
  63. package/dist/contracts/groupbuy.contract.d.ts +4 -0
  64. package/dist/contracts/groupbuy.contract.js +198 -0
  65. package/dist/contracts/groupbuy.contract.js.map +1 -0
  66. package/dist/contracts/helpers.d.ts +66 -0
  67. package/dist/contracts/helpers.js +166 -0
  68. package/dist/contracts/helpers.js.map +1 -0
  69. package/dist/contracts/insurancepool.contract.d.ts +4 -0
  70. package/dist/contracts/insurancepool.contract.js +281 -0
  71. package/dist/contracts/insurancepool.contract.js.map +1 -0
  72. package/dist/contracts/invoice.contract.d.ts +4 -0
  73. package/dist/contracts/invoice.contract.js +193 -0
  74. package/dist/contracts/invoice.contract.js.map +1 -0
  75. package/dist/contracts/launchpad.contract.d.ts +4 -0
  76. package/dist/contracts/launchpad.contract.js +225 -0
  77. package/dist/contracts/launchpad.contract.js.map +1 -0
  78. package/dist/contracts/lotto.contract.js +53 -37
  79. package/dist/contracts/lotto.contract.js.map +1 -1
  80. package/dist/contracts/multisigtreasury.contract.d.ts +4 -0
  81. package/dist/contracts/multisigtreasury.contract.js +245 -0
  82. package/dist/contracts/multisigtreasury.contract.js.map +1 -0
  83. package/dist/contracts/nft.contract.d.ts +1 -0
  84. package/dist/contracts/nft.contract.js +234 -195
  85. package/dist/contracts/nft.contract.js.map +1 -1
  86. package/dist/contracts/oraclebounty.contract.d.ts +4 -0
  87. package/dist/contracts/oraclebounty.contract.js +250 -0
  88. package/dist/contracts/oraclebounty.contract.js.map +1 -0
  89. package/dist/contracts/payroll.contract.d.ts +4 -0
  90. package/dist/contracts/payroll.contract.js +232 -0
  91. package/dist/contracts/payroll.contract.js.map +1 -0
  92. package/dist/contracts/paywall.contract.d.ts +4 -0
  93. package/dist/contracts/paywall.contract.js +185 -0
  94. package/dist/contracts/paywall.contract.js.map +1 -0
  95. package/dist/contracts/poll.contract.js +2 -0
  96. package/dist/contracts/poll.contract.js.map +1 -1
  97. package/dist/contracts/predictionmarket.contract.d.ts +4 -0
  98. package/dist/contracts/predictionmarket.contract.js +213 -0
  99. package/dist/contracts/predictionmarket.contract.js.map +1 -0
  100. package/dist/contracts/proposaltimelock.contract.d.ts +4 -0
  101. package/dist/contracts/proposaltimelock.contract.js +250 -0
  102. package/dist/contracts/proposaltimelock.contract.js.map +1 -0
  103. package/dist/contracts/questpass.contract.d.ts +4 -0
  104. package/dist/contracts/questpass.contract.js +214 -0
  105. package/dist/contracts/questpass.contract.js.map +1 -0
  106. package/dist/contracts/referral.contract.d.ts +4 -0
  107. package/dist/contracts/referral.contract.js +238 -0
  108. package/dist/contracts/referral.contract.js.map +1 -0
  109. package/dist/contracts/rental.contract.d.ts +4 -0
  110. package/dist/contracts/rental.contract.js +221 -0
  111. package/dist/contracts/rental.contract.js.map +1 -0
  112. package/dist/contracts/revenuesplit.contract.d.ts +4 -0
  113. package/dist/contracts/revenuesplit.contract.js +211 -0
  114. package/dist/contracts/revenuesplit.contract.js.map +1 -0
  115. package/dist/contracts/rps.contract.js +48 -20
  116. package/dist/contracts/rps.contract.js.map +1 -1
  117. package/dist/contracts/savings.contract.d.ts +4 -0
  118. package/dist/contracts/savings.contract.js +208 -0
  119. package/dist/contracts/savings.contract.js.map +1 -0
  120. package/dist/contracts/subscription.contract.d.ts +4 -0
  121. package/dist/contracts/subscription.contract.js +241 -0
  122. package/dist/contracts/subscription.contract.js.map +1 -0
  123. package/dist/contracts/sweepstakes.contract.d.ts +4 -0
  124. package/dist/contracts/sweepstakes.contract.js +209 -0
  125. package/dist/contracts/sweepstakes.contract.js.map +1 -0
  126. package/dist/contracts/ticketing.contract.d.ts +4 -0
  127. package/dist/contracts/ticketing.contract.js +185 -0
  128. package/dist/contracts/ticketing.contract.js.map +1 -0
  129. package/dist/contracts/tipjar.contract.js +2 -0
  130. package/dist/contracts/tipjar.contract.js.map +1 -1
  131. package/dist/contracts/token.contract.js +135 -125
  132. package/dist/contracts/token.contract.js.map +1 -1
  133. package/dist/index.d.ts +40 -0
  134. package/dist/index.js +72 -1
  135. package/dist/index.js.map +1 -1
  136. package/dist/metadata.d.ts +20 -0
  137. package/dist/metadata.js +320 -1
  138. package/dist/metadata.js.map +1 -1
  139. package/dist/providers/block-provider.d.ts +22 -0
  140. package/dist/providers/block-provider.js +3 -0
  141. package/dist/providers/block-provider.js.map +1 -0
  142. package/dist/providers/haf-client.d.ts +30 -0
  143. package/dist/providers/haf-client.js +119 -0
  144. package/dist/providers/haf-client.js.map +1 -0
  145. package/dist/providers/haf-provider.d.ts +49 -0
  146. package/dist/providers/haf-provider.js +256 -0
  147. package/dist/providers/haf-provider.js.map +1 -0
  148. package/dist/providers/hive-provider.d.ts +13 -0
  149. package/dist/providers/hive-provider.js +25 -0
  150. package/dist/providers/hive-provider.js.map +1 -0
  151. package/dist/providers/index.d.ts +4 -0
  152. package/dist/providers/index.js +21 -0
  153. package/dist/providers/index.js.map +1 -0
  154. package/dist/streamer.d.ts +65 -4
  155. package/dist/streamer.js +768 -72
  156. package/dist/streamer.js.map +1 -1
  157. package/dist/types/hive-stream.d.ts +317 -0
  158. package/dist/utils.d.ts +33 -0
  159. package/dist/utils.js +198 -2
  160. package/dist/utils.js.map +1 -1
  161. package/package.json +16 -1
  162. package/.claude/settings.local.json +0 -12
  163. package/.env.example +0 -3
  164. package/.travis.yml +0 -11
  165. package/AGENTS.md +0 -35
  166. package/CLAUDE.md +0 -75
  167. package/ecosystem.config.js +0 -17
  168. package/examples/contracts/README.md +0 -8
  169. package/examples/contracts/exchange.ts +0 -38
  170. package/examples/contracts/poll.ts +0 -21
  171. package/examples/contracts/rps.ts +0 -19
  172. package/examples/contracts/tipjar.ts +0 -19
  173. package/jest.config.js +0 -9
  174. package/test-contract-block.md +0 -19
  175. package/tests/actions.spec.ts +0 -252
  176. package/tests/adapters/actions-persistence.spec.ts +0 -144
  177. package/tests/adapters/postgresql.adapter.spec.ts +0 -127
  178. package/tests/adapters/sqlite.adapter.spec.ts +0 -181
  179. package/tests/config-input.spec.ts +0 -90
  180. package/tests/contracts/coinflip.contract.spec.ts +0 -94
  181. package/tests/contracts/dice.contract.spec.ts +0 -87
  182. package/tests/contracts/entrants.json +0 -729
  183. package/tests/contracts/exchange.contract.spec.ts +0 -84
  184. package/tests/contracts/lotto.contract.spec.ts +0 -59
  185. package/tests/contracts/nft.contract.spec.ts +0 -948
  186. package/tests/contracts/token.contract.spec.ts +0 -90
  187. package/tests/exchanges/coingecko.exchange.spec.ts +0 -169
  188. package/tests/exchanges/exchange.base.spec.ts +0 -246
  189. package/tests/helpers/mock-adapter.ts +0 -214
  190. package/tests/helpers/mock-fetch.ts +0 -165
  191. package/tests/hive-chain-features.spec.ts +0 -319
  192. package/tests/hive-rates.spec.ts +0 -443
  193. package/tests/integration/hive-rates.integration.spec.ts +0 -35
  194. package/tests/metadata.spec.ts +0 -63
  195. package/tests/setup.ts +0 -30
  196. package/tests/streamer-actions.spec.ts +0 -274
  197. package/tests/streamer.spec.ts +0 -342
  198. package/tests/types/rates.spec.ts +0 -216
  199. package/tests/utils.spec.ts +0 -113
  200. package/tsconfig.build.json +0 -4
  201. package/tslint.json +0 -21
  202. package/wallaby.js +0 -26
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRevenueSplitContract = createRevenueSplitContract;
4
+ const zod_1 = require("zod");
5
+ const contract_1 = require("./contract");
6
+ const helpers_1 = require("./helpers");
7
+ const DEFAULT_NAME = 'revenuesplit';
8
+ function createRevenueSplitContract(options = {}) {
9
+ const name = options.name || DEFAULT_NAME;
10
+ const state = (0, helpers_1.createContractState)();
11
+ const recipientSchema = zod_1.z.object({
12
+ account: zod_1.z.string().min(3).max(32),
13
+ bps: zod_1.z.number().int().min(1).max(10000)
14
+ });
15
+ const createSplitSchema = zod_1.z.object({
16
+ splitId: helpers_1.identifierSchema,
17
+ title: zod_1.z.string().min(3).max(140),
18
+ recipients: zod_1.z.array(recipientSchema).min(1).max(25),
19
+ metadata: zod_1.z.record(zod_1.z.any()).optional()
20
+ });
21
+ const splitIdSchema = zod_1.z.object({
22
+ splitId: helpers_1.identifierSchema
23
+ });
24
+ const updateSplitSchema = zod_1.z.object({
25
+ splitId: helpers_1.identifierSchema,
26
+ recipients: zod_1.z.array(recipientSchema).min(1).max(25),
27
+ metadata: zod_1.z.record(zod_1.z.any()).optional()
28
+ });
29
+ const withdrawSchema = zod_1.z.object({
30
+ splitId: helpers_1.identifierSchema.optional(),
31
+ asset: zod_1.z.string().min(3).max(16).optional()
32
+ }).optional();
33
+ const initialize = async () => {
34
+ await (0, helpers_1.initializeTables)(state.adapter, [
35
+ `
36
+ CREATE TABLE IF NOT EXISTS revenue_splits (
37
+ split_id TEXT PRIMARY KEY,
38
+ owner TEXT NOT NULL,
39
+ title TEXT NOT NULL,
40
+ recipients_json TEXT NOT NULL,
41
+ active INTEGER NOT NULL,
42
+ metadata TEXT,
43
+ created_at DATETIME NOT NULL,
44
+ updated_at DATETIME NOT NULL
45
+ )
46
+ `,
47
+ `
48
+ CREATE TABLE IF NOT EXISTS revenue_split_balances (
49
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
50
+ split_id TEXT NOT NULL,
51
+ account TEXT NOT NULL,
52
+ asset TEXT NOT NULL,
53
+ balance TEXT NOT NULL,
54
+ updated_at DATETIME NOT NULL,
55
+ UNIQUE(split_id, account, asset)
56
+ )
57
+ `,
58
+ `
59
+ CREATE TABLE IF NOT EXISTS revenue_split_distributions (
60
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
61
+ split_id TEXT NOT NULL,
62
+ amount TEXT NOT NULL,
63
+ asset TEXT NOT NULL,
64
+ payer TEXT NOT NULL,
65
+ reference TEXT,
66
+ created_at DATETIME NOT NULL
67
+ )
68
+ `
69
+ ]);
70
+ };
71
+ const validateRecipients = (owner, recipients) => {
72
+ const accounts = (0, helpers_1.uniqueItems)(recipients.map(recipient => recipient.account));
73
+ if (accounts.length !== recipients.length) {
74
+ throw new Error('Recipient accounts must be unique');
75
+ }
76
+ if (!accounts.includes(owner)) {
77
+ accounts.push(owner);
78
+ }
79
+ const totalBps = recipients.reduce((sum, recipient) => sum + recipient.bps, 0);
80
+ if (totalBps !== 10000) {
81
+ throw new Error('Recipient basis points must total 10000');
82
+ }
83
+ };
84
+ const createSplit = async (payload, ctx) => {
85
+ const owner = (0, helpers_1.requireSender)(ctx);
86
+ validateRecipients(owner, payload.recipients);
87
+ const existing = await state.adapter.query('SELECT split_id FROM revenue_splits WHERE split_id = ?', [payload.splitId]);
88
+ if (existing.length > 0) {
89
+ throw new Error(`Split ${payload.splitId} already exists`);
90
+ }
91
+ await state.adapter.query(`INSERT INTO revenue_splits (
92
+ split_id, owner, title, recipients_json, active, metadata, created_at, updated_at
93
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
94
+ payload.splitId,
95
+ owner,
96
+ payload.title,
97
+ JSON.stringify(payload.recipients),
98
+ 1,
99
+ JSON.stringify(payload.metadata || {}),
100
+ new Date(),
101
+ new Date()
102
+ ]);
103
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createSplit', payload, {
104
+ action: 'revenue_split_created',
105
+ data: {
106
+ splitId: payload.splitId,
107
+ owner
108
+ }
109
+ });
110
+ };
111
+ const updateSplit = async (payload, ctx) => {
112
+ const owner = (0, helpers_1.requireSender)(ctx);
113
+ const rows = await state.adapter.query('SELECT * FROM revenue_splits WHERE split_id = ?', [payload.splitId]);
114
+ if (rows.length === 0) {
115
+ throw new Error(`Split ${payload.splitId} does not exist`);
116
+ }
117
+ const split = rows[0];
118
+ if (split.owner !== owner) {
119
+ throw new Error('Only the split owner can update recipients');
120
+ }
121
+ validateRecipients(owner, payload.recipients);
122
+ await state.adapter.query('UPDATE revenue_splits SET recipients_json = ?, metadata = ?, updated_at = ? WHERE split_id = ?', [JSON.stringify(payload.recipients), JSON.stringify(payload.metadata || (0, helpers_1.parseJson)(split.metadata, {})), new Date(), payload.splitId]);
123
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'updateSplit', payload, {
124
+ action: 'revenue_split_updated',
125
+ data: {
126
+ splitId: payload.splitId,
127
+ owner
128
+ }
129
+ });
130
+ };
131
+ const distribute = async (payload, ctx) => {
132
+ const payer = (0, helpers_1.requireSender)(ctx);
133
+ const payment = (0, helpers_1.getIncomingPayment)(ctx);
134
+ const rows = await state.adapter.query('SELECT * FROM revenue_splits WHERE split_id = ?', [payload.splitId]);
135
+ if (rows.length === 0) {
136
+ throw new Error(`Split ${payload.splitId} does not exist`);
137
+ }
138
+ const split = rows[0];
139
+ if (!split.active) {
140
+ throw new Error('Revenue split is not active');
141
+ }
142
+ const recipients = (0, helpers_1.parseJson)(split.recipients_json, []);
143
+ let allocated = (0, helpers_1.toBigNumber)(0);
144
+ for (let index = 0; index < recipients.length; index++) {
145
+ const recipient = recipients[index];
146
+ const share = index === recipients.length - 1
147
+ ? (0, helpers_1.toBigNumber)(payment.amount).minus(allocated)
148
+ : (0, helpers_1.toBigNumber)(payment.amount).multipliedBy(recipient.bps).dividedBy(10000).decimalPlaces(8, 1);
149
+ allocated = allocated.plus(share);
150
+ const balanceRows = await state.adapter.query('SELECT * FROM revenue_split_balances WHERE split_id = ? AND account = ? AND asset = ?', [payload.splitId, recipient.account, payment.asset]);
151
+ const currentBalance = balanceRows.length > 0 ? (0, helpers_1.toBigNumber)(balanceRows[0].balance) : (0, helpers_1.toBigNumber)(0);
152
+ const nextBalance = currentBalance.plus(share);
153
+ await state.adapter.query(`INSERT INTO revenue_split_balances (split_id, account, asset, balance, updated_at)
154
+ VALUES (?, ?, ?, ?, ?)
155
+ ON CONFLICT(split_id, account, asset)
156
+ DO UPDATE SET balance = excluded.balance, updated_at = excluded.updated_at`, [payload.splitId, recipient.account, payment.asset, nextBalance.toFixed(), new Date()]);
157
+ }
158
+ await state.adapter.query('INSERT INTO revenue_split_distributions (split_id, amount, asset, payer, reference, created_at) VALUES (?, ?, ?, ?, ?, ?)', [payload.splitId, payment.amount, payment.asset, payer, payment.memo || '', new Date()]);
159
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'distribute', payload, {
160
+ action: 'revenue_split_distributed',
161
+ data: {
162
+ splitId: payload.splitId,
163
+ payer,
164
+ amount: payment.amount,
165
+ asset: payment.asset,
166
+ recipients
167
+ }
168
+ });
169
+ };
170
+ const withdraw = async (payload = {}, ctx) => {
171
+ const account = (0, helpers_1.requireSender)(ctx);
172
+ const balances = payload.splitId
173
+ ? await state.adapter.query('SELECT * FROM revenue_split_balances WHERE split_id = ? AND account = ?', [payload.splitId, account])
174
+ : await state.adapter.query('SELECT * FROM revenue_split_balances WHERE account = ?', [account]);
175
+ const filtered = balances.filter((balance) => !payload.asset || balance.asset === payload.asset);
176
+ if (filtered.length === 0) {
177
+ throw new Error('No withdrawable revenue split balances found');
178
+ }
179
+ for (const balance of filtered) {
180
+ if ((0, helpers_1.toBigNumber)(balance.balance).lte(0)) {
181
+ continue;
182
+ }
183
+ await state.adapter.query('UPDATE revenue_split_balances SET balance = ?, updated_at = ? WHERE split_id = ? AND account = ? AND asset = ?', ['0', new Date(), balance.split_id, account, balance.asset]);
184
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'withdraw', payload, {
185
+ action: 'revenue_split_withdrawal_requested',
186
+ data: {
187
+ splitId: balance.split_id,
188
+ account,
189
+ amount: balance.balance,
190
+ asset: balance.asset
191
+ }
192
+ });
193
+ }
194
+ };
195
+ return (0, contract_1.defineContract)({
196
+ name,
197
+ hooks: {
198
+ create: async ({ adapter }) => {
199
+ state.adapter = adapter;
200
+ await initialize();
201
+ }
202
+ },
203
+ actions: {
204
+ createSplit: (0, contract_1.action)(createSplit, { schema: createSplitSchema, trigger: 'custom_json' }),
205
+ updateSplit: (0, contract_1.action)(updateSplit, { schema: updateSplitSchema, trigger: 'custom_json' }),
206
+ distribute: (0, contract_1.action)(distribute, { schema: splitIdSchema, trigger: ['transfer', 'recurrent_transfer'] }),
207
+ withdraw: (0, contract_1.action)(withdraw, { schema: withdrawSchema, trigger: 'custom_json' })
208
+ }
209
+ });
210
+ }
211
+ //# sourceMappingURL=revenuesplit.contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revenuesplit.contract.js","sourceRoot":"","sources":["../../src/contracts/revenuesplit.contract.ts"],"names":[],"mappings":";;AAsBA,gEAkQC;AAxRD,6BAAwB;AACxB,yCAAoD;AACpD,uCAYmB;AAEnB,MAAM,YAAY,GAAG,cAAc,CAAC;AAMpC,SAAgB,0BAA0B,CAAC,UAAuC,EAAE;IAChF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAA,6BAAmB,GAAE,CAAC;IAEpC,MAAM,eAAe,GAAG,OAAC,CAAC,MAAM,CAAC;QAC7B,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;KAC1C,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;QAC/B,OAAO,EAAE,0BAAgB;QACzB,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACjC,UAAU,EAAE,OAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;KACzC,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,OAAC,CAAC,MAAM,CAAC;QAC3B,OAAO,EAAE,0BAAgB;KAC5B,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;QAC/B,OAAO,EAAE,0BAAgB;QACzB,UAAU,EAAE,OAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;KACzC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,OAAC,CAAC,MAAM,CAAC;QAC5B,OAAO,EAAE,0BAAgB,CAAC,QAAQ,EAAE;QACpC,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;KAC9C,CAAC,CAAC,QAAQ,EAAE,CAAC;IAEd,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAA,0BAAgB,EAAC,KAAK,CAAC,OAAO,EAAE;YAClC;;;;;;;;;;;aAWC;YACD;;;;;;;;;;aAUC;YACD;;;;;;;;;;aAUC;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,UAAkD,EAAE,EAAE;QAC7F,MAAM,QAAQ,GAAG,IAAA,qBAAW,EAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7E,IAAI,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EAAE,OAA0C,EAAE,GAAQ,EAAE,EAAE;QAC/E,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACjC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAE9C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,wDAAwD,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACxH,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB;;8CAEkC,EAClC;YACI,OAAO,CAAC,OAAO;YACf,KAAK;YACL,OAAO,CAAC,KAAK;YACb,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC;YAClC,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;YACtC,IAAI,IAAI,EAAE;YACV,IAAI,IAAI,EAAE;SACb,CACJ,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE;YACjE,MAAM,EAAE,uBAAuB;YAC/B,IAAI,EAAE;gBACF,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,KAAK;aACR;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EAAE,OAA0C,EAAE,GAAQ,EAAE,EAAE;QAC/E,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,iDAAiD,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7G,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAClE,CAAC;QAED,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAE9C,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,gGAAgG,EAChG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAA,mBAAS,EAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CACvI,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE;YACjE,MAAM,EAAE,uBAAuB;YAC/B,IAAI,EAAE;gBACF,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,KAAK;aACR;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,EAAE,OAA4B,EAAE,GAAQ,EAAE,EAAE;QAChE,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,IAAA,4BAAkB,EAAC,GAAG,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,iDAAiD,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7G,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,CAAC,OAAO,iBAAiB,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,UAAU,GAAG,IAAA,mBAAS,EAA0C,KAAK,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QACjG,IAAI,SAAS,GAAG,IAAA,qBAAW,EAAC,CAAC,CAAC,CAAC;QAE/B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,KAAK,KAAK,UAAU,CAAC,MAAM,GAAG,CAAC;gBACzC,CAAC,CAAC,IAAA,qBAAW,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBAC9C,CAAC,CAAC,IAAA,qBAAW,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACnG,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAElC,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACzC,uFAAuF,EACvF,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CACtD,CAAC;YACF,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,qBAAW,EAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAA,qBAAW,EAAC,CAAC,CAAC,CAAC;YACrG,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE/C,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB;;;4FAG4E,EAC5E,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CACzF,CAAC;QACN,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,2HAA2H,EAC3H,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAC1F,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE;YAChE,MAAM,EAAE,2BAA2B;YACnC,IAAI,EAAE;gBACF,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,KAAK;gBACL,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,UAAU;aACb;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,UAAgD,EAAE,EAAE,GAAQ,EAAE,EAAE;QACpF,MAAM,OAAO,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO;YAC5B,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACvB,yEAAyE,EACzE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAC7B;YACD,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACvB,wDAAwD,EACxD,CAAC,OAAO,CAAC,CACZ,CAAC;QAEN,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;QACtG,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACpE,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,IAAI,IAAA,qBAAW,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtC,SAAS;YACb,CAAC;YAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,gHAAgH,EAChH,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAC9D,CAAC;YAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE;gBAC9D,MAAM,EAAE,oCAAoC;gBAC5C,IAAI,EAAE;oBACF,OAAO,EAAE,OAAO,CAAC,QAAQ;oBACzB,OAAO;oBACP,MAAM,EAAE,OAAO,CAAC,OAAO;oBACvB,KAAK,EAAE,OAAO,CAAC,KAAK;iBACvB;aACJ,CAAC,CAAC;QACP,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,IAAA,yBAAc,EAAC;QAClB,IAAI;QACJ,KAAK,EAAE;YACH,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC1B,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;gBACxB,MAAM,UAAU,EAAE,CAAC;YACvB,CAAC;SACJ;QACD,OAAO,EAAE;YACL,WAAW,EAAE,IAAA,iBAAM,EAAC,WAAW,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YACvF,WAAW,EAAE,IAAA,iBAAM,EAAC,WAAW,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YACvF,UAAU,EAAE,IAAA,iBAAM,EAAC,UAAU,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC;YACtG,QAAQ,EAAE,IAAA,iBAAM,EAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;SACjF;KACJ,CAAC,CAAC;AACP,CAAC"}
@@ -9,6 +9,7 @@ const seedrandom_1 = __importDefault(require("seedrandom"));
9
9
  const uuid_1 = require("uuid");
10
10
  const zod_1 = require("zod");
11
11
  const contract_1 = require("./contract");
12
+ const helpers_1 = require("./helpers");
12
13
  const DEFAULT_NAME = 'rps';
13
14
  const DEFAULT_ACCOUNT = 'beggars';
14
15
  const DEFAULT_TOKEN_SYMBOL = 'HIVE';
@@ -51,11 +52,7 @@ function createRpsContract(options = {}) {
51
52
  try {
52
53
  const accountInfo = await state.streamer['client'].database.getAccounts([account]);
53
54
  if (accountInfo?.[0]) {
54
- const balanceParts = accountInfo[0].balance.split(' ');
55
- const amount = new bignumber_js_1.default(balanceParts[0]);
56
- if (amount.isNaN() || !amount.isFinite()) {
57
- throw new Error('Invalid balance format received from API');
58
- }
55
+ const amount = (0, helpers_1.parseBlockchainAmount)(accountInfo[0].balance).value;
59
56
  state.balanceCache = {
60
57
  balance: amount,
61
58
  timestamp: now
@@ -71,6 +68,15 @@ function createRpsContract(options = {}) {
71
68
  }
72
69
  return new bignumber_js_1.default(0);
73
70
  };
71
+ const debitCachedBalance = (amount) => {
72
+ if (!state.balanceCache) {
73
+ return;
74
+ }
75
+ state.balanceCache = {
76
+ balance: bignumber_js_1.default.maximum(new bignumber_js_1.default(0), state.balanceCache.balance.minus(amount)),
77
+ timestamp: Date.now()
78
+ };
79
+ };
74
80
  const processQueue = async () => {
75
81
  if (state.processingQueue || state.betQueue.length === 0) {
76
82
  return;
@@ -101,41 +107,46 @@ function createRpsContract(options = {}) {
101
107
  const sender = ctx.sender;
102
108
  const amountRaw = ctx.transfer.rawAmount;
103
109
  try {
104
- if (!amountRaw || typeof amountRaw !== 'string' || !amountRaw.includes(' ')) {
105
- throw new Error('Invalid amount format');
110
+ let parsedAmount;
111
+ try {
112
+ parsedAmount = (0, helpers_1.parseBlockchainAmount)(amountRaw);
106
113
  }
107
- const amountTrim = amountRaw.split(' ');
108
- if (amountTrim.length !== 2) {
114
+ catch (error) {
109
115
  throw new Error('Invalid amount format');
110
116
  }
111
- const amountParsed = new bignumber_js_1.default(amountTrim[0]);
112
- if (amountParsed.isNaN() || !amountParsed.isFinite() || amountParsed.isNegative()) {
117
+ const amountParsed = parsedAmount.value;
118
+ if (amountParsed.isNegative()) {
113
119
  throw new Error('Invalid amount value');
114
120
  }
115
- const amountCurrency = amountTrim[1].trim();
121
+ const amountCurrency = parsedAmount.asset;
116
122
  const transaction = await state.streamer.getTransaction(ctx.block.number, ctx.transaction.id);
117
123
  const verify = await state.streamer.verifyTransfer(transaction, sender, account, amountRaw);
118
124
  const balance = await getBalance();
119
125
  const availableBalance = balance.minus(state.pendingPayouts);
120
126
  if (verify) {
121
127
  if (!validCurrencies.includes(amountCurrency)) {
122
- await state.streamer.transferHiveTokens(account, sender, amountTrim[0], amountTrim[1], '[Refund] You sent an invalid currency.');
128
+ await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, '[Refund] You sent an invalid currency.');
129
+ debitCachedBalance(amountParsed);
123
130
  return;
124
131
  }
125
132
  if (amountParsed.isLessThan(minAmount)) {
126
- await state.streamer.transferHiveTokens(account, sender, amountTrim[0], amountTrim[1], `[Refund] Bet amount too small. Minimum: ${minAmount} ${amountCurrency}.`);
133
+ await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, `[Refund] Bet amount too small. Minimum: ${minAmount} ${amountCurrency}.`);
134
+ debitCachedBalance(amountParsed);
127
135
  return;
128
136
  }
129
137
  if (amountParsed.isGreaterThan(maxAmount)) {
130
- await state.streamer.transferHiveTokens(account, sender, amountTrim[0], amountTrim[1], `[Refund] You sent too much. Maximum: ${maxAmount} ${amountCurrency}.`);
138
+ await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, `[Refund] You sent too much. Maximum: ${maxAmount} ${amountCurrency}.`);
139
+ debitCachedBalance(amountParsed);
131
140
  return;
132
141
  }
133
142
  const potentialPayout = amountParsed.multipliedBy(2);
134
143
  if (potentialPayout.isGreaterThan(availableBalance)) {
135
- await state.streamer.transferHiveTokens(account, sender, amountTrim[0], amountTrim[1], '[Refund] The server cannot afford this bet payout.');
144
+ await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, '[Refund] The server cannot afford this bet payout.');
145
+ debitCachedBalance(amountParsed);
136
146
  return;
137
147
  }
138
148
  state.pendingPayouts = state.pendingPayouts.plus(potentialPayout);
149
+ let payoutIncremented = true;
139
150
  try {
140
151
  const serverSeed = (0, uuid_1.v4)();
141
152
  const serverMove = rng(ctx.block.previousId, ctx.block.id, ctx.transaction.id, serverSeed, payload.seed ?? '');
@@ -159,17 +170,23 @@ function createRpsContract(options = {}) {
159
170
  }
160
171
  });
161
172
  if (result === 'win') {
162
- await state.streamer.transferHiveTokens(account, sender, potentialPayout.toFixed(3), amountTrim[1], `[Winner] | You: ${payload.move} | Server: ${serverMove} | Seed: ${serverSeed}`);
173
+ await state.streamer.transferHiveTokens(account, sender, (0, helpers_1.formatBlockchainAmount)(potentialPayout), parsedAmount.asset, `[Winner] | You: ${payload.move} | Server: ${serverMove} | Seed: ${serverSeed}`);
174
+ debitCachedBalance(potentialPayout);
163
175
  }
164
176
  else if (result === 'tie') {
165
- await state.streamer.transferHiveTokens(account, sender, amountTrim[0], amountTrim[1], `[Tie] | You: ${payload.move} | Server: ${serverMove} | Seed: ${serverSeed}`);
177
+ await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, `[Tie] | You: ${payload.move} | Server: ${serverMove} | Seed: ${serverSeed}`);
178
+ debitCachedBalance(amountParsed);
166
179
  }
167
180
  else {
168
- await state.streamer.transferHiveTokens(account, sender, '0.001', amountTrim[1], `[Lost] | You: ${payload.move} | Server: ${serverMove} | Seed: ${serverSeed}`);
181
+ await state.streamer.transferHiveTokens(account, sender, '0.001', parsedAmount.asset, `[Lost] | You: ${payload.move} | Server: ${serverMove} | Seed: ${serverSeed}`);
182
+ debitCachedBalance(new bignumber_js_1.default('0.001'));
169
183
  }
170
184
  }
171
185
  finally {
172
- state.pendingPayouts = state.pendingPayouts.minus(potentialPayout);
186
+ if (payoutIncremented) {
187
+ state.pendingPayouts = state.pendingPayouts.minus(potentialPayout);
188
+ payoutIncremented = false;
189
+ }
173
190
  }
174
191
  }
175
192
  }
@@ -181,6 +198,17 @@ function createRpsContract(options = {}) {
181
198
  payload,
182
199
  message: error.message
183
200
  });
201
+ // Attempt refund on unexpected errors to avoid loss of funds
202
+ try {
203
+ if (amountRaw && typeof amountRaw === 'string' && amountRaw.includes(' ')) {
204
+ const parsedAmount = (0, helpers_1.parseBlockchainAmount)(amountRaw);
205
+ await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, '[Refund] An error occurred processing your bet.');
206
+ debitCachedBalance(parsedAmount.value);
207
+ }
208
+ }
209
+ catch (refundError) {
210
+ console.error('[RpsContract] Refund failed:', refundError);
211
+ }
184
212
  throw error;
185
213
  }
186
214
  };
@@ -1 +1 @@
1
- {"version":3,"file":"rps.contract.js","sourceRoot":"","sources":["../../src/contracts/rps.contract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rps.contract.js","sourceRoot":"","sources":["../../src/contracts/rps.contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export interface SavingsContractOptions {
2
+ name?: string;
3
+ }
4
+ export declare function createSavingsContract(options?: SavingsContractOptions): import("..").ContractDefinition;
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSavingsContract = createSavingsContract;
4
+ const zod_1 = require("zod");
5
+ const contract_1 = require("./contract");
6
+ const helpers_1 = require("./helpers");
7
+ const DEFAULT_NAME = 'savings';
8
+ function createSavingsContract(options = {}) {
9
+ const name = options.name || DEFAULT_NAME;
10
+ const state = (0, helpers_1.createContractState)();
11
+ const createGoalSchema = zod_1.z.object({
12
+ goalId: helpers_1.identifierSchema,
13
+ title: zod_1.z.string().min(3).max(140),
14
+ targetAmount: helpers_1.amountSchema,
15
+ asset: helpers_1.assetSchema,
16
+ deadline: zod_1.z.string().optional(),
17
+ allowEarlyWithdraw: zod_1.z.boolean().optional(),
18
+ metadata: zod_1.z.record(zod_1.z.any()).optional()
19
+ });
20
+ const goalIdSchema = zod_1.z.object({
21
+ goalId: helpers_1.identifierSchema
22
+ });
23
+ const withdrawSchema = zod_1.z.object({
24
+ goalId: helpers_1.identifierSchema,
25
+ amount: helpers_1.amountSchema.optional(),
26
+ note: zod_1.z.string().max(280).optional()
27
+ });
28
+ const initialize = async () => {
29
+ await (0, helpers_1.initializeTables)(state.adapter, [
30
+ `
31
+ CREATE TABLE IF NOT EXISTS savings_goals (
32
+ goal_id TEXT PRIMARY KEY,
33
+ owner TEXT NOT NULL,
34
+ title TEXT NOT NULL,
35
+ target_amount TEXT NOT NULL,
36
+ current_amount TEXT NOT NULL,
37
+ asset TEXT NOT NULL,
38
+ deadline DATETIME,
39
+ allow_early_withdraw INTEGER NOT NULL,
40
+ status TEXT NOT NULL,
41
+ metadata TEXT,
42
+ created_at DATETIME NOT NULL,
43
+ updated_at DATETIME NOT NULL
44
+ )
45
+ `,
46
+ `
47
+ CREATE TABLE IF NOT EXISTS savings_contributions (
48
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
49
+ goal_id TEXT NOT NULL,
50
+ contributor TEXT NOT NULL,
51
+ amount TEXT NOT NULL,
52
+ asset TEXT NOT NULL,
53
+ source TEXT NOT NULL,
54
+ transaction_id TEXT NOT NULL,
55
+ created_at DATETIME NOT NULL
56
+ )
57
+ `,
58
+ `
59
+ CREATE TABLE IF NOT EXISTS savings_withdrawals (
60
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
61
+ goal_id TEXT NOT NULL,
62
+ owner TEXT NOT NULL,
63
+ amount TEXT NOT NULL,
64
+ note TEXT,
65
+ created_at DATETIME NOT NULL
66
+ )
67
+ `
68
+ ]);
69
+ };
70
+ const createGoal = async (payload, ctx) => {
71
+ const owner = (0, helpers_1.requireSender)(ctx);
72
+ const existing = await state.adapter.query('SELECT goal_id FROM savings_goals WHERE goal_id = ?', [payload.goalId]);
73
+ if (existing.length > 0) {
74
+ throw new Error(`Goal ${payload.goalId} already exists`);
75
+ }
76
+ const deadline = (0, helpers_1.parseDateValue)(payload.deadline);
77
+ if (deadline && deadline <= new Date()) {
78
+ throw new Error('Goal deadline must be in the future');
79
+ }
80
+ await state.adapter.query(`INSERT INTO savings_goals (
81
+ goal_id, owner, title, target_amount, current_amount, asset, deadline, allow_early_withdraw, status, metadata, created_at, updated_at
82
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
83
+ payload.goalId,
84
+ owner,
85
+ payload.title,
86
+ payload.targetAmount,
87
+ '0',
88
+ payload.asset,
89
+ deadline,
90
+ payload.allowEarlyWithdraw ? 1 : 0,
91
+ 'open',
92
+ JSON.stringify(payload.metadata || {}),
93
+ new Date(),
94
+ new Date()
95
+ ]);
96
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createGoal', payload, {
97
+ action: 'savings_goal_created',
98
+ data: {
99
+ goalId: payload.goalId,
100
+ owner
101
+ }
102
+ });
103
+ };
104
+ const contribute = async (payload, ctx) => {
105
+ const contributor = (0, helpers_1.requireSender)(ctx);
106
+ const payment = (0, helpers_1.getIncomingPayment)(ctx);
107
+ const goals = await state.adapter.query('SELECT * FROM savings_goals WHERE goal_id = ?', [payload.goalId]);
108
+ if (goals.length === 0) {
109
+ throw new Error(`Goal ${payload.goalId} does not exist`);
110
+ }
111
+ const goal = goals[0];
112
+ if (goal.status !== 'open' && goal.status !== 'funded') {
113
+ throw new Error('Goal is not accepting contributions');
114
+ }
115
+ (0, helpers_1.assertAssetMatches)(payment.asset, goal.asset);
116
+ const currentAmount = (0, helpers_1.toBigNumber)(goal.current_amount).plus(payment.amount);
117
+ const status = currentAmount.gte(goal.target_amount)
118
+ ? 'funded'
119
+ : goal.status;
120
+ await state.adapter.query('INSERT INTO savings_contributions (goal_id, contributor, amount, asset, source, transaction_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)', [payload.goalId, contributor, payment.amount, payment.asset, payment.source, ctx.transaction.id, new Date()]);
121
+ await state.adapter.query('UPDATE savings_goals SET current_amount = ?, status = ?, updated_at = ? WHERE goal_id = ?', [currentAmount.toFixed(), status, new Date(), payload.goalId]);
122
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'contribute', payload, {
123
+ action: 'savings_contribution_received',
124
+ data: {
125
+ goalId: payload.goalId,
126
+ contributor,
127
+ amount: payment.amount,
128
+ asset: payment.asset,
129
+ currentAmount: currentAmount.toFixed(),
130
+ status
131
+ }
132
+ });
133
+ };
134
+ const withdraw = async (payload, ctx) => {
135
+ const owner = (0, helpers_1.requireSender)(ctx);
136
+ const goals = await state.adapter.query('SELECT * FROM savings_goals WHERE goal_id = ?', [payload.goalId]);
137
+ if (goals.length === 0) {
138
+ throw new Error(`Goal ${payload.goalId} does not exist`);
139
+ }
140
+ const goal = goals[0];
141
+ if (goal.owner !== owner) {
142
+ throw new Error('Only the goal owner can withdraw funds');
143
+ }
144
+ const goalMet = (0, helpers_1.toBigNumber)(goal.current_amount).gte(goal.target_amount);
145
+ if (!goalMet && !goal.allow_early_withdraw) {
146
+ throw new Error('Goal has not been met and early withdrawals are disabled');
147
+ }
148
+ const amount = payload.amount || goal.current_amount;
149
+ if ((0, helpers_1.toBigNumber)(amount).gt(goal.current_amount)) {
150
+ throw new Error('Withdrawal amount exceeds available goal balance');
151
+ }
152
+ const remaining = (0, helpers_1.toBigNumber)(goal.current_amount).minus(amount);
153
+ const nextStatus = remaining.eq(0)
154
+ ? 'withdrawn'
155
+ : goal.status;
156
+ await state.adapter.query('INSERT INTO savings_withdrawals (goal_id, owner, amount, note, created_at) VALUES (?, ?, ?, ?, ?)', [payload.goalId, owner, amount, payload.note || '', new Date()]);
157
+ await state.adapter.query('UPDATE savings_goals SET current_amount = ?, status = ?, updated_at = ? WHERE goal_id = ?', [remaining.toFixed(), nextStatus, new Date(), payload.goalId]);
158
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'withdraw', payload, {
159
+ action: 'savings_withdrawal_requested',
160
+ data: {
161
+ goalId: payload.goalId,
162
+ owner,
163
+ amount,
164
+ asset: goal.asset,
165
+ remainingAmount: remaining.toFixed()
166
+ }
167
+ });
168
+ };
169
+ const closeGoal = async (payload, ctx) => {
170
+ const goals = await state.adapter.query('SELECT * FROM savings_goals WHERE goal_id = ?', [payload.goalId]);
171
+ if (goals.length === 0) {
172
+ throw new Error(`Goal ${payload.goalId} does not exist`);
173
+ }
174
+ const goal = goals[0];
175
+ if (ctx.trigger !== 'time') {
176
+ const sender = (0, helpers_1.requireSender)(ctx);
177
+ if (sender !== goal.owner) {
178
+ throw new Error('Only the goal owner can close this goal');
179
+ }
180
+ }
181
+ await state.adapter.query('UPDATE savings_goals SET status = ?, updated_at = ? WHERE goal_id = ?', ['closed', new Date(), payload.goalId]);
182
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'closeGoal', payload, {
183
+ action: 'savings_goal_closed',
184
+ data: {
185
+ goalId: payload.goalId,
186
+ owner: goal.owner,
187
+ currentAmount: goal.current_amount,
188
+ asset: goal.asset
189
+ }
190
+ });
191
+ };
192
+ return (0, contract_1.defineContract)({
193
+ name,
194
+ hooks: {
195
+ create: async ({ adapter }) => {
196
+ state.adapter = adapter;
197
+ await initialize();
198
+ }
199
+ },
200
+ actions: {
201
+ createGoal: (0, contract_1.action)(createGoal, { schema: createGoalSchema, trigger: 'custom_json' }),
202
+ contribute: (0, contract_1.action)(contribute, { schema: goalIdSchema, trigger: ['transfer', 'recurrent_transfer'] }),
203
+ withdraw: (0, contract_1.action)(withdraw, { schema: withdrawSchema, trigger: 'custom_json' }),
204
+ closeGoal: (0, contract_1.action)(closeGoal, { schema: goalIdSchema, trigger: ['custom_json', 'time'] })
205
+ }
206
+ });
207
+ }
208
+ //# sourceMappingURL=savings.contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"savings.contract.js","sourceRoot":"","sources":["../../src/contracts/savings.contract.ts"],"names":[],"mappings":"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"}