hive-stream 3.0.2 → 3.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DOCUMENTATION.md +50 -2
- package/README.md +282 -4
- 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/builders.d.ts +176 -0
- package/dist/builders.js +727 -0
- package/dist/builders.js.map +1 -0
- package/dist/config.d.ts +16 -1
- package/dist/config.js +95 -3
- 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 +25 -22
- 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 +25 -22
- 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 +66 -0
- package/dist/contracts/helpers.js +166 -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 +234 -195
- 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 +48 -20
- 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 +40 -0
- package/dist/index.js +72 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata.d.ts +20 -0
- package/dist/metadata.js +320 -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 +65 -4
- package/dist/streamer.js +768 -72
- package/dist/streamer.js.map +1 -1
- package/dist/types/hive-stream.d.ts +317 -0
- package/dist/utils.d.ts +33 -0
- package/dist/utils.js +198 -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,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSubscriptionContract = createSubscriptionContract;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const contract_1 = require("./contract");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const DEFAULT_NAME = 'subscriptions';
|
|
8
|
+
function createSubscriptionContract(options = {}) {
|
|
9
|
+
const name = options.name || DEFAULT_NAME;
|
|
10
|
+
const state = (0, helpers_1.createContractState)();
|
|
11
|
+
const createPlanSchema = zod_1.z.object({
|
|
12
|
+
planId: helpers_1.identifierSchema,
|
|
13
|
+
title: zod_1.z.string().min(3).max(140),
|
|
14
|
+
price: helpers_1.amountSchema,
|
|
15
|
+
asset: helpers_1.assetSchema,
|
|
16
|
+
intervalDays: zod_1.z.number().int().min(1).max(365),
|
|
17
|
+
graceDays: zod_1.z.number().int().min(0).max(90).optional(),
|
|
18
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
19
|
+
});
|
|
20
|
+
const updatePlanSchema = zod_1.z.object({
|
|
21
|
+
planId: helpers_1.identifierSchema,
|
|
22
|
+
title: zod_1.z.string().min(3).max(140).optional(),
|
|
23
|
+
price: helpers_1.amountSchema.optional(),
|
|
24
|
+
asset: helpers_1.assetSchema.optional(),
|
|
25
|
+
intervalDays: zod_1.z.number().int().min(1).max(365).optional(),
|
|
26
|
+
graceDays: zod_1.z.number().int().min(0).max(90).optional(),
|
|
27
|
+
active: zod_1.z.boolean().optional(),
|
|
28
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
29
|
+
});
|
|
30
|
+
const planIdSchema = zod_1.z.object({
|
|
31
|
+
planId: helpers_1.identifierSchema
|
|
32
|
+
});
|
|
33
|
+
const initialize = async () => {
|
|
34
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
35
|
+
`
|
|
36
|
+
CREATE TABLE IF NOT EXISTS subscription_plans (
|
|
37
|
+
plan_id TEXT PRIMARY KEY,
|
|
38
|
+
creator TEXT NOT NULL,
|
|
39
|
+
title TEXT NOT NULL,
|
|
40
|
+
price TEXT NOT NULL,
|
|
41
|
+
asset TEXT NOT NULL,
|
|
42
|
+
interval_days INTEGER NOT NULL,
|
|
43
|
+
grace_days INTEGER NOT NULL,
|
|
44
|
+
active INTEGER NOT NULL,
|
|
45
|
+
metadata TEXT,
|
|
46
|
+
created_at DATETIME NOT NULL,
|
|
47
|
+
updated_at DATETIME NOT NULL
|
|
48
|
+
)
|
|
49
|
+
`,
|
|
50
|
+
`
|
|
51
|
+
CREATE TABLE IF NOT EXISTS subscription_memberships (
|
|
52
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
53
|
+
plan_id TEXT NOT NULL,
|
|
54
|
+
subscriber TEXT NOT NULL,
|
|
55
|
+
status TEXT NOT NULL,
|
|
56
|
+
starts_at DATETIME NOT NULL,
|
|
57
|
+
active_until DATETIME NOT NULL,
|
|
58
|
+
renewals INTEGER NOT NULL,
|
|
59
|
+
last_amount TEXT NOT NULL,
|
|
60
|
+
last_asset TEXT NOT NULL,
|
|
61
|
+
last_source TEXT NOT NULL,
|
|
62
|
+
updated_at DATETIME NOT NULL,
|
|
63
|
+
UNIQUE(plan_id, subscriber)
|
|
64
|
+
)
|
|
65
|
+
`
|
|
66
|
+
]);
|
|
67
|
+
};
|
|
68
|
+
const createPlan = async (payload, ctx) => {
|
|
69
|
+
const creator = (0, helpers_1.requireSender)(ctx);
|
|
70
|
+
const existing = await state.adapter.query('SELECT plan_id FROM subscription_plans WHERE plan_id = ?', [payload.planId]);
|
|
71
|
+
if (existing.length > 0) {
|
|
72
|
+
throw new Error(`Plan ${payload.planId} already exists`);
|
|
73
|
+
}
|
|
74
|
+
await state.adapter.query(`INSERT INTO subscription_plans (
|
|
75
|
+
plan_id, creator, title, price, asset, interval_days, grace_days, active, metadata, created_at, updated_at
|
|
76
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
77
|
+
payload.planId,
|
|
78
|
+
creator,
|
|
79
|
+
payload.title,
|
|
80
|
+
payload.price,
|
|
81
|
+
payload.asset,
|
|
82
|
+
payload.intervalDays,
|
|
83
|
+
payload.graceDays || 0,
|
|
84
|
+
1,
|
|
85
|
+
JSON.stringify(payload.metadata || {}),
|
|
86
|
+
new Date(),
|
|
87
|
+
new Date()
|
|
88
|
+
]);
|
|
89
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createPlan', payload, {
|
|
90
|
+
action: 'subscription_plan_created',
|
|
91
|
+
data: {
|
|
92
|
+
planId: payload.planId,
|
|
93
|
+
creator
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
};
|
|
97
|
+
const updatePlan = async (payload, ctx) => {
|
|
98
|
+
const sender = (0, helpers_1.requireSender)(ctx);
|
|
99
|
+
const rows = await state.adapter.query('SELECT * FROM subscription_plans WHERE plan_id = ?', [payload.planId]);
|
|
100
|
+
if (rows.length === 0) {
|
|
101
|
+
throw new Error(`Plan ${payload.planId} does not exist`);
|
|
102
|
+
}
|
|
103
|
+
const plan = rows[0];
|
|
104
|
+
if (plan.creator !== sender) {
|
|
105
|
+
throw new Error('Only the plan creator can update this plan');
|
|
106
|
+
}
|
|
107
|
+
await state.adapter.query(`UPDATE subscription_plans
|
|
108
|
+
SET title = ?, price = ?, asset = ?, interval_days = ?, grace_days = ?, active = ?, metadata = ?, updated_at = ?
|
|
109
|
+
WHERE plan_id = ?`, [
|
|
110
|
+
payload.title || plan.title,
|
|
111
|
+
payload.price || plan.price,
|
|
112
|
+
payload.asset || plan.asset,
|
|
113
|
+
payload.intervalDays || plan.interval_days,
|
|
114
|
+
typeof payload.graceDays === 'number' ? payload.graceDays : plan.grace_days,
|
|
115
|
+
typeof payload.active === 'boolean' ? (payload.active ? 1 : 0) : plan.active,
|
|
116
|
+
JSON.stringify(payload.metadata || JSON.parse(plan.metadata || '{}')),
|
|
117
|
+
new Date(),
|
|
118
|
+
payload.planId
|
|
119
|
+
]);
|
|
120
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'updatePlan', payload, {
|
|
121
|
+
action: 'subscription_plan_updated',
|
|
122
|
+
data: {
|
|
123
|
+
planId: payload.planId,
|
|
124
|
+
creator: sender
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
const subscribe = async (payload, ctx) => {
|
|
129
|
+
const subscriber = (0, helpers_1.requireSender)(ctx);
|
|
130
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
131
|
+
const planRows = await state.adapter.query('SELECT * FROM subscription_plans WHERE plan_id = ?', [payload.planId]);
|
|
132
|
+
if (planRows.length === 0) {
|
|
133
|
+
throw new Error(`Plan ${payload.planId} does not exist`);
|
|
134
|
+
}
|
|
135
|
+
const plan = planRows[0];
|
|
136
|
+
if (!plan.active) {
|
|
137
|
+
throw new Error('Plan is not active');
|
|
138
|
+
}
|
|
139
|
+
(0, helpers_1.assertAssetMatches)(payment.asset, plan.asset);
|
|
140
|
+
if ((0, helpers_1.toBigNumber)(payment.amount).lt(plan.price)) {
|
|
141
|
+
throw new Error('Payment amount is below the plan price');
|
|
142
|
+
}
|
|
143
|
+
const membershipRows = await state.adapter.query('SELECT * FROM subscription_memberships WHERE plan_id = ? AND subscriber = ?', [payload.planId, subscriber]);
|
|
144
|
+
const now = new Date();
|
|
145
|
+
const baseDate = membershipRows.length > 0 && (0, helpers_1.parseDateValue)(membershipRows[0].active_until) && (0, helpers_1.parseDateValue)(membershipRows[0].active_until) > now
|
|
146
|
+
? (0, helpers_1.parseDateValue)(membershipRows[0].active_until)
|
|
147
|
+
: now;
|
|
148
|
+
const activeUntil = new Date(baseDate.getTime() + Number(plan.interval_days) * 24 * 60 * 60 * 1000);
|
|
149
|
+
if (membershipRows.length === 0) {
|
|
150
|
+
await state.adapter.query(`INSERT INTO subscription_memberships (
|
|
151
|
+
plan_id, subscriber, status, starts_at, active_until, renewals, last_amount, last_asset, last_source, updated_at
|
|
152
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [payload.planId, subscriber, 'active', now, activeUntil, 1, payment.amount, payment.asset, payment.source, now]);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
const membership = membershipRows[0];
|
|
156
|
+
await state.adapter.query(`UPDATE subscription_memberships
|
|
157
|
+
SET status = ?, active_until = ?, renewals = ?, last_amount = ?, last_asset = ?, last_source = ?, updated_at = ?
|
|
158
|
+
WHERE plan_id = ? AND subscriber = ?`, [
|
|
159
|
+
'active',
|
|
160
|
+
activeUntil,
|
|
161
|
+
Number(membership.renewals || 0) + 1,
|
|
162
|
+
payment.amount,
|
|
163
|
+
payment.asset,
|
|
164
|
+
payment.source,
|
|
165
|
+
now,
|
|
166
|
+
payload.planId,
|
|
167
|
+
subscriber
|
|
168
|
+
]);
|
|
169
|
+
}
|
|
170
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'subscribe', payload, {
|
|
171
|
+
action: 'subscription_renewed',
|
|
172
|
+
data: {
|
|
173
|
+
planId: payload.planId,
|
|
174
|
+
subscriber,
|
|
175
|
+
activeUntil,
|
|
176
|
+
source: payment.source
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
const cancel = async (payload, ctx) => {
|
|
181
|
+
const sender = (0, helpers_1.requireSender)(ctx);
|
|
182
|
+
const membershipRows = await state.adapter.query('SELECT * FROM subscription_memberships WHERE plan_id = ? AND subscriber = ?', [payload.planId, sender]);
|
|
183
|
+
if (membershipRows.length === 0) {
|
|
184
|
+
throw new Error('Subscription does not exist');
|
|
185
|
+
}
|
|
186
|
+
await state.adapter.query('UPDATE subscription_memberships SET status = ?, updated_at = ? WHERE plan_id = ? AND subscriber = ?', ['cancelled', new Date(), payload.planId, sender]);
|
|
187
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'cancelSubscription', payload, {
|
|
188
|
+
action: 'subscription_cancelled',
|
|
189
|
+
data: {
|
|
190
|
+
planId: payload.planId,
|
|
191
|
+
subscriber: sender
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
};
|
|
195
|
+
const expireMemberships = async (payload = {}, ctx) => {
|
|
196
|
+
const plans = payload.planId
|
|
197
|
+
? await state.adapter.query('SELECT * FROM subscription_plans WHERE plan_id = ?', [payload.planId])
|
|
198
|
+
: await state.adapter.query('SELECT * FROM subscription_plans', []);
|
|
199
|
+
const now = new Date();
|
|
200
|
+
for (const plan of plans) {
|
|
201
|
+
const memberships = await state.adapter.query('SELECT * FROM subscription_memberships WHERE plan_id = ? AND status = ?', [plan.plan_id, 'active']);
|
|
202
|
+
for (const membership of memberships) {
|
|
203
|
+
const activeUntil = (0, helpers_1.parseDateValue)(membership.active_until);
|
|
204
|
+
if (!activeUntil) {
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
const graceEnd = new Date(activeUntil.getTime() + Number(plan.grace_days || 0) * 24 * 60 * 60 * 1000);
|
|
208
|
+
if (graceEnd < now) {
|
|
209
|
+
await state.adapter.query('UPDATE subscription_memberships SET status = ?, updated_at = ? WHERE plan_id = ? AND subscriber = ?', ['expired', now, membership.plan_id, membership.subscriber]);
|
|
210
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'expireMemberships', payload, {
|
|
211
|
+
action: 'subscription_expired',
|
|
212
|
+
data: {
|
|
213
|
+
planId: membership.plan_id,
|
|
214
|
+
subscriber: membership.subscriber
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
return (0, contract_1.defineContract)({
|
|
222
|
+
name,
|
|
223
|
+
hooks: {
|
|
224
|
+
create: async ({ adapter }) => {
|
|
225
|
+
state.adapter = adapter;
|
|
226
|
+
await initialize();
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
actions: {
|
|
230
|
+
createPlan: (0, contract_1.action)(createPlan, { schema: createPlanSchema, trigger: 'custom_json' }),
|
|
231
|
+
updatePlan: (0, contract_1.action)(updatePlan, { schema: updatePlanSchema, trigger: 'custom_json' }),
|
|
232
|
+
subscribe: (0, contract_1.action)(subscribe, { schema: planIdSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
233
|
+
cancelSubscription: (0, contract_1.action)(cancel, { schema: planIdSchema, trigger: 'custom_json' }),
|
|
234
|
+
expireMemberships: (0, contract_1.action)(expireMemberships, {
|
|
235
|
+
schema: zod_1.z.object({ planId: helpers_1.identifierSchema.optional() }).optional(),
|
|
236
|
+
trigger: ['custom_json', 'time']
|
|
237
|
+
})
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=subscription.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.contract.js","sourceRoot":"","sources":["../../src/contracts/subscription.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createSweepstakesContract = createSweepstakesContract;
|
|
7
|
+
const seedrandom_1 = __importDefault(require("seedrandom"));
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
const contract_1 = require("./contract");
|
|
10
|
+
const helpers_1 = require("./helpers");
|
|
11
|
+
const DEFAULT_NAME = 'sweepstakes';
|
|
12
|
+
function createSweepstakesContract(options = {}) {
|
|
13
|
+
const name = options.name || DEFAULT_NAME;
|
|
14
|
+
const state = (0, helpers_1.createContractState)();
|
|
15
|
+
const createDrawSchema = zod_1.z.object({
|
|
16
|
+
drawId: helpers_1.identifierSchema,
|
|
17
|
+
title: zod_1.z.string().min(3).max(140),
|
|
18
|
+
entryFee: helpers_1.amountSchema,
|
|
19
|
+
asset: helpers_1.assetSchema,
|
|
20
|
+
closesAt: zod_1.z.string(),
|
|
21
|
+
maxEntries: zod_1.z.number().int().min(1).max(1000000).optional(),
|
|
22
|
+
maxEntriesPerAccount: zod_1.z.number().int().min(1).max(100000).optional(),
|
|
23
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
24
|
+
});
|
|
25
|
+
const enterSchema = zod_1.z.object({
|
|
26
|
+
drawId: helpers_1.identifierSchema,
|
|
27
|
+
entries: zod_1.z.number().int().min(1).optional()
|
|
28
|
+
});
|
|
29
|
+
const drawSchema = zod_1.z.object({
|
|
30
|
+
drawId: helpers_1.identifierSchema,
|
|
31
|
+
seed: zod_1.z.string().max(120).optional()
|
|
32
|
+
});
|
|
33
|
+
const initialize = async () => {
|
|
34
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
35
|
+
`
|
|
36
|
+
CREATE TABLE IF NOT EXISTS sweepstakes_draws (
|
|
37
|
+
draw_id TEXT PRIMARY KEY,
|
|
38
|
+
creator TEXT NOT NULL,
|
|
39
|
+
title TEXT NOT NULL,
|
|
40
|
+
entry_fee TEXT NOT NULL,
|
|
41
|
+
asset TEXT NOT NULL,
|
|
42
|
+
closes_at DATETIME NOT NULL,
|
|
43
|
+
max_entries INTEGER,
|
|
44
|
+
max_entries_per_account INTEGER,
|
|
45
|
+
total_entries INTEGER NOT NULL,
|
|
46
|
+
status TEXT NOT NULL,
|
|
47
|
+
winner TEXT,
|
|
48
|
+
winner_ticket INTEGER,
|
|
49
|
+
metadata TEXT,
|
|
50
|
+
created_at DATETIME NOT NULL,
|
|
51
|
+
settled_at DATETIME
|
|
52
|
+
)
|
|
53
|
+
`,
|
|
54
|
+
`
|
|
55
|
+
CREATE TABLE IF NOT EXISTS sweepstakes_entries (
|
|
56
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
57
|
+
draw_id TEXT NOT NULL,
|
|
58
|
+
entrant TEXT NOT NULL,
|
|
59
|
+
amount TEXT NOT NULL,
|
|
60
|
+
asset TEXT NOT NULL,
|
|
61
|
+
entries_count INTEGER NOT NULL,
|
|
62
|
+
created_at DATETIME NOT NULL
|
|
63
|
+
)
|
|
64
|
+
`
|
|
65
|
+
]);
|
|
66
|
+
};
|
|
67
|
+
const createSweepstakes = async (payload, ctx) => {
|
|
68
|
+
const creator = (0, helpers_1.requireSender)(ctx);
|
|
69
|
+
const existing = await state.adapter.query('SELECT draw_id FROM sweepstakes_draws WHERE draw_id = ?', [payload.drawId]);
|
|
70
|
+
if (existing.length > 0) {
|
|
71
|
+
throw new Error(`Sweepstakes ${payload.drawId} already exists`);
|
|
72
|
+
}
|
|
73
|
+
const closesAt = (0, helpers_1.parseDateValue)(payload.closesAt);
|
|
74
|
+
if (!closesAt || closesAt <= new Date()) {
|
|
75
|
+
throw new Error('Sweepstakes close time must be in the future');
|
|
76
|
+
}
|
|
77
|
+
await state.adapter.query(`INSERT INTO sweepstakes_draws (
|
|
78
|
+
draw_id, creator, title, entry_fee, asset, closes_at, max_entries, max_entries_per_account, total_entries, status, winner, winner_ticket, metadata, created_at, settled_at
|
|
79
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
80
|
+
payload.drawId,
|
|
81
|
+
creator,
|
|
82
|
+
payload.title,
|
|
83
|
+
payload.entryFee,
|
|
84
|
+
payload.asset,
|
|
85
|
+
closesAt,
|
|
86
|
+
payload.maxEntries || null,
|
|
87
|
+
payload.maxEntriesPerAccount || null,
|
|
88
|
+
0,
|
|
89
|
+
'open',
|
|
90
|
+
null,
|
|
91
|
+
null,
|
|
92
|
+
JSON.stringify(payload.metadata || {}),
|
|
93
|
+
new Date(),
|
|
94
|
+
null
|
|
95
|
+
]);
|
|
96
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createSweepstakes', payload, {
|
|
97
|
+
action: 'sweepstakes_created',
|
|
98
|
+
data: {
|
|
99
|
+
drawId: payload.drawId,
|
|
100
|
+
creator
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
const enterSweepstakes = async (payload, ctx) => {
|
|
105
|
+
const entrant = (0, helpers_1.requireSender)(ctx);
|
|
106
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
107
|
+
const draws = await state.adapter.query('SELECT * FROM sweepstakes_draws WHERE draw_id = ?', [payload.drawId]);
|
|
108
|
+
if (draws.length === 0) {
|
|
109
|
+
throw new Error(`Sweepstakes ${payload.drawId} does not exist`);
|
|
110
|
+
}
|
|
111
|
+
const draw = draws[0];
|
|
112
|
+
if (draw.status !== 'open') {
|
|
113
|
+
throw new Error('Sweepstakes is not open');
|
|
114
|
+
}
|
|
115
|
+
if (((0, helpers_1.parseDateValue)(draw.closes_at) || new Date()) <= new Date()) {
|
|
116
|
+
throw new Error('Sweepstakes has already closed');
|
|
117
|
+
}
|
|
118
|
+
(0, helpers_1.assertAssetMatches)(payment.asset, draw.asset);
|
|
119
|
+
const exactEntries = (0, helpers_1.toBigNumber)(payment.amount).dividedBy(draw.entry_fee);
|
|
120
|
+
if (!exactEntries.isInteger()) {
|
|
121
|
+
throw new Error('Payment amount must be an exact multiple of the entry fee');
|
|
122
|
+
}
|
|
123
|
+
const entries = payload.entries || exactEntries.toNumber();
|
|
124
|
+
if (!exactEntries.eq(entries)) {
|
|
125
|
+
throw new Error('Declared entries do not match payment amount');
|
|
126
|
+
}
|
|
127
|
+
const entrantRows = await state.adapter.query('SELECT COALESCE(SUM(entries_count), 0) AS total FROM sweepstakes_entries WHERE draw_id = ? AND entrant = ?', [payload.drawId, entrant]);
|
|
128
|
+
const entrantEntries = Number(entrantRows[0]?.total || 0);
|
|
129
|
+
if (draw.max_entries_per_account && entrantEntries + entries > Number(draw.max_entries_per_account)) {
|
|
130
|
+
throw new Error('Entry would exceed the per-account limit');
|
|
131
|
+
}
|
|
132
|
+
const totalEntries = Number(draw.total_entries) + entries;
|
|
133
|
+
if (draw.max_entries && totalEntries > Number(draw.max_entries)) {
|
|
134
|
+
throw new Error('Entry would exceed the draw entry cap');
|
|
135
|
+
}
|
|
136
|
+
await state.adapter.query('INSERT INTO sweepstakes_entries (draw_id, entrant, amount, asset, entries_count, created_at) VALUES (?, ?, ?, ?, ?, ?)', [payload.drawId, entrant, payment.amount, payment.asset, entries, new Date()]);
|
|
137
|
+
await state.adapter.query('UPDATE sweepstakes_draws SET total_entries = ? WHERE draw_id = ?', [totalEntries, payload.drawId]);
|
|
138
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'enterSweepstakes', payload, {
|
|
139
|
+
action: 'sweepstakes_entered',
|
|
140
|
+
data: {
|
|
141
|
+
drawId: payload.drawId,
|
|
142
|
+
entrant,
|
|
143
|
+
entries,
|
|
144
|
+
totalEntries
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
};
|
|
148
|
+
const drawWinner = async (payload, ctx) => {
|
|
149
|
+
const draws = await state.adapter.query('SELECT * FROM sweepstakes_draws WHERE draw_id = ?', [payload.drawId]);
|
|
150
|
+
if (draws.length === 0) {
|
|
151
|
+
throw new Error(`Sweepstakes ${payload.drawId} does not exist`);
|
|
152
|
+
}
|
|
153
|
+
const draw = draws[0];
|
|
154
|
+
if (draw.status !== 'open') {
|
|
155
|
+
throw new Error('Sweepstakes is not open for drawing');
|
|
156
|
+
}
|
|
157
|
+
if (ctx.trigger !== 'time') {
|
|
158
|
+
const sender = (0, helpers_1.requireSender)(ctx);
|
|
159
|
+
if (sender !== draw.creator) {
|
|
160
|
+
throw new Error('Only the creator can draw this sweepstakes');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const closesAt = (0, helpers_1.parseDateValue)(draw.closes_at) || new Date();
|
|
164
|
+
if (closesAt > new Date()) {
|
|
165
|
+
throw new Error('Sweepstakes cannot be drawn before it closes');
|
|
166
|
+
}
|
|
167
|
+
if (Number(draw.total_entries) <= 0) {
|
|
168
|
+
throw new Error('Sweepstakes has no entries');
|
|
169
|
+
}
|
|
170
|
+
const entries = await state.adapter.query('SELECT entrant, entries_count FROM sweepstakes_entries WHERE draw_id = ? ORDER BY id ASC', [payload.drawId]);
|
|
171
|
+
const seed = `${payload.seed || ''}:${ctx.block.id}:${payload.drawId}:${draw.total_entries}`;
|
|
172
|
+
const rng = (0, seedrandom_1.default)(seed);
|
|
173
|
+
const winningTicket = Math.floor(rng() * Number(draw.total_entries)) + 1;
|
|
174
|
+
let cursor = 0;
|
|
175
|
+
let winner = entries[0].entrant;
|
|
176
|
+
for (const entry of entries) {
|
|
177
|
+
cursor += Number(entry.entries_count);
|
|
178
|
+
if (winningTicket <= cursor) {
|
|
179
|
+
winner = entry.entrant;
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
await state.adapter.query('UPDATE sweepstakes_draws SET status = ?, winner = ?, winner_ticket = ?, settled_at = ? WHERE draw_id = ?', ['drawn', winner, winningTicket, new Date(), payload.drawId]);
|
|
184
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'drawWinner', payload, {
|
|
185
|
+
action: 'sweepstakes_winner_drawn',
|
|
186
|
+
data: {
|
|
187
|
+
drawId: payload.drawId,
|
|
188
|
+
winner,
|
|
189
|
+
winningTicket,
|
|
190
|
+
totalEntries: Number(draw.total_entries)
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
return (0, contract_1.defineContract)({
|
|
195
|
+
name,
|
|
196
|
+
hooks: {
|
|
197
|
+
create: async ({ adapter }) => {
|
|
198
|
+
state.adapter = adapter;
|
|
199
|
+
await initialize();
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
actions: {
|
|
203
|
+
createSweepstakes: (0, contract_1.action)(createSweepstakes, { schema: createDrawSchema, trigger: 'custom_json' }),
|
|
204
|
+
enterSweepstakes: (0, contract_1.action)(enterSweepstakes, { schema: enterSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
205
|
+
drawWinner: (0, contract_1.action)(drawWinner, { schema: drawSchema, trigger: ['custom_json', 'time'] })
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=sweepstakes.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweepstakes.contract.js","sourceRoot":"","sources":["../../src/contracts/sweepstakes.contract.ts"],"names":[],"mappings":"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"}
|