@coti-io/coti-contracts 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/.github/workflows/npm-publish.yml +52 -0
  2. package/CODE_OF_CONDUCT.md +44 -0
  3. package/CONTRIBUTING.md +101 -0
  4. package/LICENSE +201 -0
  5. package/README.md +48 -0
  6. package/contracts/access/DataPrivacyFramework/DataPrivacyFramework.sol +480 -0
  7. package/contracts/access/DataPrivacyFramework/README.md +68 -0
  8. package/contracts/access/DataPrivacyFramework/extensions/DataPrivacyFrameworkMpc.sol +1139 -0
  9. package/contracts/mocks/README.md +5 -0
  10. package/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock.sol +9 -0
  11. package/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.sol +17 -0
  12. package/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock.sol +34 -0
  13. package/contracts/mocks/utils/mpc/ArithmeticTestsContract.sol +431 -0
  14. package/contracts/mocks/utils/mpc/BitwiseTestsContract.sol +361 -0
  15. package/contracts/mocks/utils/mpc/Comparison1Tests.Contract.sol +307 -0
  16. package/contracts/mocks/utils/mpc/Comparison2TestsContract.sol +307 -0
  17. package/contracts/mocks/utils/mpc/MinMaxTestsContract.sol +297 -0
  18. package/contracts/mocks/utils/mpc/Miscellaneous1TestsContract.sol +185 -0
  19. package/contracts/mocks/utils/mpc/Miscellaneous2TestsContract.sol +448 -0
  20. package/contracts/mocks/utils/mpc/OffboardToUserKeyTestsContract.sol +81 -0
  21. package/contracts/mocks/utils/mpc/README.md +486 -0
  22. package/contracts/mocks/utils/mpc/ShiftTestsContract.sol +311 -0
  23. package/contracts/mocks/utils/mpc/StringTestsContract.sol +59 -0
  24. package/contracts/mocks/utils/mpc/TransferScalarTestsContract.sol +271 -0
  25. package/contracts/mocks/utils/mpc/TransferTestsContract.sol +715 -0
  26. package/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock.sol +25 -0
  27. package/contracts/onboard/AccountOnboard.sol +21 -0
  28. package/contracts/onboard/README.md +65 -0
  29. package/contracts/package.json +11 -0
  30. package/contracts/token/PrivateERC20/IPrivateERC20.sol +142 -0
  31. package/contracts/token/PrivateERC20/PrivateERC20.sol +478 -0
  32. package/contracts/token/PrivateERC20/README.md +104 -0
  33. package/contracts/token/PrivateERC721/PrivateERC721.sol +458 -0
  34. package/contracts/token/PrivateERC721/README.md +282 -0
  35. package/contracts/token/PrivateERC721/extensions/PrivateERC721URIStorage.sol +87 -0
  36. package/contracts/utils/mpc/MpcCore.sol +3215 -0
  37. package/contracts/utils/mpc/MpcInterface.sol +41 -0
  38. package/contracts/utils/mpc/README.md +82 -0
  39. package/hardhat.config.ts +18 -0
  40. package/package.json +14 -0
  41. package/test/access/DataPrivacyFramework/DataPrivacyFramework.test.ts +780 -0
  42. package/test/onboard/AccountOnboard.test.ts +45 -0
  43. package/test/token/PrivateERC20/PrivateERC20.test.ts +546 -0
  44. package/test/token/PrivateERC721/PrivateERC721.test.ts +223 -0
  45. package/test/utils/accounts.ts +55 -0
  46. package/test/utils/mpc/Precompile.test.ts +113 -0
  47. package/test/utils/mpc/String.test.ts +227 -0
  48. package/tsconfig.json +11 -0
  49. package/typechain-types/@openzeppelin/contracts/index.ts +9 -0
  50. package/typechain-types/@openzeppelin/contracts/interfaces/IERC4906.ts +462 -0
  51. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts +69 -0
  52. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts +69 -0
  53. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts +69 -0
  54. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
  55. package/typechain-types/@openzeppelin/contracts/interfaces/index.ts +6 -0
  56. package/typechain-types/@openzeppelin/contracts/token/ERC721/IERC721.ts +393 -0
  57. package/typechain-types/@openzeppelin/contracts/token/ERC721/IERC721Receiver.ts +110 -0
  58. package/typechain-types/@openzeppelin/contracts/token/ERC721/index.ts +5 -0
  59. package/typechain-types/@openzeppelin/contracts/token/index.ts +5 -0
  60. package/typechain-types/@openzeppelin/contracts/utils/index.ts +5 -0
  61. package/typechain-types/@openzeppelin/contracts/utils/introspection/ERC165.ts +94 -0
  62. package/typechain-types/@openzeppelin/contracts/utils/introspection/IERC165.ts +94 -0
  63. package/typechain-types/@openzeppelin/contracts/utils/introspection/index.ts +5 -0
  64. package/typechain-types/@openzeppelin/index.ts +5 -0
  65. package/typechain-types/common.ts +131 -0
  66. package/typechain-types/contracts/access/DataPrivacyFramework/DataPrivacyFramework.ts +598 -0
  67. package/typechain-types/contracts/access/DataPrivacyFramework/extensions/DataPrivacyFrameworkMpc.ts +598 -0
  68. package/typechain-types/contracts/access/DataPrivacyFramework/extensions/index.ts +4 -0
  69. package/typechain-types/contracts/access/DataPrivacyFramework/index.ts +6 -0
  70. package/typechain-types/contracts/access/index.ts +5 -0
  71. package/typechain-types/contracts/index.ts +13 -0
  72. package/typechain-types/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock.ts +598 -0
  73. package/typechain-types/contracts/mocks/access/DataPrivacyFramework/index.ts +4 -0
  74. package/typechain-types/contracts/mocks/access/index.ts +5 -0
  75. package/typechain-types/contracts/mocks/index.ts +11 -0
  76. package/typechain-types/contracts/mocks/token/PrivateERC20/PrivateERC20Mock.ts +543 -0
  77. package/typechain-types/contracts/mocks/token/PrivateERC20/index.ts +4 -0
  78. package/typechain-types/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock.ts +576 -0
  79. package/typechain-types/contracts/mocks/token/PrivateERC721/index.ts +4 -0
  80. package/typechain-types/contracts/mocks/token/index.ts +7 -0
  81. package/typechain-types/contracts/mocks/utils/index.ts +5 -0
  82. package/typechain-types/contracts/mocks/utils/mpc/ArithmeticTestsContract.ts +354 -0
  83. package/typechain-types/contracts/mocks/utils/mpc/BitwiseTestsContract.ts +340 -0
  84. package/typechain-types/contracts/mocks/utils/mpc/Comparison1Tests.Contract.sol/Comparison1TestsContract.ts +340 -0
  85. package/typechain-types/contracts/mocks/utils/mpc/Comparison1Tests.Contract.sol/index.ts +4 -0
  86. package/typechain-types/contracts/mocks/utils/mpc/Comparison2TestsContract.ts +340 -0
  87. package/typechain-types/contracts/mocks/utils/mpc/MinMaxTestsContract.ts +321 -0
  88. package/typechain-types/contracts/mocks/utils/mpc/Miscellaneous1TestsContract.ts +199 -0
  89. package/typechain-types/contracts/mocks/utils/mpc/Miscellaneous2TestsContract.ts +384 -0
  90. package/typechain-types/contracts/mocks/utils/mpc/OffboardToUserKeyTestsContract.sol/OffboardToUserKeyTestContract.ts +218 -0
  91. package/typechain-types/contracts/mocks/utils/mpc/OffboardToUserKeyTestsContract.sol/index.ts +4 -0
  92. package/typechain-types/contracts/mocks/utils/mpc/ShiftTestsContract.ts +339 -0
  93. package/typechain-types/contracts/mocks/utils/mpc/StringTestsContract.ts +211 -0
  94. package/typechain-types/contracts/mocks/utils/mpc/TransferScalarTestsContract.ts +266 -0
  95. package/typechain-types/contracts/mocks/utils/mpc/TransferTestsContract.ts +288 -0
  96. package/typechain-types/contracts/mocks/utils/mpc/index.ts +17 -0
  97. package/typechain-types/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock.ts +173 -0
  98. package/typechain-types/contracts/mocks/wallet/PrivateERC20Wallet/index.ts +4 -0
  99. package/typechain-types/contracts/mocks/wallet/index.ts +5 -0
  100. package/typechain-types/contracts/onboard/AccountOnboard.ts +135 -0
  101. package/typechain-types/contracts/onboard/index.ts +4 -0
  102. package/typechain-types/contracts/token/PrivateERC20/IPrivateERC20.ts +437 -0
  103. package/typechain-types/contracts/token/PrivateERC20/PrivateERC20.ts +505 -0
  104. package/typechain-types/contracts/token/PrivateERC20/index.ts +5 -0
  105. package/typechain-types/contracts/token/PrivateERC721/PrivateERC721.ts +409 -0
  106. package/typechain-types/contracts/token/PrivateERC721/extensions/PrivateERC721URIStorage.ts +501 -0
  107. package/typechain-types/contracts/token/PrivateERC721/extensions/index.ts +4 -0
  108. package/typechain-types/contracts/token/PrivateERC721/index.ts +6 -0
  109. package/typechain-types/contracts/token/index.ts +7 -0
  110. package/typechain-types/contracts/utils/index.ts +5 -0
  111. package/typechain-types/contracts/utils/mpc/MpcInterface.sol/ExtendedOperations.ts +698 -0
  112. package/typechain-types/contracts/utils/mpc/MpcInterface.sol/index.ts +4 -0
  113. package/typechain-types/contracts/utils/mpc/index.ts +5 -0
  114. package/typechain-types/factories/@openzeppelin/contracts/index.ts +6 -0
  115. package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC4906__factory.ts +339 -0
  116. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts +127 -0
  117. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts +111 -0
  118. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts +128 -0
  119. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
  120. package/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts +5 -0
  121. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/IERC721Receiver__factory.ts +59 -0
  122. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/IERC721__factory.ts +307 -0
  123. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/index.ts +5 -0
  124. package/typechain-types/factories/@openzeppelin/contracts/token/index.ts +4 -0
  125. package/typechain-types/factories/@openzeppelin/contracts/utils/index.ts +4 -0
  126. package/typechain-types/factories/@openzeppelin/contracts/utils/introspection/ERC165__factory.ts +41 -0
  127. package/typechain-types/factories/@openzeppelin/contracts/utils/introspection/IERC165__factory.ts +41 -0
  128. package/typechain-types/factories/@openzeppelin/contracts/utils/introspection/index.ts +5 -0
  129. package/typechain-types/factories/@openzeppelin/index.ts +4 -0
  130. package/typechain-types/factories/contracts/access/DataPrivacyFramework/DataPrivacyFramework__factory.ts +621 -0
  131. package/typechain-types/factories/contracts/access/DataPrivacyFramework/extensions/DataPrivacyFrameworkMpc__factory.ts +621 -0
  132. package/typechain-types/factories/contracts/access/DataPrivacyFramework/extensions/index.ts +4 -0
  133. package/typechain-types/factories/contracts/access/DataPrivacyFramework/index.ts +5 -0
  134. package/typechain-types/factories/contracts/access/index.ts +4 -0
  135. package/typechain-types/factories/contracts/index.ts +8 -0
  136. package/typechain-types/factories/contracts/mocks/access/DataPrivacyFramework/DataPrivacyFrameworkMock__factory.ts +670 -0
  137. package/typechain-types/factories/contracts/mocks/access/DataPrivacyFramework/index.ts +4 -0
  138. package/typechain-types/factories/contracts/mocks/access/index.ts +4 -0
  139. package/typechain-types/factories/contracts/mocks/index.ts +7 -0
  140. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/PrivateERC20Mock__factory.ts +615 -0
  141. package/typechain-types/factories/contracts/mocks/token/PrivateERC20/index.ts +4 -0
  142. package/typechain-types/factories/contracts/mocks/token/PrivateERC721/PrivateERC721URIStorageMock__factory.ts +630 -0
  143. package/typechain-types/factories/contracts/mocks/token/PrivateERC721/index.ts +4 -0
  144. package/typechain-types/factories/contracts/mocks/token/index.ts +5 -0
  145. package/typechain-types/factories/contracts/mocks/utils/index.ts +4 -0
  146. package/typechain-types/factories/contracts/mocks/utils/mpc/ArithmeticTestsContract__factory.ts +374 -0
  147. package/typechain-types/factories/contracts/mocks/utils/mpc/BitwiseTestsContract__factory.ts +361 -0
  148. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison1Tests.Contract.sol/Comparison1TestsContract__factory.ts +361 -0
  149. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison1Tests.Contract.sol/index.ts +4 -0
  150. package/typechain-types/factories/contracts/mocks/utils/mpc/Comparison2TestsContract__factory.ts +361 -0
  151. package/typechain-types/factories/contracts/mocks/utils/mpc/MinMaxTestsContract__factory.ts +337 -0
  152. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous1TestsContract__factory.ts +236 -0
  153. package/typechain-types/factories/contracts/mocks/utils/mpc/Miscellaneous2TestsContract__factory.ts +432 -0
  154. package/typechain-types/factories/contracts/mocks/utils/mpc/OffboardToUserKeyTestsContract.sol/OffboardToUserKeyTestContract__factory.ts +245 -0
  155. package/typechain-types/factories/contracts/mocks/utils/mpc/OffboardToUserKeyTestsContract.sol/index.ts +4 -0
  156. package/typechain-types/factories/contracts/mocks/utils/mpc/ShiftTestsContract__factory.ts +374 -0
  157. package/typechain-types/factories/contracts/mocks/utils/mpc/StringTestsContract__factory.ts +264 -0
  158. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferScalarTestsContract__factory.ts +360 -0
  159. package/typechain-types/factories/contracts/mocks/utils/mpc/TransferTestsContract__factory.ts +441 -0
  160. package/typechain-types/factories/contracts/mocks/utils/mpc/index.ts +15 -0
  161. package/typechain-types/factories/contracts/mocks/wallet/PrivateERC20Wallet/PrivateERC20WalletMock__factory.ts +194 -0
  162. package/typechain-types/factories/contracts/mocks/wallet/PrivateERC20Wallet/index.ts +4 -0
  163. package/typechain-types/factories/contracts/mocks/wallet/index.ts +4 -0
  164. package/typechain-types/factories/contracts/onboard/AccountOnboard__factory.ts +104 -0
  165. package/typechain-types/factories/contracts/onboard/index.ts +4 -0
  166. package/typechain-types/factories/contracts/token/PrivateERC20/IPrivateERC20__factory.ts +406 -0
  167. package/typechain-types/factories/contracts/token/PrivateERC20/PrivateERC20__factory.ts +532 -0
  168. package/typechain-types/factories/contracts/token/PrivateERC20/index.ts +5 -0
  169. package/typechain-types/factories/contracts/token/PrivateERC721/PrivateERC721__factory.ts +439 -0
  170. package/typechain-types/factories/contracts/token/PrivateERC721/extensions/PrivateERC721URIStorage__factory.ts +512 -0
  171. package/typechain-types/factories/contracts/token/PrivateERC721/extensions/index.ts +4 -0
  172. package/typechain-types/factories/contracts/token/PrivateERC721/index.ts +5 -0
  173. package/typechain-types/factories/contracts/token/index.ts +5 -0
  174. package/typechain-types/factories/contracts/utils/index.ts +4 -0
  175. package/typechain-types/factories/contracts/utils/mpc/MpcInterface.sol/ExtendedOperations__factory.ts +919 -0
  176. package/typechain-types/factories/contracts/utils/mpc/MpcInterface.sol/index.ts +4 -0
  177. package/typechain-types/factories/contracts/utils/mpc/index.ts +4 -0
  178. package/typechain-types/factories/index.ts +5 -0
  179. package/typechain-types/hardhat.d.ts +621 -0
  180. package/typechain-types/index.ts +72 -0
