opinion-clob-sdk 0.1.12__py3-none-any.whl → 0.1.13__py3-none-any.whl
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.
Potentially problematic release.
This version of opinion-clob-sdk might be problematic. Click here for more details.
- opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +1 -1
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/__init__.py +26 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contract_caller.py +390 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/conditional_tokens.py +707 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/contracts/erc20.py +111 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/exception.py +11 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/base_builder.py +41 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/exception.py +2 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder.py +90 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/builders/order_builder_test.py +40 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/constants.py +2 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order.py +254 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/order_type.py +9 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/sides.py +8 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/model/signatures.py +8 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/signer.py +20 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/py_order_utils/utils.py +182 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/constants.py +19 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/eip712/__init__.py +176 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/enums.py +6 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/exceptions.py +94 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/multisend.py +347 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe.py +141 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/__init__.py +0 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/compatibility_fallback_handler_v1_3_0.py +327 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/multisend_v1_3_0.py +22 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/safe_v1_3_0.py +1035 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_contracts/utils.py +26 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_signature.py +364 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_test.py +37 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/safe_tx.py +437 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/signatures.py +63 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/typing.py +17 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/chain/safe/utils.py +218 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/config.py +4 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/model.py +19 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/sdk.py +957 -0
- opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/opinion_clob_sdk/verify_api_calls.py +135 -0
- {opinion_clob_sdk-0.1.12.dist-info → opinion_clob_sdk-0.1.13.dist-info}/METADATA +2 -2
- {opinion_clob_sdk-0.1.12.dist-info → opinion_clob_sdk-0.1.13.dist-info}/RECORD +59 -16
- {opinion_clob_sdk-0.1.12.dist-info → opinion_clob_sdk-0.1.13.dist-info}/WHEEL +0 -0
- {opinion_clob_sdk-0.1.12.dist-info → opinion_clob_sdk-0.1.13.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
abi = """
|
|
2
|
+
[
|
|
3
|
+
{
|
|
4
|
+
"type": "function",
|
|
5
|
+
"name": "allowance",
|
|
6
|
+
"inputs": [
|
|
7
|
+
{ "name": "owner", "type": "address", "internalType": "address" },
|
|
8
|
+
{ "name": "spender", "type": "address", "internalType": "address" }
|
|
9
|
+
],
|
|
10
|
+
"outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
|
|
11
|
+
"stateMutability": "view"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"type": "function",
|
|
15
|
+
"name": "approve",
|
|
16
|
+
"inputs": [
|
|
17
|
+
{ "name": "spender", "type": "address", "internalType": "address" },
|
|
18
|
+
{ "name": "value", "type": "uint256", "internalType": "uint256" }
|
|
19
|
+
],
|
|
20
|
+
"outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
|
|
21
|
+
"stateMutability": "nonpayable"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"type": "function",
|
|
25
|
+
"name": "balanceOf",
|
|
26
|
+
"inputs": [
|
|
27
|
+
{ "name": "account", "type": "address", "internalType": "address" }
|
|
28
|
+
],
|
|
29
|
+
"outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
|
|
30
|
+
"stateMutability": "view"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"type": "function",
|
|
34
|
+
"name": "totalSupply",
|
|
35
|
+
"inputs": [],
|
|
36
|
+
"outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }],
|
|
37
|
+
"stateMutability": "view"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"type": "function",
|
|
41
|
+
"name": "transfer",
|
|
42
|
+
"inputs": [
|
|
43
|
+
{ "name": "to", "type": "address", "internalType": "address" },
|
|
44
|
+
{ "name": "value", "type": "uint256", "internalType": "uint256" }
|
|
45
|
+
],
|
|
46
|
+
"outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
|
|
47
|
+
"stateMutability": "nonpayable"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"type": "function",
|
|
51
|
+
"name": "transferFrom",
|
|
52
|
+
"inputs": [
|
|
53
|
+
{ "name": "from", "type": "address", "internalType": "address" },
|
|
54
|
+
{ "name": "to", "type": "address", "internalType": "address" },
|
|
55
|
+
{ "name": "value", "type": "uint256", "internalType": "uint256" }
|
|
56
|
+
],
|
|
57
|
+
"outputs": [{ "name": "", "type": "bool", "internalType": "bool" }],
|
|
58
|
+
"stateMutability": "nonpayable"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"type": "event",
|
|
62
|
+
"name": "Approval",
|
|
63
|
+
"inputs": [
|
|
64
|
+
{
|
|
65
|
+
"name": "owner",
|
|
66
|
+
"type": "address",
|
|
67
|
+
"indexed": true,
|
|
68
|
+
"internalType": "address"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "spender",
|
|
72
|
+
"type": "address",
|
|
73
|
+
"indexed": true,
|
|
74
|
+
"internalType": "address"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "value",
|
|
78
|
+
"type": "uint256",
|
|
79
|
+
"indexed": false,
|
|
80
|
+
"internalType": "uint256"
|
|
81
|
+
}
|
|
82
|
+
],
|
|
83
|
+
"anonymous": false
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"type": "event",
|
|
87
|
+
"name": "Transfer",
|
|
88
|
+
"inputs": [
|
|
89
|
+
{
|
|
90
|
+
"name": "from",
|
|
91
|
+
"type": "address",
|
|
92
|
+
"indexed": true,
|
|
93
|
+
"internalType": "address"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "to",
|
|
97
|
+
"type": "address",
|
|
98
|
+
"indexed": true,
|
|
99
|
+
"internalType": "address"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"name": "value",
|
|
103
|
+
"type": "uint256",
|
|
104
|
+
"indexed": false,
|
|
105
|
+
"internalType": "uint256"
|
|
106
|
+
}
|
|
107
|
+
],
|
|
108
|
+
"anonymous": false
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
"""
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from ..signer import Signer
|
|
2
|
+
from ..utils import normalize_address, prepend_zx
|
|
3
|
+
from poly_eip712_structs import make_domain, EIP712Struct
|
|
4
|
+
from eth_utils import keccak
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class BaseBuilder:
|
|
8
|
+
def __init__(
|
|
9
|
+
self, exchange_address: str, chain_id: int, signer: Signer, salt_generator
|
|
10
|
+
):
|
|
11
|
+
self.contract_address = normalize_address(exchange_address)
|
|
12
|
+
self.signer = signer
|
|
13
|
+
self.chain_id = chain_id
|
|
14
|
+
self.domain_separator = self._get_domain_separator(
|
|
15
|
+
self.chain_id, self.contract_address
|
|
16
|
+
)
|
|
17
|
+
self.salt_generator = salt_generator
|
|
18
|
+
|
|
19
|
+
def _get_domain_separator(
|
|
20
|
+
self, chain_id: int, verifying_contract: str
|
|
21
|
+
) -> EIP712Struct:
|
|
22
|
+
return make_domain(
|
|
23
|
+
name="OLAB CTF Exchange",
|
|
24
|
+
version="1",
|
|
25
|
+
chainId=str(chain_id),
|
|
26
|
+
verifyingContract=verifying_contract,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
def _create_struct_hash(self, order: EIP712Struct):
|
|
30
|
+
"""
|
|
31
|
+
Creates an EIP712 compliant struct hash for the Order
|
|
32
|
+
"""
|
|
33
|
+
return prepend_zx(
|
|
34
|
+
keccak(order.signable_bytes(domain=self.domain_separator)).hex()
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
def sign(self, struct_hash):
|
|
38
|
+
"""
|
|
39
|
+
Signs the struct hash
|
|
40
|
+
"""
|
|
41
|
+
return self.signer.sign(struct_hash)
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
from ..signer import Signer
|
|
2
|
+
from .base_builder import BaseBuilder
|
|
3
|
+
from .exception import ValidationException
|
|
4
|
+
from ..utils import generate_seed, normalize_address, prepend_zx
|
|
5
|
+
from ..model.order import Order, SignedOrder, OrderData
|
|
6
|
+
from ..model.sides import BUY, SELL, OrderSide
|
|
7
|
+
from ..model.signatures import EOA, POLY_GNOSIS_SAFE, POLY_PROXY
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class OrderBuilder(BaseBuilder):
|
|
11
|
+
"""
|
|
12
|
+
Order builder
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def __init__(
|
|
16
|
+
self,
|
|
17
|
+
exchange_address: str,
|
|
18
|
+
chain_id: int,
|
|
19
|
+
signer: Signer,
|
|
20
|
+
salt_generator=generate_seed,
|
|
21
|
+
):
|
|
22
|
+
super().__init__(exchange_address, chain_id, signer, salt_generator)
|
|
23
|
+
|
|
24
|
+
def build_order(self, data: OrderData) -> Order:
|
|
25
|
+
"""
|
|
26
|
+
Builds an order
|
|
27
|
+
"""
|
|
28
|
+
if not self._validate_inputs(data):
|
|
29
|
+
raise ValidationException("Invalid order inputs")
|
|
30
|
+
|
|
31
|
+
if data.signer is None:
|
|
32
|
+
data.signer = data.maker
|
|
33
|
+
|
|
34
|
+
if data.signer != self.signer.address():
|
|
35
|
+
raise ValidationException("Signer does not match")
|
|
36
|
+
|
|
37
|
+
if data.expiration is None:
|
|
38
|
+
data.expiration = "0"
|
|
39
|
+
|
|
40
|
+
if data.signatureType is None:
|
|
41
|
+
data.signatureType = EOA
|
|
42
|
+
|
|
43
|
+
return Order(
|
|
44
|
+
salt=int(self.salt_generator()),
|
|
45
|
+
maker=normalize_address(data.maker),
|
|
46
|
+
signer=normalize_address(data.signer),
|
|
47
|
+
taker=normalize_address(data.taker),
|
|
48
|
+
tokenId=int(data.tokenId),
|
|
49
|
+
makerAmount=int(data.makerAmount),
|
|
50
|
+
takerAmount=int(data.takerAmount),
|
|
51
|
+
expiration=int(data.expiration),
|
|
52
|
+
nonce=int(data.nonce),
|
|
53
|
+
feeRateBps=int(data.feeRateBps),
|
|
54
|
+
side=int(data.side.value), # Ensure 'side' is converted to int
|
|
55
|
+
signatureType=int(data.signatureType),
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
def build_order_signature(self, _order: Order) -> str:
|
|
59
|
+
"""
|
|
60
|
+
Signs the order
|
|
61
|
+
"""
|
|
62
|
+
return prepend_zx(self.sign(self._create_struct_hash(_order)))
|
|
63
|
+
|
|
64
|
+
def build_signed_order(self, data: OrderData) -> SignedOrder:
|
|
65
|
+
"""
|
|
66
|
+
Helper function to build and sign a order
|
|
67
|
+
"""
|
|
68
|
+
order = self.build_order(data)
|
|
69
|
+
sig = self.build_order_signature(order)
|
|
70
|
+
|
|
71
|
+
return SignedOrder(order, sig)
|
|
72
|
+
|
|
73
|
+
def _validate_inputs(self, data: OrderData) -> bool:
|
|
74
|
+
return not (
|
|
75
|
+
# ensure required values exist
|
|
76
|
+
data.maker is None
|
|
77
|
+
or data.tokenId is None
|
|
78
|
+
or data.makerAmount is None
|
|
79
|
+
or data.takerAmount is None
|
|
80
|
+
or data.side is None
|
|
81
|
+
or data.side not in [BUY, SELL]
|
|
82
|
+
or not data.feeRateBps.isnumeric()
|
|
83
|
+
or int(data.feeRateBps) < 0
|
|
84
|
+
or not data.nonce.isnumeric()
|
|
85
|
+
or int(data.nonce) < 0
|
|
86
|
+
or not data.expiration.isnumeric()
|
|
87
|
+
or int(data.expiration) < 0
|
|
88
|
+
or data.signatureType is None
|
|
89
|
+
or data.signatureType not in [EOA, POLY_GNOSIS_SAFE, POLY_PROXY]
|
|
90
|
+
)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
from .order_builder import OrderBuilder
|
|
3
|
+
from ..model.order import OrderData
|
|
4
|
+
from ..model.sides import BUY
|
|
5
|
+
from ..model import signatures
|
|
6
|
+
from ..constants import ZERO_ADDRESS
|
|
7
|
+
from ..signer import Signer
|
|
8
|
+
import json
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class TestInterfaces(unittest.TestCase):
|
|
12
|
+
def test_sign_order(self):
|
|
13
|
+
exchange_address = "0xF0aebf65490374a477100351291c736c73c11D9F"
|
|
14
|
+
chain_id = 8453
|
|
15
|
+
# Test private key, please do not use the key in production env.
|
|
16
|
+
signer = Signer("0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80")
|
|
17
|
+
builder = OrderBuilder(exchange_address, chain_id, signer, lambda: 1)
|
|
18
|
+
|
|
19
|
+
print('signer address: {}'.format(signer.address()))
|
|
20
|
+
self.assertEqual(signer.address(), '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266', "invalid signer address")
|
|
21
|
+
# Create and sign the order
|
|
22
|
+
order = builder.build_signed_order(
|
|
23
|
+
OrderData(
|
|
24
|
+
maker='0x8edbd5d17f368a50a7f8c0b1bbc0c9fcd0c2ccb3',
|
|
25
|
+
taker=ZERO_ADDRESS,
|
|
26
|
+
tokenId='102955147056674320605625831094933410586073394253729381009399467166952809400644',
|
|
27
|
+
makerAmount='50',
|
|
28
|
+
takerAmount='100',
|
|
29
|
+
side=BUY,
|
|
30
|
+
feeRateBps='0',
|
|
31
|
+
signer=signer.address(),
|
|
32
|
+
signatureType=signatures.POLY_GNOSIS_SAFE,
|
|
33
|
+
)
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
# Generate the Order and Signature json to be sent to the CLOB API
|
|
37
|
+
print('order: {}'.format(json.dumps(order.dict())))
|
|
38
|
+
expected_signature = '0x4e2fbeb4959ddee243c682d2ebce61785cb03c1accb6b13a058df62d935ddf4941226aaa28dd1d71f150dc1708e9bfc22aab0bbb77690609e5692d2b7fd8ef3d1c'
|
|
39
|
+
self.assertEqual(order.signature, expected_signature, 'unexpected signature')
|
|
40
|
+
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from ..constants import ZERO_ADDRESS
|
|
4
|
+
from .signatures import EOA
|
|
5
|
+
from poly_eip712_structs import Address, EIP712Struct, Uint
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass
|
|
9
|
+
class OrderDataInput:
|
|
10
|
+
marketId: int = None
|
|
11
|
+
"""
|
|
12
|
+
MarketId / TopicId of Given Market
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
tokenId: str = None
|
|
16
|
+
"""
|
|
17
|
+
Token Id of the CTF ERC1155 asset to be bought or sold.
|
|
18
|
+
If BUY, this is the tokenId of the asset to be bought, i.e the makerAssetId
|
|
19
|
+
If SELL, this is the tokenId of the asset to be sold, i.e the takerAssetId
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
makerAmount: str = None
|
|
23
|
+
"""
|
|
24
|
+
Maker amount, i.e the max amount of tokens to be sold
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
price: str = None
|
|
28
|
+
"""
|
|
29
|
+
Price of the token, 2 digits allowed. i.e 0.5 for 50c of token price or 0.49 for 49c of token price
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
side: int = None
|
|
33
|
+
"""
|
|
34
|
+
The side of the order, BUY or SELL
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
orderType: int = None
|
|
38
|
+
"""
|
|
39
|
+
1 for Market Order, 2 for Limit Order
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
@dataclass
|
|
43
|
+
class PlaceOrderDataInput:
|
|
44
|
+
marketId: int = None
|
|
45
|
+
"""
|
|
46
|
+
MarketId / TopicId of Given Market
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
tokenId: str = None
|
|
50
|
+
"""
|
|
51
|
+
Token Id of the CTF ERC1155 asset to be bought or sold.
|
|
52
|
+
If BUY, this is the tokenId of the asset to be bought, i.e the makerAssetId
|
|
53
|
+
If SELL, this is the tokenId of the asset to be sold, i.e the takerAssetId
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
makerAmountInQuoteToken: str = None
|
|
57
|
+
"""
|
|
58
|
+
Maker amount of quote/collateral token, i.e 500 usdc
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
makerAmountInBaseToken: str = None
|
|
62
|
+
"""
|
|
63
|
+
Maker amount of base/conditional token, i.e 500 yes token
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
price: str = None
|
|
67
|
+
"""
|
|
68
|
+
Price of the token, 2 digits allowed. i.e 0.5 for 50c of token price or 0.49 for 49c of token price
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
side: int = None
|
|
72
|
+
"""
|
|
73
|
+
The side of the order, BUY or SELL
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
orderType: int = None
|
|
77
|
+
"""
|
|
78
|
+
1 for Market Order, 2 for Limit Order
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
@dataclass
|
|
82
|
+
class OrderData:
|
|
83
|
+
"""
|
|
84
|
+
Inputs to generate orders
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
maker: str = None
|
|
88
|
+
"""
|
|
89
|
+
Maker of the order, i.e the source of funds for the order
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
taker: str = ZERO_ADDRESS
|
|
93
|
+
"""
|
|
94
|
+
Address of the order taker. The zero address is used to indicate a public order
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
tokenId: str = None
|
|
98
|
+
"""
|
|
99
|
+
Token Id of the CTF ERC1155 asset to be bought or sold.
|
|
100
|
+
If BUY, this is the tokenId of the asset to be bought, i.e the makerAssetId
|
|
101
|
+
If SELL, this is the tokenId of the asset to be sold, i.e the takerAssetId
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
makerAmount: str = None
|
|
105
|
+
"""
|
|
106
|
+
Maker amount, i.e the max amount of tokens to be sold
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
takerAmount: str = None
|
|
110
|
+
"""
|
|
111
|
+
Taker amount, i.e the minimum amount of tokens to be received
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
side: int = None
|
|
115
|
+
"""
|
|
116
|
+
The side of the order, BUY or SELL
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
feeRateBps: str = None
|
|
120
|
+
"""
|
|
121
|
+
Fee rate, in basis points, charged to the order maker, charged on proceeds
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
nonce: str = "0"
|
|
125
|
+
"""
|
|
126
|
+
Nonce used for onchain cancellations
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
signer: str = None
|
|
130
|
+
"""
|
|
131
|
+
Signer of the order. Optional, if it is not present the signer is the maker of the order.
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
expiration: str = "0"
|
|
135
|
+
"""
|
|
136
|
+
Timestamp after which the order is expired.
|
|
137
|
+
Optional, if it is not present the value is '0' (no expiration)
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
signatureType: int = EOA
|
|
141
|
+
"""
|
|
142
|
+
Signature type used by the Order. Default value 'EOA'
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class Order(EIP712Struct):
|
|
147
|
+
"""
|
|
148
|
+
Order
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
# NOTE: Important to keep in mind, fields are ordered
|
|
152
|
+
|
|
153
|
+
salt = Uint(256)
|
|
154
|
+
"""
|
|
155
|
+
Unique salt to ensure entropy
|
|
156
|
+
"""
|
|
157
|
+
|
|
158
|
+
maker = Address()
|
|
159
|
+
"""
|
|
160
|
+
Maker of the order, i.e the source of funds for the order
|
|
161
|
+
"""
|
|
162
|
+
|
|
163
|
+
signer = Address()
|
|
164
|
+
"""
|
|
165
|
+
Signer of the order
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
taker = Address()
|
|
169
|
+
"""
|
|
170
|
+
Address of the order taker. The zero address is used to indicate a public order
|
|
171
|
+
"""
|
|
172
|
+
|
|
173
|
+
tokenId = Uint(256)
|
|
174
|
+
"""
|
|
175
|
+
Token Id of the CTF ERC1155 asset to be bought or sold.
|
|
176
|
+
If BUY, this is the tokenId of the asset to be bought, i.e the makerAssetId
|
|
177
|
+
If SELL, this is the tokenId of the asset to be sold, i.e the takerAssetId
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
makerAmount = Uint(256)
|
|
181
|
+
"""
|
|
182
|
+
Maker amount, i.e the max amount of tokens to be sold
|
|
183
|
+
"""
|
|
184
|
+
|
|
185
|
+
takerAmount = Uint(256)
|
|
186
|
+
"""
|
|
187
|
+
Taker amount, i.e the minimum amount of tokens to be received
|
|
188
|
+
"""
|
|
189
|
+
|
|
190
|
+
expiration = Uint(256)
|
|
191
|
+
"""
|
|
192
|
+
Timestamp after which the order is expired
|
|
193
|
+
"""
|
|
194
|
+
|
|
195
|
+
nonce = Uint(256)
|
|
196
|
+
"""
|
|
197
|
+
Nonce used for onchain cancellations
|
|
198
|
+
"""
|
|
199
|
+
|
|
200
|
+
feeRateBps = Uint(256)
|
|
201
|
+
"""
|
|
202
|
+
Fee rate, in basis points, charged to the order maker, charged on proceeds
|
|
203
|
+
"""
|
|
204
|
+
|
|
205
|
+
side = Uint(8)
|
|
206
|
+
"""
|
|
207
|
+
The side of the order, BUY or SELL
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
signatureType = Uint(8)
|
|
211
|
+
"""
|
|
212
|
+
Signature type used by the Order
|
|
213
|
+
"""
|
|
214
|
+
|
|
215
|
+
def dict(self):
|
|
216
|
+
return {
|
|
217
|
+
"salt": self["salt"],
|
|
218
|
+
"maker": self["maker"],
|
|
219
|
+
"signer": self["signer"],
|
|
220
|
+
"taker": self["taker"],
|
|
221
|
+
"tokenId": self["tokenId"],
|
|
222
|
+
"makerAmount": self["makerAmount"],
|
|
223
|
+
"takerAmount": self["takerAmount"],
|
|
224
|
+
"expiration": self["expiration"],
|
|
225
|
+
"nonce": self["nonce"],
|
|
226
|
+
"feeRateBps": self["feeRateBps"],
|
|
227
|
+
"side": self["side"],
|
|
228
|
+
"signatureType": self["signatureType"],
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
@dataclass
|
|
233
|
+
class SignedOrder:
|
|
234
|
+
"""
|
|
235
|
+
Order + Signature
|
|
236
|
+
"""
|
|
237
|
+
|
|
238
|
+
order: Order
|
|
239
|
+
signature: str
|
|
240
|
+
|
|
241
|
+
def dict(self):
|
|
242
|
+
d = self.order.dict()
|
|
243
|
+
d["signature"] = self.signature
|
|
244
|
+
if d["side"] == 0:
|
|
245
|
+
d["side"] = "BUY"
|
|
246
|
+
else:
|
|
247
|
+
d["side"] = "SELL"
|
|
248
|
+
d["expiration"] = str(d["expiration"])
|
|
249
|
+
d["nonce"] = str(d["nonce"])
|
|
250
|
+
d["feeRateBps"] = str(d["feeRateBps"])
|
|
251
|
+
d["makerAmount"] = str(d["makerAmount"])
|
|
252
|
+
d["takerAmount"] = str(d["takerAmount"])
|
|
253
|
+
d["tokenId"] = str(d["tokenId"])
|
|
254
|
+
return d
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from eth_account import Account
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Signer:
|
|
5
|
+
"""
|
|
6
|
+
Signs orders using a private key
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
def __init__(self, key: str):
|
|
10
|
+
self._key = key
|
|
11
|
+
self.account = Account.from_key(key)
|
|
12
|
+
|
|
13
|
+
def sign(self, struct_hash) -> str:
|
|
14
|
+
"""
|
|
15
|
+
Signs an EIP712 struct hash
|
|
16
|
+
"""
|
|
17
|
+
return Account._sign_hash(struct_hash, self._key).signature.hex()
|
|
18
|
+
|
|
19
|
+
def address(self) -> str:
|
|
20
|
+
return self.account.address
|