hive-stream 3.0.2 → 3.0.3

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 (197) hide show
  1. package/DOCUMENTATION.md +50 -2
  2. package/README.md +44 -3
  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/config.d.ts +7 -1
  19. package/dist/config.js +7 -1
  20. package/dist/config.js.map +1 -1
  21. package/dist/contracts/auctionhouse.contract.d.ts +4 -0
  22. package/dist/contracts/auctionhouse.contract.js +234 -0
  23. package/dist/contracts/auctionhouse.contract.js.map +1 -0
  24. package/dist/contracts/booking.contract.d.ts +4 -0
  25. package/dist/contracts/booking.contract.js +225 -0
  26. package/dist/contracts/booking.contract.js.map +1 -0
  27. package/dist/contracts/bountyboard.contract.d.ts +4 -0
  28. package/dist/contracts/bountyboard.contract.js +233 -0
  29. package/dist/contracts/bountyboard.contract.js.map +1 -0
  30. package/dist/contracts/bundlemarketplace.contract.d.ts +4 -0
  31. package/dist/contracts/bundlemarketplace.contract.js +195 -0
  32. package/dist/contracts/bundlemarketplace.contract.js.map +1 -0
  33. package/dist/contracts/charitymatch.contract.d.ts +4 -0
  34. package/dist/contracts/charitymatch.contract.js +172 -0
  35. package/dist/contracts/charitymatch.contract.js.map +1 -0
  36. package/dist/contracts/coinflip.contract.js +7 -1
  37. package/dist/contracts/coinflip.contract.js.map +1 -1
  38. package/dist/contracts/crowdfund.contract.d.ts +4 -0
  39. package/dist/contracts/crowdfund.contract.js +290 -0
  40. package/dist/contracts/crowdfund.contract.js.map +1 -0
  41. package/dist/contracts/dcabot.contract.d.ts +4 -0
  42. package/dist/contracts/dcabot.contract.js +217 -0
  43. package/dist/contracts/dcabot.contract.js.map +1 -0
  44. package/dist/contracts/dice.contract.js +7 -1
  45. package/dist/contracts/dice.contract.js.map +1 -1
  46. package/dist/contracts/domainregistry.contract.d.ts +4 -0
  47. package/dist/contracts/domainregistry.contract.js +232 -0
  48. package/dist/contracts/domainregistry.contract.js.map +1 -0
  49. package/dist/contracts/exchange.contract.js +209 -168
  50. package/dist/contracts/exchange.contract.js.map +1 -1
  51. package/dist/contracts/fanclub.contract.d.ts +4 -0
  52. package/dist/contracts/fanclub.contract.js +193 -0
  53. package/dist/contracts/fanclub.contract.js.map +1 -0
  54. package/dist/contracts/giftcard.contract.d.ts +4 -0
  55. package/dist/contracts/giftcard.contract.js +158 -0
  56. package/dist/contracts/giftcard.contract.js.map +1 -0
  57. package/dist/contracts/grantrounds.contract.d.ts +4 -0
  58. package/dist/contracts/grantrounds.contract.js +265 -0
  59. package/dist/contracts/grantrounds.contract.js.map +1 -0
  60. package/dist/contracts/groupbuy.contract.d.ts +4 -0
  61. package/dist/contracts/groupbuy.contract.js +198 -0
  62. package/dist/contracts/groupbuy.contract.js.map +1 -0
  63. package/dist/contracts/helpers.d.ts +64 -0
  64. package/dist/contracts/helpers.js +159 -0
  65. package/dist/contracts/helpers.js.map +1 -0
  66. package/dist/contracts/insurancepool.contract.d.ts +4 -0
  67. package/dist/contracts/insurancepool.contract.js +281 -0
  68. package/dist/contracts/insurancepool.contract.js.map +1 -0
  69. package/dist/contracts/invoice.contract.d.ts +4 -0
  70. package/dist/contracts/invoice.contract.js +193 -0
  71. package/dist/contracts/invoice.contract.js.map +1 -0
  72. package/dist/contracts/launchpad.contract.d.ts +4 -0
  73. package/dist/contracts/launchpad.contract.js +225 -0
  74. package/dist/contracts/launchpad.contract.js.map +1 -0
  75. package/dist/contracts/lotto.contract.js +53 -37
  76. package/dist/contracts/lotto.contract.js.map +1 -1
  77. package/dist/contracts/multisigtreasury.contract.d.ts +4 -0
  78. package/dist/contracts/multisigtreasury.contract.js +245 -0
  79. package/dist/contracts/multisigtreasury.contract.js.map +1 -0
  80. package/dist/contracts/nft.contract.d.ts +1 -0
  81. package/dist/contracts/nft.contract.js +236 -192
  82. package/dist/contracts/nft.contract.js.map +1 -1
  83. package/dist/contracts/oraclebounty.contract.d.ts +4 -0
  84. package/dist/contracts/oraclebounty.contract.js +250 -0
  85. package/dist/contracts/oraclebounty.contract.js.map +1 -0
  86. package/dist/contracts/payroll.contract.d.ts +4 -0
  87. package/dist/contracts/payroll.contract.js +232 -0
  88. package/dist/contracts/payroll.contract.js.map +1 -0
  89. package/dist/contracts/paywall.contract.d.ts +4 -0
  90. package/dist/contracts/paywall.contract.js +185 -0
  91. package/dist/contracts/paywall.contract.js.map +1 -0
  92. package/dist/contracts/poll.contract.js +2 -0
  93. package/dist/contracts/poll.contract.js.map +1 -1
  94. package/dist/contracts/predictionmarket.contract.d.ts +4 -0
  95. package/dist/contracts/predictionmarket.contract.js +213 -0
  96. package/dist/contracts/predictionmarket.contract.js.map +1 -0
  97. package/dist/contracts/proposaltimelock.contract.d.ts +4 -0
  98. package/dist/contracts/proposaltimelock.contract.js +250 -0
  99. package/dist/contracts/proposaltimelock.contract.js.map +1 -0
  100. package/dist/contracts/questpass.contract.d.ts +4 -0
  101. package/dist/contracts/questpass.contract.js +214 -0
  102. package/dist/contracts/questpass.contract.js.map +1 -0
  103. package/dist/contracts/referral.contract.d.ts +4 -0
  104. package/dist/contracts/referral.contract.js +238 -0
  105. package/dist/contracts/referral.contract.js.map +1 -0
  106. package/dist/contracts/rental.contract.d.ts +4 -0
  107. package/dist/contracts/rental.contract.js +221 -0
  108. package/dist/contracts/rental.contract.js.map +1 -0
  109. package/dist/contracts/revenuesplit.contract.d.ts +4 -0
  110. package/dist/contracts/revenuesplit.contract.js +211 -0
  111. package/dist/contracts/revenuesplit.contract.js.map +1 -0
  112. package/dist/contracts/rps.contract.js +17 -1
  113. package/dist/contracts/rps.contract.js.map +1 -1
  114. package/dist/contracts/savings.contract.d.ts +4 -0
  115. package/dist/contracts/savings.contract.js +208 -0
  116. package/dist/contracts/savings.contract.js.map +1 -0
  117. package/dist/contracts/subscription.contract.d.ts +4 -0
  118. package/dist/contracts/subscription.contract.js +241 -0
  119. package/dist/contracts/subscription.contract.js.map +1 -0
  120. package/dist/contracts/sweepstakes.contract.d.ts +4 -0
  121. package/dist/contracts/sweepstakes.contract.js +209 -0
  122. package/dist/contracts/sweepstakes.contract.js.map +1 -0
  123. package/dist/contracts/ticketing.contract.d.ts +4 -0
  124. package/dist/contracts/ticketing.contract.js +185 -0
  125. package/dist/contracts/ticketing.contract.js.map +1 -0
  126. package/dist/contracts/tipjar.contract.js +2 -0
  127. package/dist/contracts/tipjar.contract.js.map +1 -1
  128. package/dist/contracts/token.contract.js +135 -125
  129. package/dist/contracts/token.contract.js.map +1 -1
  130. package/dist/index.d.ts +39 -0
  131. package/dist/index.js +71 -1
  132. package/dist/index.js.map +1 -1
  133. package/dist/metadata.d.ts +7 -0
  134. package/dist/metadata.js +64 -1
  135. package/dist/metadata.js.map +1 -1
  136. package/dist/providers/block-provider.d.ts +22 -0
  137. package/dist/providers/block-provider.js +3 -0
  138. package/dist/providers/block-provider.js.map +1 -0
  139. package/dist/providers/haf-client.d.ts +30 -0
  140. package/dist/providers/haf-client.js +119 -0
  141. package/dist/providers/haf-client.js.map +1 -0
  142. package/dist/providers/haf-provider.d.ts +49 -0
  143. package/dist/providers/haf-provider.js +256 -0
  144. package/dist/providers/haf-provider.js.map +1 -0
  145. package/dist/providers/hive-provider.d.ts +13 -0
  146. package/dist/providers/hive-provider.js +25 -0
  147. package/dist/providers/hive-provider.js.map +1 -0
  148. package/dist/providers/index.d.ts +4 -0
  149. package/dist/providers/index.js +21 -0
  150. package/dist/providers/index.js.map +1 -0
  151. package/dist/streamer.d.ts +21 -1
  152. package/dist/streamer.js +187 -62
  153. package/dist/streamer.js.map +1 -1
  154. package/dist/utils.js +11 -2
  155. package/dist/utils.js.map +1 -1
  156. package/package.json +16 -1
  157. package/.claude/settings.local.json +0 -12
  158. package/.env.example +0 -3
  159. package/.travis.yml +0 -11
  160. package/AGENTS.md +0 -35
  161. package/CLAUDE.md +0 -75
  162. package/ecosystem.config.js +0 -17
  163. package/examples/contracts/README.md +0 -8
  164. package/examples/contracts/exchange.ts +0 -38
  165. package/examples/contracts/poll.ts +0 -21
  166. package/examples/contracts/rps.ts +0 -19
  167. package/examples/contracts/tipjar.ts +0 -19
  168. package/jest.config.js +0 -9
  169. package/test-contract-block.md +0 -19
  170. package/tests/actions.spec.ts +0 -252
  171. package/tests/adapters/actions-persistence.spec.ts +0 -144
  172. package/tests/adapters/postgresql.adapter.spec.ts +0 -127
  173. package/tests/adapters/sqlite.adapter.spec.ts +0 -181
  174. package/tests/config-input.spec.ts +0 -90
  175. package/tests/contracts/coinflip.contract.spec.ts +0 -94
  176. package/tests/contracts/dice.contract.spec.ts +0 -87
  177. package/tests/contracts/entrants.json +0 -729
  178. package/tests/contracts/exchange.contract.spec.ts +0 -84
  179. package/tests/contracts/lotto.contract.spec.ts +0 -59
  180. package/tests/contracts/nft.contract.spec.ts +0 -948
  181. package/tests/contracts/token.contract.spec.ts +0 -90
  182. package/tests/exchanges/coingecko.exchange.spec.ts +0 -169
  183. package/tests/exchanges/exchange.base.spec.ts +0 -246
  184. package/tests/helpers/mock-adapter.ts +0 -214
  185. package/tests/helpers/mock-fetch.ts +0 -165
  186. package/tests/hive-chain-features.spec.ts +0 -319
  187. package/tests/hive-rates.spec.ts +0 -443
  188. package/tests/integration/hive-rates.integration.spec.ts +0 -35
  189. package/tests/metadata.spec.ts +0 -63
  190. package/tests/setup.ts +0 -30
  191. package/tests/streamer-actions.spec.ts +0 -274
  192. package/tests/streamer.spec.ts +0 -342
  193. package/tests/types/rates.spec.ts +0 -216
  194. package/tests/utils.spec.ts +0 -113
  195. package/tsconfig.build.json +0 -4
  196. package/tslint.json +0 -21
  197. package/wallaby.js +0 -26
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBountyBoardContract = createBountyBoardContract;
4
+ const zod_1 = require("zod");
5
+ const contract_1 = require("./contract");
6
+ const helpers_1 = require("./helpers");
7
+ const DEFAULT_NAME = 'bountyboard';
8
+ function createBountyBoardContract(options = {}) {
9
+ const name = options.name || DEFAULT_NAME;
10
+ const state = (0, helpers_1.createContractState)();
11
+ const createBountySchema = zod_1.z.object({
12
+ bountyId: helpers_1.identifierSchema,
13
+ title: zod_1.z.string().min(3).max(140),
14
+ description: zod_1.z.string().max(1200).optional(),
15
+ deadline: zod_1.z.string().optional(),
16
+ maxWinners: zod_1.z.number().int().min(1).max(25).optional(),
17
+ metadata: zod_1.z.record(zod_1.z.any()).optional()
18
+ });
19
+ const submitWorkSchema = zod_1.z.object({
20
+ bountyId: helpers_1.identifierSchema,
21
+ submissionId: helpers_1.identifierSchema,
22
+ url: zod_1.z.string().url(),
23
+ description: zod_1.z.string().max(1000).optional()
24
+ });
25
+ const awardSchema = zod_1.z.object({
26
+ bountyId: helpers_1.identifierSchema,
27
+ submissionId: helpers_1.identifierSchema,
28
+ amount: helpers_1.amountSchema.optional(),
29
+ note: zod_1.z.string().max(280).optional()
30
+ });
31
+ const closeSchema = zod_1.z.object({
32
+ bountyId: helpers_1.identifierSchema
33
+ });
34
+ const initialize = async () => {
35
+ await (0, helpers_1.initializeTables)(state.adapter, [
36
+ `
37
+ CREATE TABLE IF NOT EXISTS bounty_board_bounties (
38
+ bounty_id TEXT PRIMARY KEY,
39
+ sponsor TEXT NOT NULL,
40
+ title TEXT NOT NULL,
41
+ description TEXT,
42
+ reward_pool TEXT NOT NULL,
43
+ remaining_reward TEXT NOT NULL,
44
+ asset TEXT NOT NULL,
45
+ deadline DATETIME,
46
+ max_winners INTEGER NOT NULL,
47
+ status TEXT NOT NULL,
48
+ metadata TEXT,
49
+ created_at DATETIME NOT NULL,
50
+ updated_at DATETIME NOT NULL
51
+ )
52
+ `,
53
+ `
54
+ CREATE TABLE IF NOT EXISTS bounty_board_submissions (
55
+ submission_id TEXT PRIMARY KEY,
56
+ bounty_id TEXT NOT NULL,
57
+ submitter TEXT NOT NULL,
58
+ url TEXT NOT NULL,
59
+ description TEXT,
60
+ status TEXT NOT NULL,
61
+ created_at DATETIME NOT NULL
62
+ )
63
+ `,
64
+ `
65
+ CREATE TABLE IF NOT EXISTS bounty_board_awards (
66
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
67
+ bounty_id TEXT NOT NULL,
68
+ submission_id TEXT NOT NULL,
69
+ winner TEXT NOT NULL,
70
+ amount TEXT NOT NULL,
71
+ note TEXT,
72
+ created_at DATETIME NOT NULL
73
+ )
74
+ `
75
+ ]);
76
+ };
77
+ const createBounty = async (payload, ctx) => {
78
+ const sponsor = (0, helpers_1.requireSender)(ctx);
79
+ const payment = (0, helpers_1.getIncomingPayment)(ctx);
80
+ const existing = await state.adapter.query('SELECT bounty_id FROM bounty_board_bounties WHERE bounty_id = ?', [payload.bountyId]);
81
+ if (existing.length > 0) {
82
+ throw new Error(`Bounty ${payload.bountyId} already exists`);
83
+ }
84
+ const deadline = (0, helpers_1.parseDateValue)(payload.deadline);
85
+ if (deadline && deadline <= new Date()) {
86
+ throw new Error('Bounty deadline must be in the future');
87
+ }
88
+ await state.adapter.query(`INSERT INTO bounty_board_bounties (
89
+ bounty_id, sponsor, title, description, reward_pool, remaining_reward, asset, deadline, max_winners, status, metadata, created_at, updated_at
90
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
91
+ payload.bountyId,
92
+ sponsor,
93
+ payload.title,
94
+ payload.description || '',
95
+ payment.amount,
96
+ payment.amount,
97
+ payment.asset,
98
+ deadline,
99
+ payload.maxWinners || 1,
100
+ 'open',
101
+ JSON.stringify(payload.metadata || {}),
102
+ new Date(),
103
+ new Date()
104
+ ]);
105
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createBounty', payload, {
106
+ action: 'bounty_created',
107
+ data: {
108
+ bountyId: payload.bountyId,
109
+ sponsor,
110
+ rewardPool: payment.amount,
111
+ asset: payment.asset
112
+ }
113
+ });
114
+ };
115
+ const submitWork = async (payload, ctx) => {
116
+ const submitter = (0, helpers_1.requireSender)(ctx);
117
+ const bounties = await state.adapter.query('SELECT * FROM bounty_board_bounties WHERE bounty_id = ?', [payload.bountyId]);
118
+ if (bounties.length === 0) {
119
+ throw new Error(`Bounty ${payload.bountyId} does not exist`);
120
+ }
121
+ const bounty = bounties[0];
122
+ if (bounty.status !== 'open' && bounty.status !== 'partially_awarded') {
123
+ throw new Error('Bounty is not accepting submissions');
124
+ }
125
+ const deadline = (0, helpers_1.parseDateValue)(bounty.deadline);
126
+ if (deadline && deadline <= new Date()) {
127
+ throw new Error('Bounty submission window has closed');
128
+ }
129
+ const existing = await state.adapter.query('SELECT submission_id FROM bounty_board_submissions WHERE submission_id = ?', [payload.submissionId]);
130
+ if (existing.length > 0) {
131
+ throw new Error(`Submission ${payload.submissionId} already exists`);
132
+ }
133
+ await state.adapter.query(`INSERT INTO bounty_board_submissions (
134
+ submission_id, bounty_id, submitter, url, description, status, created_at
135
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)`, [payload.submissionId, payload.bountyId, submitter, payload.url, payload.description || '', 'submitted', new Date()]);
136
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'submitWork', payload, {
137
+ action: 'bounty_submission_received',
138
+ data: {
139
+ bountyId: payload.bountyId,
140
+ submissionId: payload.submissionId,
141
+ submitter
142
+ }
143
+ });
144
+ };
145
+ const awardBounty = async (payload, ctx) => {
146
+ const sponsor = (0, helpers_1.requireSender)(ctx);
147
+ const bountyRows = await state.adapter.query('SELECT * FROM bounty_board_bounties WHERE bounty_id = ?', [payload.bountyId]);
148
+ if (bountyRows.length === 0) {
149
+ throw new Error(`Bounty ${payload.bountyId} does not exist`);
150
+ }
151
+ const bounty = bountyRows[0];
152
+ if (bounty.sponsor !== sponsor) {
153
+ throw new Error('Only the bounty sponsor can award submissions');
154
+ }
155
+ if (bounty.status === 'closed') {
156
+ throw new Error('Bounty is closed');
157
+ }
158
+ const submissions = await state.adapter.query('SELECT * FROM bounty_board_submissions WHERE submission_id = ? AND bounty_id = ?', [payload.submissionId, payload.bountyId]);
159
+ if (submissions.length === 0) {
160
+ throw new Error('Submission does not exist for this bounty');
161
+ }
162
+ const submission = submissions[0];
163
+ if (submission.status === 'awarded') {
164
+ throw new Error('Submission already awarded');
165
+ }
166
+ const amount = payload.amount || bounty.remaining_reward;
167
+ if ((0, helpers_1.toBigNumber)(amount).gt(bounty.remaining_reward)) {
168
+ throw new Error('Award amount exceeds remaining bounty reward');
169
+ }
170
+ const awardCountRows = await state.adapter.query('SELECT COUNT(*) AS count FROM bounty_board_awards WHERE bounty_id = ?', [payload.bountyId]);
171
+ const awardCount = Number(awardCountRows[0]?.count || 0);
172
+ if (awardCount >= Number(bounty.max_winners)) {
173
+ throw new Error('Maximum winners already reached');
174
+ }
175
+ await state.adapter.query('INSERT INTO bounty_board_awards (bounty_id, submission_id, winner, amount, note, created_at) VALUES (?, ?, ?, ?, ?, ?)', [payload.bountyId, payload.submissionId, submission.submitter, amount, payload.note || '', new Date()]);
176
+ await state.adapter.query('UPDATE bounty_board_submissions SET status = ? WHERE submission_id = ?', ['awarded', payload.submissionId]);
177
+ const remainingReward = (0, helpers_1.toBigNumber)(bounty.remaining_reward).minus(amount);
178
+ const nextStatus = remainingReward.lte(0) || awardCount + 1 >= Number(bounty.max_winners)
179
+ ? 'closed'
180
+ : 'partially_awarded';
181
+ await state.adapter.query('UPDATE bounty_board_bounties SET remaining_reward = ?, status = ?, updated_at = ? WHERE bounty_id = ?', [remainingReward.toFixed(), nextStatus, new Date(), payload.bountyId]);
182
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'awardBounty', payload, {
183
+ action: 'bounty_awarded',
184
+ data: {
185
+ bountyId: payload.bountyId,
186
+ submissionId: payload.submissionId,
187
+ winner: submission.submitter,
188
+ amount,
189
+ asset: bounty.asset,
190
+ remainingReward: remainingReward.toFixed()
191
+ }
192
+ });
193
+ };
194
+ const closeBounty = async (payload, ctx) => {
195
+ const bountyRows = await state.adapter.query('SELECT * FROM bounty_board_bounties WHERE bounty_id = ?', [payload.bountyId]);
196
+ if (bountyRows.length === 0) {
197
+ throw new Error(`Bounty ${payload.bountyId} does not exist`);
198
+ }
199
+ const bounty = bountyRows[0];
200
+ if (ctx.trigger !== 'time') {
201
+ const sender = (0, helpers_1.requireSender)(ctx);
202
+ if (sender !== bounty.sponsor) {
203
+ throw new Error('Only the bounty sponsor can close this bounty');
204
+ }
205
+ }
206
+ await state.adapter.query('UPDATE bounty_board_bounties SET status = ?, updated_at = ? WHERE bounty_id = ?', ['closed', new Date(), payload.bountyId]);
207
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'closeBounty', payload, {
208
+ action: 'bounty_closed',
209
+ data: {
210
+ bountyId: payload.bountyId,
211
+ sponsor: bounty.sponsor,
212
+ remainingReward: bounty.remaining_reward,
213
+ asset: bounty.asset
214
+ }
215
+ });
216
+ };
217
+ return (0, contract_1.defineContract)({
218
+ name,
219
+ hooks: {
220
+ create: async ({ adapter }) => {
221
+ state.adapter = adapter;
222
+ await initialize();
223
+ }
224
+ },
225
+ actions: {
226
+ createBounty: (0, contract_1.action)(createBounty, { schema: createBountySchema, trigger: ['transfer', 'recurrent_transfer'] }),
227
+ submitWork: (0, contract_1.action)(submitWork, { schema: submitWorkSchema, trigger: 'custom_json' }),
228
+ awardBounty: (0, contract_1.action)(awardBounty, { schema: awardSchema, trigger: 'custom_json' }),
229
+ closeBounty: (0, contract_1.action)(closeBounty, { schema: closeSchema, trigger: ['custom_json', 'time'] })
230
+ }
231
+ });
232
+ }
233
+ //# sourceMappingURL=bountyboard.contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bountyboard.contract.js","sourceRoot":"","sources":["../../src/contracts/bountyboard.contract.ts"],"names":[],"mappings":";;AAqBA,8DAiRC;AAtSD,6BAAwB;AACxB,yCAAoD;AACpD,uCAWmB;AAEnB,MAAM,YAAY,GAAG,aAAa,CAAC;AAMnC,SAAgB,yBAAyB,CAAC,UAAsC,EAAE;IAC9E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAA,6BAAmB,GAAE,CAAC;IAEpC,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;QAChC,QAAQ,EAAE,0BAAgB;QAC1B,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACjC,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;QAC5C,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;QACtD,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;KACzC,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,OAAC,CAAC,MAAM,CAAC;QAC9B,QAAQ,EAAE,0BAAgB;QAC1B,YAAY,EAAE,0BAAgB;QAC9B,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;QACrB,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;KAC/C,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,OAAC,CAAC,MAAM,CAAC;QACzB,QAAQ,EAAE,0BAAgB;QAC1B,YAAY,EAAE,0BAAgB;QAC9B,MAAM,EAAE,sBAAY,CAAC,QAAQ,EAAE;QAC/B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;KACvC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,OAAC,CAAC,MAAM,CAAC;QACzB,QAAQ,EAAE,0BAAgB;KAC7B,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAA,0BAAgB,EAAC,KAAK,CAAC,OAAO,EAAE;YAClC;;;;;;;;;;;;;;;;aAgBC;YACD;;;;;;;;;;aAUC;YACD;;;;;;;;;;aAUC;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAA2C,EAAE,GAAQ,EAAE,EAAE;QACjF,MAAM,OAAO,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAA,4BAAkB,EAAC,GAAG,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,iEAAiE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,CAAC,QAAQ,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,QAAQ,GAAG,IAAA,wBAAc,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB;;6DAEiD,EACjD;YACI,OAAO,CAAC,QAAQ;YAChB,OAAO;YACP,OAAO,CAAC,KAAK;YACb,OAAO,CAAC,WAAW,IAAI,EAAE;YACzB,OAAO,CAAC,MAAM;YACd,OAAO,CAAC,MAAM;YACd,OAAO,CAAC,KAAK;YACb,QAAQ;YACR,OAAO,CAAC,UAAU,IAAI,CAAC;YACvB,MAAM;YACN,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,cAAc,EAAE,OAAO,EAAE;YAClE,MAAM,EAAE,gBAAgB;YACxB,IAAI,EAAE;gBACF,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,OAAO;gBACP,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;aACvB;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,EAAE,OAAyC,EAAE,GAAQ,EAAE,EAAE;QAC7E,MAAM,SAAS,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1H,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,CAAC,QAAQ,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,QAAQ,GAAG,IAAA,wBAAc,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,4EAA4E,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QACjJ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,cAAc,OAAO,CAAC,YAAY,iBAAiB,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB;;2CAE+B,EAC/B,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,CACvH,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE;YAChE,MAAM,EAAE,4BAA4B;YACpC,IAAI,EAAE;gBACF,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,SAAS;aACZ;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EAAE,OAAoC,EAAE,GAAQ,EAAE,EAAE;QACzE,MAAM,OAAO,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5H,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,CAAC,QAAQ,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACrE,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,kFAAkF,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5K,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,gBAAgB,CAAC;QACzD,IAAI,IAAA,qBAAW,EAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,uEAAuE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9I,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;QACzD,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,wHAAwH,EACxH,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CACzG,CAAC;QACF,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,wEAAwE,EACxE,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CACpC,CAAC;QAEF,MAAM,eAAe,GAAG,IAAA,qBAAW,EAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3E,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;YACrF,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,mBAAmB,CAAC;QAE1B,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,uGAAuG,EACvG,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CACxE,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE;YACjE,MAAM,EAAE,gBAAgB;YACxB,IAAI,EAAE;gBACF,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;gBAClC,MAAM,EAAE,UAAU,CAAC,SAAS;gBAC5B,MAAM;gBACN,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,eAAe,EAAE,eAAe,CAAC,OAAO,EAAE;aAC7C;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EAAE,OAAoC,EAAE,GAAQ,EAAE,EAAE;QACzE,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5H,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,CAAC,QAAQ,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,GAAG,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;YAClC,IAAI,MAAM,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACrE,CAAC;QACL,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,iFAAiF,EACjF,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAC3C,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE;YACjE,MAAM,EAAE,eAAe;YACvB,IAAI,EAAE;gBACF,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,eAAe,EAAE,MAAM,CAAC,gBAAgB;gBACxC,KAAK,EAAE,MAAM,CAAC,KAAK;aACtB;SACJ,CAAC,CAAC;IACP,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,YAAY,EAAE,IAAA,iBAAM,EAAC,YAAY,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC/G,UAAU,EAAE,IAAA,iBAAM,EAAC,UAAU,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YACpF,WAAW,EAAE,IAAA,iBAAM,EAAC,WAAW,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YACjF,WAAW,EAAE,IAAA,iBAAM,EAAC,WAAW,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC;SAC9F;KACJ,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ export interface BundleMarketplaceContractOptions {
2
+ name?: string;
3
+ }
4
+ export declare function createBundleMarketplaceContract(options?: BundleMarketplaceContractOptions): import("..").ContractDefinition;
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBundleMarketplaceContract = createBundleMarketplaceContract;
4
+ const zod_1 = require("zod");
5
+ const contract_1 = require("./contract");
6
+ const helpers_1 = require("./helpers");
7
+ const DEFAULT_NAME = 'bundlemarketplace';
8
+ function createBundleMarketplaceContract(options = {}) {
9
+ const name = options.name || DEFAULT_NAME;
10
+ const state = (0, helpers_1.createContractState)();
11
+ const createBundleSchema = zod_1.z.object({
12
+ bundleId: helpers_1.identifierSchema,
13
+ title: zod_1.z.string().min(3).max(140),
14
+ price: helpers_1.amountSchema,
15
+ asset: helpers_1.assetSchema,
16
+ items: zod_1.z.array(zod_1.z.string().min(1).max(140)).min(1).max(25),
17
+ inventory: zod_1.z.number().int().min(1).max(1000000).optional(),
18
+ metadata: zod_1.z.record(zod_1.z.any()).optional()
19
+ });
20
+ const idSchema = zod_1.z.object({
21
+ bundleId: helpers_1.identifierSchema
22
+ });
23
+ const updateSchema = zod_1.z.object({
24
+ bundleId: helpers_1.identifierSchema,
25
+ title: zod_1.z.string().min(3).max(140).optional(),
26
+ price: helpers_1.amountSchema.optional(),
27
+ inventory: zod_1.z.number().int().min(0).max(1000000).optional(),
28
+ active: zod_1.z.boolean().optional(),
29
+ metadata: zod_1.z.record(zod_1.z.any()).optional()
30
+ });
31
+ const fulfillSchema = zod_1.z.object({
32
+ purchaseId: zod_1.z.number().int().min(1),
33
+ notes: zod_1.z.string().max(280).optional()
34
+ });
35
+ const initialize = async () => {
36
+ await (0, helpers_1.initializeTables)(state.adapter, [
37
+ `
38
+ CREATE TABLE IF NOT EXISTS bundle_marketplace_bundles (
39
+ bundle_id TEXT PRIMARY KEY,
40
+ owner TEXT NOT NULL,
41
+ title TEXT NOT NULL,
42
+ price TEXT NOT NULL,
43
+ asset TEXT NOT NULL,
44
+ items_json TEXT NOT NULL,
45
+ inventory INTEGER,
46
+ sold_count INTEGER NOT NULL,
47
+ active INTEGER NOT NULL,
48
+ metadata TEXT,
49
+ created_at DATETIME NOT NULL,
50
+ updated_at DATETIME NOT NULL
51
+ )
52
+ `,
53
+ `
54
+ CREATE TABLE IF NOT EXISTS bundle_marketplace_purchases (
55
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
56
+ bundle_id TEXT NOT NULL,
57
+ buyer TEXT NOT NULL,
58
+ amount_paid TEXT NOT NULL,
59
+ asset TEXT NOT NULL,
60
+ status TEXT NOT NULL,
61
+ notes TEXT,
62
+ created_at DATETIME NOT NULL,
63
+ updated_at DATETIME NOT NULL
64
+ )
65
+ `
66
+ ]);
67
+ };
68
+ const createBundle = async (payload, ctx) => {
69
+ const owner = (0, helpers_1.requireSender)(ctx);
70
+ const existing = await state.adapter.query('SELECT bundle_id FROM bundle_marketplace_bundles WHERE bundle_id = ?', [payload.bundleId]);
71
+ if (existing.length > 0) {
72
+ throw new Error(`Bundle ${payload.bundleId} already exists`);
73
+ }
74
+ await state.adapter.query(`INSERT INTO bundle_marketplace_bundles (
75
+ bundle_id, owner, title, price, asset, items_json, inventory, sold_count, active, metadata, created_at, updated_at
76
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
77
+ payload.bundleId,
78
+ owner,
79
+ payload.title,
80
+ payload.price,
81
+ payload.asset,
82
+ JSON.stringify(payload.items),
83
+ payload.inventory || null,
84
+ 0,
85
+ 1,
86
+ JSON.stringify(payload.metadata || {}),
87
+ new Date(),
88
+ new Date()
89
+ ]);
90
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createBundle', payload, {
91
+ action: 'bundle_created',
92
+ data: {
93
+ bundleId: payload.bundleId,
94
+ owner
95
+ }
96
+ });
97
+ };
98
+ const updateBundle = async (payload, ctx) => {
99
+ const owner = (0, helpers_1.requireSender)(ctx);
100
+ const rows = await state.adapter.query('SELECT * FROM bundle_marketplace_bundles WHERE bundle_id = ?', [payload.bundleId]);
101
+ if (rows.length === 0) {
102
+ throw new Error(`Bundle ${payload.bundleId} does not exist`);
103
+ }
104
+ const bundle = rows[0];
105
+ if (bundle.owner !== owner) {
106
+ throw new Error('Only the bundle owner can update the bundle');
107
+ }
108
+ await state.adapter.query(`UPDATE bundle_marketplace_bundles
109
+ SET title = ?, price = ?, inventory = ?, active = ?, metadata = ?, updated_at = ?
110
+ WHERE bundle_id = ?`, [
111
+ payload.title || bundle.title,
112
+ payload.price || bundle.price,
113
+ typeof payload.inventory === 'number' ? payload.inventory : bundle.inventory,
114
+ typeof payload.active === 'boolean' ? (payload.active ? 1 : 0) : bundle.active,
115
+ JSON.stringify(payload.metadata || (0, helpers_1.parseJson)(bundle.metadata, {})),
116
+ new Date(),
117
+ payload.bundleId
118
+ ]);
119
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'updateBundle', payload, {
120
+ action: 'bundle_updated',
121
+ data: {
122
+ bundleId: payload.bundleId,
123
+ owner
124
+ }
125
+ });
126
+ };
127
+ const buyBundle = async (payload, ctx) => {
128
+ const buyer = (0, helpers_1.requireSender)(ctx);
129
+ const payment = (0, helpers_1.getIncomingPayment)(ctx);
130
+ const rows = await state.adapter.query('SELECT * FROM bundle_marketplace_bundles WHERE bundle_id = ?', [payload.bundleId]);
131
+ if (rows.length === 0) {
132
+ throw new Error(`Bundle ${payload.bundleId} does not exist`);
133
+ }
134
+ const bundle = rows[0];
135
+ if (!bundle.active) {
136
+ throw new Error('Bundle is not active');
137
+ }
138
+ (0, helpers_1.assertAssetMatches)(payment.asset, bundle.asset);
139
+ if (!(0, helpers_1.toBigNumber)(payment.amount).eq(bundle.price)) {
140
+ throw new Error(`Bundle price is ${bundle.price} ${bundle.asset}`);
141
+ }
142
+ if (bundle.inventory !== null && Number(bundle.inventory) <= 0) {
143
+ throw new Error('Bundle is out of stock');
144
+ }
145
+ await state.adapter.query('INSERT INTO bundle_marketplace_purchases (bundle_id, buyer, amount_paid, asset, status, notes, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', [payload.bundleId, buyer, payment.amount, payment.asset, 'paid', '', new Date(), new Date()]);
146
+ const nextInventory = bundle.inventory === null ? null : Number(bundle.inventory) - 1;
147
+ await state.adapter.query('UPDATE bundle_marketplace_bundles SET inventory = ?, sold_count = ?, updated_at = ? WHERE bundle_id = ?', [nextInventory, Number(bundle.sold_count) + 1, new Date(), payload.bundleId]);
148
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'buyBundle', payload, {
149
+ action: 'bundle_purchased',
150
+ data: {
151
+ bundleId: payload.bundleId,
152
+ buyer,
153
+ items: (0, helpers_1.parseJson)(bundle.items_json, [])
154
+ }
155
+ });
156
+ };
157
+ const fulfillPurchase = async (payload, ctx) => {
158
+ const owner = (0, helpers_1.requireSender)(ctx);
159
+ const purchaseRows = await state.adapter.query('SELECT * FROM bundle_marketplace_purchases WHERE id = ?', [payload.purchaseId]);
160
+ if (purchaseRows.length === 0) {
161
+ throw new Error(`Purchase ${payload.purchaseId} does not exist`);
162
+ }
163
+ const purchase = purchaseRows[0];
164
+ const bundleRows = await state.adapter.query('SELECT * FROM bundle_marketplace_bundles WHERE bundle_id = ?', [purchase.bundle_id]);
165
+ const bundle = bundleRows[0];
166
+ if (bundle.owner !== owner) {
167
+ throw new Error('Only the bundle owner can fulfill purchases');
168
+ }
169
+ await state.adapter.query('UPDATE bundle_marketplace_purchases SET status = ?, notes = ?, updated_at = ? WHERE id = ?', ['fulfilled', payload.notes || '', new Date(), payload.purchaseId]);
170
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'fulfillPurchase', payload, {
171
+ action: 'bundle_purchase_fulfilled',
172
+ data: {
173
+ purchaseId: payload.purchaseId,
174
+ bundleId: purchase.bundle_id,
175
+ buyer: purchase.buyer
176
+ }
177
+ });
178
+ };
179
+ return (0, contract_1.defineContract)({
180
+ name,
181
+ hooks: {
182
+ create: async ({ adapter }) => {
183
+ state.adapter = adapter;
184
+ await initialize();
185
+ }
186
+ },
187
+ actions: {
188
+ createBundle: (0, contract_1.action)(createBundle, { schema: createBundleSchema, trigger: 'custom_json' }),
189
+ updateBundle: (0, contract_1.action)(updateBundle, { schema: updateSchema, trigger: 'custom_json' }),
190
+ buyBundle: (0, contract_1.action)(buyBundle, { schema: idSchema, trigger: ['transfer', 'recurrent_transfer'] }),
191
+ fulfillPurchase: (0, contract_1.action)(fulfillPurchase, { schema: fulfillSchema, trigger: 'custom_json' })
192
+ }
193
+ });
194
+ }
195
+ //# sourceMappingURL=bundlemarketplace.contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundlemarketplace.contract.js","sourceRoot":"","sources":["../../src/contracts/bundlemarketplace.contract.ts"],"names":[],"mappings":";;AAsBA,0EAiOC;AAvPD,6BAAwB;AACxB,yCAAoD;AACpD,uCAYmB;AAEnB,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAMzC,SAAgB,+BAA+B,CAAC,UAA4C,EAAE;IAC1F,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAA,6BAAmB,GAAE,CAAC;IAEpC,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;QAChC,QAAQ,EAAE,0BAAgB;QAC1B,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACjC,KAAK,EAAE,sBAAY;QACnB,KAAK,EAAE,qBAAW;QAClB,KAAK,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACzD,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;QAC1D,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;KACzC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,OAAC,CAAC,MAAM,CAAC;QACtB,QAAQ,EAAE,0BAAgB;KAC7B,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,OAAC,CAAC,MAAM,CAAC;QAC1B,QAAQ,EAAE,0BAAgB;QAC1B,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;QAC5C,KAAK,EAAE,sBAAY,CAAC,QAAQ,EAAE;QAC9B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;QAC1D,MAAM,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAC9B,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,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACnC,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;KACxC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,IAAA,0BAAgB,EAAC,KAAK,CAAC,OAAO,EAAE;YAClC;;;;;;;;;;;;;;;aAeC;YACD;;;;;;;;;;;;aAYC;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAA2C,EAAE,GAAQ,EAAE,EAAE;QACjF,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,sEAAsE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,CAAC,QAAQ,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB;;0DAE8C,EAC9C;YACI,OAAO,CAAC,QAAQ;YAChB,KAAK;YACL,OAAO,CAAC,KAAK;YACb,OAAO,CAAC,KAAK;YACb,OAAO,CAAC,KAAK;YACb,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;YAC7B,OAAO,CAAC,SAAS,IAAI,IAAI;YACzB,CAAC;YACD,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,cAAc,EAAE,OAAO,EAAE;YAClE,MAAM,EAAE,gBAAgB;YACxB,IAAI,EAAE;gBACF,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK;aACR;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAAqC,EAAE,GAAQ,EAAE,EAAE;QAC3E,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,8DAA8D,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3H,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,CAAC,QAAQ,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB;;iCAEqB,EACrB;YACI,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;YAC7B,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;YAC7B,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS;YAC5E,OAAO,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;YAC9E,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAA,mBAAS,EAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAClE,IAAI,IAAI,EAAE;YACV,OAAO,CAAC,QAAQ;SACnB,CACJ,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE;YAClE,MAAM,EAAE,gBAAgB;YACxB,IAAI,EAAE;gBACF,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK;aACR;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,EAAE,OAAiC,EAAE,GAAQ,EAAE,EAAE;QACpE,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,8DAA8D,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3H,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,CAAC,QAAQ,iBAAiB,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC5C,CAAC;QAED,IAAA,4BAAkB,EAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,IAAA,qBAAW,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,wJAAwJ,EACxJ,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAC/F,CAAC;QAEF,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACtF,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,yGAAyG,EACzG,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAC/E,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE;YAC/D,MAAM,EAAE,kBAAkB;YAC1B,IAAI,EAAE;gBACF,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK;gBACL,KAAK,EAAE,IAAA,mBAAS,EAAW,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;aACpD;SACJ,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,KAAK,EAAE,OAAsC,EAAE,GAAQ,EAAE,EAAE;QAC/E,MAAM,KAAK,GAAG,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACjC,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,yDAAyD,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAChI,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,YAAY,OAAO,CAAC,UAAU,iBAAiB,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,8DAA8D,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACnI,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CACrB,4FAA4F,EAC5F,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,CACrE,CAAC;QAEF,MAAM,IAAA,2BAAiB,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE;YACrE,MAAM,EAAE,2BAA2B;YACnC,IAAI,EAAE;gBACF,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,QAAQ,EAAE,QAAQ,CAAC,SAAS;gBAC5B,KAAK,EAAE,QAAQ,CAAC,KAAK;aACxB;SACJ,CAAC,CAAC;IACP,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,YAAY,EAAE,IAAA,iBAAM,EAAC,YAAY,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YAC1F,YAAY,EAAE,IAAA,iBAAM,EAAC,YAAY,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YACpF,SAAS,EAAE,IAAA,iBAAM,EAAC,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,oBAAoB,CAAC,EAAE,CAAC;YAC/F,eAAe,EAAE,IAAA,iBAAM,EAAC,eAAe,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;SAC9F;KACJ,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,4 @@
1
+ export interface CharityMatchContractOptions {
2
+ name?: string;
3
+ }
4
+ export declare function createCharityMatchContract(options?: CharityMatchContractOptions): import("..").ContractDefinition;
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCharityMatchContract = createCharityMatchContract;
4
+ const zod_1 = require("zod");
5
+ const contract_1 = require("./contract");
6
+ const helpers_1 = require("./helpers");
7
+ const DEFAULT_NAME = 'charitymatch';
8
+ function createCharityMatchContract(options = {}) {
9
+ const name = options.name || DEFAULT_NAME;
10
+ const state = (0, helpers_1.createContractState)();
11
+ const createCampaignSchema = zod_1.z.object({
12
+ campaignId: helpers_1.identifierSchema,
13
+ title: zod_1.z.string().min(3).max(140),
14
+ beneficiary: zod_1.z.string().min(3).max(32),
15
+ asset: helpers_1.assetSchema,
16
+ matchCap: helpers_1.amountSchema,
17
+ matchBps: zod_1.z.number().int().min(0).max(100000),
18
+ closesAt: zod_1.z.string(),
19
+ metadata: zod_1.z.record(zod_1.z.any()).optional()
20
+ });
21
+ const campaignIdSchema = zod_1.z.object({
22
+ campaignId: helpers_1.identifierSchema
23
+ });
24
+ const initialize = async () => {
25
+ await (0, helpers_1.initializeTables)(state.adapter, [
26
+ `
27
+ CREATE TABLE IF NOT EXISTS charity_match_campaigns (
28
+ campaign_id TEXT PRIMARY KEY,
29
+ sponsor TEXT NOT NULL,
30
+ title TEXT NOT NULL,
31
+ beneficiary TEXT NOT NULL,
32
+ asset TEXT NOT NULL,
33
+ match_cap TEXT NOT NULL,
34
+ match_bps INTEGER NOT NULL,
35
+ total_donations TEXT NOT NULL,
36
+ matched_total TEXT NOT NULL,
37
+ status TEXT NOT NULL,
38
+ closes_at DATETIME NOT NULL,
39
+ metadata TEXT,
40
+ created_at DATETIME NOT NULL,
41
+ closed_at DATETIME
42
+ )
43
+ `,
44
+ `
45
+ CREATE TABLE IF NOT EXISTS charity_match_donations (
46
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
47
+ campaign_id TEXT NOT NULL,
48
+ donor TEXT NOT NULL,
49
+ amount TEXT NOT NULL,
50
+ asset TEXT NOT NULL,
51
+ created_at DATETIME NOT NULL
52
+ )
53
+ `
54
+ ]);
55
+ };
56
+ const createCampaign = async (payload, ctx) => {
57
+ const sponsor = (0, helpers_1.requireSender)(ctx);
58
+ const existing = await state.adapter.query('SELECT campaign_id FROM charity_match_campaigns WHERE campaign_id = ?', [payload.campaignId]);
59
+ if (existing.length > 0) {
60
+ throw new Error(`Campaign ${payload.campaignId} already exists`);
61
+ }
62
+ const closesAt = (0, helpers_1.parseDateValue)(payload.closesAt);
63
+ if (!closesAt || closesAt <= new Date()) {
64
+ throw new Error('Campaign close time must be in the future');
65
+ }
66
+ await state.adapter.query(`INSERT INTO charity_match_campaigns (
67
+ campaign_id, sponsor, title, beneficiary, asset, match_cap, match_bps, total_donations, matched_total, status, closes_at, metadata, created_at, closed_at
68
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
69
+ payload.campaignId,
70
+ sponsor,
71
+ payload.title,
72
+ payload.beneficiary,
73
+ payload.asset,
74
+ payload.matchCap,
75
+ payload.matchBps,
76
+ '0',
77
+ '0',
78
+ 'open',
79
+ closesAt,
80
+ JSON.stringify(payload.metadata || {}),
81
+ new Date(),
82
+ null
83
+ ]);
84
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createCampaign', payload, {
85
+ action: 'charity_match_campaign_created',
86
+ data: {
87
+ campaignId: payload.campaignId,
88
+ sponsor,
89
+ beneficiary: payload.beneficiary
90
+ }
91
+ });
92
+ };
93
+ const donate = async (payload, ctx) => {
94
+ const donor = (0, helpers_1.requireSender)(ctx);
95
+ const payment = (0, helpers_1.getIncomingPayment)(ctx);
96
+ const rows = await state.adapter.query('SELECT * FROM charity_match_campaigns WHERE campaign_id = ?', [payload.campaignId]);
97
+ if (rows.length === 0) {
98
+ throw new Error(`Campaign ${payload.campaignId} does not exist`);
99
+ }
100
+ const campaign = rows[0];
101
+ if (campaign.status !== 'open') {
102
+ throw new Error('Campaign is not open');
103
+ }
104
+ if (((0, helpers_1.parseDateValue)(campaign.closes_at) || new Date()) <= new Date()) {
105
+ throw new Error('Campaign has already closed');
106
+ }
107
+ (0, helpers_1.assertAssetMatches)(payment.asset, campaign.asset);
108
+ const totalDonations = (0, helpers_1.toBigNumber)(campaign.total_donations).plus(payment.amount);
109
+ const potentialMatch = totalDonations.multipliedBy(Number(campaign.match_bps)).dividedBy(10000);
110
+ const nextMatched = potentialMatch.gt(campaign.match_cap)
111
+ ? (0, helpers_1.toBigNumber)(campaign.match_cap)
112
+ : potentialMatch;
113
+ await state.adapter.query('INSERT INTO charity_match_donations (campaign_id, donor, amount, asset, created_at) VALUES (?, ?, ?, ?, ?)', [payload.campaignId, donor, payment.amount, payment.asset, new Date()]);
114
+ await state.adapter.query('UPDATE charity_match_campaigns SET total_donations = ?, matched_total = ? WHERE campaign_id = ?', [totalDonations.toFixed(), nextMatched.toFixed(), payload.campaignId]);
115
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'donate', payload, {
116
+ action: 'charity_donation_received',
117
+ data: {
118
+ campaignId: payload.campaignId,
119
+ donor,
120
+ amount: payment.amount,
121
+ asset: payment.asset,
122
+ totalDonations: totalDonations.toFixed(),
123
+ matchedTotal: nextMatched.toFixed()
124
+ }
125
+ });
126
+ };
127
+ const closeCampaign = async (payload, ctx) => {
128
+ const rows = await state.adapter.query('SELECT * FROM charity_match_campaigns WHERE campaign_id = ?', [payload.campaignId]);
129
+ if (rows.length === 0) {
130
+ throw new Error(`Campaign ${payload.campaignId} does not exist`);
131
+ }
132
+ const campaign = rows[0];
133
+ if (campaign.status === 'closed') {
134
+ return;
135
+ }
136
+ if (ctx.trigger !== 'time') {
137
+ const sender = (0, helpers_1.requireSender)(ctx);
138
+ if (sender !== campaign.sponsor) {
139
+ throw new Error('Only the sponsor can close this campaign');
140
+ }
141
+ }
142
+ if (((0, helpers_1.parseDateValue)(campaign.closes_at) || new Date()) > new Date()) {
143
+ throw new Error('Campaign cannot be closed before its close time');
144
+ }
145
+ await state.adapter.query('UPDATE charity_match_campaigns SET status = ?, closed_at = ? WHERE campaign_id = ?', ['closed', new Date(), payload.campaignId]);
146
+ await (0, helpers_1.emitContractEvent)(state.adapter, name, 'closeCampaign', payload, {
147
+ action: 'charity_match_campaign_closed',
148
+ data: {
149
+ campaignId: payload.campaignId,
150
+ beneficiary: campaign.beneficiary,
151
+ totalDonations: campaign.total_donations,
152
+ matchedTotal: campaign.matched_total,
153
+ asset: campaign.asset
154
+ }
155
+ });
156
+ };
157
+ return (0, contract_1.defineContract)({
158
+ name,
159
+ hooks: {
160
+ create: async ({ adapter }) => {
161
+ state.adapter = adapter;
162
+ await initialize();
163
+ }
164
+ },
165
+ actions: {
166
+ createCampaign: (0, contract_1.action)(createCampaign, { schema: createCampaignSchema, trigger: 'custom_json' }),
167
+ donate: (0, contract_1.action)(donate, { schema: campaignIdSchema, trigger: ['transfer', 'recurrent_transfer'] }),
168
+ closeCampaign: (0, contract_1.action)(closeCampaign, { schema: campaignIdSchema, trigger: ['custom_json', 'time'] })
169
+ }
170
+ });
171
+ }
172
+ //# sourceMappingURL=charitymatch.contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"charitymatch.contract.js","sourceRoot":"","sources":["../../src/contracts/charitymatch.contract.ts"],"names":[],"mappings":"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"}