@ottochain/sdk 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/dist/cjs/apps/contracts/state-machines/contract.json +1 -29
  2. package/dist/cjs/apps/contracts/state-machines/escrow.json +2 -32
  3. package/dist/cjs/generated/index.js +11 -1
  4. package/dist/cjs/metakit/drop-nulls.js +50 -0
  5. package/dist/cjs/metakit/normalize.js +147 -0
  6. package/dist/cjs/ottochain/metagraph-client.js +147 -0
  7. package/dist/cjs/validation.js +1 -1
  8. package/dist/esm/apps/contracts/state-machines/contract.json +1 -29
  9. package/dist/esm/apps/contracts/state-machines/escrow.json +2 -32
  10. package/dist/esm/generated/index.js +11 -1
  11. package/dist/esm/metakit/drop-nulls.js +46 -0
  12. package/dist/esm/metakit/normalize.js +140 -0
  13. package/dist/esm/ottochain/metagraph-client.js +147 -0
  14. package/dist/esm/validation.js +1 -1
  15. package/dist/types/generated/index.d.ts +11 -1
  16. package/dist/types/metakit/drop-nulls.d.ts +29 -0
  17. package/dist/types/metakit/normalize.d.ts +67 -0
  18. package/dist/types/ottochain/index.d.ts +1 -1
  19. package/dist/types/ottochain/metagraph-client.d.ts +90 -0
  20. package/package.json +12 -12
  21. package/dist/apps/contracts/index.d.ts +0 -21
  22. package/dist/apps/contracts/index.js +0 -39
  23. package/dist/apps/contracts/types.d.ts +0 -24
  24. package/dist/apps/contracts/types.js +0 -48
  25. package/dist/apps/identity/index.d.ts +0 -22
  26. package/dist/apps/identity/index.js +0 -40
  27. package/dist/apps/identity/types.d.ts +0 -30
  28. package/dist/apps/identity/types.js +0 -53
  29. package/dist/apps/index.d.ts +0 -29
  30. package/dist/apps/index.js +0 -60
  31. package/dist/apps/markets/index.d.ts +0 -26
  32. package/dist/apps/markets/index.js +0 -46
  33. package/dist/apps/markets/types.d.ts +0 -185
  34. package/dist/apps/markets/types.js +0 -252
  35. package/dist/apps/oracles/index.d.ts +0 -26
  36. package/dist/apps/oracles/index.js +0 -46
  37. package/dist/apps/oracles/types.d.ts +0 -211
  38. package/dist/apps/oracles/types.js +0 -306
  39. package/dist/cjs/apps/contracts/types.js +0 -48
  40. package/dist/cjs/apps/corporate/types.js +0 -44
  41. package/dist/cjs/apps/governance/types.js +0 -42
  42. package/dist/cjs/apps/identity/types.js +0 -53
  43. package/dist/cjs/apps/markets/types.js +0 -219
  44. package/dist/cjs/apps/oracles/types.js +0 -282
  45. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract_pb.js +0 -100
  46. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate_pb.js +0 -392
  47. package/dist/cjs/generated/ottochain/apps/governance/v1/governance_pb.js +0 -235
  48. package/dist/cjs/generated/ottochain/apps/identity/v1/agent_pb.js +0 -116
  49. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation_pb.js +0 -79
  50. package/dist/cjs/generated/ottochain/apps/markets/v1/market_pb.js +0 -151
  51. package/dist/cjs/generated/ottochain/apps/oracles/v1/oracle_pb.js +0 -109
  52. package/dist/cjs/generated/ottochain/v1/common_pb.js +0 -37
  53. package/dist/cjs/generated/ottochain/v1/fiber_pb.js +0 -86
  54. package/dist/cjs/generated/ottochain/v1/messages_pb.js +0 -44
  55. package/dist/cjs/generated/ottochain/v1/records_pb.js +0 -44
  56. package/dist/errors.d.ts +0 -221
  57. package/dist/errors.js +0 -293
  58. package/dist/esm/apps/contracts/types.js +0 -44
  59. package/dist/esm/apps/corporate/types.js +0 -38
  60. package/dist/esm/apps/governance/types.js +0 -35
  61. package/dist/esm/apps/identity/types.js +0 -50
  62. package/dist/esm/apps/markets/types.js +0 -206
  63. package/dist/esm/apps/oracles/types.js +0 -267
  64. package/dist/esm/generated/ottochain/apps/contracts/v1/contract_pb.js +0 -97
  65. package/dist/esm/generated/ottochain/apps/corporate/v1/corporate_pb.js +0 -389
  66. package/dist/esm/generated/ottochain/apps/governance/v1/governance_pb.js +0 -232
  67. package/dist/esm/generated/ottochain/apps/identity/v1/agent_pb.js +0 -113
  68. package/dist/esm/generated/ottochain/apps/identity/v1/attestation_pb.js +0 -76
  69. package/dist/esm/generated/ottochain/apps/markets/v1/market_pb.js +0 -148
  70. package/dist/esm/generated/ottochain/apps/oracles/v1/oracle_pb.js +0 -106
  71. package/dist/esm/generated/ottochain/v1/common_pb.js +0 -34
  72. package/dist/esm/generated/ottochain/v1/fiber_pb.js +0 -83
  73. package/dist/esm/generated/ottochain/v1/messages_pb.js +0 -41
  74. package/dist/esm/generated/ottochain/v1/records_pb.js +0 -41
  75. package/dist/generated/index.d.ts +0 -15
  76. package/dist/generated/index.js +0 -34
  77. package/dist/generated/ottochain/apps/contracts/v1/contract_pb.d.ts +0 -274
  78. package/dist/generated/ottochain/apps/contracts/v1/contract_pb.js +0 -100
  79. package/dist/generated/ottochain/apps/identity/v1/agent_pb.d.ts +0 -211
  80. package/dist/generated/ottochain/apps/identity/v1/agent_pb.js +0 -116
  81. package/dist/generated/ottochain/apps/identity/v1/attestation_pb.d.ts +0 -238
  82. package/dist/generated/ottochain/apps/identity/v1/attestation_pb.js +0 -79
  83. package/dist/generated/ottochain/apps/markets/v1/market_pb.d.ts +0 -436
  84. package/dist/generated/ottochain/apps/markets/v1/market_pb.js +0 -151
  85. package/dist/generated/ottochain/apps/oracles/v1/oracle_pb.d.ts +0 -393
  86. package/dist/generated/ottochain/apps/oracles/v1/oracle_pb.js +0 -109
  87. package/dist/generated/ottochain/v1/common_pb.d.ts +0 -86
  88. package/dist/generated/ottochain/v1/common_pb.js +0 -37
  89. package/dist/generated/ottochain/v1/fiber_pb.d.ts +0 -292
  90. package/dist/generated/ottochain/v1/fiber_pb.js +0 -86
  91. package/dist/generated/ottochain/v1/messages_pb.d.ts +0 -190
  92. package/dist/generated/ottochain/v1/messages_pb.js +0 -44
  93. package/dist/generated/ottochain/v1/records_pb.d.ts +0 -221
  94. package/dist/generated/ottochain/v1/records_pb.js +0 -44
  95. package/dist/index.d.ts +0 -21
  96. package/dist/index.js +0 -77
  97. package/dist/metakit/binary.d.ts +0 -38
  98. package/dist/metakit/binary.js +0 -58
  99. package/dist/metakit/canonicalize.d.ts +0 -26
  100. package/dist/metakit/canonicalize.js +0 -40
  101. package/dist/metakit/codec.d.ts +0 -16
  102. package/dist/metakit/codec.js +0 -45
  103. package/dist/metakit/currency-transaction.d.ts +0 -157
  104. package/dist/metakit/currency-transaction.js +0 -319
  105. package/dist/metakit/currency-types.d.ts +0 -55
  106. package/dist/metakit/currency-types.js +0 -13
  107. package/dist/metakit/hash.d.ts +0 -50
  108. package/dist/metakit/hash.js +0 -84
  109. package/dist/metakit/index.d.ts +0 -23
  110. package/dist/metakit/index.js +0 -74
  111. package/dist/metakit/network/client.d.ts +0 -23
  112. package/dist/metakit/network/client.js +0 -78
  113. package/dist/metakit/network/currency-l1-client.d.ts +0 -71
  114. package/dist/metakit/network/currency-l1-client.js +0 -101
  115. package/dist/metakit/network/data-l1-client.d.ts +0 -57
  116. package/dist/metakit/network/data-l1-client.js +0 -76
  117. package/dist/metakit/network/index.d.ts +0 -10
  118. package/dist/metakit/network/index.js +0 -16
  119. package/dist/metakit/network/types.d.ts +0 -74
  120. package/dist/metakit/network/types.js +0 -20
  121. package/dist/metakit/sign.d.ts +0 -65
  122. package/dist/metakit/sign.js +0 -120
  123. package/dist/metakit/signed-object.d.ts +0 -66
  124. package/dist/metakit/signed-object.js +0 -100
  125. package/dist/metakit/types.d.ts +0 -67
  126. package/dist/metakit/types.js +0 -14
  127. package/dist/metakit/verify.d.ts +0 -55
  128. package/dist/metakit/verify.js +0 -217
  129. package/dist/metakit/wallet.d.ts +0 -70
  130. package/dist/metakit/wallet.js +0 -127
  131. package/dist/ottochain/index.d.ts +0 -13
  132. package/dist/ottochain/index.js +0 -45
  133. package/dist/ottochain/metagraph-client.d.ts +0 -111
  134. package/dist/ottochain/metagraph-client.js +0 -157
  135. package/dist/ottochain/snapshot.d.ts +0 -86
  136. package/dist/ottochain/snapshot.js +0 -110
  137. package/dist/ottochain/types.d.ts +0 -278
  138. package/dist/ottochain/types.js +0 -11
  139. package/dist/types/apps/contracts/types.d.ts +0 -24
  140. package/dist/types/apps/corporate/types.d.ts +0 -9861
  141. package/dist/types/apps/governance/types.d.ts +0 -344
  142. package/dist/types/apps/identity/types.d.ts +0 -30
  143. package/dist/types/apps/markets/types.d.ts +0 -155
  144. package/dist/types/apps/oracles/types.d.ts +0 -193
  145. package/dist/types/generated/ottochain/apps/contracts/v1/contract_pb.d.ts +0 -274
  146. package/dist/types/generated/ottochain/apps/corporate/v1/corporate_pb.d.ts +0 -1172
  147. package/dist/types/generated/ottochain/apps/governance/v1/governance_pb.d.ts +0 -772
  148. package/dist/types/generated/ottochain/apps/identity/v1/agent_pb.d.ts +0 -211
  149. package/dist/types/generated/ottochain/apps/identity/v1/attestation_pb.d.ts +0 -238
  150. package/dist/types/generated/ottochain/apps/markets/v1/market_pb.d.ts +0 -436
  151. package/dist/types/generated/ottochain/apps/oracles/v1/oracle_pb.d.ts +0 -393
  152. package/dist/types/generated/ottochain/v1/common_pb.d.ts +0 -86
  153. package/dist/types/generated/ottochain/v1/fiber_pb.d.ts +0 -292
  154. package/dist/types/generated/ottochain/v1/messages_pb.d.ts +0 -190
  155. package/dist/types/generated/ottochain/v1/records_pb.d.ts +0 -221
  156. package/dist/validation.d.ts +0 -449
  157. package/dist/validation.js +0 -312