@@ -0,0 +1,780 @@
1
+ // Data Privacy Framework (last updated v0.1.0)
2
+
3
+ import hre from "hardhat"
4
+ import { expect } from "chai"
5
+ import { setupAccounts } from "../../utils/accounts"
6
+ import { DataPrivacyFramework } from "../../../typechain-types"
7
+
8
+ async function deploy() {
9
+ const [owner, otherAccount] = await setupAccounts()
10
+
11
+ const DataPrivacyFrameworkMock = await hre.ethers.getContractFactory("DataPrivacyFrameworkMock")
12
+
13
+ const dataPrivacyFrameworkMock = await DataPrivacyFrameworkMock
14
+ .connect(owner)
15
+ .deploy()
16
+
17
+ const contract = await dataPrivacyFrameworkMock.waitForDeployment()
18
+
19
+ return { contract, contractAddress: await contract.getAddress(), owner, otherAccount }
20
+ }
21
+
22
+ describe("Data Privacy Framework", function () {
23
+ let deployment: Awaited<ReturnType<typeof deploy>>
24
+
25
+ before(async function () {
26
+ deployment = await deploy()
27
+ })
28
+
29
+ describe("Deployment", function () {
30
+ it("Deployed address should not be undefined", async function () {
31
+ const { contractAddress } = deployment
32
+
33
+ expect(contractAddress).to.not.equal(undefined)
34
+ })
35
+ })
36
+
37
+ describe("Allowing operations", function () {
38
+ it("Should remove '*' from the allowed operations mapping", async function () {
39
+ const { contract } = deployment
40
+
41
+ const tx = await contract.removeAllowedOperation("*")
42
+
43
+ await tx.wait()
44
+
45
+ const isAllowed = await contract.allowedOperations("*")
46
+
47
+ expect(isAllowed).to.equal(false)
48
+ })
49
+
50
+ it("Should update the allowed operations mapping", async function () {
51
+ const { contract } = deployment
52
+
53
+ const tx = await contract.addAllowedOperation("*")
54
+
55
+ await tx.wait()
56
+
57
+ const isAllowed = await contract.allowedOperations("*")
58
+
59
+ expect(isAllowed).to.equal(true)
60
+ })
61
+
62
+ it("Should allow all operations for all users", async function () {
63
+ const { contract } = deployment
64
+
65
+ const permissionGranted = await contract["isOperationAllowed(address,string)"](
66
+ "0xB75fc724A3F951b6D25310d476893b60f4B77C8F", // random address
67
+ "yzfsvycmua" // random string
68
+ )
69
+
70
+ expect(permissionGranted).to.equal(true)
71
+ })
72
+ })
73
+
74
+ describe("Restricting operations", function () {
75
+ before(async function() {
76
+ const { contract } = deployment
77
+
78
+ const tx = await contract.addRestrictedOperation("decrypt")
79
+
80
+ await tx.wait()
81
+ })
82
+
83
+ it("Should add 'decrypt' to the restricted operations mapping", async function () {
84
+ const { contract } = deployment
85
+
86
+ const isRestricted = await contract.restrictedOperations("decrypt")
87
+
88
+ expect(isRestricted).to.equal(true)
89
+ })
90
+
91
+ it("Should not allow any user to decrypt", async function () {
92
+ const { contract } = deployment
93
+
94
+ const permissionGranted = await contract["isOperationAllowed(address,string)"](
95
+ "0xb818166f592329B1c6122c447E078425AF522e96", // random address
96
+ "decrypt"
97
+ )
98
+
99
+ expect(permissionGranted).to.equal(false)
100
+ })
101
+
102
+ it("Should allow all other operations for all users", async function () {
103
+ const { contract } = deployment
104
+
105
+ const permissionGranted = await contract["isOperationAllowed(address,string)"](
106
+ "0x21AF6033aaC0E75eD898a9742183aC06B562bc92", // random address
107
+ "mztsdimwve" // random string
108
+ )
109
+
110
+ expect(permissionGranted).to.equal(true)
111
+ })
112
+
113
+ it("Should remove 'decrypt' from the restricted operations mapping", async function () {
114
+ const { contract } = deployment
115
+
116
+ const tx = await contract.removeRestrictedOperation("decrypt")
117
+
118
+ await tx.wait()
119
+
120
+ const isRestricted = await contract.restrictedOperations("decrypt")
121
+
122
+ expect(isRestricted).to.equal(false)
123
+ })
124
+
125
+ after(async function() {
126
+ const { contract } = deployment
127
+
128
+ let tx = await contract.removeAllowedOperation("*")
129
+
130
+ await tx.wait()
131
+
132
+ tx = await contract.addAllowedOperation("gt")
133
+
134
+ await tx.wait()
135
+ })
136
+ })
137
+
138
+ describe("Updating default permissions", function () {
139
+ before(async function() {
140
+ const { contract } = deployment
141
+
142
+ let tx = await contract.setAddressDefaultPermission(false)
143
+
144
+ await tx.wait()
145
+
146
+ tx = await contract.setOperationDefaultPermission(false)
147
+
148
+ await tx.wait()
149
+ })
150
+
151
+ it("Should set default address permissions to false", async function () {
152
+ const { contract } = deployment
153
+
154
+ const defaultPermission = await contract.addressDefaultPermission()
155
+
156
+ expect(defaultPermission).to.equal(false)
157
+ })
158
+
159
+ it("Should set default operation permissions to false", async function () {
160
+ const { contract } = deployment
161
+
162
+ const defaultPermission = await contract.operationDefaultPermission()
163
+
164
+ expect(defaultPermission).to.equal(false)
165
+ })
166
+ })
167
+
168
+ describe("Setting permissions", function () {
169
+ before(async function() {
170
+ const { contract } = deployment
171
+
172
+ let inputData: DataPrivacyFramework.InputDataStruct = {
173
+ caller: "0x0000000000000000000000000000000000000001",
174
+ operation: "*",
175
+ active: false,
176
+ timestampBefore: "0",
177
+ timestampAfter: "0",
178
+ falseKey: false,
179
+ trueKey: false,
180
+ uintParameter: "0",
181
+ addressParameter: "0x0000000000000000000000000000000000000000",
182
+ stringParameter: ""
183
+ }
184
+
185
+ let tx = await contract.setPermission(inputData)
186
+
187
+ await tx.wait()
188
+
189
+ inputData = {
190
+ caller: "0x70D6c0e13B60964D3A3e372Dd86acA7b75dcc562",
191
+ operation: "gt",
192
+ active: true,
193
+ timestampBefore: "0",
194
+ timestampAfter: "0",
195
+ falseKey: false,
196
+ trueKey: false,
197
+ uintParameter: "0",
198
+ addressParameter: "0x0000000000000000000000000000000000000000",
199
+ stringParameter: ""
200
+ }
201
+
202
+ tx = await contract.setPermission(inputData)
203
+
204
+ await tx.wait()
205
+ })
206
+
207
+ it("Should update the permissions mapping", async function () {
208
+ const { contract } = deployment
209
+
210
+ const conditionIdx = await contract.permissions("0x70D6c0e13B60964D3A3e372Dd86acA7b75dcc562", "gt")
211
+
212
+ expect(conditionIdx).to.equal(3)
213
+ })
214
+
215
+ it("Should update the conditions mapping", async function () {
216
+ const { contract } = deployment
217
+
218
+ const condition = await contract.conditions(3)
219
+
220
+ expect(condition[0]).to.equal(BigInt(3))
221
+ expect(condition[1]).to.equal("0x70D6c0e13B60964D3A3e372Dd86acA7b75dcc562")
222
+ expect(condition[2]).to.equal("gt")
223
+ expect(condition[3]).to.equal(true)
224
+ expect(condition[4]).to.equal(false)
225
+ expect(condition[5]).to.equal(false)
226
+ expect(condition[6]).to.equal(BigInt(0))
227
+ expect(condition[7]).to.equal(BigInt(0))
228
+ expect(condition[8]).to.equal(BigInt(0))
229
+ expect(condition[9]).to.equal("0x0000000000000000000000000000000000000000")
230
+ expect(condition[10]).to.equal("")
231
+ })
232
+
233
+ it("Should update the activePermissions mapping", async function () {
234
+ const { contract } = deployment
235
+
236
+ const rows = await contract.activePermissions("0x70D6c0e13B60964D3A3e372Dd86acA7b75dcc562")
237
+
238
+ expect(rows).to.equal(1)
239
+ })
240
+
241
+ it("Should allow 0x70D6c0e13B60964D3A3e372Dd86acA7b75dcc562 to compute gt", async function () {
242
+ const { contract } = deployment
243
+
244
+ const permissionGranted = await contract["isOperationAllowed(address,string)"](
245
+ "0x70D6c0e13B60964D3A3e372Dd86acA7b75dcc562",
246
+ "gt"
247
+ )
248
+
249
+ expect(permissionGranted).to.equal(true)
250
+ })
251
+
252
+ it("Should not allow other addresses to compute gt", async function () {
253
+ const { contract } = deployment
254
+
255
+ const permissionGranted = await contract["isOperationAllowed(address,string)"](
256
+ "0x7dc13edFF17da7e6D903573E688A5e06746B85e1", // random address
257
+ "gt"
258
+ )
259
+
260
+ expect(permissionGranted).to.equal(false)
261
+ })
262
+
263
+ it("Should not increment activePermissions", async function () {
264
+ const { contract } = deployment
265
+
266
+ const inputData: DataPrivacyFramework.InputDataStruct = {
267
+ caller: "0x70D6c0e13B60964D3A3e372Dd86acA7b75dcc562",
268
+ operation: "gt",
269
+ active: true,
270
+ timestampBefore: "0",
271
+ timestampAfter: "0",
272
+ falseKey: false,
273
+ trueKey: false,
274
+ uintParameter: "0",
275
+ addressParameter: "0x0000000000000000000000000000000000000001",
276
+ stringParameter: ""
277
+ }
278
+
279
+ const tx = await contract.setPermission(inputData)
280
+
281
+ await tx.wait()
282
+
283
+ const activePermissions = await contract.activePermissions("0x70D6c0e13B60964D3A3e372Dd86acA7b75dcc562")
284
+
285
+ expect(activePermissions).to.equal(1)
286
+ })
287
+
288
+ it("Should decrement activePermissions", async function () {
289
+ const { contract } = deployment
290
+
291
+ const inputData: DataPrivacyFramework.InputDataStruct = {
292
+ caller: "0x70D6c0e13B60964D3A3e372Dd86acA7b75dcc562",
293
+ operation: "gt",
294
+ active: false,
295
+ timestampBefore: "0",
296
+ timestampAfter: "0",
297
+ falseKey: false,
298
+ trueKey: false,
299
+ uintParameter: "0",
300
+ addressParameter: "0x0000000000000000000000000000000000000001",
301
+ stringParameter: ""
302
+ }
303
+
304
+ const tx = await contract.setPermission(inputData)
305
+
306
+ await tx.wait()
307
+
308
+ const activePermissions = await contract.activePermissions("0x70D6c0e13B60964D3A3e372Dd86acA7b75dcc562")
309
+
310
+ expect(activePermissions).to.equal(0)
311
+ })
312
+
313
+ it("Should increment activePermissions", async function () {
314
+ const { contract } = deployment
315
+
316
+ const inputData: DataPrivacyFramework.InputDataStruct = {
317
+ caller: "0x70D6c0e13B60964D3A3e372Dd86acA7b75dcc562",
318
+ operation: "gt",
319
+ active: true,
320
+ timestampBefore: "0",
321
+ timestampAfter: "0",
322
+ falseKey: false,
323
+ trueKey: false,
324
+ uintParameter: "0",
325
+ addressParameter: "0x0000000000000000000000000000000000000001",
326
+ stringParameter: ""
327
+ }
328
+
329
+ const tx = await contract.setPermission(inputData)
330
+
331
+ await tx.wait()
332
+
333
+ const activePermissions = await contract.activePermissions("0x70D6c0e13B60964D3A3e372Dd86acA7b75dcc562")
334
+
335
+ expect(activePermissions).to.equal(1)
336
+ })
337
+ })
338
+
339
+ describe("Downloading conditions table", function () {
340
+ before(async function() {
341
+ const { contract } = deployment
342
+
343
+ let inputData: DataPrivacyFramework.InputDataStruct = {
344
+ caller: "0x2943dE47d15538a99C25246Ac8628da5D3EC7DA8",
345
+ operation: "ntyxygayec",
346
+ active: true,
347
+ timestampBefore: "0",
348
+ timestampAfter: "0",
349
+ falseKey: false,
350
+ trueKey: false,
351
+ uintParameter: "0",
352
+ addressParameter: "0x0000000000000000000000000000000000000000",
353
+ stringParameter: ""
354
+ }
355
+
356
+ let tx = await contract.setPermission(inputData)
357
+
358
+ await tx.wait()
359
+
360
+ inputData = {
361
+ caller: "0x9794eA465f89231eaaB730d87A2083E1ae091Bc6",
362
+ operation: "gkdswnhthi",
363
+ active: true,
364
+ timestampBefore: "0",
365
+ timestampAfter: "0",
366
+ falseKey: false,
367
+ trueKey: false,
368
+ uintParameter: "0",
369
+ addressParameter: "0x0000000000000000000000000000000000000000",
370
+ stringParameter: ""
371
+ }
372
+
373
+ tx = await contract.setPermission(inputData)
374
+
375
+ await tx.wait()
376
+
377
+ inputData = {
378
+ caller: "0x377005C508C0a44Ee986fA344A61FDCA453Cb31F",
379
+ operation: "zqotxlwxwz",
380
+ active: true,
381
+ timestampBefore: "0",
382
+ timestampAfter: "0",
383
+ falseKey: false,
384
+ trueKey: false,
385
+ uintParameter: "0",
386
+ addressParameter: "0x0000000000000000000000000000000000000000",
387
+ stringParameter: ""
388
+ }
389
+
390
+ tx = await contract.setPermission(inputData)
391
+
392
+ await tx.wait()
393
+ })
394
+
395
+ it("Should return the first two conditions", async function () {
396
+ const { contract } = deployment
397
+
398
+ const conditions = await contract.getConditions(1, 2)
399
+
400
+ expect(conditions.length).to.equal(2)
401
+ })
402
+
403
+ it("Should return the third, fourth and fifth conditions", async function () {
404
+ const { contract } = deployment
405
+
406
+ const conditions = await contract.getConditions(3, 3)
407
+
408
+ expect(conditions.length).to.equal(3)
409
+ })
410
+
411
+ it("Should return the fifth condition", async function () {
412
+ const { contract } = deployment
413
+
414
+ const conditions = await contract.getConditions(6, 2)
415
+
416
+ expect(conditions.length).to.equal(1)
417
+ })
418
+ })
419
+
420
+ describe("Evaluate condition", function () {
421
+ it("Should return false due to falseKey", async function () {
422
+ const { contract } = deployment
423
+
424
+ let inputData: DataPrivacyFramework.InputDataStruct = {
425
+ caller: "0x5b8E1b957369135d58a86c736F5eea661B929227", // random address
426
+ operation: "gt",
427
+ active: true,
428
+ timestampBefore: "0",
429
+ timestampAfter: "0",
430
+ falseKey: true,
431
+ trueKey: false,
432
+ uintParameter: "0",
433
+ addressParameter: "0x0000000000000000000000000000000000000000",
434
+ stringParameter: ""
435
+ }
436
+
437
+ let tx = await contract.setPermission(inputData)
438
+
439
+ await tx.wait()
440
+
441
+ const permissionGranted = await contract["isOperationAllowed(address,string)"](
442
+ "0x5b8E1b957369135d58a86c736F5eea661B929227",
443
+ "gt"
444
+ )
445
+
446
+ expect(permissionGranted).to.equal(false)
447
+ })
448
+
449
+ it("Should return true due to trueKey", async function () {
450
+ const { contract } = deployment
451
+
452
+ let inputData: DataPrivacyFramework.InputDataStruct = {
453
+ caller: "0x5b8E1b957369135d58a86c736F5eea661B929227", // random address
454
+ operation: "gt",
455
+ active: true,
456
+ timestampBefore: "0",
457
+ timestampAfter: "0",
458
+ falseKey: false,
459
+ trueKey: true,
460
+ uintParameter: "0",
461
+ addressParameter: "0x0000000000000000000000000000000000000000",
462
+ stringParameter: ""
463
+ }
464
+
465
+ let tx = await contract.setPermission(inputData)
466
+
467
+ await tx.wait()
468
+
469
+ const permissionGranted = await contract["isOperationAllowed(address,string)"](
470
+ "0x5b8E1b957369135d58a86c736F5eea661B929227",
471
+ "gt"
472
+ )
473
+
474
+ expect(permissionGranted).to.equal(true)
475
+ })
476
+
477
+ it("Should return false due to timestampBefore", async function () {
478
+ const { contract } = deployment
479
+
480
+ let inputData: DataPrivacyFramework.InputDataStruct = {
481
+ caller: "0x5b8E1b957369135d58a86c736F5eea661B929227", // random address
482
+ operation: "gt",
483
+ active: true,
484
+ timestampBefore: BigInt(1),
485
+ timestampAfter: "0",
486
+ falseKey: false,
487
+ trueKey: false,
488
+ uintParameter: "0",
489
+ addressParameter: "0x0000000000000000000000000000000000000000",
490
+ stringParameter: ""
491
+ }
492
+
493
+ let tx = await contract.setPermission(inputData)
494
+
495
+ await tx.wait()
496
+
497
+ const permissionGranted = await contract["isOperationAllowed(address,string)"](
498
+ "0x5b8E1b957369135d58a86c736F5eea661B929227",
499
+ "gt"
500
+ )
501
+
502
+ expect(permissionGranted).to.equal(false)
503
+ })
504
+
505
+ it("Should return false due to timestampAfter", async function () {
506
+ const { contract } = deployment
507
+
508
+ let inputData: DataPrivacyFramework.InputDataStruct = {
509
+ caller: "0x5b8E1b957369135d58a86c736F5eea661B929227", // random address
510
+ operation: "gt",
511
+ active: true,
512
+ timestampBefore: "0",
513
+ timestampAfter: BigInt(2716990740),
514
+ falseKey: false,
515
+ trueKey: false,
516
+ uintParameter: "0",
517
+ addressParameter: "0x0000000000000000000000000000000000000000",
518
+ stringParameter: ""
519
+ }
520
+
521
+ let tx = await contract.setPermission(inputData)
522
+
523
+ await tx.wait()
524
+
525
+ const permissionGranted = await contract["isOperationAllowed(address,string)"](
526
+ "0x5b8E1b957369135d58a86c736F5eea661B929227",
527
+ "gt"
528
+ )
529
+
530
+ expect(permissionGranted).to.equal(false)
531
+ })
532
+
533
+ it("Should return false due to uintParameter", async function () {
534
+ const { contract } = deployment
535
+
536
+ let inputData: DataPrivacyFramework.InputDataStruct = {
537
+ caller: "0x5b8E1b957369135d58a86c736F5eea661B929227", // random address
538
+ operation: "gt",
539
+ active: true,
540
+ timestampBefore: "0",
541
+ timestampAfter: "0",
542
+ falseKey: false,
543
+ trueKey: false,
544
+ uintParameter: BigInt(1),
545
+ addressParameter: "0x0000000000000000000000000000000000000000",
546
+ stringParameter: ""
547
+ }
548
+
549
+ let tx = await contract.setPermission(inputData)
550
+
551
+ await tx.wait()
552
+
553
+ const permissionGranted = await contract["isOperationAllowed(address,string,uint256)"](
554
+ "0x5b8E1b957369135d58a86c736F5eea661B929227",
555
+ "gt",
556
+ BigInt(2)
557
+ )
558
+
559
+ expect(permissionGranted).to.equal(false)
560
+ })
561
+
562
+ it("Should return false due to addressParameter", async function () {
563
+ const { contract } = deployment
564
+
565
+ let inputData: DataPrivacyFramework.InputDataStruct = {
566
+ caller: "0x5b8E1b957369135d58a86c736F5eea661B929227", // random address
567
+ operation: "gt",
568
+ active: true,
569
+ timestampBefore: "0",
570
+ timestampAfter: "0",
571
+ falseKey: false,
572
+ trueKey: false,
573
+ uintParameter: "0",
574
+ addressParameter: "0x0000000000000000000000000000000000000001",
575
+ stringParameter: ""
576
+ }
577
+
578
+ let tx = await contract.setPermission(inputData)
579
+
580
+ await tx.wait()
581
+
582
+ const permissionGranted = await contract["isOperationAllowed(address,string,address)"](
583
+ "0x5b8E1b957369135d58a86c736F5eea661B929227",
584
+ "gt",
585
+ "0x0000000000000000000000000000000000000002"
586
+ )
587
+
588
+ expect(permissionGranted).to.equal(false)
589
+ })
590
+
591
+ it("Should return false due to addressParameter", async function () {
592
+ const { contract } = deployment
593
+
594
+ let inputData: DataPrivacyFramework.InputDataStruct = {
595
+ caller: "0x5b8E1b957369135d58a86c736F5eea661B929227", // random address
596
+ operation: "gt",
597
+ active: true,
598
+ timestampBefore: "0",
599
+ timestampAfter: "0",
600
+ falseKey: false,
601
+ trueKey: false,
602
+ uintParameter: "0",
603
+ addressParameter: "0x0000000000000000000000000000000000000000",
604
+ stringParameter: "abc"
605
+ }
606
+
607
+ let tx = await contract.setPermission(inputData)
608
+
609
+ await tx.wait()
610
+
611
+ const permissionGranted = await contract["isOperationAllowed(address,string,string)"](
612
+ "0x5b8E1b957369135d58a86c736F5eea661B929227",
613
+ "gt",
614
+ "def"
615
+ )
616
+
617
+ expect(permissionGranted).to.equal(false)
618
+ })
619
+ })
620
+
621
+ describe("Get permission", function () {
622
+ before(async function() {
623
+ const { contract } = deployment
624
+
625
+ let tx = await contract.setAddressDefaultPermission(true)
626
+
627
+ await tx.wait()
628
+
629
+ tx = await contract.setOperationDefaultPermission(true)
630
+
631
+ await tx.wait()
632
+ })
633
+
634
+ it("Should return true due to caller holding generic permission", async function () {
635
+ const { contract } = deployment
636
+
637
+ let inputData: DataPrivacyFramework.InputDataStruct = {
638
+ caller: "0xbC70898a84DE49d3aA3190b124542bc5eca88A5C", // random address
639
+ operation: "*",
640
+ active: true,
641
+ timestampBefore: "0",
642
+ timestampAfter: "0",
643
+ falseKey: false,
644
+ trueKey: false,
645
+ uintParameter: "0",
646
+ addressParameter: "0x0000000000000000000000000000000000000000",
647
+ stringParameter: ""
648
+ }
649
+
650
+ let tx = await contract.setPermission(inputData)
651
+
652
+ await tx.wait()
653
+
654
+ const permissionGranted = await contract["isOperationAllowed(address,string)"](
655
+ "0xbC70898a84DE49d3aA3190b124542bc5eca88A5C",
656
+ "gt"
657
+ )
658
+
659
+ expect(permissionGranted).to.equal(true)
660
+ })
661
+
662
+ it("Should return true due to default operation permission", async function () {
663
+ const { contract } = deployment
664
+
665
+ let inputData: DataPrivacyFramework.InputDataStruct = {
666
+ caller: "0xbC70898a84DE49d3aA3190b124542bc5eca88A5C", // random address
667
+ operation: "*",
668
+ active: false,
669
+ timestampBefore: "0",
670
+ timestampAfter: "0",
671
+ falseKey: false,
672
+ trueKey: false,
673
+ uintParameter: "0",
674
+ addressParameter: "0x0000000000000000000000000000000000000000",
675
+ stringParameter: ""
676
+ }
677
+
678
+ let tx = await contract.setPermission(inputData)
679
+
680
+ await tx.wait()
681
+
682
+ inputData = {
683
+ caller: "0xbC70898a84DE49d3aA3190b124542bc5eca88A5C", // random address
684
+ operation: "gte",
685
+ active: true,
686
+ timestampBefore: "0",
687
+ timestampAfter: "0",
688
+ falseKey: false,
689
+ trueKey: false,
690
+ uintParameter: "0",
691
+ addressParameter: "0x0000000000000000000000000000000000000000",
692
+ stringParameter: ""
693
+ }
694
+
695
+ tx = await contract.setPermission(inputData)
696
+
697
+ await tx.wait()
698
+
699
+ const permissionGranted = await contract["isOperationAllowed(address,string)"](
700
+ "0xbC70898a84DE49d3aA3190b124542bc5eca88A5C",
701
+ "gt"
702
+ )
703
+
704
+ expect(permissionGranted).to.equal(true)
705
+ })
706
+
707
+ it("Should return true due to generic address holding the specific permission", async function () {
708
+ const { contract } = deployment
709
+
710
+ let inputData = {
711
+ caller: "0x0000000000000000000000000000000000000001", // generic address
712
+ operation: "gt",
713
+ active: true,
714
+ timestampBefore: "0",
715
+ timestampAfter: "0",
716
+ falseKey: false,
717
+ trueKey: false,
718
+ uintParameter: "0",
719
+ addressParameter: "0x0000000000000000000000000000000000000000",
720
+ stringParameter: ""
721
+ }
722
+
723
+ let tx = await contract.setPermission(inputData)
724
+
725
+ await tx.wait()
726
+
727
+ const permissionGranted = await contract["isOperationAllowed(address,string)"](
728
+ "0x9e874196782e439FD2CEFcF62bC5c59816a6ae8b",
729
+ "gt"
730
+ )
731
+
732
+ expect(permissionGranted).to.equal(true)
733
+ })
734
+
735
+ it("Should return true due to generic address holding the generic permission", async function () {
736
+ const { contract } = deployment
737
+
738
+ let inputData = {
739
+ caller: "0x0000000000000000000000000000000000000001", // generic address
740
+ operation: "gt",
741
+ active: false,
742
+ timestampBefore: "0",
743
+ timestampAfter: "0",
744
+ falseKey: false,
745
+ trueKey: false,
746
+ uintParameter: "0",
747
+ addressParameter: "0x0000000000000000000000000000000000000000",
748
+ stringParameter: ""
749
+ }
750
+
751
+ let tx = await contract.setPermission(inputData)
752
+
753
+ await tx.wait()
754
+
755
+ inputData = {
756
+ caller: "0x0000000000000000000000000000000000000001", // generic address
757
+ operation: "*",
758
+ active: true,
759
+ timestampBefore: "0",
760
+ timestampAfter: "0",
761
+ falseKey: false,
762
+ trueKey: false,
763
+ uintParameter: "0",
764
+ addressParameter: "0x0000000000000000000000000000000000000000",
765
+ stringParameter: ""
766
+ }
767
+
768
+ tx = await contract.setPermission(inputData)
769
+
770
+ await tx.wait()
771
+
772
+ const permissionGranted = await contract["isOperationAllowed(address,string)"](
773
+ "0x9e874196782e439FD2CEFcF62bC5c59816a6ae8b",
774
+ "gt"
775
+ )
776
+
777
+ expect(permissionGranted).to.equal(true)
778
+ })
779
+ })
780
+ })