编译器
0.8.26+commit.8a97fa7a
文件 1 的 11:IEmbeddingVerifier.sol
pragma solidity ^0.8.26;
interface IEmbeddingVerifier {
function getEmbeddingDim() external returns (uint256 embedding_dim);
function verify(string memory text, bytes memory proof) external returns (int256[] memory embedding);
}
文件 2 的 11:IMarket.sol
pragma solidity >=0.8.26;
import { IEmbeddingVerifier } from "./IEmbeddingVerifier.sol";
import { IMarketResolver } from "./IMarketResolver.sol";
import { ITLSNVerifier } from "./ITLSNVerifier.sol";
interface IMarket {
function create(
string memory title,
string memory url,
uint256 end,
uint256 revealPeriod,
uint256 minValue,
int256 wadFeeFraction,
string memory regex,
address feeRecipient,
IMarketResolver resolver,
ITLSNVerifier tlsnVerifier,
IEmbeddingVerifier verifier
)
external
returns (uint256 marketId);
function predict(
uint256 marketId,
string memory text,
bytes memory encodedEmbedding
)
external
payable
returns (uint256 predictionId);
function reveal(uint256 marketId, bytes memory tlsnProof, bytes memory embeddingProof) external;
function trackPredictions(uint256 marketId, bytes memory data) external;
function claim(uint256 marketId, uint256 predictionId) external;
function refund(uint256 marketId, uint256 predictionId) external;
}
文件 3 的 11:IMarketResolver.sol
pragma solidity ^0.8.26;
interface IMarketResolver {
function addPrediction(
uint256 marketId,
uint256 predictionId,
string memory text,
bytes memory encodedEmbedding,
uint256 value
)
external;
function trackPredictions(
uint256 marketId,
int256[] memory revealEmbedding,
bytes memory data
)
external
returns (bool tracked);
function getWadScore(uint256 marketId, uint256 predictionId) external view returns (int256 score);
function getWadTotalScore(uint256 marketId) external view returns (int256 score);
function assertValidEmbedding(int256[] memory embedding) external pure;
}
文件 4 的 11:ITLSNVerifier.sol
pragma solidity ^0.8.26;
interface ITLSNVerifier {
function verify(string memory url, string memory regex, bytes memory proof) external returns (string memory data);
}
文件 5 的 11:Id.sol
pragma solidity ^0.8.26;
contract Id {
uint256 public id = 0;
function getId() public returns (uint256) {
id++;
return id;
}
}
文件 6 的 11:LibAlgebra.sol
pragma solidity >=0.8.26;
import { wadMul, wadPow } from "solmate/utils/SignedWadMath.sol";
library LibAlgebra {
error VectorDimMismatch();
error Overflow();
int256 constant MIN_WEIGHT = 0.0001e18;
function weightedSimilarity(
int256[] memory a,
int256[] memory b,
int256 wadShift,
uint256 value
)
internal
pure
returns (int256)
{
int256 wadDot = _dot(a, b);
int256 similarity = _wadMax(wadDot + wadShift, MIN_WEIGHT);
return wadMul(similarity, _toWad(value));
}
function min(uint256 x, uint256 y) internal pure returns (uint256) {
return x < y ? x : y;
}
function norm(int256[] memory a) internal pure returns (int256) {
return wadPow(_dot(a, a), 0.5e18);
}
function _dot(int256[] memory a, int256[] memory b) internal pure returns (int256) {
if (a.length != b.length) {
revert VectorDimMismatch();
}
int256 result = 0;
for (uint256 i = 0; i < a.length; i++) {
result += wadMul(a[i], b[i]);
}
return result;
}
function _wadMax(int256 x, int256 y) internal pure returns (int256) {
return x > y ? x : y;
}
function _toWad(uint256 x) private pure returns (int256) {
uint256 wad = x * 1e18;
if (wad > uint256(type(int256).max)) {
revert Overflow();
}
return int256(wad);
}
}
文件 7 的 11:LibClaim.sol
pragma solidity >=0.8.26;
import { wadDiv, wadMul } from "solmate/utils/SignedWadMath.sol";
library LibClaim {
error Overflow();
function getClaimValue(
int256 wadScore,
int256 wadTotalScore,
uint256 totalValue,
int256 wadFeeFraction
)
internal
pure
returns (uint256 payout, uint256 fees)
{
int256 wadShare = wadDiv(wadScore, wadTotalScore);
int256 payoutPreFees = wadMul(wadShare, int256(totalValue));
fees = uint256(wadMul(wadFeeFraction, payoutPreFees));
payout = uint256(payoutPreFees) - fees;
}
}
文件 8 的 11:LibEncode.sol
pragma solidity >=0.8.26;
library LibEncode {
function encodeEmbedding(int256[] memory wadEmbedding) internal pure returns (bytes memory) {
bytes memory data = new bytes(0);
for (uint256 i = 0; i < wadEmbedding.length; i++) {
data = bytes.concat(data, abi.encodePacked(int16(wadEmbedding[i] / 1e14)));
}
return data;
}
function decodeEmbedding(bytes memory data) internal pure returns (int256[] memory) {
uint256 dim = data.length / 2;
int256[] memory wadEmbedding = new int256[](dim);
for (uint256 i = 0; i < dim; i++) {
wadEmbedding[i] = int256(int16(uint16(bytes2(slice(data, 2 * i, 2))))) * 1e14;
}
return wadEmbedding;
}
function slice(bytes memory _bytes, uint256 _start, uint256 _length) internal pure returns (bytes memory) {
require(_length + 31 >= _length, "slice_overflow");
require(_bytes.length >= _start + _length, "slice_outOfBounds");
bytes memory tempBytes;
assembly {
switch iszero(_length)
case 0 {
tempBytes := mload(0x40)
let lengthmod := and(_length, 31)
let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
let end := add(mc, _length)
for {
let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
} lt(mc, end) {
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} { mstore(mc, mload(cc)) }
mstore(tempBytes, _length)
mstore(0x40, and(add(mc, 31), not(31)))
}
default {
tempBytes := mload(0x40)
mstore(tempBytes, 0)
mstore(0x40, add(tempBytes, 0x20))
}
}
return tempBytes;
}
}
文件 9 的 11:Market.sol
pragma solidity ^0.8.26;
import { Id } from "./Id.sol";
import { Config, Embedding, MarketStatus, Prediction, PredictionTracker } from "./common/MarketData.sol";
import { IEmbeddingVerifier } from "./interfaces/IEmbeddingVerifier.sol";
import { IMarket } from "./interfaces/IMarket.sol";
import { IMarketResolver } from "./interfaces/IMarketResolver.sol";
import { ITLSNVerifier } from "./interfaces/ITLSNVerifier.sol";
import { LibAlgebra } from "./libraries/LibAlgebra.sol";
import { LibClaim } from "./libraries/LibClaim.sol";
import { LibEncode } from "./libraries/LibEncode.sol";
contract Market is IMarket {
Id public id;
mapping(address => uint256) public fees;
mapping(uint256 => Config) public markets;
mapping(uint256 => PredictionTracker) public predictionTrackers;
mapping(uint256 => Embedding) public reveals;
mapping(uint256 => mapping(uint256 => Prediction)) public predictions;
event MarketCreated(
uint256 indexed marketId,
string title,
string url,
uint256 end,
string regex,
int256 wadFeeFraction,
address feeRecipient,
address tlsnVerifier,
address embeddingVerifier,
address resolver
);
event PredictionAdded(
uint256 indexed marketId,
uint256 indexed predictionId,
address indexed predictor,
uint256 value,
string text,
int256[] embedding
);
event MarketRevealed(uint256 indexed marketId, string text, int256[] embedding, uint256 totalValue);
event PredictionPaid(
uint256 indexed marketId, uint256 indexed predictionId, address indexed predictor, uint256 value
);
event MarketTracked(uint256 indexed marketId, int256 wadTotalScore);
error InvalidEnd();
error NotEnoughValue();
error InvalidMarketStatus();
error InvalidPredictionStatus();
error OverValue();
error InvalidFeeBound();
constructor() {
id = new Id();
}
function create(
string memory title,
string memory url,
uint256 end,
uint256 revealPeriod,
uint256 minValue,
int256 wadFeeFraction,
string memory regex,
address feeRecipient,
IMarketResolver resolver,
ITLSNVerifier tlsnVerifier,
IEmbeddingVerifier embeddingVerifier
)
external
returns (uint256)
{
if (end < block.timestamp) {
revert InvalidEnd();
}
if (wadFeeFraction > 1e18) {
revert InvalidFeeBound();
}
uint256 marketId = id.getId();
markets[marketId] = Config({
id: marketId,
end: end,
revealPeriod: revealPeriod,
minValue: minValue,
wadFeeFraction: wadFeeFraction,
url: url,
title: title,
regex: regex,
feeRecipient: feeRecipient,
resolver: resolver,
embeddingVerifier: embeddingVerifier,
tlsnVerifier: tlsnVerifier,
status: MarketStatus.OPEN
});
predictionTrackers[marketId] = PredictionTracker({ numPredictions: 0, totalValue: 0, totalValueClaimed: 0 });
emit MarketCreated({
marketId: marketId,
title: title,
url: url,
end: end,
wadFeeFraction: wadFeeFraction,
regex: regex,
feeRecipient: feeRecipient,
embeddingVerifier: address(embeddingVerifier),
tlsnVerifier: address(tlsnVerifier),
resolver: address(resolver)
});
return marketId;
}
function predict(
uint256 marketId,
string memory text,
bytes memory encodedEmbedding
)
external
payable
returns (uint256)
{
uint256 value = msg.value;
address predictor = msg.sender;
Config memory market = markets[marketId];
if (value < market.minValue) {
revert NotEnoughValue();
}
if (market.end < block.timestamp) {
revert InvalidMarketStatus();
}
if (market.status != MarketStatus.OPEN) {
revert InvalidMarketStatus();
}
PredictionTracker storage tracker = predictionTrackers[marketId];
int256[] memory embedding = LibEncode.decodeEmbedding({ data: encodedEmbedding });
market.resolver.assertValidEmbedding({ embedding: embedding });
uint256 predictionId = tracker.numPredictions + 1;
predictions[marketId][predictionId] = Prediction({ value: value, predictor: predictor, used: false });
market.resolver.addPrediction({
marketId: marketId,
predictionId: predictionId,
text: text,
encodedEmbedding: encodedEmbedding,
value: value
});
tracker.totalValue += value;
tracker.numPredictions += 1;
emit PredictionAdded({
marketId: marketId,
predictionId: predictionId,
predictor: predictor,
value: value,
text: text,
embedding: embedding
});
return predictionId;
}
function reveal(uint256 marketId, bytes memory tlsnProof, bytes memory embeddingProof) external {
Config storage market = markets[marketId];
if (market.id == 0) {
revert InvalidMarketStatus();
}
if (market.end >= block.timestamp) {
revert InvalidMarketStatus();
}
if (market.status != MarketStatus.OPEN) {
revert InvalidMarketStatus();
}
string memory text = market.tlsnVerifier.verify({ url: market.url, regex: market.regex, proof: tlsnProof });
int256[] memory embedding = market.embeddingVerifier.verify({ proof: embeddingProof, text: text });
market.resolver.assertValidEmbedding({ embedding: embedding });
reveals[marketId] =
Embedding({ encodedData: LibEncode.encodeEmbedding({ wadEmbedding: embedding }), text: text });
market.status = MarketStatus.REVEALED;
PredictionTracker memory tracker = predictionTrackers[marketId];
emit MarketRevealed({ marketId: marketId, text: text, embedding: embedding, totalValue: tracker.totalValue });
}
function trackPredictions(uint256 marketId, bytes memory data) external {
Config storage market = markets[marketId];
if (market.status != MarketStatus.REVEALED) {
revert InvalidMarketStatus();
}
bytes memory encodedReveal = reveals[marketId].encodedData;
bool tracked = market.resolver.trackPredictions({
marketId: marketId,
revealEmbedding: LibEncode.decodeEmbedding(encodedReveal),
data: data
});
if (tracked) {
market.status = MarketStatus.TRACKED;
emit MarketTracked({ marketId: marketId, wadTotalScore: market.resolver.getWadTotalScore(marketId) });
}
}
function claim(uint256 marketId, uint256 predictionId) external {
Config memory market = markets[marketId];
if (market.status != MarketStatus.TRACKED) {
revert InvalidMarketStatus();
}
Prediction storage prediction = predictions[marketId][predictionId];
if (prediction.used) {
revert InvalidPredictionStatus();
}
PredictionTracker memory tracker = predictionTrackers[marketId];
(uint256 payout, uint256 fee) = LibClaim.getClaimValue({
wadScore: market.resolver.getWadScore({ marketId: marketId, predictionId: predictionId }),
wadTotalScore: market.resolver.getWadTotalScore({ marketId: marketId }),
totalValue: tracker.totalValue,
wadFeeFraction: market.wadFeeFraction
});
prediction.used = true;
_checkedTransfer({
to: prediction.predictor,
value: payout,
fee: fee,
feeRecipient: market.feeRecipient,
marketId: marketId
});
emit PredictionPaid(market.id, predictionId, prediction.predictor, payout);
}
function refund(uint256 marketId, uint256 predictionId) external {
Config storage market = markets[marketId];
if (market.id == 0) {
revert InvalidMarketStatus();
}
if (market.end + market.revealPeriod >= block.timestamp) {
revert InvalidMarketStatus();
}
if (market.status == MarketStatus.TRACKED) {
revert InvalidMarketStatus();
}
Prediction storage prediction = predictions[marketId][predictionId];
if (prediction.used) {
revert InvalidPredictionStatus();
}
market.status = MarketStatus.REFUNDED;
prediction.used = true;
_checkedTransfer({
to: prediction.predictor,
value: prediction.value,
fee: 0,
feeRecipient: address(0),
marketId: marketId
});
}
function claimFees(uint256 value) external {
address sender = msg.sender;
uint256 feesOwed = fees[sender];
if (value > feesOwed) {
revert OverValue();
}
feesOwed -= value;
payable(sender).transfer(value);
}
function _checkedTransfer(address to, uint256 value, uint256 fee, address feeRecipient, uint256 marketId) private {
PredictionTracker storage tracker = predictionTrackers[marketId];
uint256 truncatedValue = value;
if ((value + tracker.totalValueClaimed) > tracker.totalValue) {
truncatedValue = tracker.totalValue - tracker.totalValueClaimed;
}
tracker.totalValueClaimed += truncatedValue;
uint256 truncatedFee = fee;
if ((fee + tracker.totalValueClaimed) > tracker.totalValue) {
truncatedFee = tracker.totalValue - tracker.totalValueClaimed;
}
tracker.totalValueClaimed += truncatedFee;
fees[feeRecipient] += truncatedFee;
payable(to).transfer(truncatedValue);
}
}
文件 10 的 11:MarketData.sol
pragma solidity >=0.8.26;
import { IEmbeddingVerifier } from "../interfaces/IEmbeddingVerifier.sol";
import { IMarketResolver } from "../interfaces/IMarketResolver.sol";
import { ITLSNVerifier } from "../interfaces/ITLSNVerifier.sol";
enum MarketStatus {
OPEN,
REVEALED,
TRACKED,
REFUNDED
}
struct Config {
uint256 id;
uint256 end;
uint256 revealPeriod;
uint256 minValue;
int256 wadFeeFraction;
string url;
string title;
string regex;
address feeRecipient;
IMarketResolver resolver;
IEmbeddingVerifier embeddingVerifier;
ITLSNVerifier tlsnVerifier;
MarketStatus status;
}
struct Embedding {
bytes encodedData;
string text;
}
struct Prediction {
uint256 value;
address predictor;
bool used;
}
struct PredictionTracker {
uint256 numPredictions;
uint256 totalValue;
uint256 totalValueClaimed;
}
文件 11 的 11:SignedWadMath.sol
pragma solidity >=0.8.0;
function toWadUnsafe(uint256 x) pure returns (int256 r) {
assembly {
r := mul(x, 1000000000000000000)
}
}
function toDaysWadUnsafe(uint256 x) pure returns (int256 r) {
assembly {
r := div(mul(x, 1000000000000000000), 86400)
}
}
function fromDaysWadUnsafe(int256 x) pure returns (uint256 r) {
assembly {
r := div(mul(x, 86400), 1000000000000000000)
}
}
function unsafeWadMul(int256 x, int256 y) pure returns (int256 r) {
assembly {
r := sdiv(mul(x, y), 1000000000000000000)
}
}
function unsafeWadDiv(int256 x, int256 y) pure returns (int256 r) {
assembly {
r := sdiv(mul(x, 1000000000000000000), y)
}
}
function wadMul(int256 x, int256 y) pure returns (int256 r) {
assembly {
r := mul(x, y)
if iszero(
and(
or(iszero(x), eq(sdiv(r, x), y)),
or(lt(x, not(0)), sgt(y, 0x8000000000000000000000000000000000000000000000000000000000000000))
)
) {
revert(0, 0)
}
r := sdiv(r, 1000000000000000000)
}
}
function wadDiv(int256 x, int256 y) pure returns (int256 r) {
assembly {
r := mul(x, 1000000000000000000)
if iszero(and(iszero(iszero(y)), eq(sdiv(r, 1000000000000000000), x))) {
revert(0, 0)
}
r := sdiv(r, y)
}
}
function wadPow(int256 x, int256 y) pure returns (int256) {
return wadExp((wadLn(x) * y) / 1e18);
}
function wadExp(int256 x) pure returns (int256 r) {
unchecked {
if (x <= -42139678854452767551) return 0;
if (x >= 135305999368893231589) revert("EXP_OVERFLOW");
x = (x << 78) / 5**18;
int256 k = ((x << 96) / 54916777467707473351141471128 + 2**95) >> 96;
x = x - k * 54916777467707473351141471128;
int256 y = x + 1346386616545796478920950773328;
y = ((y * x) >> 96) + 57155421227552351082224309758442;
int256 p = y + x - 94201549194550492254356042504812;
p = ((p * y) >> 96) + 28719021644029726153956944680412240;
p = p * x + (4385272521454847904659076985693276 << 96);
int256 q = x - 2855989394907223263936484059900;
q = ((q * x) >> 96) + 50020603652535783019961831881945;
q = ((q * x) >> 96) - 533845033583426703283633433725380;
q = ((q * x) >> 96) + 3604857256930695427073651918091429;
q = ((q * x) >> 96) - 14423608567350463180887372962807573;
q = ((q * x) >> 96) + 26449188498355588339934803723976023;
assembly {
r := sdiv(p, q)
}
r = int256((uint256(r) * 3822833074963236453042738258902158003155416615667) >> uint256(195 - k));
}
}
function wadLn(int256 x) pure returns (int256 r) {
unchecked {
require(x > 0, "UNDEFINED");
assembly {
r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x))
r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x))))
r := or(r, shl(5, lt(0xffffffff, shr(r, x))))
r := or(r, shl(4, lt(0xffff, shr(r, x))))
r := or(r, shl(3, lt(0xff, shr(r, x))))
r := or(r, shl(2, lt(0xf, shr(r, x))))
r := or(r, shl(1, lt(0x3, shr(r, x))))
r := or(r, lt(0x1, shr(r, x)))
}
int256 k = r - 96;
x <<= uint256(159 - k);
x = int256(uint256(x) >> 159);
int256 p = x + 3273285459638523848632254066296;
p = ((p * x) >> 96) + 24828157081833163892658089445524;
p = ((p * x) >> 96) + 43456485725739037958740375743393;
p = ((p * x) >> 96) - 11111509109440967052023855526967;
p = ((p * x) >> 96) - 45023709667254063763336534515857;
p = ((p * x) >> 96) - 14706773417378608786704636184526;
p = p * x - (795164235651350426258249787498 << 96);
int256 q = x + 5573035233440673466300451813936;
q = ((q * x) >> 96) + 71694874799317883764090561454958;
q = ((q * x) >> 96) + 283447036172924575727196451306956;
q = ((q * x) >> 96) + 401686690394027663651624208769553;
q = ((q * x) >> 96) + 204048457590392012362485061816622;
q = ((q * x) >> 96) + 31853899698501571402653359427138;
q = ((q * x) >> 96) + 909429971244387300277376558375;
assembly {
r := sdiv(p, q)
}
r *= 1677202110996718588342820967067443963516166;
r += 16597577552685614221487285958193947469193820559219878177908093499208371 * k;
r += 600920179829731861736702779321621459595472258049074101567377883020018308;
r >>= 174;
}
}
function unsafeDiv(int256 x, int256 y) pure returns (int256 r) {
assembly {
r := sdiv(x, y)
}
}
{
"compilationTarget": {
"src/Market.sol": "Market"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
":@reclaimprotocol/verifier-solidity-sdk/contracts/=lib/reclaim/src/",
":ds-test/=lib/solmate/lib/ds-test/src/",
":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/",
":reclaim/=lib/reclaim/src/",
":solady/=lib/solady/src/",
":solmate/=lib/solmate/src/"
],
"viaIR": true
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidEnd","type":"error"},{"inputs":[],"name":"InvalidFeeBound","type":"error"},{"inputs":[],"name":"InvalidMarketStatus","type":"error"},{"inputs":[],"name":"InvalidPredictionStatus","type":"error"},{"inputs":[],"name":"NotEnoughValue","type":"error"},{"inputs":[],"name":"OverValue","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"string","name":"title","type":"string"},{"indexed":false,"internalType":"string","name":"url","type":"string"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"},{"indexed":false,"internalType":"string","name":"regex","type":"string"},{"indexed":false,"internalType":"int256","name":"wadFeeFraction","type":"int256"},{"indexed":false,"internalType":"address","name":"feeRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"tlsnVerifier","type":"address"},{"indexed":false,"internalType":"address","name":"embeddingVerifier","type":"address"},{"indexed":false,"internalType":"address","name":"resolver","type":"address"}],"name":"MarketCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"string","name":"text","type":"string"},{"indexed":false,"internalType":"int256[]","name":"embedding","type":"int256[]"},{"indexed":false,"internalType":"uint256","name":"totalValue","type":"uint256"}],"name":"MarketRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"int256","name":"wadTotalScore","type":"int256"}],"name":"MarketTracked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"predictionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"predictor","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"text","type":"string"},{"indexed":false,"internalType":"int256[]","name":"embedding","type":"int256[]"}],"name":"PredictionAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"predictionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"predictor","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"PredictionPaid","type":"event"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"predictionId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"url","type":"string"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"revealPeriod","type":"uint256"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"int256","name":"wadFeeFraction","type":"int256"},{"internalType":"string","name":"regex","type":"string"},{"internalType":"address","name":"feeRecipient","type":"address"},{"internalType":"contract IMarketResolver","name":"resolver","type":"address"},{"internalType":"contract ITLSNVerifier","name":"tlsnVerifier","type":"address"},{"internalType":"contract IEmbeddingVerifier","name":"embeddingVerifier","type":"address"}],"name":"create","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"id","outputs":[{"internalType":"contract Id","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"markets","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"uint256","name":"revealPeriod","type":"uint256"},{"internalType":"uint256","name":"minValue","type":"uint256"},{"internalType":"int256","name":"wadFeeFraction","type":"int256"},{"internalType":"string","name":"url","type":"string"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"regex","type":"string"},{"internalType":"address","name":"feeRecipient","type":"address"},{"internalType":"contract IMarketResolver","name":"resolver","type":"address"},{"internalType":"contract IEmbeddingVerifier","name":"embeddingVerifier","type":"address"},{"internalType":"contract ITLSNVerifier","name":"tlsnVerifier","type":"address"},{"internalType":"enum MarketStatus","name":"status","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"string","name":"text","type":"string"},{"internalType":"bytes","name":"encodedEmbedding","type":"bytes"}],"name":"predict","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"predictionTrackers","outputs":[{"internalType":"uint256","name":"numPredictions","type":"uint256"},{"internalType":"uint256","name":"totalValue","type":"uint256"},{"internalType":"uint256","name":"totalValueClaimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"predictions","outputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"predictor","type":"address"},{"internalType":"bool","name":"used","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint256","name":"predictionId","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"bytes","name":"tlsnProof","type":"bytes"},{"internalType":"bytes","name":"embeddingProof","type":"bytes"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reveals","outputs":[{"internalType":"bytes","name":"encodedData","type":"bytes"},{"internalType":"string","name":"text","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"trackPredictions","outputs":[],"stateMutability":"nonpayable","type":"function"}]