polkamarkets-js 3.4.2 → 3.4.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/abis/AccessControlUpgradeable.json +1 -0
- package/abis/ERC165Upgradeable.json +1 -0
- package/abis/Hashes.json +1 -0
- package/abis/Math.json +1 -1
- package/abis/MerkleProof.json +1 -0
- package/abis/MerkleRewardsDistributor.json +1 -0
- package/abis/MerkleRewardsDistributorTest.json +1 -0
- package/abis/Panic.json +1 -0
- package/abis/SafeCast.json +1 -0
- package/abis/SignedMath.json +1 -0
- package/abis/Strings.json +1 -1
- package/contracts/MerkleRewardsDistributor.sol +194 -0
- package/package.json +1 -1
- package/script/copy-abis.js +57 -0
- package/scripts/AddAdminToLand.s.sol +29 -0
- package/scripts/ClaimMerkleRoot.s.sol +34 -0
- package/scripts/CreateLand.s.sol +28 -0
- package/scripts/CreateMarkets.s.sol +71 -0
- package/scripts/DeployContracts.s.sol +94 -0
- package/scripts/DeployMerkleRewardsDistributor.s.sol +27 -0
- package/scripts/DeployToken.s.sol +17 -0
- package/scripts/DeployUSDT.s.sol +24 -0
- package/scripts/MintTokens.s.sol +21 -0
- package/scripts/PublishMerkleRoot.s.sol +50 -0
- package/scripts/ResolveMarket.s.sol +23 -0
- package/scripts/TradeMarket.s.sol +28 -0
- package/scripts/UpdateMarket.s.sol +55 -0
- package/src/Application.js +28 -1
- package/src/interfaces/index.js +1 -0
- package/src/models/IContract.js +101 -1
- package/src/models/MerkleRewardsDistributorContract.js +107 -0
- package/src/models/PolkamarketsSmartAccount.js +23 -0
- package/src/models/index.js +3 -1
- package/test/MerkleRewardsDistributor.t.sol +316 -0
- /package/abis/{test.json → Test.json} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"abi":[{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]}]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"abi":[{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]}]}
|
package/abis/Hashes.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"abi":[]}
|
package/abis/Math.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"
|
|
1
|
+
{"abi":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"abi":[{"type":"error","name":"MerkleProofInvalidMultiproof","inputs":[]}]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"UPGRADE_INTERFACE_VERSION","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"acceptOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addAdmin","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claim","inputs":[{"name":"contestId","type":"string","internalType":"string"},{"name":"token","type":"address","internalType":"contract IERC20"},{"name":"index","type":"uint256","internalType":"uint256"},{"name":"user","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"merkleProof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claimMany","inputs":[{"name":"contestIds","type":"string[]","internalType":"string[]"},{"name":"tokens","type":"address[]","internalType":"contract IERC20[]"},{"name":"indices","type":"uint256[]","internalType":"uint256[]"},{"name":"users","type":"address[]","internalType":"address[]"},{"name":"amounts","type":"uint256[]","internalType":"uint256[]"},{"name":"merkleProofs","type":"bytes32[][]","internalType":"bytes32[][]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoot","inputs":[{"name":"contestId","type":"string","internalType":"string"},{"name":"token","type":"address","internalType":"contract IERC20"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"initialOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isAdmin","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isClaimed","inputs":[{"name":"contestId","type":"string","internalType":"string"},{"name":"token","type":"address","internalType":"contract IERC20"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isClaimedMany","inputs":[{"name":"contestIds","type":"string[]","internalType":"string[]"},{"name":"tokens","type":"address[]","internalType":"contract IERC20[]"},{"name":"indices","type":"uint256[]","internalType":"uint256[]"}],"outputs":[{"name":"","type":"bool[]","internalType":"bool[]"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"pendingOwner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"publishRoot","inputs":[{"name":"contestId","type":"string","internalType":"string"},{"name":"token","type":"address","internalType":"contract IERC20"},{"name":"root","type":"bytes32","internalType":"bytes32"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeAdmin","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"withdraw","inputs":[{"name":"token","type":"address","internalType":"contract IERC20"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Claim","inputs":[{"name":"contestId","type":"string","indexed":false,"internalType":"string"},{"name":"token","type":"address","indexed":true,"internalType":"contract IERC20"},{"name":"index","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"user","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"OwnershipTransferStarted","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RootPublished","inputs":[{"name":"contestId","type":"string","indexed":false,"internalType":"string"},{"name":"token","type":"address","indexed":true,"internalType":"contract IERC20"},{"name":"root","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"rootKey","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"TokensWithdrawn","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AddressEmptyCode","inputs":[{"name":"target","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967InvalidImplementation","inputs":[{"name":"implementation","type":"address","internalType":"address"}]},{"type":"error","name":"ERC1967NonPayable","inputs":[]},{"type":"error","name":"FailedCall","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"type":"error","name":"ReentrancyGuardReentrantCall","inputs":[]},{"type":"error","name":"SafeERC20FailedOperation","inputs":[{"name":"token","type":"address","internalType":"address"}]},{"type":"error","name":"UUPSUnauthorizedCallContext","inputs":[]},{"type":"error","name":"UUPSUnsupportedProxiableUUID","inputs":[{"name":"slot","type":"bytes32","internalType":"bytes32"}]}]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"abi":[{"type":"function","name":"IS_TEST","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"excludeArtifacts","inputs":[],"outputs":[{"name":"excludedArtifacts_","type":"string[]","internalType":"string[]"}],"stateMutability":"view"},{"type":"function","name":"excludeContracts","inputs":[],"outputs":[{"name":"excludedContracts_","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"excludeSelectors","inputs":[],"outputs":[{"name":"excludedSelectors_","type":"tuple[]","internalType":"struct StdInvariant.FuzzSelector[]","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"selectors","type":"bytes4[]","internalType":"bytes4[]"}]}],"stateMutability":"view"},{"type":"function","name":"excludeSenders","inputs":[],"outputs":[{"name":"excludedSenders_","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"failed","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"setUp","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"targetArtifactSelectors","inputs":[],"outputs":[{"name":"targetedArtifactSelectors_","type":"tuple[]","internalType":"struct StdInvariant.FuzzArtifactSelector[]","components":[{"name":"artifact","type":"string","internalType":"string"},{"name":"selectors","type":"bytes4[]","internalType":"bytes4[]"}]}],"stateMutability":"view"},{"type":"function","name":"targetArtifacts","inputs":[],"outputs":[{"name":"targetedArtifacts_","type":"string[]","internalType":"string[]"}],"stateMutability":"view"},{"type":"function","name":"targetContracts","inputs":[],"outputs":[{"name":"targetedContracts_","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"targetInterfaces","inputs":[],"outputs":[{"name":"targetedInterfaces_","type":"tuple[]","internalType":"struct StdInvariant.FuzzInterface[]","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"artifacts","type":"string[]","internalType":"string[]"}]}],"stateMutability":"view"},{"type":"function","name":"targetSelectors","inputs":[],"outputs":[{"name":"targetedSelectors_","type":"tuple[]","internalType":"struct StdInvariant.FuzzSelector[]","components":[{"name":"addr","type":"address","internalType":"address"},{"name":"selectors","type":"bytes4[]","internalType":"bytes4[]"}]}],"stateMutability":"view"},{"type":"function","name":"targetSenders","inputs":[],"outputs":[{"name":"targetedSenders_","type":"address[]","internalType":"address[]"}],"stateMutability":"view"},{"type":"function","name":"test_AdminRoleCanPublishRoot","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"test_AdminWithdraw","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"test_ClaimMany","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"test_ClaimMany_DuplicateIndexReverts","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"test_ClaimMany_LengthMismatchReverts","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"test_ClaimWithWrongTokenOrContest","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"test_IsClaimedReflectsState","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"test_OnlyOwnerGuards","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"test_PublishRootAndSingleClaim","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"test_RevertOnDoubleClaim","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"test_RevertOnInvalidProof","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"test_RootNotSet_RevertOnClaim","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"test_RootUpdateInvalidatesOldProof","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"log","inputs":[{"name":"","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"log_address","inputs":[{"name":"","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"log_array","inputs":[{"name":"val","type":"uint256[]","indexed":false,"internalType":"uint256[]"}],"anonymous":false},{"type":"event","name":"log_array","inputs":[{"name":"val","type":"int256[]","indexed":false,"internalType":"int256[]"}],"anonymous":false},{"type":"event","name":"log_array","inputs":[{"name":"val","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"log_bytes","inputs":[{"name":"","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"log_bytes32","inputs":[{"name":"","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"log_int","inputs":[{"name":"","type":"int256","indexed":false,"internalType":"int256"}],"anonymous":false},{"type":"event","name":"log_named_address","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"log_named_array","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"uint256[]","indexed":false,"internalType":"uint256[]"}],"anonymous":false},{"type":"event","name":"log_named_array","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"int256[]","indexed":false,"internalType":"int256[]"}],"anonymous":false},{"type":"event","name":"log_named_array","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"log_named_bytes","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"log_named_bytes32","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"log_named_decimal_int","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"int256","indexed":false,"internalType":"int256"},{"name":"decimals","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"log_named_decimal_uint","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"decimals","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"log_named_int","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"int256","indexed":false,"internalType":"int256"}],"anonymous":false},{"type":"event","name":"log_named_string","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"log_named_uint","inputs":[{"name":"key","type":"string","indexed":false,"internalType":"string"},{"name":"val","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"log_string","inputs":[{"name":"","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"log_uint","inputs":[{"name":"","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"logs","inputs":[{"name":"","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false}]}
|
package/abis/Panic.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"abi":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"abi":[{"type":"error","name":"SafeCastOverflowedIntDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"int256","internalType":"int256"}]},{"type":"error","name":"SafeCastOverflowedIntToUint","inputs":[{"name":"value","type":"int256","internalType":"int256"}]},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"SafeCastOverflowedUintToInt","inputs":[{"name":"value","type":"uint256","internalType":"uint256"}]}]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"abi":[]}
|
package/abis/Strings.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"
|
|
1
|
+
{"abi":[{"type":"error","name":"StringsInsufficientHexLength","inputs":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"length","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"StringsInvalidAddressFormat","inputs":[]},{"type":"error","name":"StringsInvalidChar","inputs":[]}]}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity ^0.8.26;
|
|
3
|
+
|
|
4
|
+
// OpenZeppelin upgradeable
|
|
5
|
+
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
|
|
6
|
+
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
|
|
7
|
+
import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol";
|
|
8
|
+
import "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol";
|
|
9
|
+
import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
|
|
10
|
+
|
|
11
|
+
// OpenZeppelin non-upgradeable utils
|
|
12
|
+
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
13
|
+
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
|
|
14
|
+
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
|
|
15
|
+
|
|
16
|
+
/// @title Merkle-based rewards distributor for contests
|
|
17
|
+
/// @notice Owner publishes one Merkle root per (contestId, token). Users claim with proof.
|
|
18
|
+
contract MerkleRewardsDistributor is Initializable, UUPSUpgradeable, Ownable2StepUpgradeable, AccessControlUpgradeable, ReentrancyGuardUpgradeable {
|
|
19
|
+
using SafeERC20 for IERC20;
|
|
20
|
+
|
|
21
|
+
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
|
|
22
|
+
|
|
23
|
+
// rootKey => merkleRoot
|
|
24
|
+
mapping(bytes32 => bytes32) private _roots;
|
|
25
|
+
// rootKey => claimed bitmap wordIndex => word
|
|
26
|
+
mapping(bytes32 => mapping(uint256 => uint256)) private _claimedBitMap;
|
|
27
|
+
|
|
28
|
+
event RootPublished(string contestId, IERC20 indexed token, bytes32 indexed root, bytes32 indexed rootKey);
|
|
29
|
+
event Claim(
|
|
30
|
+
string contestId,
|
|
31
|
+
IERC20 indexed token,
|
|
32
|
+
uint256 indexed index,
|
|
33
|
+
address indexed user,
|
|
34
|
+
uint256 amount
|
|
35
|
+
);
|
|
36
|
+
event TokensWithdrawn(address indexed token, address indexed to, uint256 amount);
|
|
37
|
+
|
|
38
|
+
/// @custom:oz-upgrades-unsafe-allow constructor
|
|
39
|
+
constructor() {
|
|
40
|
+
_disableInitializers();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function initialize(address initialOwner) public initializer {
|
|
44
|
+
__ReentrancyGuard_init();
|
|
45
|
+
__Ownable_init(initialOwner);
|
|
46
|
+
__UUPSUpgradeable_init();
|
|
47
|
+
__AccessControl_init();
|
|
48
|
+
|
|
49
|
+
_grantRole(ADMIN_ROLE, initialOwner);
|
|
50
|
+
_setRoleAdmin(ADMIN_ROLE, ADMIN_ROLE);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function _authorizeUpgrade(address newImplementation) internal override onlyOwner {}
|
|
54
|
+
|
|
55
|
+
// ------ Admin ------
|
|
56
|
+
|
|
57
|
+
/// @notice Publishes/updates the root for a given (contestId, token)
|
|
58
|
+
function publishRoot(string calldata contestId, IERC20 token, bytes32 root) external onlyAdmin {
|
|
59
|
+
bytes32 key = _rootKey(contestId, token);
|
|
60
|
+
_roots[key] = root;
|
|
61
|
+
emit RootPublished(contestId, token, root, key);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function withdraw(IERC20 token, uint256 amount) external onlyOwner nonReentrant {
|
|
65
|
+
token.safeTransfer(msg.sender, amount);
|
|
66
|
+
emit TokensWithdrawn(address(token), msg.sender, amount);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// role management
|
|
70
|
+
modifier onlyAdmin() {
|
|
71
|
+
require(hasRole(ADMIN_ROLE, msg.sender), "MerkleRewards: must have admin role");
|
|
72
|
+
_;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function addAdmin(address user) external onlyAdmin {
|
|
76
|
+
grantRole(ADMIN_ROLE, user);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function removeAdmin(address user) external onlyAdmin {
|
|
80
|
+
revokeRole(ADMIN_ROLE, user);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function isAdmin(address user) external view returns (bool) {
|
|
84
|
+
return hasRole(ADMIN_ROLE, user);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// ------ Claims ------
|
|
88
|
+
|
|
89
|
+
/// @notice Claims `amount` for `user` with a Merkle proof. Funds are sent to `user`.
|
|
90
|
+
/// @dev Leaf is keccak256(abi.encode(index, user, token, amount, contestId))
|
|
91
|
+
function claim(
|
|
92
|
+
string calldata contestId,
|
|
93
|
+
IERC20 token,
|
|
94
|
+
uint256 index,
|
|
95
|
+
address user,
|
|
96
|
+
uint256 amount,
|
|
97
|
+
bytes32[] calldata merkleProof
|
|
98
|
+
) external nonReentrant {
|
|
99
|
+
bytes32 key = _rootKey(contestId, token);
|
|
100
|
+
bytes32 root = _roots[key];
|
|
101
|
+
require(root != bytes32(0), "MerkleRewards: root not set");
|
|
102
|
+
require(!_isClaimed(key, index), "MerkleRewards: already claimed");
|
|
103
|
+
|
|
104
|
+
bytes32 leaf = keccak256(abi.encode(index, user, token, amount, contestId));
|
|
105
|
+
require(MerkleProof.verify(merkleProof, root, leaf), "MerkleRewards: invalid proof");
|
|
106
|
+
|
|
107
|
+
_setClaimed(key, index);
|
|
108
|
+
|
|
109
|
+
token.safeTransfer(user, amount);
|
|
110
|
+
|
|
111
|
+
emit Claim(contestId, token, index, user, amount);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/// @notice Claims multiple entries in one transaction. Funds are sent to each entry's `user`.
|
|
115
|
+
function claimMany(
|
|
116
|
+
string[] calldata contestIds,
|
|
117
|
+
IERC20[] calldata tokens,
|
|
118
|
+
uint256[] calldata indices,
|
|
119
|
+
address[] calldata users,
|
|
120
|
+
uint256[] calldata amounts,
|
|
121
|
+
bytes32[][] calldata merkleProofs
|
|
122
|
+
) external nonReentrant {
|
|
123
|
+
uint256 len = contestIds.length;
|
|
124
|
+
require(
|
|
125
|
+
len == tokens.length &&
|
|
126
|
+
len == indices.length &&
|
|
127
|
+
len == users.length &&
|
|
128
|
+
len == amounts.length &&
|
|
129
|
+
len == merkleProofs.length,
|
|
130
|
+
"MerkleRewards: arrays length mismatch"
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
for (uint256 i = 0; i < len; i++) {
|
|
134
|
+
bytes32 key = _rootKey(contestIds[i], tokens[i]);
|
|
135
|
+
bytes32 root = _roots[key];
|
|
136
|
+
require(root != bytes32(0), "MerkleRewards: root not set");
|
|
137
|
+
require(!_isClaimed(key, indices[i]), "MerkleRewards: already claimed");
|
|
138
|
+
|
|
139
|
+
bytes32 leaf = keccak256(abi.encode(indices[i], users[i], tokens[i], amounts[i], contestIds[i]));
|
|
140
|
+
require(MerkleProof.verify(merkleProofs[i], root, leaf), "MerkleRewards: invalid proof");
|
|
141
|
+
|
|
142
|
+
_setClaimed(key, indices[i]);
|
|
143
|
+
tokens[i].safeTransfer(users[i], amounts[i]);
|
|
144
|
+
|
|
145
|
+
emit Claim(contestIds[i], tokens[i], indices[i], users[i], amounts[i]);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ------ Views ------
|
|
150
|
+
|
|
151
|
+
function getRoot(string calldata contestId, IERC20 token) external view returns (bytes32) {
|
|
152
|
+
return _roots[_rootKey(contestId, token)];
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function isClaimed(
|
|
156
|
+
string calldata contestId,
|
|
157
|
+
IERC20 token,
|
|
158
|
+
uint256 index
|
|
159
|
+
) external view returns (bool) {
|
|
160
|
+
return _isClaimed(_rootKey(contestId, token), index);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function isClaimedMany(
|
|
164
|
+
string[] calldata contestIds,
|
|
165
|
+
IERC20[] calldata tokens,
|
|
166
|
+
uint256[] calldata indices
|
|
167
|
+
) external view returns (bool[] memory) {
|
|
168
|
+
bool[] memory claims = new bool[](contestIds.length);
|
|
169
|
+
for (uint256 i = 0; i < contestIds.length; i++) {
|
|
170
|
+
claims[i] = _isClaimed(_rootKey(contestIds[i], tokens[i]), indices[i]);
|
|
171
|
+
}
|
|
172
|
+
return claims;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// ------ Internal utils ------
|
|
176
|
+
|
|
177
|
+
function _rootKey(string calldata contestId, IERC20 token) private pure returns (bytes32) {
|
|
178
|
+
return keccak256(abi.encode(contestId, token));
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function _isClaimed(bytes32 key, uint256 index) private view returns (bool) {
|
|
182
|
+
uint256 wordIndex = index >> 8; // divide by 256
|
|
183
|
+
uint256 bitIndex = index & 255; // modulo 256
|
|
184
|
+
uint256 word = _claimedBitMap[key][wordIndex];
|
|
185
|
+
uint256 mask = (1 << bitIndex);
|
|
186
|
+
return word & mask == mask;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function _setClaimed(bytes32 key, uint256 index) private {
|
|
190
|
+
uint256 wordIndex = index >> 8;
|
|
191
|
+
uint256 bitIndex = index & 255;
|
|
192
|
+
_claimedBitMap[key][wordIndex] = _claimedBitMap[key][wordIndex] | (1 << bitIndex);
|
|
193
|
+
}
|
|
194
|
+
}
|
package/package.json
CHANGED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
const outDir = path.join(__dirname, '../out');
|
|
5
|
+
const abisDir = path.join(__dirname, '../abis');
|
|
6
|
+
|
|
7
|
+
// Ensure abis directory exists
|
|
8
|
+
if (!fs.existsSync(abisDir)) {
|
|
9
|
+
fs.mkdirSync(abisDir, { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// Copy ABIs from out/ to abis/
|
|
13
|
+
function copyAbis() {
|
|
14
|
+
if (!fs.existsSync(outDir)) {
|
|
15
|
+
console.log('❌ /out directory not found. Run "forge build" first.');
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const contracts = fs.readdirSync(outDir);
|
|
20
|
+
let copiedCount = 0;
|
|
21
|
+
|
|
22
|
+
contracts.forEach(contract => {
|
|
23
|
+
if (contract.endsWith('.sol')) {
|
|
24
|
+
const contractDir = path.join(outDir, contract);
|
|
25
|
+
|
|
26
|
+
if (fs.statSync(contractDir).isDirectory()) {
|
|
27
|
+
const contractFiles = fs.readdirSync(contractDir);
|
|
28
|
+
|
|
29
|
+
contractFiles.forEach(file => {
|
|
30
|
+
if (file.endsWith('.json')) {
|
|
31
|
+
try {
|
|
32
|
+
const sourcePath = path.join(contractDir, file);
|
|
33
|
+
const destPath = path.join(abisDir, file);
|
|
34
|
+
|
|
35
|
+
const contractData = JSON.parse(fs.readFileSync(sourcePath, 'utf8'));
|
|
36
|
+
|
|
37
|
+
// Extract only ABI (minified)
|
|
38
|
+
const abiData = {
|
|
39
|
+
abi: contractData.abi || []
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
fs.writeFileSync(destPath, JSON.stringify(abiData));
|
|
43
|
+
copiedCount++;
|
|
44
|
+
console.log(`✅ Copied ${file}`);
|
|
45
|
+
} catch (error) {
|
|
46
|
+
console.log(`⚠️ Failed to copy ${file}:`, error.message);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
console.log(`\n🎉 Successfully copied ${copiedCount} contract ABIs to /abis directory`);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
copyAbis();
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-2.0
|
|
2
|
+
pragma solidity ^0.8.26;
|
|
3
|
+
|
|
4
|
+
import {Script} from "forge-std/Script.sol";
|
|
5
|
+
import {console} from "forge-std/console.sol";
|
|
6
|
+
// Import your contracts here
|
|
7
|
+
import {PredictionMarketV3Manager} from "../contracts/PredictionMarketV3Manager.sol";
|
|
8
|
+
import {PredictionMarketV3_4} from "../contracts/PredictionMarketV3_4.sol";
|
|
9
|
+
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
10
|
+
|
|
11
|
+
contract AddAdminToLand is Script {
|
|
12
|
+
function run() public {
|
|
13
|
+
vm.startBroadcast();
|
|
14
|
+
|
|
15
|
+
address PREDICTION_MARKET_V3_MANAGER = address(0xBC39fa757886E8A56422Abc460b1FFfc70bbaeC6);
|
|
16
|
+
address PREDICTION_MARKET_V3 = address(0x39E66eE6b2ddaf4DEfDEd3038E0162180dbeF340);
|
|
17
|
+
address LAND_TOKEN = address(0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d);
|
|
18
|
+
address admin = address(0xAE7Bfff784EeEe7812D6527B72c77A7Ed773Ed9D);
|
|
19
|
+
|
|
20
|
+
// PredictionMarketV3_4(payable(PREDICTION_MARKET_V3)).setAllowedManager(PREDICTION_MARKET_V3_MANAGER, true);
|
|
21
|
+
|
|
22
|
+
PredictionMarketV3Manager(PREDICTION_MARKET_V3_MANAGER).addAdminToLand(
|
|
23
|
+
IERC20(LAND_TOKEN),
|
|
24
|
+
admin
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
vm.stopBroadcast();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-2.0
|
|
2
|
+
pragma solidity ^0.8.26;
|
|
3
|
+
|
|
4
|
+
import {Script} from "forge-std/Script.sol";
|
|
5
|
+
import {console} from "forge-std/console.sol";
|
|
6
|
+
import {MerkleRewardsDistributor} from "../contracts/MerkleRewardsDistributor.sol";
|
|
7
|
+
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
8
|
+
|
|
9
|
+
contract ClaimMerkleRoot is Script {
|
|
10
|
+
function run() public {
|
|
11
|
+
vm.startBroadcast();
|
|
12
|
+
|
|
13
|
+
MerkleRewardsDistributor distributor = MerkleRewardsDistributor(address(0x846BBEF1e62c211a16fD3F4Cd15C54B010D85036));
|
|
14
|
+
IERC20 token = IERC20(address(0xf74B14ecbAdC9fBb283Fb3c8ae11E186856eae6f));
|
|
15
|
+
string memory contestId = "7663c7a6-5c93-40e2-9de7-21a821d363e3";
|
|
16
|
+
uint256 index = 4;
|
|
17
|
+
address account = address(0x68FcB3Db1BA4Abb85D9f9420A110948e6459d613);
|
|
18
|
+
uint256 amount = 200000;
|
|
19
|
+
bytes32[] memory merkleProof = new bytes32[](2);
|
|
20
|
+
merkleProof[0] = bytes32(0x7c0e1af482e345503812141a5583c24adcfb9304cd8674e2d55b875e1ec27fdc);
|
|
21
|
+
merkleProof[1] = bytes32(0x995dc3a28d8b8bcf31a29435a588bfcea38841d36509f285b0ea606c0ee574bf);
|
|
22
|
+
|
|
23
|
+
distributor.claim(
|
|
24
|
+
contestId,
|
|
25
|
+
IERC20(address(token)),
|
|
26
|
+
index,
|
|
27
|
+
account,
|
|
28
|
+
amount,
|
|
29
|
+
merkleProof
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
vm.stopBroadcast();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-2.0
|
|
2
|
+
pragma solidity ^0.8.26;
|
|
3
|
+
|
|
4
|
+
import {Script} from "forge-std/Script.sol";
|
|
5
|
+
import {console} from "forge-std/console.sol";
|
|
6
|
+
// Import your contracts here
|
|
7
|
+
import {PredictionMarketV3Manager} from "../contracts/PredictionMarketV3Manager.sol";
|
|
8
|
+
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
9
|
+
|
|
10
|
+
contract CreateLand is Script {
|
|
11
|
+
function run() public {
|
|
12
|
+
|
|
13
|
+
vm.startBroadcast();
|
|
14
|
+
|
|
15
|
+
address PREDICTION_MARKET_V3_MANAGER = address(0xBC39fa757886E8A56422Abc460b1FFfc70bbaeC6);
|
|
16
|
+
address ADMIN_TOKEN = address(0x307893b1d9F2F6AF097310Ef6E49b90bc5a2Ee3d);
|
|
17
|
+
address LAND_TOKEN = address(0x8d0D000Ee44948FC98c9B98A4FA4921476f08B0d);
|
|
18
|
+
|
|
19
|
+
// IERC20(ADMIN_TOKEN).approve(PREDICTION_MARKET_V3_MANAGER, 1000 ether);
|
|
20
|
+
|
|
21
|
+
PredictionMarketV3Manager(PREDICTION_MARKET_V3_MANAGER).createLand(
|
|
22
|
+
IERC20(LAND_TOKEN),
|
|
23
|
+
IERC20(ADMIN_TOKEN)
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
vm.stopBroadcast();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// SPDX-License-Identifier: GPL-2.0
|
|
2
|
+
pragma solidity ^0.8.26;
|
|
3
|
+
|
|
4
|
+
import {Script} from "forge-std/Script.sol";
|
|
5
|
+
import {console} from "forge-std/console.sol";
|
|
6
|
+
import {PredictionMarketV3_4} from "../contracts/PredictionMarketV3_4.sol";
|
|
7
|
+
import {IPredictionMarketV3Manager} from "../contracts/IPredictionMarketV3Manager.sol";
|
|
8
|
+
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
9
|
+
|
|
10
|
+
contract CreateMarkets is Script {
|
|
11
|
+
function run() public {
|
|
12
|
+
|
|
13
|
+
vm.startBroadcast();
|
|
14
|
+
|
|
15
|
+
address predictionMarket = address(0xb5625db4777262460589724693e6E032999FCCd5);
|
|
16
|
+
address manager = address(0x47b5E2Ef0B3e79b6f5432d983731c04855121796);
|
|
17
|
+
address arbitrator = address(0x68FcB3Db1BA4Abb85D9f9420A110948e6459d613);
|
|
18
|
+
address treasury = address(0x68FcB3Db1BA4Abb85D9f9420A110948e6459d613);
|
|
19
|
+
address distributor = address(0x68FcB3Db1BA4Abb85D9f9420A110948e6459d613);
|
|
20
|
+
uint256[] memory distribution = new uint256[](2);
|
|
21
|
+
distribution[0] = 100e6;
|
|
22
|
+
distribution[1] = 100e6;
|
|
23
|
+
|
|
24
|
+
// uint256 value = 1000000000000000000000;
|
|
25
|
+
// address token = address(0xAe86Ea629FB0454bEA8EC9Da19c1b4b3d0c9Ac41);
|
|
26
|
+
// uint256 fee = 0;
|
|
27
|
+
|
|
28
|
+
uint256 value = 1000 ether;
|
|
29
|
+
address token = address(0x49Ff827F0C8835ebd8109Cc3b51b80435ce44F09);
|
|
30
|
+
uint256 fee = 1e16;
|
|
31
|
+
|
|
32
|
+
// IERC20(token).approve(predictionMarket, 10000000 ether);
|
|
33
|
+
// PredictionMarketV3_4(payable(predictionMarket)).setAllowedManager(manager, true);
|
|
34
|
+
|
|
35
|
+
PredictionMarketV3_4(payable(predictionMarket)).createMarket(PredictionMarketV3_4.CreateMarketDescription({
|
|
36
|
+
value: value,
|
|
37
|
+
closesAt: 1765029602,
|
|
38
|
+
outcomes: 2,
|
|
39
|
+
token: IERC20(token),
|
|
40
|
+
distribution: distribution,
|
|
41
|
+
question: unicode"Will Oscar Piastri win the F1 Drivers Championship 2025?;The “Lando era” became the Oscar show—but can the rising star hold his nerve and beat Lando and Max to his first Drivers Championship?\\n\\n**Market dates:**\\n\\n- **Market Period**: From the publication date through December 6th, 2025, at 02:00 PM UTC\\n- **Market Closing:** December 6th, 2025, at 02:00 PM UTC ahead of the last race\\n- **Resolution Deadline:** This market will resolve based on the official race results published by Formula 1 after the publication of the results of the last race, or earlier if the outcome is reached. The resolution may be delayed if there are any announced investigations that could impact points-scoring positions\\n\\n**Resolution criteria:**\\n\\n- This market resolves to “Yes” if Oscar Piastri wins the Drivers Championship of Formula 1 in 2025.\\n- This market resolves to “No” if Oscar Piastri doesn’t win the Drivers Championship of Formula 1 in 2025\\n\\n**Cancellation/Invalidity details:**\\n\\nThis market will be cancelled if:\\n\\n- The 2025 Formula 1 season is cancelled or postponed indefinitely\\n- The racing format of the 2025 Formula 1 season changes significantly from the standard format\\n- No official result is declared\\n- The resolution source becomes unavailable for large period of the market period\\n\\nIn the event of cancellation, participants may claim their stakes at the market value of their open positions at the time of cancellation. This could result in a profit or a loss, depending on the price of their outstanding shares.␟\"Yes\",\"No\"␟Sports,F1;;https://www.formula1.com/en/results/2025/drivers;Formula 1␟",
|
|
42
|
+
image: unicode"␟QmWvnfTtJNLCiJTPDZwVVXq2QAt9RN5gCWCWwpxDg8GsVL,",
|
|
43
|
+
arbitrator: arbitrator,
|
|
44
|
+
buyFees: PredictionMarketV3_4.Fees({fee: fee, treasuryFee: fee, distributorFee: fee}),
|
|
45
|
+
sellFees: PredictionMarketV3_4.Fees({fee: 0, treasuryFee: 0, distributorFee: 0}),
|
|
46
|
+
treasury: treasury,
|
|
47
|
+
distributor: distributor,
|
|
48
|
+
realitioTimeout: 3600,
|
|
49
|
+
manager: IPredictionMarketV3Manager(manager)
|
|
50
|
+
}));
|
|
51
|
+
|
|
52
|
+
PredictionMarketV3_4(payable(predictionMarket)).createMarket(PredictionMarketV3_4.CreateMarketDescription({
|
|
53
|
+
value: value,
|
|
54
|
+
closesAt: 1767225542,
|
|
55
|
+
outcomes: 2,
|
|
56
|
+
token: IERC20(token),
|
|
57
|
+
distribution: distribution,
|
|
58
|
+
question: unicode"Bitcoin’s next hit: moon to $150K or dip to $50K?;**Market dates:**\\n\\n- **Market Period**: From the publication date through December 31st, 2025, at 11:59 PM UTC\\n- **Market Closing:** December 31st, 2025, at 11:59 PM UTC\\n- **Resolution Deadline:** The resolution will be determined after market closing, or earlier if the outcome is reached\\n\\n**Resolution criteria:**\\n\\n- The market resolves based on which condition is met first:\\n - **“≥ $150K”** if the BTC/USDT price on Binance reaches or exceeds $150,000.00\\n - **“≤ $50K”** if the BTC/USDT price on Binance drops to or below $50,000.00\\n\\n**Resolution details:**\\n\\n- The market resolves based on the Binance BTC/USDT spot price, using the 1-minute chart with the following specifications:\\n - 1-minute timeframe (\\\"1m\\\")\\n - \\\"Original\\\" view\\n - \\\"Close\\\" price of each candle\\n- Only the price of BTC/USDT as quoted by Binance (spot market) will be considered\\n\\n**Cancellation (Invalidity) Conditions**\\n\\nThis market will be **canceled/invalid** if:\\n\\n- The BTC/USDT spot price on Binance doesn’t reach either one of the two options until market close.\\n- The BTC/USDT spot market on Binance is suspended or becomes unreliable\\n- The Binance platform is unavailable or experiences significant disruptions during the Market Period\\n- Any circumstance prevents reliable price tracking during the Market Period\\n\\nIn the event of cancellation, participants may claim their stakes at the market value of their open positions at the time of cancellation. This could result in a profit or a loss, depending on the price of their outstanding shares.␟\"≥ $150K\",\"≤ $50K\"␟Crypto;;https://www.binance.com/en/trade/BTC_USDT?type=spot;Binance␟",
|
|
59
|
+
image: unicode"␟QmdWFkhqiUX3XxwFBMGP749Wpx1Y44KAqqCuhpnCzap7cg,",
|
|
60
|
+
arbitrator: arbitrator,
|
|
61
|
+
buyFees: PredictionMarketV3_4.Fees({fee: fee, treasuryFee: fee, distributorFee: fee}),
|
|
62
|
+
sellFees: PredictionMarketV3_4.Fees({fee: 0, treasuryFee: 0, distributorFee: 0}),
|
|
63
|
+
treasury: treasury,
|
|
64
|
+
distributor: distributor,
|
|
65
|
+
realitioTimeout: 3600,
|
|
66
|
+
manager: IPredictionMarketV3Manager(manager)
|
|
67
|
+
}));
|
|
68
|
+
|
|
69
|
+
vm.stopBroadcast();
|
|
70
|
+
}
|
|
71
|
+
}
|