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,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createInsurancePoolContract = createInsurancePoolContract;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const contract_1 = require("./contract");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const DEFAULT_NAME = 'insurancepool';
|
|
8
|
+
function createInsurancePoolContract(options = {}) {
|
|
9
|
+
const name = options.name || DEFAULT_NAME;
|
|
10
|
+
const state = (0, helpers_1.createContractState)();
|
|
11
|
+
const createPoolSchema = zod_1.z.object({
|
|
12
|
+
poolId: helpers_1.identifierSchema,
|
|
13
|
+
title: zod_1.z.string().min(3).max(140),
|
|
14
|
+
asset: helpers_1.assetSchema,
|
|
15
|
+
premiumAmount: helpers_1.amountSchema,
|
|
16
|
+
coverageCap: helpers_1.amountSchema,
|
|
17
|
+
coverageDays: zod_1.z.number().int().min(1).max(3650),
|
|
18
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
19
|
+
});
|
|
20
|
+
const poolIdSchema = zod_1.z.object({
|
|
21
|
+
poolId: helpers_1.identifierSchema
|
|
22
|
+
});
|
|
23
|
+
const fileClaimSchema = zod_1.z.object({
|
|
24
|
+
poolId: helpers_1.identifierSchema,
|
|
25
|
+
claimId: helpers_1.identifierSchema,
|
|
26
|
+
amount: helpers_1.amountSchema,
|
|
27
|
+
reason: zod_1.z.string().min(3).max(500)
|
|
28
|
+
});
|
|
29
|
+
const approveClaimSchema = zod_1.z.object({
|
|
30
|
+
claimId: helpers_1.identifierSchema,
|
|
31
|
+
amount: helpers_1.amountSchema.optional(),
|
|
32
|
+
note: zod_1.z.string().max(280).optional()
|
|
33
|
+
});
|
|
34
|
+
const expireSchema = zod_1.z.object({
|
|
35
|
+
poolId: helpers_1.identifierSchema.optional()
|
|
36
|
+
}).optional();
|
|
37
|
+
const initialize = async () => {
|
|
38
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
39
|
+
`
|
|
40
|
+
CREATE TABLE IF NOT EXISTS insurance_pools (
|
|
41
|
+
pool_id TEXT PRIMARY KEY,
|
|
42
|
+
owner TEXT NOT NULL,
|
|
43
|
+
title TEXT NOT NULL,
|
|
44
|
+
asset TEXT NOT NULL,
|
|
45
|
+
premium_amount TEXT NOT NULL,
|
|
46
|
+
coverage_cap TEXT NOT NULL,
|
|
47
|
+
coverage_days INTEGER NOT NULL,
|
|
48
|
+
reserve_balance TEXT NOT NULL,
|
|
49
|
+
metadata TEXT,
|
|
50
|
+
created_at DATETIME NOT NULL,
|
|
51
|
+
updated_at DATETIME NOT NULL
|
|
52
|
+
)
|
|
53
|
+
`,
|
|
54
|
+
`
|
|
55
|
+
CREATE TABLE IF NOT EXISTS insurance_policies (
|
|
56
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
57
|
+
pool_id TEXT NOT NULL,
|
|
58
|
+
holder TEXT NOT NULL,
|
|
59
|
+
premium_paid TEXT NOT NULL,
|
|
60
|
+
asset TEXT NOT NULL,
|
|
61
|
+
status TEXT NOT NULL,
|
|
62
|
+
purchased_at DATETIME NOT NULL,
|
|
63
|
+
expires_at DATETIME NOT NULL,
|
|
64
|
+
updated_at DATETIME NOT NULL,
|
|
65
|
+
UNIQUE(pool_id, holder)
|
|
66
|
+
)
|
|
67
|
+
`,
|
|
68
|
+
`
|
|
69
|
+
CREATE TABLE IF NOT EXISTS insurance_claims (
|
|
70
|
+
claim_id TEXT PRIMARY KEY,
|
|
71
|
+
pool_id TEXT NOT NULL,
|
|
72
|
+
holder TEXT NOT NULL,
|
|
73
|
+
requested_amount TEXT NOT NULL,
|
|
74
|
+
approved_amount TEXT,
|
|
75
|
+
reason TEXT NOT NULL,
|
|
76
|
+
status TEXT NOT NULL,
|
|
77
|
+
note TEXT,
|
|
78
|
+
created_at DATETIME NOT NULL,
|
|
79
|
+
updated_at DATETIME NOT NULL
|
|
80
|
+
)
|
|
81
|
+
`
|
|
82
|
+
]);
|
|
83
|
+
};
|
|
84
|
+
const createPool = async (payload, ctx) => {
|
|
85
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
86
|
+
const existing = await state.adapter.query('SELECT pool_id FROM insurance_pools WHERE pool_id = ?', [payload.poolId]);
|
|
87
|
+
if (existing.length > 0) {
|
|
88
|
+
throw new Error(`Pool ${payload.poolId} already exists`);
|
|
89
|
+
}
|
|
90
|
+
await state.adapter.query(`INSERT INTO insurance_pools (
|
|
91
|
+
pool_id, owner, title, asset, premium_amount, coverage_cap, coverage_days, reserve_balance, metadata, created_at, updated_at
|
|
92
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
93
|
+
payload.poolId,
|
|
94
|
+
owner,
|
|
95
|
+
payload.title,
|
|
96
|
+
payload.asset,
|
|
97
|
+
payload.premiumAmount,
|
|
98
|
+
payload.coverageCap,
|
|
99
|
+
payload.coverageDays,
|
|
100
|
+
'0',
|
|
101
|
+
JSON.stringify(payload.metadata || {}),
|
|
102
|
+
new Date(),
|
|
103
|
+
new Date()
|
|
104
|
+
]);
|
|
105
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createPool', payload, {
|
|
106
|
+
action: 'insurance_pool_created',
|
|
107
|
+
data: {
|
|
108
|
+
poolId: payload.poolId,
|
|
109
|
+
owner
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
const fundPool = async (payload, ctx) => {
|
|
114
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
115
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
116
|
+
const pools = await state.adapter.query('SELECT * FROM insurance_pools WHERE pool_id = ?', [payload.poolId]);
|
|
117
|
+
if (pools.length === 0) {
|
|
118
|
+
throw new Error(`Pool ${payload.poolId} does not exist`);
|
|
119
|
+
}
|
|
120
|
+
const pool = pools[0];
|
|
121
|
+
if (pool.owner !== owner) {
|
|
122
|
+
throw new Error('Only the pool owner can fund the reserve');
|
|
123
|
+
}
|
|
124
|
+
(0, helpers_1.assertAssetMatches)(payment.asset, pool.asset);
|
|
125
|
+
const reserve = (0, helpers_1.toBigNumber)(pool.reserve_balance).plus(payment.amount);
|
|
126
|
+
await state.adapter.query('UPDATE insurance_pools SET reserve_balance = ?, updated_at = ? WHERE pool_id = ?', [reserve.toFixed(), new Date(), payload.poolId]);
|
|
127
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'fundPool', payload, {
|
|
128
|
+
action: 'insurance_pool_funded',
|
|
129
|
+
data: {
|
|
130
|
+
poolId: payload.poolId,
|
|
131
|
+
owner,
|
|
132
|
+
reserveBalance: reserve.toFixed()
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
const buyPolicy = async (payload, ctx) => {
|
|
137
|
+
const holder = (0, helpers_1.requireSender)(ctx);
|
|
138
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
139
|
+
const pools = await state.adapter.query('SELECT * FROM insurance_pools WHERE pool_id = ?', [payload.poolId]);
|
|
140
|
+
if (pools.length === 0) {
|
|
141
|
+
throw new Error(`Pool ${payload.poolId} does not exist`);
|
|
142
|
+
}
|
|
143
|
+
const pool = pools[0];
|
|
144
|
+
(0, helpers_1.assertAssetMatches)(payment.asset, pool.asset);
|
|
145
|
+
if (!(0, helpers_1.toBigNumber)(payment.amount).eq(pool.premium_amount)) {
|
|
146
|
+
throw new Error(`Policy premium is ${pool.premium_amount} ${pool.asset}`);
|
|
147
|
+
}
|
|
148
|
+
const policyRows = await state.adapter.query('SELECT * FROM insurance_policies WHERE pool_id = ? AND holder = ?', [payload.poolId, holder]);
|
|
149
|
+
const now = new Date();
|
|
150
|
+
const baseDate = policyRows.length > 0 && (0, helpers_1.parseDateValue)(policyRows[0].expires_at) && (0, helpers_1.parseDateValue)(policyRows[0].expires_at) > now
|
|
151
|
+
? (0, helpers_1.parseDateValue)(policyRows[0].expires_at)
|
|
152
|
+
: now;
|
|
153
|
+
const expiresAt = new Date(baseDate.getTime() + Number(pool.coverage_days) * 24 * 60 * 60 * 1000);
|
|
154
|
+
await state.adapter.query(`INSERT INTO insurance_policies (
|
|
155
|
+
pool_id, holder, premium_paid, asset, status, purchased_at, expires_at, updated_at
|
|
156
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
157
|
+
ON CONFLICT(pool_id, holder)
|
|
158
|
+
DO UPDATE SET premium_paid = excluded.premium_paid, asset = excluded.asset, status = excluded.status, expires_at = excluded.expires_at, updated_at = excluded.updated_at`, [payload.poolId, holder, payment.amount, payment.asset, 'active', now, expiresAt, now]);
|
|
159
|
+
const reserve = (0, helpers_1.toBigNumber)(pool.reserve_balance).plus(payment.amount);
|
|
160
|
+
await state.adapter.query('UPDATE insurance_pools SET reserve_balance = ?, updated_at = ? WHERE pool_id = ?', [reserve.toFixed(), new Date(), payload.poolId]);
|
|
161
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'buyPolicy', payload, {
|
|
162
|
+
action: 'insurance_policy_purchased',
|
|
163
|
+
data: {
|
|
164
|
+
poolId: payload.poolId,
|
|
165
|
+
holder,
|
|
166
|
+
expiresAt
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
const fileClaim = async (payload, ctx) => {
|
|
171
|
+
const holder = (0, helpers_1.requireSender)(ctx);
|
|
172
|
+
const pools = await state.adapter.query('SELECT * FROM insurance_pools WHERE pool_id = ?', [payload.poolId]);
|
|
173
|
+
const policies = await state.adapter.query('SELECT * FROM insurance_policies WHERE pool_id = ? AND holder = ?', [payload.poolId, holder]);
|
|
174
|
+
if (pools.length === 0 || policies.length === 0) {
|
|
175
|
+
throw new Error('Insurance policy does not exist');
|
|
176
|
+
}
|
|
177
|
+
const pool = pools[0];
|
|
178
|
+
const policy = policies[0];
|
|
179
|
+
if (policy.status !== 'active') {
|
|
180
|
+
throw new Error('Insurance policy is not active');
|
|
181
|
+
}
|
|
182
|
+
if (((0, helpers_1.parseDateValue)(policy.expires_at) || new Date()) <= new Date()) {
|
|
183
|
+
throw new Error('Insurance policy has expired');
|
|
184
|
+
}
|
|
185
|
+
if ((0, helpers_1.toBigNumber)(payload.amount).gt(pool.coverage_cap)) {
|
|
186
|
+
throw new Error('Claim exceeds the coverage cap');
|
|
187
|
+
}
|
|
188
|
+
const existing = await state.adapter.query('SELECT claim_id FROM insurance_claims WHERE claim_id = ?', [payload.claimId]);
|
|
189
|
+
if (existing.length > 0) {
|
|
190
|
+
throw new Error(`Claim ${payload.claimId} already exists`);
|
|
191
|
+
}
|
|
192
|
+
await state.adapter.query(`INSERT INTO insurance_claims (
|
|
193
|
+
claim_id, pool_id, holder, requested_amount, approved_amount, reason, status, note, created_at, updated_at
|
|
194
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [payload.claimId, payload.poolId, holder, payload.amount, null, payload.reason, 'pending', '', new Date(), new Date()]);
|
|
195
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'fileClaim', payload, {
|
|
196
|
+
action: 'insurance_claim_filed',
|
|
197
|
+
data: {
|
|
198
|
+
claimId: payload.claimId,
|
|
199
|
+
poolId: payload.poolId,
|
|
200
|
+
holder,
|
|
201
|
+
amount: payload.amount
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
};
|
|
205
|
+
const approveClaim = async (payload, ctx) => {
|
|
206
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
207
|
+
const claimRows = await state.adapter.query('SELECT * FROM insurance_claims WHERE claim_id = ?', [payload.claimId]);
|
|
208
|
+
if (claimRows.length === 0) {
|
|
209
|
+
throw new Error(`Claim ${payload.claimId} does not exist`);
|
|
210
|
+
}
|
|
211
|
+
const claim = claimRows[0];
|
|
212
|
+
if (claim.status !== 'pending') {
|
|
213
|
+
throw new Error(`Claim ${payload.claimId} has already been ${claim.status}`);
|
|
214
|
+
}
|
|
215
|
+
const poolRows = await state.adapter.query('SELECT * FROM insurance_pools WHERE pool_id = ?', [claim.pool_id]);
|
|
216
|
+
const pool = poolRows[0];
|
|
217
|
+
if (pool.owner !== owner) {
|
|
218
|
+
throw new Error('Only the pool owner can approve claims');
|
|
219
|
+
}
|
|
220
|
+
const approvedAmount = payload.amount || claim.requested_amount;
|
|
221
|
+
if ((0, helpers_1.toBigNumber)(approvedAmount).gt(pool.reserve_balance)) {
|
|
222
|
+
throw new Error('Pool reserve cannot cover the approved claim amount');
|
|
223
|
+
}
|
|
224
|
+
const nextReserve = (0, helpers_1.toBigNumber)(pool.reserve_balance).minus(approvedAmount);
|
|
225
|
+
await state.adapter.query('UPDATE insurance_pools SET reserve_balance = ?, updated_at = ? WHERE pool_id = ?', [nextReserve.toFixed(), new Date(), pool.pool_id]);
|
|
226
|
+
await state.adapter.query('UPDATE insurance_claims SET approved_amount = ?, status = ?, note = ?, updated_at = ? WHERE claim_id = ?', [approvedAmount, 'approved', payload.note || '', new Date(), payload.claimId]);
|
|
227
|
+
// Actually pay the claimant
|
|
228
|
+
if (state.streamer) {
|
|
229
|
+
const contractAccount = pool.owner;
|
|
230
|
+
await state.streamer.transferHiveTokens(contractAccount, claim.holder, (0, helpers_1.toBigNumber)(approvedAmount).toFixed(3), pool.asset, `Insurance claim payout: ${payload.claimId}`);
|
|
231
|
+
}
|
|
232
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'approveClaim', payload, {
|
|
233
|
+
action: 'insurance_claim_approved',
|
|
234
|
+
data: {
|
|
235
|
+
claimId: payload.claimId,
|
|
236
|
+
poolId: pool.pool_id,
|
|
237
|
+
holder: claim.holder,
|
|
238
|
+
approvedAmount,
|
|
239
|
+
asset: pool.asset
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
};
|
|
243
|
+
const expirePolicies = async (payload = {}, _ctx) => {
|
|
244
|
+
const policies = payload.poolId
|
|
245
|
+
? await state.adapter.query('SELECT * FROM insurance_policies WHERE pool_id = ?', [payload.poolId])
|
|
246
|
+
: await state.adapter.query('SELECT * FROM insurance_policies', []);
|
|
247
|
+
const now = new Date();
|
|
248
|
+
for (const policy of policies) {
|
|
249
|
+
const expiresAt = (0, helpers_1.parseDateValue)(policy.expires_at);
|
|
250
|
+
if (policy.status === 'active' && expiresAt && expiresAt < now) {
|
|
251
|
+
await state.adapter.query('UPDATE insurance_policies SET status = ?, updated_at = ? WHERE pool_id = ? AND holder = ?', ['expired', now, policy.pool_id, policy.holder]);
|
|
252
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'expirePolicies', payload, {
|
|
253
|
+
action: 'insurance_policy_expired',
|
|
254
|
+
data: {
|
|
255
|
+
poolId: policy.pool_id,
|
|
256
|
+
holder: policy.holder
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
return (0, contract_1.defineContract)({
|
|
263
|
+
name,
|
|
264
|
+
hooks: {
|
|
265
|
+
create: async ({ adapter, streamer }) => {
|
|
266
|
+
state.adapter = adapter;
|
|
267
|
+
state.streamer = streamer;
|
|
268
|
+
await initialize();
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
actions: {
|
|
272
|
+
createPool: (0, contract_1.action)(createPool, { schema: createPoolSchema, trigger: 'custom_json' }),
|
|
273
|
+
fundPool: (0, contract_1.action)(fundPool, { schema: poolIdSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
274
|
+
buyPolicy: (0, contract_1.action)(buyPolicy, { schema: poolIdSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
275
|
+
fileClaim: (0, contract_1.action)(fileClaim, { schema: fileClaimSchema, trigger: 'custom_json' }),
|
|
276
|
+
approveClaim: (0, contract_1.action)(approveClaim, { schema: approveClaimSchema, trigger: 'custom_json' }),
|
|
277
|
+
expirePolicies: (0, contract_1.action)(expirePolicies, { schema: expireSchema, trigger: ['custom_json', 'time'] })
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=insurancepool.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insurancepool.contract.js","sourceRoot":"","sources":["../../src/contracts/insurancepool.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createInvoiceContract = createInvoiceContract;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const contract_1 = require("./contract");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const DEFAULT_NAME = 'invoices';
|
|
8
|
+
function createInvoiceContract(options = {}) {
|
|
9
|
+
const name = options.name || DEFAULT_NAME;
|
|
10
|
+
const state = (0, helpers_1.createContractState)();
|
|
11
|
+
const createInvoiceSchema = zod_1.z.object({
|
|
12
|
+
invoiceId: helpers_1.identifierSchema,
|
|
13
|
+
payer: zod_1.z.string().min(3).max(32),
|
|
14
|
+
title: zod_1.z.string().min(3).max(140),
|
|
15
|
+
description: zod_1.z.string().max(1000).optional(),
|
|
16
|
+
amount: helpers_1.amountSchema,
|
|
17
|
+
asset: helpers_1.assetSchema,
|
|
18
|
+
dueAt: zod_1.z.string().optional(),
|
|
19
|
+
allowPartial: zod_1.z.boolean().optional(),
|
|
20
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
21
|
+
});
|
|
22
|
+
const invoiceIdSchema = zod_1.z.object({
|
|
23
|
+
invoiceId: helpers_1.identifierSchema
|
|
24
|
+
});
|
|
25
|
+
const initialize = async () => {
|
|
26
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
27
|
+
`
|
|
28
|
+
CREATE TABLE IF NOT EXISTS invoices (
|
|
29
|
+
invoice_id TEXT PRIMARY KEY,
|
|
30
|
+
issuer TEXT NOT NULL,
|
|
31
|
+
payer TEXT NOT NULL,
|
|
32
|
+
title TEXT NOT NULL,
|
|
33
|
+
description TEXT,
|
|
34
|
+
total_amount TEXT NOT NULL,
|
|
35
|
+
outstanding_amount TEXT NOT NULL,
|
|
36
|
+
asset TEXT NOT NULL,
|
|
37
|
+
due_at DATETIME,
|
|
38
|
+
allow_partial INTEGER NOT NULL,
|
|
39
|
+
status TEXT NOT NULL,
|
|
40
|
+
metadata TEXT,
|
|
41
|
+
created_at DATETIME NOT NULL,
|
|
42
|
+
updated_at DATETIME NOT NULL
|
|
43
|
+
)
|
|
44
|
+
`,
|
|
45
|
+
`
|
|
46
|
+
CREATE TABLE IF NOT EXISTS invoice_payments (
|
|
47
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
48
|
+
invoice_id TEXT NOT NULL,
|
|
49
|
+
payer TEXT NOT NULL,
|
|
50
|
+
amount TEXT NOT NULL,
|
|
51
|
+
asset TEXT NOT NULL,
|
|
52
|
+
source TEXT NOT NULL,
|
|
53
|
+
transaction_id TEXT NOT NULL,
|
|
54
|
+
created_at DATETIME NOT NULL
|
|
55
|
+
)
|
|
56
|
+
`
|
|
57
|
+
]);
|
|
58
|
+
};
|
|
59
|
+
const createInvoice = async (payload, ctx) => {
|
|
60
|
+
const issuer = (0, helpers_1.requireSender)(ctx);
|
|
61
|
+
const existing = await state.adapter.query('SELECT invoice_id FROM invoices WHERE invoice_id = ?', [payload.invoiceId]);
|
|
62
|
+
if (existing.length > 0) {
|
|
63
|
+
throw new Error(`Invoice ${payload.invoiceId} already exists`);
|
|
64
|
+
}
|
|
65
|
+
const dueAt = (0, helpers_1.parseDateValue)(payload.dueAt);
|
|
66
|
+
await state.adapter.query(`INSERT INTO invoices (
|
|
67
|
+
invoice_id, issuer, payer, title, description, total_amount, outstanding_amount, asset, due_at, allow_partial, status, metadata, created_at, updated_at
|
|
68
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
69
|
+
payload.invoiceId,
|
|
70
|
+
issuer,
|
|
71
|
+
payload.payer,
|
|
72
|
+
payload.title,
|
|
73
|
+
payload.description || '',
|
|
74
|
+
payload.amount,
|
|
75
|
+
payload.amount,
|
|
76
|
+
payload.asset,
|
|
77
|
+
dueAt,
|
|
78
|
+
payload.allowPartial ? 1 : 0,
|
|
79
|
+
'open',
|
|
80
|
+
JSON.stringify(payload.metadata || {}),
|
|
81
|
+
new Date(),
|
|
82
|
+
new Date()
|
|
83
|
+
]);
|
|
84
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createInvoice', payload, {
|
|
85
|
+
action: 'invoice_created',
|
|
86
|
+
data: {
|
|
87
|
+
invoiceId: payload.invoiceId,
|
|
88
|
+
issuer,
|
|
89
|
+
payer: payload.payer,
|
|
90
|
+
amount: payload.amount,
|
|
91
|
+
asset: payload.asset
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
const payInvoice = async (payload, ctx) => {
|
|
96
|
+
const payer = (0, helpers_1.requireSender)(ctx);
|
|
97
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
98
|
+
const rows = await state.adapter.query('SELECT * FROM invoices WHERE invoice_id = ?', [payload.invoiceId]);
|
|
99
|
+
if (rows.length === 0) {
|
|
100
|
+
throw new Error(`Invoice ${payload.invoiceId} does not exist`);
|
|
101
|
+
}
|
|
102
|
+
const invoice = rows[0];
|
|
103
|
+
if (invoice.status === 'paid' || invoice.status === 'cancelled') {
|
|
104
|
+
throw new Error('Invoice is not payable');
|
|
105
|
+
}
|
|
106
|
+
if (invoice.payer !== payer) {
|
|
107
|
+
throw new Error('Only the designated payer can pay this invoice');
|
|
108
|
+
}
|
|
109
|
+
(0, helpers_1.assertAssetMatches)(payment.asset, invoice.asset);
|
|
110
|
+
const outstanding = (0, helpers_1.toBigNumber)(invoice.outstanding_amount);
|
|
111
|
+
if (!invoice.allow_partial && !(0, helpers_1.toBigNumber)(payment.amount).eq(outstanding)) {
|
|
112
|
+
throw new Error('This invoice requires full payment');
|
|
113
|
+
}
|
|
114
|
+
if ((0, helpers_1.toBigNumber)(payment.amount).gt(outstanding)) {
|
|
115
|
+
throw new Error('Payment exceeds the outstanding amount');
|
|
116
|
+
}
|
|
117
|
+
const nextOutstanding = outstanding.minus(payment.amount);
|
|
118
|
+
const nextStatus = nextOutstanding.eq(0)
|
|
119
|
+
? 'paid'
|
|
120
|
+
: 'partially_paid';
|
|
121
|
+
await state.adapter.query('INSERT INTO invoice_payments (invoice_id, payer, amount, asset, source, transaction_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)', [payload.invoiceId, payer, payment.amount, payment.asset, payment.source, ctx.transaction.id, new Date()]);
|
|
122
|
+
await state.adapter.query('UPDATE invoices SET outstanding_amount = ?, status = ?, updated_at = ? WHERE invoice_id = ?', [nextOutstanding.toFixed(), nextStatus, new Date(), payload.invoiceId]);
|
|
123
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'payInvoice', payload, {
|
|
124
|
+
action: 'invoice_payment_received',
|
|
125
|
+
data: {
|
|
126
|
+
invoiceId: payload.invoiceId,
|
|
127
|
+
payer,
|
|
128
|
+
amount: payment.amount,
|
|
129
|
+
asset: payment.asset,
|
|
130
|
+
outstandingAmount: nextOutstanding.toFixed(),
|
|
131
|
+
status: nextStatus
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
const cancelInvoice = async (payload, ctx) => {
|
|
136
|
+
const issuer = (0, helpers_1.requireSender)(ctx);
|
|
137
|
+
const rows = await state.adapter.query('SELECT * FROM invoices WHERE invoice_id = ?', [payload.invoiceId]);
|
|
138
|
+
if (rows.length === 0) {
|
|
139
|
+
throw new Error(`Invoice ${payload.invoiceId} does not exist`);
|
|
140
|
+
}
|
|
141
|
+
const invoice = rows[0];
|
|
142
|
+
if (invoice.issuer !== issuer) {
|
|
143
|
+
throw new Error('Only the invoice issuer can cancel this invoice');
|
|
144
|
+
}
|
|
145
|
+
if (invoice.status === 'paid') {
|
|
146
|
+
throw new Error('Paid invoices cannot be cancelled');
|
|
147
|
+
}
|
|
148
|
+
await state.adapter.query('UPDATE invoices SET status = ?, updated_at = ? WHERE invoice_id = ?', ['cancelled', new Date(), payload.invoiceId]);
|
|
149
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'cancelInvoice', payload, {
|
|
150
|
+
action: 'invoice_cancelled',
|
|
151
|
+
data: {
|
|
152
|
+
invoiceId: payload.invoiceId,
|
|
153
|
+
issuer
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
};
|
|
157
|
+
const closeOverdueInvoices = async (_payload = {}, _ctx) => {
|
|
158
|
+
const invoices = await state.adapter.query('SELECT * FROM invoices WHERE status IN (?, ?)', ['open', 'partially_paid']);
|
|
159
|
+
const now = new Date();
|
|
160
|
+
for (const invoice of invoices) {
|
|
161
|
+
const dueAt = (0, helpers_1.parseDateValue)(invoice.due_at);
|
|
162
|
+
if (dueAt && dueAt < now) {
|
|
163
|
+
await state.adapter.query('UPDATE invoices SET status = ?, updated_at = ? WHERE invoice_id = ?', ['overdue', now, invoice.invoice_id]);
|
|
164
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'closeOverdueInvoices', { invoiceId: invoice.invoice_id }, {
|
|
165
|
+
action: 'invoice_overdue',
|
|
166
|
+
data: {
|
|
167
|
+
invoiceId: invoice.invoice_id,
|
|
168
|
+
payer: invoice.payer
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
return (0, contract_1.defineContract)({
|
|
175
|
+
name,
|
|
176
|
+
hooks: {
|
|
177
|
+
create: async ({ adapter }) => {
|
|
178
|
+
state.adapter = adapter;
|
|
179
|
+
await initialize();
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
actions: {
|
|
183
|
+
createInvoice: (0, contract_1.action)(createInvoice, { schema: createInvoiceSchema, trigger: 'custom_json' }),
|
|
184
|
+
payInvoice: (0, contract_1.action)(payInvoice, { schema: invoiceIdSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
185
|
+
cancelInvoice: (0, contract_1.action)(cancelInvoice, { schema: invoiceIdSchema, trigger: 'custom_json' }),
|
|
186
|
+
closeOverdueInvoices: (0, contract_1.action)(closeOverdueInvoices, {
|
|
187
|
+
schema: zod_1.z.object({ invoiceId: helpers_1.identifierSchema.optional() }).optional(),
|
|
188
|
+
trigger: ['custom_json', 'time']
|
|
189
|
+
})
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=invoice.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice.contract.js","sourceRoot":"","sources":["../../src/contracts/invoice.contract.ts"],"names":[],"mappings":"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"}
|