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.
- package/DOCUMENTATION.md +50 -2
- package/README.md +44 -3
- package/dist/adapters/base.adapter.d.ts +5 -0
- package/dist/adapters/base.adapter.js +9 -0
- package/dist/adapters/base.adapter.js.map +1 -1
- package/dist/adapters/mongodb.adapter.d.ts +6 -6
- package/dist/adapters/mongodb.adapter.js +36 -21
- package/dist/adapters/mongodb.adapter.js.map +1 -1
- package/dist/adapters/postgresql.adapter.d.ts +7 -0
- package/dist/adapters/postgresql.adapter.js +46 -19
- package/dist/adapters/postgresql.adapter.js.map +1 -1
- package/dist/adapters/sqlite.adapter.d.ts +4 -0
- package/dist/adapters/sqlite.adapter.js +10 -0
- package/dist/adapters/sqlite.adapter.js.map +1 -1
- package/dist/api.d.ts +13 -3
- package/dist/api.js +96 -62
- package/dist/api.js.map +1 -1
- package/dist/config.d.ts +7 -1
- package/dist/config.js +7 -1
- package/dist/config.js.map +1 -1
- package/dist/contracts/auctionhouse.contract.d.ts +4 -0
- package/dist/contracts/auctionhouse.contract.js +234 -0
- package/dist/contracts/auctionhouse.contract.js.map +1 -0
- package/dist/contracts/booking.contract.d.ts +4 -0
- package/dist/contracts/booking.contract.js +225 -0
- package/dist/contracts/booking.contract.js.map +1 -0
- package/dist/contracts/bountyboard.contract.d.ts +4 -0
- package/dist/contracts/bountyboard.contract.js +233 -0
- package/dist/contracts/bountyboard.contract.js.map +1 -0
- package/dist/contracts/bundlemarketplace.contract.d.ts +4 -0
- package/dist/contracts/bundlemarketplace.contract.js +195 -0
- package/dist/contracts/bundlemarketplace.contract.js.map +1 -0
- package/dist/contracts/charitymatch.contract.d.ts +4 -0
- package/dist/contracts/charitymatch.contract.js +172 -0
- package/dist/contracts/charitymatch.contract.js.map +1 -0
- package/dist/contracts/coinflip.contract.js +7 -1
- package/dist/contracts/coinflip.contract.js.map +1 -1
- package/dist/contracts/crowdfund.contract.d.ts +4 -0
- package/dist/contracts/crowdfund.contract.js +290 -0
- package/dist/contracts/crowdfund.contract.js.map +1 -0
- package/dist/contracts/dcabot.contract.d.ts +4 -0
- package/dist/contracts/dcabot.contract.js +217 -0
- package/dist/contracts/dcabot.contract.js.map +1 -0
- package/dist/contracts/dice.contract.js +7 -1
- package/dist/contracts/dice.contract.js.map +1 -1
- package/dist/contracts/domainregistry.contract.d.ts +4 -0
- package/dist/contracts/domainregistry.contract.js +232 -0
- package/dist/contracts/domainregistry.contract.js.map +1 -0
- package/dist/contracts/exchange.contract.js +209 -168
- package/dist/contracts/exchange.contract.js.map +1 -1
- package/dist/contracts/fanclub.contract.d.ts +4 -0
- package/dist/contracts/fanclub.contract.js +193 -0
- package/dist/contracts/fanclub.contract.js.map +1 -0
- package/dist/contracts/giftcard.contract.d.ts +4 -0
- package/dist/contracts/giftcard.contract.js +158 -0
- package/dist/contracts/giftcard.contract.js.map +1 -0
- package/dist/contracts/grantrounds.contract.d.ts +4 -0
- package/dist/contracts/grantrounds.contract.js +265 -0
- package/dist/contracts/grantrounds.contract.js.map +1 -0
- package/dist/contracts/groupbuy.contract.d.ts +4 -0
- package/dist/contracts/groupbuy.contract.js +198 -0
- package/dist/contracts/groupbuy.contract.js.map +1 -0
- package/dist/contracts/helpers.d.ts +64 -0
- package/dist/contracts/helpers.js +159 -0
- package/dist/contracts/helpers.js.map +1 -0
- package/dist/contracts/insurancepool.contract.d.ts +4 -0
- package/dist/contracts/insurancepool.contract.js +281 -0
- package/dist/contracts/insurancepool.contract.js.map +1 -0
- package/dist/contracts/invoice.contract.d.ts +4 -0
- package/dist/contracts/invoice.contract.js +193 -0
- package/dist/contracts/invoice.contract.js.map +1 -0
- package/dist/contracts/launchpad.contract.d.ts +4 -0
- package/dist/contracts/launchpad.contract.js +225 -0
- package/dist/contracts/launchpad.contract.js.map +1 -0
- package/dist/contracts/lotto.contract.js +53 -37
- package/dist/contracts/lotto.contract.js.map +1 -1
- package/dist/contracts/multisigtreasury.contract.d.ts +4 -0
- package/dist/contracts/multisigtreasury.contract.js +245 -0
- package/dist/contracts/multisigtreasury.contract.js.map +1 -0
- package/dist/contracts/nft.contract.d.ts +1 -0
- package/dist/contracts/nft.contract.js +236 -192
- package/dist/contracts/nft.contract.js.map +1 -1
- package/dist/contracts/oraclebounty.contract.d.ts +4 -0
- package/dist/contracts/oraclebounty.contract.js +250 -0
- package/dist/contracts/oraclebounty.contract.js.map +1 -0
- package/dist/contracts/payroll.contract.d.ts +4 -0
- package/dist/contracts/payroll.contract.js +232 -0
- package/dist/contracts/payroll.contract.js.map +1 -0
- package/dist/contracts/paywall.contract.d.ts +4 -0
- package/dist/contracts/paywall.contract.js +185 -0
- package/dist/contracts/paywall.contract.js.map +1 -0
- package/dist/contracts/poll.contract.js +2 -0
- package/dist/contracts/poll.contract.js.map +1 -1
- package/dist/contracts/predictionmarket.contract.d.ts +4 -0
- package/dist/contracts/predictionmarket.contract.js +213 -0
- package/dist/contracts/predictionmarket.contract.js.map +1 -0
- package/dist/contracts/proposaltimelock.contract.d.ts +4 -0
- package/dist/contracts/proposaltimelock.contract.js +250 -0
- package/dist/contracts/proposaltimelock.contract.js.map +1 -0
- package/dist/contracts/questpass.contract.d.ts +4 -0
- package/dist/contracts/questpass.contract.js +214 -0
- package/dist/contracts/questpass.contract.js.map +1 -0
- package/dist/contracts/referral.contract.d.ts +4 -0
- package/dist/contracts/referral.contract.js +238 -0
- package/dist/contracts/referral.contract.js.map +1 -0
- package/dist/contracts/rental.contract.d.ts +4 -0
- package/dist/contracts/rental.contract.js +221 -0
- package/dist/contracts/rental.contract.js.map +1 -0
- package/dist/contracts/revenuesplit.contract.d.ts +4 -0
- package/dist/contracts/revenuesplit.contract.js +211 -0
- package/dist/contracts/revenuesplit.contract.js.map +1 -0
- package/dist/contracts/rps.contract.js +17 -1
- package/dist/contracts/rps.contract.js.map +1 -1
- package/dist/contracts/savings.contract.d.ts +4 -0
- package/dist/contracts/savings.contract.js +208 -0
- package/dist/contracts/savings.contract.js.map +1 -0
- package/dist/contracts/subscription.contract.d.ts +4 -0
- package/dist/contracts/subscription.contract.js +241 -0
- package/dist/contracts/subscription.contract.js.map +1 -0
- package/dist/contracts/sweepstakes.contract.d.ts +4 -0
- package/dist/contracts/sweepstakes.contract.js +209 -0
- package/dist/contracts/sweepstakes.contract.js.map +1 -0
- package/dist/contracts/ticketing.contract.d.ts +4 -0
- package/dist/contracts/ticketing.contract.js +185 -0
- package/dist/contracts/ticketing.contract.js.map +1 -0
- package/dist/contracts/tipjar.contract.js +2 -0
- package/dist/contracts/tipjar.contract.js.map +1 -1
- package/dist/contracts/token.contract.js +135 -125
- package/dist/contracts/token.contract.js.map +1 -1
- package/dist/index.d.ts +39 -0
- package/dist/index.js +71 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata.d.ts +7 -0
- package/dist/metadata.js +64 -1
- package/dist/metadata.js.map +1 -1
- package/dist/providers/block-provider.d.ts +22 -0
- package/dist/providers/block-provider.js +3 -0
- package/dist/providers/block-provider.js.map +1 -0
- package/dist/providers/haf-client.d.ts +30 -0
- package/dist/providers/haf-client.js +119 -0
- package/dist/providers/haf-client.js.map +1 -0
- package/dist/providers/haf-provider.d.ts +49 -0
- package/dist/providers/haf-provider.js +256 -0
- package/dist/providers/haf-provider.js.map +1 -0
- package/dist/providers/hive-provider.d.ts +13 -0
- package/dist/providers/hive-provider.js +25 -0
- package/dist/providers/hive-provider.js.map +1 -0
- package/dist/providers/index.d.ts +4 -0
- package/dist/providers/index.js +21 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/streamer.d.ts +21 -1
- package/dist/streamer.js +187 -62
- package/dist/streamer.js.map +1 -1
- package/dist/utils.js +11 -2
- package/dist/utils.js.map +1 -1
- package/package.json +16 -1
- package/.claude/settings.local.json +0 -12
- package/.env.example +0 -3
- package/.travis.yml +0 -11
- package/AGENTS.md +0 -35
- package/CLAUDE.md +0 -75
- package/ecosystem.config.js +0 -17
- package/examples/contracts/README.md +0 -8
- package/examples/contracts/exchange.ts +0 -38
- package/examples/contracts/poll.ts +0 -21
- package/examples/contracts/rps.ts +0 -19
- package/examples/contracts/tipjar.ts +0 -19
- package/jest.config.js +0 -9
- package/test-contract-block.md +0 -19
- package/tests/actions.spec.ts +0 -252
- package/tests/adapters/actions-persistence.spec.ts +0 -144
- package/tests/adapters/postgresql.adapter.spec.ts +0 -127
- package/tests/adapters/sqlite.adapter.spec.ts +0 -181
- package/tests/config-input.spec.ts +0 -90
- package/tests/contracts/coinflip.contract.spec.ts +0 -94
- package/tests/contracts/dice.contract.spec.ts +0 -87
- package/tests/contracts/entrants.json +0 -729
- package/tests/contracts/exchange.contract.spec.ts +0 -84
- package/tests/contracts/lotto.contract.spec.ts +0 -59
- package/tests/contracts/nft.contract.spec.ts +0 -948
- package/tests/contracts/token.contract.spec.ts +0 -90
- package/tests/exchanges/coingecko.exchange.spec.ts +0 -169
- package/tests/exchanges/exchange.base.spec.ts +0 -246
- package/tests/helpers/mock-adapter.ts +0 -214
- package/tests/helpers/mock-fetch.ts +0 -165
- package/tests/hive-chain-features.spec.ts +0 -319
- package/tests/hive-rates.spec.ts +0 -443
- package/tests/integration/hive-rates.integration.spec.ts +0 -35
- package/tests/metadata.spec.ts +0 -63
- package/tests/setup.ts +0 -30
- package/tests/streamer-actions.spec.ts +0 -274
- package/tests/streamer.spec.ts +0 -342
- package/tests/types/rates.spec.ts +0 -216
- package/tests/utils.spec.ts +0 -113
- package/tsconfig.build.json +0 -4
- package/tslint.json +0 -21
- 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,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":"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"}
|
|
@@ -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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"}
|