@@ -1,219 +0,0 @@
1
- "use strict";
2
- /**
3
- * Markets Application Types
4
- *
5
- * Constants, types, and utilities for the Markets application on OttoChain.
6
- *
7
- * Core types (MarketType, MarketState, Market, Commitment, Resolution) are
8
- * exported from proto-generated types in index.ts.
9
- *
10
- * @packageDocumentation
11
- */
12
- Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.isMarketType = exports.isMarketState = exports.calculateGroupBuyDiscount = exports.calculateCrowdfundProgress = exports.validateCommitment = exports.calculateRefund = exports.calculatePayout = exports.calculateFees = exports.calculateNetCommitment = exports.isTerminalMarketState = exports.MARKET_TRANSITIONS = exports.MARKET_TYPE_CONFIGS = exports.DEFAULT_MARKET_CONFIG = exports.CommitmentSide = void 0;
14
- const market_pb_js_1 = require("../../generated/ottochain/apps/markets/v1/market_pb.js");
15
- /**
16
- * Commitment direction (for prediction markets)
17
- */
18
- var CommitmentSide;
19
- (function (CommitmentSide) {
20
- CommitmentSide[CommitmentSide["UNSPECIFIED"] = 0] = "UNSPECIFIED";
21
- CommitmentSide[CommitmentSide["YES"] = 1] = "YES";
22
- CommitmentSide[CommitmentSide["NO"] = 2] = "NO";
23
- })(CommitmentSide || (exports.CommitmentSide = CommitmentSide = {}));
24
- /**
25
- * Default market configuration
26
- */
27
- exports.DEFAULT_MARKET_CONFIG = {
28
- platformFeePercent: 0.01,
29
- creatorFeePercent: 0.02,
30
- oracleFeePercent: 0.01,
31
- minQuorum: 100n,
32
- resolutionWindowEpochs: 24,
33
- disputeWindowEpochs: 12,
34
- minCommitment: 1n,
35
- maxSlippagePercent: 0.05,
36
- };
37
- /**
38
- * Type-specific market configurations
39
- */
40
- exports.MARKET_TYPE_CONFIGS = {
41
- [market_pb_js_1.MarketType.UNSPECIFIED]: {},
42
- [market_pb_js_1.MarketType.PREDICTION]: {
43
- platformFeePercent: 0.02,
44
- oracleFeePercent: 0.02,
45
- },
46
- [market_pb_js_1.MarketType.AUCTION]: {
47
- platformFeePercent: 0.025,
48
- creatorFeePercent: 0,
49
- oracleFeePercent: 0,
50
- minQuorum: 1n,
51
- },
52
- [market_pb_js_1.MarketType.CROWDFUND]: {
53
- platformFeePercent: 0.03,
54
- creatorFeePercent: 0,
55
- oracleFeePercent: 0,
56
- disputeWindowEpochs: 0,
57
- },
58
- [market_pb_js_1.MarketType.GROUP_BUY]: {
59
- platformFeePercent: 0.015,
60
- creatorFeePercent: 0.01,
61
- oracleFeePercent: 0,
62
- },
63
- };
64
- // ---------------------------------------------------------------------------
65
- // State Machine Transitions
66
- // ---------------------------------------------------------------------------
67
- /**
68
- * Valid transitions for each market state (aligned with proto MarketState enum)
69
- */
70
- exports.MARKET_TRANSITIONS = {
71
- [market_pb_js_1.MarketState.UNSPECIFIED]: [],
72
- [market_pb_js_1.MarketState.PROPOSED]: ['open', 'cancel'],
73
- [market_pb_js_1.MarketState.OPEN]: ['close', 'cancel', 'commit'],
74
- [market_pb_js_1.MarketState.CLOSED]: ['submit_resolution', 'refund'],
75
- [market_pb_js_1.MarketState.RESOLVING]: ['submit_resolution', 'finalize', 'refund'],
76
- [market_pb_js_1.MarketState.SETTLED]: ['claim'], // Terminal (only claims allowed)
77
- [market_pb_js_1.MarketState.REFUNDED]: [], // Terminal state
78
- [market_pb_js_1.MarketState.CANCELLED]: [], // Terminal state
79
- };
80
- /**
81
- * Check if a market state is terminal
82
- */
83
- function isTerminalMarketState(state) {
84
- return [
85
- market_pb_js_1.MarketState.SETTLED,
86
- market_pb_js_1.MarketState.REFUNDED,
87
- market_pb_js_1.MarketState.CANCELLED,
88
- ].includes(state);
89
- }
90
- exports.isTerminalMarketState = isTerminalMarketState;
91
- // ---------------------------------------------------------------------------
92
- // Commitment Calculations
93
- // ---------------------------------------------------------------------------
94
- /**
95
- * Calculate effective commitment after fees
96
- *
97
- * @param amount - Raw commitment amount
98
- * @param config - Market configuration (uses defaults if not provided)
99
- * @returns Net commitment amount after platform fees
100
- */
101
- function calculateNetCommitment(amount, config = {}) {
102
- const feePercent = config.platformFeePercent ?? exports.DEFAULT_MARKET_CONFIG.platformFeePercent;
103
- const feeAmount = (amount * BigInt(Math.floor(feePercent * 10000))) / 10000n;
104
- return amount - feeAmount;
105
- }
106
- exports.calculateNetCommitment = calculateNetCommitment;
107
- /**
108
- * Calculate total fees for a commitment
109
- *
110
- * @param amount - Commitment amount
111
- * @param marketType - Type of market for type-specific fees
112
- * @returns Fee breakdown object
113
- */
114
- function calculateFees(amount, marketType = market_pb_js_1.MarketType.PREDICTION) {
115
- const typeConfig = { ...exports.DEFAULT_MARKET_CONFIG, ...exports.MARKET_TYPE_CONFIGS[marketType] };
116
- const platform = (amount * BigInt(Math.floor(typeConfig.platformFeePercent * 10000))) / 10000n;
117
- const creator = (amount * BigInt(Math.floor(typeConfig.creatorFeePercent * 10000))) / 10000n;
118
- const oracle = (amount * BigInt(Math.floor(typeConfig.oracleFeePercent * 10000))) / 10000n;
119
- return {
120
- platform,
121
- creator,
122
- oracle,
123
- total: platform + creator + oracle,
124
- };
125
- }
126
- exports.calculateFees = calculateFees;
127
- /**
128
- * Calculate payout for a winning commitment in a prediction market
129
- *
130
- * Winner receives: their original + proportional share of losing pool (minus fees)
131
- *
132
- * @param shares - Pool and commitment details
133
- * @param marketType - Type of market for fee calculation
134
- * @returns Payout amount
135
- */
136
- function calculatePayout(shares, marketType = market_pb_js_1.MarketType.PREDICTION) {
137
- if (shares.winningPool === 0n)
138
- return 0n;
139
- const fees = calculateFees(shares.losingPool, marketType);
140
- const distributablePool = shares.losingPool - fees.total;
141
- // Proportional share of losing pool
142
- const winnings = (distributablePool * shares.userCommitment) / shares.winningPool;
143
- // Return original commitment + winnings
144
- return shares.userCommitment + winnings;
145
- }
146
- exports.calculatePayout = calculatePayout;
147
- /**
148
- * Calculate refund for cancelled market
149
- *
150
- * @param commitment - Original commitment amount
151
- * @param refundFeePercent - Optional fee retained on refund (default 0)
152
- * @returns Refund amount
153
- */
154
- function calculateRefund(commitment, refundFeePercent = 0) {
155
- const fee = (commitment * BigInt(Math.floor(refundFeePercent * 10000))) / 10000n;
156
- return commitment - fee;
157
- }
158
- exports.calculateRefund = calculateRefund;
159
- /**
160
- * Validate a commitment against market rules
161
- */
162
- function validateCommitment(amount, marketState, config = {}) {
163
- const minCommitment = config.minCommitment ?? exports.DEFAULT_MARKET_CONFIG.minCommitment;
164
- if (marketState !== market_pb_js_1.MarketState.OPEN) {
165
- return { valid: false, reason: 'Market is not open for commitments' };
166
- }
167
- if (amount < minCommitment) {
168
- return { valid: false, reason: `Commitment below minimum: ${minCommitment}` };
169
- }
170
- return { valid: true };
171
- }
172
- exports.validateCommitment = validateCommitment;
173
- /**
174
- * Calculate crowdfund campaign progress
175
- */
176
- function calculateCrowdfundProgress(current, goal) {
177
- if (goal === 0n) {
178
- return { current, goal, percentComplete: 0, goalReached: false };
179
- }
180
- const percentComplete = Number((current * 10000n) / goal) / 100;
181
- return {
182
- current,
183
- goal,
184
- percentComplete: Math.min(percentComplete, 100),
185
- goalReached: current >= goal,
186
- };
187
- }
188
- exports.calculateCrowdfundProgress = calculateCrowdfundProgress;
189
- /**
190
- * Calculate applicable discount based on participant count
191
- */
192
- function calculateGroupBuyDiscount(participantCount, tiers) {
193
- // Sort tiers descending by minParticipants
194
- const sortedTiers = [...tiers].sort((a, b) => b.minParticipants - a.minParticipants);
195
- for (const tier of sortedTiers) {
196
- if (participantCount >= tier.minParticipants) {
197
- return tier.discountPercent;
198
- }
199
- }
200
- return 0;
201
- }
202
- exports.calculateGroupBuyDiscount = calculateGroupBuyDiscount;
203
- // ---------------------------------------------------------------------------
204
- // Type Guards
205
- // ---------------------------------------------------------------------------
206
- /**
207
- * Check if a value is a valid MarketState
208
- */
209
- function isMarketState(value) {
210
- return typeof value === 'number' && value in market_pb_js_1.MarketState;
211
- }
212
- exports.isMarketState = isMarketState;
213
- /**
214
- * Check if a value is a valid MarketType
215
- */
216
- function isMarketType(value) {
217
- return typeof value === 'number' && value in market_pb_js_1.MarketType;
218
- }
219
- exports.isMarketType = isMarketType;
@@ -1,282 +0,0 @@
1
- "use strict";
2
- /**
3
- * Oracles Application Types
4
- *
5
- * Constants, types, and utilities for the Oracle system on OttoChain.
6
- * Oracles provide truth resolution for markets and disputes.
7
- *
8
- * Core types (OracleState, Oracle, etc.) are exported from proto-generated
9
- * types in index.ts.
10
- *
11
- * @packageDocumentation
12
- */
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.isResolutionType = exports.isSlashingReason = exports.isOracleState = exports.calculateOracleReward = exports.calculateSelectionScore = exports.calculateStakeAfterSlash = exports.calculateSlashAmount = exports.SLASHING_CONDITIONS = exports.qualifiesForHighValue = exports.calculateWeightedReputation = exports.calculateReputation = exports.REPUTATION_DELTAS = exports.canAcceptAssignment = exports.isTerminalOracleState = exports.ORACLE_TRANSITIONS = exports.SLASHING_PERCENTAGES = exports.DEFAULT_ORACLE_CONFIG = exports.SlashingReason = exports.ResolutionType = void 0;
15
- const oracle_pb_js_1 = require("../../generated/ottochain/apps/oracles/v1/oracle_pb.js");
16
- /**
17
- * Types of oracle resolutions
18
- */
19
- var ResolutionType;
20
- (function (ResolutionType) {
21
- ResolutionType[ResolutionType["UNSPECIFIED"] = 0] = "UNSPECIFIED";
22
- /** Binary yes/no outcome */
23
- ResolutionType[ResolutionType["BINARY"] = 1] = "BINARY";
24
- /** One of multiple predefined outcomes */
25
- ResolutionType[ResolutionType["MULTI_CHOICE"] = 2] = "MULTI_CHOICE";
26
- /** Numeric value (e.g., price) */
27
- ResolutionType[ResolutionType["NUMERIC"] = 3] = "NUMERIC";
28
- /** Free-form attestation */
29
- ResolutionType[ResolutionType["ATTESTATION"] = 4] = "ATTESTATION";
30
- })(ResolutionType || (exports.ResolutionType = ResolutionType = {}));
31
- /**
32
- * Reasons for slashing oracle stake
33
- */
34
- var SlashingReason;
35
- (function (SlashingReason) {
36
- SlashingReason[SlashingReason["UNSPECIFIED"] = 0] = "UNSPECIFIED";
37
- /** Failed to submit resolution in time */
38
- SlashingReason[SlashingReason["TIMEOUT"] = 1] = "TIMEOUT";
39
- /** Resolution overturned by dispute */
40
- SlashingReason[SlashingReason["INCORRECT_RESOLUTION"] = 2] = "INCORRECT_RESOLUTION";
41
- /** Evidence of collusion or manipulation */
42
- SlashingReason[SlashingReason["COLLUSION"] = 3] = "COLLUSION";
43
- /** Violation of oracle protocol */
44
- SlashingReason[SlashingReason["PROTOCOL_VIOLATION"] = 4] = "PROTOCOL_VIOLATION";
45
- })(SlashingReason || (exports.SlashingReason = SlashingReason = {}));
46
- /**
47
- * Default oracle configuration
48
- */
49
- exports.DEFAULT_ORACLE_CONFIG = {
50
- minStake: 10000n,
51
- timeoutSlashPercent: 0.05,
52
- incorrectSlashPercent: 0.25,
53
- collusionSlashPercent: 1.0,
54
- violationSlashPercent: 0.10,
55
- cooldownEpochs: 48,
56
- baseReputation: 50,
57
- highValueThreshold: 100,
58
- resolutionWindowEpochs: 12,
59
- challengeWindowEpochs: 6,
60
- oracleRewardPercent: 0.01,
61
- };
62
- /**
63
- * Slashing percentages by reason
64
- */
65
- exports.SLASHING_PERCENTAGES = {
66
- [SlashingReason.UNSPECIFIED]: 0,
67
- [SlashingReason.TIMEOUT]: exports.DEFAULT_ORACLE_CONFIG.timeoutSlashPercent,
68
- [SlashingReason.INCORRECT_RESOLUTION]: exports.DEFAULT_ORACLE_CONFIG.incorrectSlashPercent,
69
- [SlashingReason.COLLUSION]: exports.DEFAULT_ORACLE_CONFIG.collusionSlashPercent,
70
- [SlashingReason.PROTOCOL_VIOLATION]: exports.DEFAULT_ORACLE_CONFIG.violationSlashPercent,
71
- };
72
- // ---------------------------------------------------------------------------
73
- // State Machine Transitions
74
- // ---------------------------------------------------------------------------
75
- /**
76
- * Valid transitions for each oracle state (aligned with proto OracleState enum)
77
- */
78
- exports.ORACLE_TRANSITIONS = {
79
- [oracle_pb_js_1.OracleState.UNSPECIFIED]: [],
80
- [oracle_pb_js_1.OracleState.UNREGISTERED]: ['register'],
81
- [oracle_pb_js_1.OracleState.REGISTERED]: ['activate', 'withdraw'],
82
- [oracle_pb_js_1.OracleState.ACTIVE]: ['add_stake', 'record_resolution', 'slash', 'withdraw'],
83
- [oracle_pb_js_1.OracleState.SLASHED]: ['reactivate', 'withdraw'],
84
- [oracle_pb_js_1.OracleState.WITHDRAWN]: [], // Terminal state
85
- };
86
- /**
87
- * Check if an oracle state is terminal
88
- */
89
- function isTerminalOracleState(state) {
90
- return state === oracle_pb_js_1.OracleState.WITHDRAWN;
91
- }
92
- exports.isTerminalOracleState = isTerminalOracleState;
93
- /**
94
- * Check if an oracle can accept new assignments
95
- */
96
- function canAcceptAssignment(state) {
97
- return state === oracle_pb_js_1.OracleState.ACTIVE;
98
- }
99
- exports.canAcceptAssignment = canAcceptAssignment;
100
- // ---------------------------------------------------------------------------
101
- // Reputation Calculations
102
- // ---------------------------------------------------------------------------
103
- /**
104
- * Reputation update factors
105
- */
106
- exports.REPUTATION_DELTAS = {
107
- /** Successfully resolved market without challenge */
108
- successfulResolution: 5,
109
- /** Resolution upheld after challenge */
110
- upheldChallenge: 10,
111
- /** Resolution overturned (negative) */
112
- overturnedResolution: -25,
113
- /** Timeout on assigned market (negative) */
114
- timeout: -15,
115
- /** Collusion detected (negative) */
116
- collusion: -100,
117
- /** Protocol violation (negative) */
118
- violation: -20,
119
- /** Bonus for high-value market resolution */
120
- highValueBonus: 3,
121
- };
122
- /**
123
- * Calculate new reputation after an event
124
- *
125
- * @param currentReputation - Current reputation score
126
- * @param delta - Reputation change (positive or negative)
127
- * @param minReputation - Minimum reputation floor (default 0)
128
- * @returns New reputation score
129
- */
130
- function calculateReputation(currentReputation, delta, minReputation = 0) {
131
- return Math.max(minReputation, currentReputation + delta);
132
- }
133
- exports.calculateReputation = calculateReputation;
134
- /**
135
- * Calculate weighted reputation considering history
136
- *
137
- * @param baseReputation - Current base reputation
138
- * @param successCount - Number of successful resolutions
139
- * @param failureCount - Number of failed/overturned resolutions
140
- * @returns Weighted reputation score
141
- */
142
- function calculateWeightedReputation(baseReputation, successCount, failureCount) {
143
- const totalAttempts = successCount + failureCount;
144
- if (totalAttempts === 0)
145
- return baseReputation;
146
- const successRate = successCount / totalAttempts;
147
- const experienceMultiplier = Math.min(1 + Math.log10(totalAttempts + 1) * 0.2, 1.5);
148
- return Math.round(baseReputation * successRate * experienceMultiplier);
149
- }
150
- exports.calculateWeightedReputation = calculateWeightedReputation;
151
- /**
152
- * Check if oracle qualifies for high-value markets
153
- */
154
- function qualifiesForHighValue(reputation, stake, threshold = exports.DEFAULT_ORACLE_CONFIG.highValueThreshold, minStakeMultiplier = 5) {
155
- return (reputation >= threshold &&
156
- stake >= exports.DEFAULT_ORACLE_CONFIG.minStake * BigInt(minStakeMultiplier));
157
- }
158
- exports.qualifiesForHighValue = qualifiesForHighValue;
159
- /**
160
- * Predefined slashing conditions
161
- */
162
- exports.SLASHING_CONDITIONS = {
163
- [SlashingReason.UNSPECIFIED]: {
164
- reason: SlashingReason.UNSPECIFIED,
165
- slashPercent: 0,
166
- description: 'No slashing',
167
- appealable: false,
168
- suspensionEpochs: 0,
169
- },
170
- [SlashingReason.TIMEOUT]: {
171
- reason: SlashingReason.TIMEOUT,
172
- slashPercent: exports.DEFAULT_ORACLE_CONFIG.timeoutSlashPercent,
173
- description: 'Failed to submit resolution within deadline',
174
- appealable: true,
175
- suspensionEpochs: 12,
176
- },
177
- [SlashingReason.INCORRECT_RESOLUTION]: {
178
- reason: SlashingReason.INCORRECT_RESOLUTION,
179
- slashPercent: exports.DEFAULT_ORACLE_CONFIG.incorrectSlashPercent,
180
- description: 'Resolution overturned by dispute process',
181
- appealable: true,
182
- suspensionEpochs: 48,
183
- },
184
- [SlashingReason.COLLUSION]: {
185
- reason: SlashingReason.COLLUSION,
186
- slashPercent: exports.DEFAULT_ORACLE_CONFIG.collusionSlashPercent,
187
- description: 'Evidence of collusion or market manipulation',
188
- appealable: false,
189
- suspensionEpochs: -1, // Permanent
190
- },
191
- [SlashingReason.PROTOCOL_VIOLATION]: {
192
- reason: SlashingReason.PROTOCOL_VIOLATION,
193
- slashPercent: exports.DEFAULT_ORACLE_CONFIG.violationSlashPercent,
194
- description: 'Violation of oracle operating protocol',
195
- appealable: true,
196
- suspensionEpochs: 24,
197
- },
198
- };
199
- /**
200
- * Calculate slash amount for a given stake and reason
201
- *
202
- * @param stake - Oracle's current stake
203
- * @param reason - Reason for slashing
204
- * @returns Amount to be slashed
205
- */
206
- function calculateSlashAmount(stake, reason) {
207
- const condition = exports.SLASHING_CONDITIONS[reason];
208
- return (stake * BigInt(Math.floor(condition.slashPercent * 10000))) / 10000n;
209
- }
210
- exports.calculateSlashAmount = calculateSlashAmount;
211
- /**
212
- * Calculate remaining stake after slashing
213
- */
214
- function calculateStakeAfterSlash(stake, reason) {
215
- return stake - calculateSlashAmount(stake, reason);
216
- }
217
- exports.calculateStakeAfterSlash = calculateStakeAfterSlash;
218
- /**
219
- * Calculate oracle selection score
220
- * Higher score = more likely to be selected
221
- *
222
- * @param candidate - Oracle candidate details
223
- * @param marketValue - Value of market to resolve (affects weight for high-value markets)
224
- * @returns Selection score
225
- */
226
- function calculateSelectionScore(candidate, marketValue = 0n) {
227
- const reputationWeight = 0.4;
228
- const stakeWeight = 0.3;
229
- const successWeight = 0.2;
230
- const loadWeight = 0.1;
231
- // Normalize stake to 0-100 range (assuming 1M max)
232
- const normalizedStake = Math.min(Number(candidate.stake / 10000n), 100);
233
- // Load penalty (fewer active = better)
234
- const loadScore = Math.max(0, 100 - candidate.activeAssignments * 20);
235
- // High-value market bonus for qualified oracles
236
- const highValueBonus = marketValue > 100000n &&
237
- qualifiesForHighValue(candidate.reputation, candidate.stake) ? 10 : 0;
238
- return (candidate.reputation * reputationWeight +
239
- normalizedStake * stakeWeight +
240
- candidate.successRate * 100 * successWeight +
241
- loadScore * loadWeight +
242
- highValueBonus);
243
- }
244
- exports.calculateSelectionScore = calculateSelectionScore;
245
- // ---------------------------------------------------------------------------
246
- // Reward Calculations
247
- // ---------------------------------------------------------------------------
248
- /**
249
- * Calculate oracle reward for successful resolution
250
- *
251
- * @param marketFees - Total fees collected from market
252
- * @param rewardPercent - Oracle's reward percentage (default from config)
253
- * @returns Oracle reward amount
254
- */
255
- function calculateOracleReward(marketFees, rewardPercent = exports.DEFAULT_ORACLE_CONFIG.oracleRewardPercent) {
256
- return (marketFees * BigInt(Math.floor(rewardPercent * 10000))) / 10000n;
257
- }
258
- exports.calculateOracleReward = calculateOracleReward;
259
- // ---------------------------------------------------------------------------
260
- // Type Guards
261
- // ---------------------------------------------------------------------------
262
- /**
263
- * Check if a value is a valid OracleState
264
- */
265
- function isOracleState(value) {
266
- return typeof value === 'number' && value in oracle_pb_js_1.OracleState;
267
- }
268
- exports.isOracleState = isOracleState;
269
- /**
270
- * Check if a value is a valid SlashingReason
271
- */
272
- function isSlashingReason(value) {
273
- return typeof value === 'number' && value in SlashingReason;
274
- }
275
- exports.isSlashingReason = isSlashingReason;
276
- /**
277
- * Check if a value is a valid ResolutionType
278
- */
279
- function isResolutionType(value) {
280
- return typeof value === 'number' && value in ResolutionType;
281
- }
282
- exports.isResolutionType = isResolutionType;
@@ -1,100 +0,0 @@
1
- "use strict";
2
- // @generated by protoc-gen-es v2.2.0 with parameter "target=ts,import_extension=.js"
3
- // @generated from file ottochain/apps/contracts/v1/contract.proto (package ottochain.apps.contracts.v1, syntax proto3)
4
- /* eslint-disable */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.ContractStateSchema = exports.ContractState = exports.ContractDefinitionSchema = exports.DisputeContractRequestSchema = exports.RejectContractRequestSchema = exports.CompleteContractRequestSchema = exports.AcceptContractRequestSchema = exports.ProposeContractRequestSchema = exports.ContractSchema = exports.file_ottochain_apps_contracts_v1_contract = void 0;
7
- const codegenv1_1 = require("@bufbuild/protobuf/codegenv1");
8
- const common_pb_js_1 = require("../../../v1/common_pb.js");
9
- const wkt_1 = require("@bufbuild/protobuf/wkt");
10
- /**
11
- * Describes the file ottochain/apps/contracts/v1/contract.proto.
12
- */
13
- exports.file_ottochain_apps_contracts_v1_contract = (0, codegenv1_1.fileDesc)("CipvdHRvY2hhaW4vYXBwcy9jb250cmFjdHMvdjEvY29udHJhY3QucHJvdG8SG290dG9jaGFpbi5hcHBzLmNvbnRyYWN0cy52MSKSAwoIQ29udHJhY3QSCgoCaWQYASABKAkSEwoLY29udHJhY3RfaWQYAiABKAkSJwoIcHJvcG9zZXIYAyABKAsyFS5vdHRvY2hhaW4udjEuQWRkcmVzcxIrCgxjb3VudGVycGFydHkYBCABKAsyFS5vdHRvY2hhaW4udjEuQWRkcmVzcxI5CgVzdGF0ZRgFIAEoDjIqLm90dG9jaGFpbi5hcHBzLmNvbnRyYWN0cy52MS5Db250cmFjdFN0YXRlEiYKBXRlcm1zGAYgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdBIvCgtwcm9wb3NlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLwoLYWNjZXB0ZWRfYXQYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjAKDGNvbXBsZXRlZF9hdBgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGAoQY29tcGxldGlvbl9wcm9vZhgKIAEoCSKrAQoWUHJvcG9zZUNvbnRyYWN0UmVxdWVzdBInCghwcm9wb3NlchgBIAEoCzIVLm90dG9jaGFpbi52MS5BZGRyZXNzEisKDGNvdW50ZXJwYXJ0eRgCIAEoCzIVLm90dG9jaGFpbi52MS5BZGRyZXNzEiYKBXRlcm1zGAMgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdBITCgtkZXNjcmlwdGlvbhgEIAEoCSJVChVBY2NlcHRDb250cmFjdFJlcXVlc3QSEwoLY29udHJhY3RfaWQYASABKAkSJwoIYWNjZXB0b3IYAiABKAsyFS5vdHRvY2hhaW4udjEuQWRkcmVzcyJnChdDb21wbGV0ZUNvbnRyYWN0UmVxdWVzdBITCgtjb250cmFjdF9pZBgBIAEoCRIoCgljb21wbGV0ZXIYAiABKAsyFS5vdHRvY2hhaW4udjEuQWRkcmVzcxINCgVwcm9vZhgDIAEoCSJlChVSZWplY3RDb250cmFjdFJlcXVlc3QSEwoLY29udHJhY3RfaWQYASABKAkSJwoIcmVqZWN0b3IYAiABKAsyFS5vdHRvY2hhaW4udjEuQWRkcmVzcxIOCgZyZWFzb24YAyABKAkieQoWRGlzcHV0ZUNvbnRyYWN0UmVxdWVzdBITCgtjb250cmFjdF9pZBgBIAEoCRIoCglkaXNwdXRhbnQYAiABKAsyFS5vdHRvY2hhaW4udjEuQWRkcmVzcxIQCghldmlkZW5jZRgDIAEoCRIOCgZyZWFzb24YBCABKAkiVAoSQ29udHJhY3REZWZpbml0aW9uEh8KF3JlcXVpcmVfYm90aF9zaWduYXR1cmVzGAEgASgIEh0KFWRpc3B1dGVfd2luZG93X2Vwb2NocxgCIAEoBSrdAQoNQ29udHJhY3RTdGF0ZRIeChpDT05UUkFDVF9TVEFURV9VTlNQRUNJRklFRBAAEhsKF0NPTlRSQUNUX1NUQVRFX1BST1BPU0VEEAESGQoVQ09OVFJBQ1RfU1RBVEVfQUNUSVZFEAISHAoYQ09OVFJBQ1RfU1RBVEVfQ09NUExFVEVEEAMSGwoXQ09OVFJBQ1RfU1RBVEVfUkVKRUNURUQQBBIbChdDT05UUkFDVF9TVEFURV9ESVNQVVRFRBAFEhwKGENPTlRSQUNUX1NUQVRFX0NBTkNFTExFRBAGQr8BCh9jb20ub3R0b2NoYWluLmFwcHMuY29udHJhY3RzLnYxQg1Db250cmFjdFByb3RvUAGiAgNPQUOqAhtPdHRvY2hhaW4uQXBwcy5Db250cmFjdHMuVjHKAhtPdHRvY2hhaW5cQXBwc1xDb250cmFjdHNcVjHiAidPdHRvY2hhaW5cQXBwc1xDb250cmFjdHNcVjFcR1BCTWV0YWRhdGHqAh5PdHRvY2hhaW46OkFwcHM6OkNvbnRyYWN0czo6VjFiBnByb3RvMw", [common_pb_js_1.file_ottochain_v1_common, wkt_1.file_google_protobuf_struct, wkt_1.file_google_protobuf_timestamp]);
14
- /**
15
- * Describes the message ottochain.apps.contracts.v1.Contract.
16
- * Use `create(ContractSchema)` to create a new message.
17
- */
18
- exports.ContractSchema = (0, codegenv1_1.messageDesc)(exports.file_ottochain_apps_contracts_v1_contract, 0);
19
- /**
20
- * Describes the message ottochain.apps.contracts.v1.ProposeContractRequest.
21
- * Use `create(ProposeContractRequestSchema)` to create a new message.
22
- */
23
- exports.ProposeContractRequestSchema = (0, codegenv1_1.messageDesc)(exports.file_ottochain_apps_contracts_v1_contract, 1);
24
- /**
25
- * Describes the message ottochain.apps.contracts.v1.AcceptContractRequest.
26
- * Use `create(AcceptContractRequestSchema)` to create a new message.
27
- */
28
- exports.AcceptContractRequestSchema = (0, codegenv1_1.messageDesc)(exports.file_ottochain_apps_contracts_v1_contract, 2);
29
- /**
30
- * Describes the message ottochain.apps.contracts.v1.CompleteContractRequest.
31
- * Use `create(CompleteContractRequestSchema)` to create a new message.
32
- */
33
- exports.CompleteContractRequestSchema = (0, codegenv1_1.messageDesc)(exports.file_ottochain_apps_contracts_v1_contract, 3);
34
- /**
35
- * Describes the message ottochain.apps.contracts.v1.RejectContractRequest.
36
- * Use `create(RejectContractRequestSchema)` to create a new message.
37
- */
38
- exports.RejectContractRequestSchema = (0, codegenv1_1.messageDesc)(exports.file_ottochain_apps_contracts_v1_contract, 4);
39
- /**
40
- * Describes the message ottochain.apps.contracts.v1.DisputeContractRequest.
41
- * Use `create(DisputeContractRequestSchema)` to create a new message.
42
- */
43
- exports.DisputeContractRequestSchema = (0, codegenv1_1.messageDesc)(exports.file_ottochain_apps_contracts_v1_contract, 5);
44
- /**
45
- * Describes the message ottochain.apps.contracts.v1.ContractDefinition.
46
- * Use `create(ContractDefinitionSchema)` to create a new message.
47
- */
48
- exports.ContractDefinitionSchema = (0, codegenv1_1.messageDesc)(exports.file_ottochain_apps_contracts_v1_contract, 6);
49
- /**
50
- * Contract lifecycle states
51
- *
52
- * @generated from enum ottochain.apps.contracts.v1.ContractState
53
- */
54
- var ContractState;
55
- (function (ContractState) {
56
- /**
57
- * @generated from enum value: CONTRACT_STATE_UNSPECIFIED = 0;
58
- */
59
- ContractState[ContractState["UNSPECIFIED"] = 0] = "UNSPECIFIED";
60
- /**
61
- * Awaiting counterparty acceptance
62
- *
63
- * @generated from enum value: CONTRACT_STATE_PROPOSED = 1;
64
- */
65
- ContractState[ContractState["PROPOSED"] = 1] = "PROPOSED";
66
- /**
67
- * Both parties agreed, in progress
68
- *
69
- * @generated from enum value: CONTRACT_STATE_ACTIVE = 2;
70
- */
71
- ContractState[ContractState["ACTIVE"] = 2] = "ACTIVE";
72
- /**
73
- * Successfully fulfilled (terminal)
74
- *
75
- * @generated from enum value: CONTRACT_STATE_COMPLETED = 3;
76
- */
77
- ContractState[ContractState["COMPLETED"] = 3] = "COMPLETED";
78
- /**
79
- * Counterparty declined (terminal)
80
- *
81
- * @generated from enum value: CONTRACT_STATE_REJECTED = 4;
82
- */
83
- ContractState[ContractState["REJECTED"] = 4] = "REJECTED";
84
- /**
85
- * Under dispute resolution
86
- *
87
- * @generated from enum value: CONTRACT_STATE_DISPUTED = 5;
88
- */
89
- ContractState[ContractState["DISPUTED"] = 5] = "DISPUTED";
90
- /**
91
- * Cancelled by proposer before acceptance (terminal)
92
- *
93
- * @generated from enum value: CONTRACT_STATE_CANCELLED = 6;
94
- */
95
- ContractState[ContractState["CANCELLED"] = 6] = "CANCELLED";
96
- })(ContractState || (exports.ContractState = ContractState = {}));
97
- /**
98
- * Describes the enum ottochain.apps.contracts.v1.ContractState.
99
- */
100
- exports.ContractStateSchema = (0, codegenv1_1.enumDesc)(exports.file_ottochain_apps_contracts_v1_contract, 0);