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,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createRevenueSplitContract = createRevenueSplitContract;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const contract_1 = require("./contract");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const DEFAULT_NAME = 'revenuesplit';
|
|
8
|
+
function createRevenueSplitContract(options = {}) {
|
|
9
|
+
const name = options.name || DEFAULT_NAME;
|
|
10
|
+
const state = (0, helpers_1.createContractState)();
|
|
11
|
+
const recipientSchema = zod_1.z.object({
|
|
12
|
+
account: zod_1.z.string().min(3).max(32),
|
|
13
|
+
bps: zod_1.z.number().int().min(1).max(10000)
|
|
14
|
+
});
|
|
15
|
+
const createSplitSchema = zod_1.z.object({
|
|
16
|
+
splitId: helpers_1.identifierSchema,
|
|
17
|
+
title: zod_1.z.string().min(3).max(140),
|
|
18
|
+
recipients: zod_1.z.array(recipientSchema).min(1).max(25),
|
|
19
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
20
|
+
});
|
|
21
|
+
const splitIdSchema = zod_1.z.object({
|
|
22
|
+
splitId: helpers_1.identifierSchema
|
|
23
|
+
});
|
|
24
|
+
const updateSplitSchema = zod_1.z.object({
|
|
25
|
+
splitId: helpers_1.identifierSchema,
|
|
26
|
+
recipients: zod_1.z.array(recipientSchema).min(1).max(25),
|
|
27
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
28
|
+
});
|
|
29
|
+
const withdrawSchema = zod_1.z.object({
|
|
30
|
+
splitId: helpers_1.identifierSchema.optional(),
|
|
31
|
+
asset: zod_1.z.string().min(3).max(16).optional()
|
|
32
|
+
}).optional();
|
|
33
|
+
const initialize = async () => {
|
|
34
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
35
|
+
`
|
|
36
|
+
CREATE TABLE IF NOT EXISTS revenue_splits (
|
|
37
|
+
split_id TEXT PRIMARY KEY,
|
|
38
|
+
owner TEXT NOT NULL,
|
|
39
|
+
title TEXT NOT NULL,
|
|
40
|
+
recipients_json TEXT NOT NULL,
|
|
41
|
+
active INTEGER NOT NULL,
|
|
42
|
+
metadata TEXT,
|
|
43
|
+
created_at DATETIME NOT NULL,
|
|
44
|
+
updated_at DATETIME NOT NULL
|
|
45
|
+
)
|
|
46
|
+
`,
|
|
47
|
+
`
|
|
48
|
+
CREATE TABLE IF NOT EXISTS revenue_split_balances (
|
|
49
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
50
|
+
split_id TEXT NOT NULL,
|
|
51
|
+
account TEXT NOT NULL,
|
|
52
|
+
asset TEXT NOT NULL,
|
|
53
|
+
balance TEXT NOT NULL,
|
|
54
|
+
updated_at DATETIME NOT NULL,
|
|
55
|
+
UNIQUE(split_id, account, asset)
|
|
56
|
+
)
|
|
57
|
+
`,
|
|
58
|
+
`
|
|
59
|
+
CREATE TABLE IF NOT EXISTS revenue_split_distributions (
|
|
60
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
61
|
+
split_id TEXT NOT NULL,
|
|
62
|
+
amount TEXT NOT NULL,
|
|
63
|
+
asset TEXT NOT NULL,
|
|
64
|
+
payer TEXT NOT NULL,
|
|
65
|
+
reference TEXT,
|
|
66
|
+
created_at DATETIME NOT NULL
|
|
67
|
+
)
|
|
68
|
+
`
|
|
69
|
+
]);
|
|
70
|
+
};
|
|
71
|
+
const validateRecipients = (owner, recipients) => {
|
|
72
|
+
const accounts = (0, helpers_1.uniqueItems)(recipients.map(recipient => recipient.account));
|
|
73
|
+
if (accounts.length !== recipients.length) {
|
|
74
|
+
throw new Error('Recipient accounts must be unique');
|
|
75
|
+
}
|
|
76
|
+
if (!accounts.includes(owner)) {
|
|
77
|
+
accounts.push(owner);
|
|
78
|
+
}
|
|
79
|
+
const totalBps = recipients.reduce((sum, recipient) => sum + recipient.bps, 0);
|
|
80
|
+
if (totalBps !== 10000) {
|
|
81
|
+
throw new Error('Recipient basis points must total 10000');
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const createSplit = async (payload, ctx) => {
|
|
85
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
86
|
+
validateRecipients(owner, payload.recipients);
|
|
87
|
+
const existing = await state.adapter.query('SELECT split_id FROM revenue_splits WHERE split_id = ?', [payload.splitId]);
|
|
88
|
+
if (existing.length > 0) {
|
|
89
|
+
throw new Error(`Split ${payload.splitId} already exists`);
|
|
90
|
+
}
|
|
91
|
+
await state.adapter.query(`INSERT INTO revenue_splits (
|
|
92
|
+
split_id, owner, title, recipients_json, active, metadata, created_at, updated_at
|
|
93
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
94
|
+
payload.splitId,
|
|
95
|
+
owner,
|
|
96
|
+
payload.title,
|
|
97
|
+
JSON.stringify(payload.recipients),
|
|
98
|
+
1,
|
|
99
|
+
JSON.stringify(payload.metadata || {}),
|
|
100
|
+
new Date(),
|
|
101
|
+
new Date()
|
|
102
|
+
]);
|
|
103
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createSplit', payload, {
|
|
104
|
+
action: 'revenue_split_created',
|
|
105
|
+
data: {
|
|
106
|
+
splitId: payload.splitId,
|
|
107
|
+
owner
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
const updateSplit = async (payload, ctx) => {
|
|
112
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
113
|
+
const rows = await state.adapter.query('SELECT * FROM revenue_splits WHERE split_id = ?', [payload.splitId]);
|
|
114
|
+
if (rows.length === 0) {
|
|
115
|
+
throw new Error(`Split ${payload.splitId} does not exist`);
|
|
116
|
+
}
|
|
117
|
+
const split = rows[0];
|
|
118
|
+
if (split.owner !== owner) {
|
|
119
|
+
throw new Error('Only the split owner can update recipients');
|
|
120
|
+
}
|
|
121
|
+
validateRecipients(owner, payload.recipients);
|
|
122
|
+
await state.adapter.query('UPDATE revenue_splits SET recipients_json = ?, metadata = ?, updated_at = ? WHERE split_id = ?', [JSON.stringify(payload.recipients), JSON.stringify(payload.metadata || (0, helpers_1.parseJson)(split.metadata, {})), new Date(), payload.splitId]);
|
|
123
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'updateSplit', payload, {
|
|
124
|
+
action: 'revenue_split_updated',
|
|
125
|
+
data: {
|
|
126
|
+
splitId: payload.splitId,
|
|
127
|
+
owner
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
const distribute = async (payload, ctx) => {
|
|
132
|
+
const payer = (0, helpers_1.requireSender)(ctx);
|
|
133
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
134
|
+
const rows = await state.adapter.query('SELECT * FROM revenue_splits WHERE split_id = ?', [payload.splitId]);
|
|
135
|
+
if (rows.length === 0) {
|
|
136
|
+
throw new Error(`Split ${payload.splitId} does not exist`);
|
|
137
|
+
}
|
|
138
|
+
const split = rows[0];
|
|
139
|
+
if (!split.active) {
|
|
140
|
+
throw new Error('Revenue split is not active');
|
|
141
|
+
}
|
|
142
|
+
const recipients = (0, helpers_1.parseJson)(split.recipients_json, []);
|
|
143
|
+
let allocated = (0, helpers_1.toBigNumber)(0);
|
|
144
|
+
for (let index = 0; index < recipients.length; index++) {
|
|
145
|
+
const recipient = recipients[index];
|
|
146
|
+
const share = index === recipients.length - 1
|
|
147
|
+
? (0, helpers_1.toBigNumber)(payment.amount).minus(allocated)
|
|
148
|
+
: (0, helpers_1.toBigNumber)(payment.amount).multipliedBy(recipient.bps).dividedBy(10000).decimalPlaces(8, 1);
|
|
149
|
+
allocated = allocated.plus(share);
|
|
150
|
+
const balanceRows = await state.adapter.query('SELECT * FROM revenue_split_balances WHERE split_id = ? AND account = ? AND asset = ?', [payload.splitId, recipient.account, payment.asset]);
|
|
151
|
+
const currentBalance = balanceRows.length > 0 ? (0, helpers_1.toBigNumber)(balanceRows[0].balance) : (0, helpers_1.toBigNumber)(0);
|
|
152
|
+
const nextBalance = currentBalance.plus(share);
|
|
153
|
+
await state.adapter.query(`INSERT INTO revenue_split_balances (split_id, account, asset, balance, updated_at)
|
|
154
|
+
VALUES (?, ?, ?, ?, ?)
|
|
155
|
+
ON CONFLICT(split_id, account, asset)
|
|
156
|
+
DO UPDATE SET balance = excluded.balance, updated_at = excluded.updated_at`, [payload.splitId, recipient.account, payment.asset, nextBalance.toFixed(), new Date()]);
|
|
157
|
+
}
|
|
158
|
+
await state.adapter.query('INSERT INTO revenue_split_distributions (split_id, amount, asset, payer, reference, created_at) VALUES (?, ?, ?, ?, ?, ?)', [payload.splitId, payment.amount, payment.asset, payer, payment.memo || '', new Date()]);
|
|
159
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'distribute', payload, {
|
|
160
|
+
action: 'revenue_split_distributed',
|
|
161
|
+
data: {
|
|
162
|
+
splitId: payload.splitId,
|
|
163
|
+
payer,
|
|
164
|
+
amount: payment.amount,
|
|
165
|
+
asset: payment.asset,
|
|
166
|
+
recipients
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
const withdraw = async (payload = {}, ctx) => {
|
|
171
|
+
const account = (0, helpers_1.requireSender)(ctx);
|
|
172
|
+
const balances = payload.splitId
|
|
173
|
+
? await state.adapter.query('SELECT * FROM revenue_split_balances WHERE split_id = ? AND account = ?', [payload.splitId, account])
|
|
174
|
+
: await state.adapter.query('SELECT * FROM revenue_split_balances WHERE account = ?', [account]);
|
|
175
|
+
const filtered = balances.filter((balance) => !payload.asset || balance.asset === payload.asset);
|
|
176
|
+
if (filtered.length === 0) {
|
|
177
|
+
throw new Error('No withdrawable revenue split balances found');
|
|
178
|
+
}
|
|
179
|
+
for (const balance of filtered) {
|
|
180
|
+
if ((0, helpers_1.toBigNumber)(balance.balance).lte(0)) {
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
await state.adapter.query('UPDATE revenue_split_balances SET balance = ?, updated_at = ? WHERE split_id = ? AND account = ? AND asset = ?', ['0', new Date(), balance.split_id, account, balance.asset]);
|
|
184
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'withdraw', payload, {
|
|
185
|
+
action: 'revenue_split_withdrawal_requested',
|
|
186
|
+
data: {
|
|
187
|
+
splitId: balance.split_id,
|
|
188
|
+
account,
|
|
189
|
+
amount: balance.balance,
|
|
190
|
+
asset: balance.asset
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
return (0, contract_1.defineContract)({
|
|
196
|
+
name,
|
|
197
|
+
hooks: {
|
|
198
|
+
create: async ({ adapter }) => {
|
|
199
|
+
state.adapter = adapter;
|
|
200
|
+
await initialize();
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
actions: {
|
|
204
|
+
createSplit: (0, contract_1.action)(createSplit, { schema: createSplitSchema, trigger: 'custom_json' }),
|
|
205
|
+
updateSplit: (0, contract_1.action)(updateSplit, { schema: updateSplitSchema, trigger: 'custom_json' }),
|
|
206
|
+
distribute: (0, contract_1.action)(distribute, { schema: splitIdSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
207
|
+
withdraw: (0, contract_1.action)(withdraw, { schema: withdrawSchema, trigger: 'custom_json' })
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=revenuesplit.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revenuesplit.contract.js","sourceRoot":"","sources":["../../src/contracts/revenuesplit.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ const seedrandom_1 = __importDefault(require("seedrandom"));
|
|
|
9
9
|
const uuid_1 = require("uuid");
|
|
10
10
|
const zod_1 = require("zod");
|
|
11
11
|
const contract_1 = require("./contract");
|
|
12
|
+
const helpers_1 = require("./helpers");
|
|
12
13
|
const DEFAULT_NAME = 'rps';
|
|
13
14
|
const DEFAULT_ACCOUNT = 'beggars';
|
|
14
15
|
const DEFAULT_TOKEN_SYMBOL = 'HIVE';
|
|
@@ -51,11 +52,7 @@ function createRpsContract(options = {}) {
|
|
|
51
52
|
try {
|
|
52
53
|
const accountInfo = await state.streamer['client'].database.getAccounts([account]);
|
|
53
54
|
if (accountInfo?.[0]) {
|
|
54
|
-
const
|
|
55
|
-
const amount = new bignumber_js_1.default(balanceParts[0]);
|
|
56
|
-
if (amount.isNaN() || !amount.isFinite()) {
|
|
57
|
-
throw new Error('Invalid balance format received from API');
|
|
58
|
-
}
|
|
55
|
+
const amount = (0, helpers_1.parseBlockchainAmount)(accountInfo[0].balance).value;
|
|
59
56
|
state.balanceCache = {
|
|
60
57
|
balance: amount,
|
|
61
58
|
timestamp: now
|
|
@@ -71,6 +68,15 @@ function createRpsContract(options = {}) {
|
|
|
71
68
|
}
|
|
72
69
|
return new bignumber_js_1.default(0);
|
|
73
70
|
};
|
|
71
|
+
const debitCachedBalance = (amount) => {
|
|
72
|
+
if (!state.balanceCache) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
state.balanceCache = {
|
|
76
|
+
balance: bignumber_js_1.default.maximum(new bignumber_js_1.default(0), state.balanceCache.balance.minus(amount)),
|
|
77
|
+
timestamp: Date.now()
|
|
78
|
+
};
|
|
79
|
+
};
|
|
74
80
|
const processQueue = async () => {
|
|
75
81
|
if (state.processingQueue || state.betQueue.length === 0) {
|
|
76
82
|
return;
|
|
@@ -101,41 +107,46 @@ function createRpsContract(options = {}) {
|
|
|
101
107
|
const sender = ctx.sender;
|
|
102
108
|
const amountRaw = ctx.transfer.rawAmount;
|
|
103
109
|
try {
|
|
104
|
-
|
|
105
|
-
|
|
110
|
+
let parsedAmount;
|
|
111
|
+
try {
|
|
112
|
+
parsedAmount = (0, helpers_1.parseBlockchainAmount)(amountRaw);
|
|
106
113
|
}
|
|
107
|
-
|
|
108
|
-
if (amountTrim.length !== 2) {
|
|
114
|
+
catch (error) {
|
|
109
115
|
throw new Error('Invalid amount format');
|
|
110
116
|
}
|
|
111
|
-
const amountParsed =
|
|
112
|
-
if (amountParsed.
|
|
117
|
+
const amountParsed = parsedAmount.value;
|
|
118
|
+
if (amountParsed.isNegative()) {
|
|
113
119
|
throw new Error('Invalid amount value');
|
|
114
120
|
}
|
|
115
|
-
const amountCurrency =
|
|
121
|
+
const amountCurrency = parsedAmount.asset;
|
|
116
122
|
const transaction = await state.streamer.getTransaction(ctx.block.number, ctx.transaction.id);
|
|
117
123
|
const verify = await state.streamer.verifyTransfer(transaction, sender, account, amountRaw);
|
|
118
124
|
const balance = await getBalance();
|
|
119
125
|
const availableBalance = balance.minus(state.pendingPayouts);
|
|
120
126
|
if (verify) {
|
|
121
127
|
if (!validCurrencies.includes(amountCurrency)) {
|
|
122
|
-
await state.streamer.transferHiveTokens(account, sender,
|
|
128
|
+
await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, '[Refund] You sent an invalid currency.');
|
|
129
|
+
debitCachedBalance(amountParsed);
|
|
123
130
|
return;
|
|
124
131
|
}
|
|
125
132
|
if (amountParsed.isLessThan(minAmount)) {
|
|
126
|
-
await state.streamer.transferHiveTokens(account, sender,
|
|
133
|
+
await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, `[Refund] Bet amount too small. Minimum: ${minAmount} ${amountCurrency}.`);
|
|
134
|
+
debitCachedBalance(amountParsed);
|
|
127
135
|
return;
|
|
128
136
|
}
|
|
129
137
|
if (amountParsed.isGreaterThan(maxAmount)) {
|
|
130
|
-
await state.streamer.transferHiveTokens(account, sender,
|
|
138
|
+
await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, `[Refund] You sent too much. Maximum: ${maxAmount} ${amountCurrency}.`);
|
|
139
|
+
debitCachedBalance(amountParsed);
|
|
131
140
|
return;
|
|
132
141
|
}
|
|
133
142
|
const potentialPayout = amountParsed.multipliedBy(2);
|
|
134
143
|
if (potentialPayout.isGreaterThan(availableBalance)) {
|
|
135
|
-
await state.streamer.transferHiveTokens(account, sender,
|
|
144
|
+
await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, '[Refund] The server cannot afford this bet payout.');
|
|
145
|
+
debitCachedBalance(amountParsed);
|
|
136
146
|
return;
|
|
137
147
|
}
|
|
138
148
|
state.pendingPayouts = state.pendingPayouts.plus(potentialPayout);
|
|
149
|
+
let payoutIncremented = true;
|
|
139
150
|
try {
|
|
140
151
|
const serverSeed = (0, uuid_1.v4)();
|
|
141
152
|
const serverMove = rng(ctx.block.previousId, ctx.block.id, ctx.transaction.id, serverSeed, payload.seed ?? '');
|
|
@@ -159,17 +170,23 @@ function createRpsContract(options = {}) {
|
|
|
159
170
|
}
|
|
160
171
|
});
|
|
161
172
|
if (result === 'win') {
|
|
162
|
-
await state.streamer.transferHiveTokens(account, sender,
|
|
173
|
+
await state.streamer.transferHiveTokens(account, sender, (0, helpers_1.formatBlockchainAmount)(potentialPayout), parsedAmount.asset, `[Winner] | You: ${payload.move} | Server: ${serverMove} | Seed: ${serverSeed}`);
|
|
174
|
+
debitCachedBalance(potentialPayout);
|
|
163
175
|
}
|
|
164
176
|
else if (result === 'tie') {
|
|
165
|
-
await state.streamer.transferHiveTokens(account, sender,
|
|
177
|
+
await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, `[Tie] | You: ${payload.move} | Server: ${serverMove} | Seed: ${serverSeed}`);
|
|
178
|
+
debitCachedBalance(amountParsed);
|
|
166
179
|
}
|
|
167
180
|
else {
|
|
168
|
-
await state.streamer.transferHiveTokens(account, sender, '0.001',
|
|
181
|
+
await state.streamer.transferHiveTokens(account, sender, '0.001', parsedAmount.asset, `[Lost] | You: ${payload.move} | Server: ${serverMove} | Seed: ${serverSeed}`);
|
|
182
|
+
debitCachedBalance(new bignumber_js_1.default('0.001'));
|
|
169
183
|
}
|
|
170
184
|
}
|
|
171
185
|
finally {
|
|
172
|
-
|
|
186
|
+
if (payoutIncremented) {
|
|
187
|
+
state.pendingPayouts = state.pendingPayouts.minus(potentialPayout);
|
|
188
|
+
payoutIncremented = false;
|
|
189
|
+
}
|
|
173
190
|
}
|
|
174
191
|
}
|
|
175
192
|
}
|
|
@@ -181,6 +198,17 @@ function createRpsContract(options = {}) {
|
|
|
181
198
|
payload,
|
|
182
199
|
message: error.message
|
|
183
200
|
});
|
|
201
|
+
// Attempt refund on unexpected errors to avoid loss of funds
|
|
202
|
+
try {
|
|
203
|
+
if (amountRaw && typeof amountRaw === 'string' && amountRaw.includes(' ')) {
|
|
204
|
+
const parsedAmount = (0, helpers_1.parseBlockchainAmount)(amountRaw);
|
|
205
|
+
await state.streamer.transferHiveTokens(account, sender, parsedAmount.amount, parsedAmount.asset, '[Refund] An error occurred processing your bet.');
|
|
206
|
+
debitCachedBalance(parsedAmount.value);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch (refundError) {
|
|
210
|
+
console.error('[RpsContract] Refund failed:', refundError);
|
|
211
|
+
}
|
|
184
212
|
throw error;
|
|
185
213
|
}
|
|
186
214
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rps.contract.js","sourceRoot":"","sources":["../../src/contracts/rps.contract.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"rps.contract.js","sourceRoot":"","sources":["../../src/contracts/rps.contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSavingsContract = createSavingsContract;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const contract_1 = require("./contract");
|
|
6
|
+
const helpers_1 = require("./helpers");
|
|
7
|
+
const DEFAULT_NAME = 'savings';
|
|
8
|
+
function createSavingsContract(options = {}) {
|
|
9
|
+
const name = options.name || DEFAULT_NAME;
|
|
10
|
+
const state = (0, helpers_1.createContractState)();
|
|
11
|
+
const createGoalSchema = zod_1.z.object({
|
|
12
|
+
goalId: helpers_1.identifierSchema,
|
|
13
|
+
title: zod_1.z.string().min(3).max(140),
|
|
14
|
+
targetAmount: helpers_1.amountSchema,
|
|
15
|
+
asset: helpers_1.assetSchema,
|
|
16
|
+
deadline: zod_1.z.string().optional(),
|
|
17
|
+
allowEarlyWithdraw: zod_1.z.boolean().optional(),
|
|
18
|
+
metadata: zod_1.z.record(zod_1.z.any()).optional()
|
|
19
|
+
});
|
|
20
|
+
const goalIdSchema = zod_1.z.object({
|
|
21
|
+
goalId: helpers_1.identifierSchema
|
|
22
|
+
});
|
|
23
|
+
const withdrawSchema = zod_1.z.object({
|
|
24
|
+
goalId: helpers_1.identifierSchema,
|
|
25
|
+
amount: helpers_1.amountSchema.optional(),
|
|
26
|
+
note: zod_1.z.string().max(280).optional()
|
|
27
|
+
});
|
|
28
|
+
const initialize = async () => {
|
|
29
|
+
await (0, helpers_1.initializeTables)(state.adapter, [
|
|
30
|
+
`
|
|
31
|
+
CREATE TABLE IF NOT EXISTS savings_goals (
|
|
32
|
+
goal_id TEXT PRIMARY KEY,
|
|
33
|
+
owner TEXT NOT NULL,
|
|
34
|
+
title TEXT NOT NULL,
|
|
35
|
+
target_amount TEXT NOT NULL,
|
|
36
|
+
current_amount TEXT NOT NULL,
|
|
37
|
+
asset TEXT NOT NULL,
|
|
38
|
+
deadline DATETIME,
|
|
39
|
+
allow_early_withdraw INTEGER NOT NULL,
|
|
40
|
+
status TEXT NOT NULL,
|
|
41
|
+
metadata TEXT,
|
|
42
|
+
created_at DATETIME NOT NULL,
|
|
43
|
+
updated_at DATETIME NOT NULL
|
|
44
|
+
)
|
|
45
|
+
`,
|
|
46
|
+
`
|
|
47
|
+
CREATE TABLE IF NOT EXISTS savings_contributions (
|
|
48
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
49
|
+
goal_id TEXT NOT NULL,
|
|
50
|
+
contributor TEXT NOT NULL,
|
|
51
|
+
amount TEXT NOT NULL,
|
|
52
|
+
asset TEXT NOT NULL,
|
|
53
|
+
source TEXT NOT NULL,
|
|
54
|
+
transaction_id TEXT NOT NULL,
|
|
55
|
+
created_at DATETIME NOT NULL
|
|
56
|
+
)
|
|
57
|
+
`,
|
|
58
|
+
`
|
|
59
|
+
CREATE TABLE IF NOT EXISTS savings_withdrawals (
|
|
60
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
61
|
+
goal_id TEXT NOT NULL,
|
|
62
|
+
owner TEXT NOT NULL,
|
|
63
|
+
amount TEXT NOT NULL,
|
|
64
|
+
note TEXT,
|
|
65
|
+
created_at DATETIME NOT NULL
|
|
66
|
+
)
|
|
67
|
+
`
|
|
68
|
+
]);
|
|
69
|
+
};
|
|
70
|
+
const createGoal = async (payload, ctx) => {
|
|
71
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
72
|
+
const existing = await state.adapter.query('SELECT goal_id FROM savings_goals WHERE goal_id = ?', [payload.goalId]);
|
|
73
|
+
if (existing.length > 0) {
|
|
74
|
+
throw new Error(`Goal ${payload.goalId} already exists`);
|
|
75
|
+
}
|
|
76
|
+
const deadline = (0, helpers_1.parseDateValue)(payload.deadline);
|
|
77
|
+
if (deadline && deadline <= new Date()) {
|
|
78
|
+
throw new Error('Goal deadline must be in the future');
|
|
79
|
+
}
|
|
80
|
+
await state.adapter.query(`INSERT INTO savings_goals (
|
|
81
|
+
goal_id, owner, title, target_amount, current_amount, asset, deadline, allow_early_withdraw, status, metadata, created_at, updated_at
|
|
82
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
83
|
+
payload.goalId,
|
|
84
|
+
owner,
|
|
85
|
+
payload.title,
|
|
86
|
+
payload.targetAmount,
|
|
87
|
+
'0',
|
|
88
|
+
payload.asset,
|
|
89
|
+
deadline,
|
|
90
|
+
payload.allowEarlyWithdraw ? 1 : 0,
|
|
91
|
+
'open',
|
|
92
|
+
JSON.stringify(payload.metadata || {}),
|
|
93
|
+
new Date(),
|
|
94
|
+
new Date()
|
|
95
|
+
]);
|
|
96
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'createGoal', payload, {
|
|
97
|
+
action: 'savings_goal_created',
|
|
98
|
+
data: {
|
|
99
|
+
goalId: payload.goalId,
|
|
100
|
+
owner
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
const contribute = async (payload, ctx) => {
|
|
105
|
+
const contributor = (0, helpers_1.requireSender)(ctx);
|
|
106
|
+
const payment = (0, helpers_1.getIncomingPayment)(ctx);
|
|
107
|
+
const goals = await state.adapter.query('SELECT * FROM savings_goals WHERE goal_id = ?', [payload.goalId]);
|
|
108
|
+
if (goals.length === 0) {
|
|
109
|
+
throw new Error(`Goal ${payload.goalId} does not exist`);
|
|
110
|
+
}
|
|
111
|
+
const goal = goals[0];
|
|
112
|
+
if (goal.status !== 'open' && goal.status !== 'funded') {
|
|
113
|
+
throw new Error('Goal is not accepting contributions');
|
|
114
|
+
}
|
|
115
|
+
(0, helpers_1.assertAssetMatches)(payment.asset, goal.asset);
|
|
116
|
+
const currentAmount = (0, helpers_1.toBigNumber)(goal.current_amount).plus(payment.amount);
|
|
117
|
+
const status = currentAmount.gte(goal.target_amount)
|
|
118
|
+
? 'funded'
|
|
119
|
+
: goal.status;
|
|
120
|
+
await state.adapter.query('INSERT INTO savings_contributions (goal_id, contributor, amount, asset, source, transaction_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)', [payload.goalId, contributor, payment.amount, payment.asset, payment.source, ctx.transaction.id, new Date()]);
|
|
121
|
+
await state.adapter.query('UPDATE savings_goals SET current_amount = ?, status = ?, updated_at = ? WHERE goal_id = ?', [currentAmount.toFixed(), status, new Date(), payload.goalId]);
|
|
122
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'contribute', payload, {
|
|
123
|
+
action: 'savings_contribution_received',
|
|
124
|
+
data: {
|
|
125
|
+
goalId: payload.goalId,
|
|
126
|
+
contributor,
|
|
127
|
+
amount: payment.amount,
|
|
128
|
+
asset: payment.asset,
|
|
129
|
+
currentAmount: currentAmount.toFixed(),
|
|
130
|
+
status
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
const withdraw = async (payload, ctx) => {
|
|
135
|
+
const owner = (0, helpers_1.requireSender)(ctx);
|
|
136
|
+
const goals = await state.adapter.query('SELECT * FROM savings_goals WHERE goal_id = ?', [payload.goalId]);
|
|
137
|
+
if (goals.length === 0) {
|
|
138
|
+
throw new Error(`Goal ${payload.goalId} does not exist`);
|
|
139
|
+
}
|
|
140
|
+
const goal = goals[0];
|
|
141
|
+
if (goal.owner !== owner) {
|
|
142
|
+
throw new Error('Only the goal owner can withdraw funds');
|
|
143
|
+
}
|
|
144
|
+
const goalMet = (0, helpers_1.toBigNumber)(goal.current_amount).gte(goal.target_amount);
|
|
145
|
+
if (!goalMet && !goal.allow_early_withdraw) {
|
|
146
|
+
throw new Error('Goal has not been met and early withdrawals are disabled');
|
|
147
|
+
}
|
|
148
|
+
const amount = payload.amount || goal.current_amount;
|
|
149
|
+
if ((0, helpers_1.toBigNumber)(amount).gt(goal.current_amount)) {
|
|
150
|
+
throw new Error('Withdrawal amount exceeds available goal balance');
|
|
151
|
+
}
|
|
152
|
+
const remaining = (0, helpers_1.toBigNumber)(goal.current_amount).minus(amount);
|
|
153
|
+
const nextStatus = remaining.eq(0)
|
|
154
|
+
? 'withdrawn'
|
|
155
|
+
: goal.status;
|
|
156
|
+
await state.adapter.query('INSERT INTO savings_withdrawals (goal_id, owner, amount, note, created_at) VALUES (?, ?, ?, ?, ?)', [payload.goalId, owner, amount, payload.note || '', new Date()]);
|
|
157
|
+
await state.adapter.query('UPDATE savings_goals SET current_amount = ?, status = ?, updated_at = ? WHERE goal_id = ?', [remaining.toFixed(), nextStatus, new Date(), payload.goalId]);
|
|
158
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'withdraw', payload, {
|
|
159
|
+
action: 'savings_withdrawal_requested',
|
|
160
|
+
data: {
|
|
161
|
+
goalId: payload.goalId,
|
|
162
|
+
owner,
|
|
163
|
+
amount,
|
|
164
|
+
asset: goal.asset,
|
|
165
|
+
remainingAmount: remaining.toFixed()
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
const closeGoal = async (payload, ctx) => {
|
|
170
|
+
const goals = await state.adapter.query('SELECT * FROM savings_goals WHERE goal_id = ?', [payload.goalId]);
|
|
171
|
+
if (goals.length === 0) {
|
|
172
|
+
throw new Error(`Goal ${payload.goalId} does not exist`);
|
|
173
|
+
}
|
|
174
|
+
const goal = goals[0];
|
|
175
|
+
if (ctx.trigger !== 'time') {
|
|
176
|
+
const sender = (0, helpers_1.requireSender)(ctx);
|
|
177
|
+
if (sender !== goal.owner) {
|
|
178
|
+
throw new Error('Only the goal owner can close this goal');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
await state.adapter.query('UPDATE savings_goals SET status = ?, updated_at = ? WHERE goal_id = ?', ['closed', new Date(), payload.goalId]);
|
|
182
|
+
await (0, helpers_1.emitContractEvent)(state.adapter, name, 'closeGoal', payload, {
|
|
183
|
+
action: 'savings_goal_closed',
|
|
184
|
+
data: {
|
|
185
|
+
goalId: payload.goalId,
|
|
186
|
+
owner: goal.owner,
|
|
187
|
+
currentAmount: goal.current_amount,
|
|
188
|
+
asset: goal.asset
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
};
|
|
192
|
+
return (0, contract_1.defineContract)({
|
|
193
|
+
name,
|
|
194
|
+
hooks: {
|
|
195
|
+
create: async ({ adapter }) => {
|
|
196
|
+
state.adapter = adapter;
|
|
197
|
+
await initialize();
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
actions: {
|
|
201
|
+
createGoal: (0, contract_1.action)(createGoal, { schema: createGoalSchema, trigger: 'custom_json' }),
|
|
202
|
+
contribute: (0, contract_1.action)(contribute, { schema: goalIdSchema, trigger: ['transfer', 'recurrent_transfer'] }),
|
|
203
|
+
withdraw: (0, contract_1.action)(withdraw, { schema: withdrawSchema, trigger: 'custom_json' }),
|
|
204
|
+
closeGoal: (0, contract_1.action)(closeGoal, { schema: goalIdSchema, trigger: ['custom_json', 'time'] })
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=savings.contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"savings.contract.js","sourceRoot":"","sources":["../../src/contracts/savings.contract.ts"],"names":[],"mappings":"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"}
|