@ocap/tx-protocols 1.28.9 → 1.29.1

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 (284) hide show
  1. package/esm/execute.d.mts +53 -0
  2. package/esm/execute.mjs +225 -0
  3. package/esm/index.d.mts +95 -0
  4. package/esm/index.mjs +100 -0
  5. package/esm/pipes/ensure-cost.d.mts +18 -0
  6. package/esm/pipes/ensure-cost.mjs +136 -0
  7. package/esm/pipes/ensure-gas.d.mts +14 -0
  8. package/esm/pipes/ensure-gas.mjs +38 -0
  9. package/esm/protocols/account/delegate.d.mts +4 -0
  10. package/esm/protocols/account/delegate.mjs +195 -0
  11. package/esm/protocols/account/migrate.d.mts +4 -0
  12. package/esm/protocols/account/migrate.mjs +130 -0
  13. package/esm/protocols/account/revoke-delegate.d.mts +4 -0
  14. package/esm/protocols/account/revoke-delegate.mjs +102 -0
  15. package/esm/protocols/asset/acquire-v2.d.mts +9 -0
  16. package/esm/protocols/asset/acquire-v2.mjs +213 -0
  17. package/esm/protocols/asset/acquire-v3.d.mts +17 -0
  18. package/esm/protocols/asset/acquire-v3.mjs +265 -0
  19. package/esm/protocols/asset/calls/transfer-token.d.mts +4 -0
  20. package/esm/protocols/asset/calls/transfer-token.mjs +36 -0
  21. package/esm/protocols/asset/calls/transfer.d.mts +4 -0
  22. package/esm/protocols/asset/calls/transfer.mjs +32 -0
  23. package/esm/protocols/asset/consume.d.mts +4 -0
  24. package/esm/protocols/asset/consume.mjs +92 -0
  25. package/esm/protocols/asset/create.d.mts +4 -0
  26. package/esm/protocols/asset/create.mjs +136 -0
  27. package/esm/protocols/asset/mint.d.mts +4 -0
  28. package/esm/protocols/asset/mint.mjs +156 -0
  29. package/esm/protocols/asset/pipes/exec-mint-hook.d.mts +24 -0
  30. package/esm/protocols/asset/pipes/exec-mint-hook.mjs +54 -0
  31. package/esm/protocols/asset/pipes/extract-factory-tokens.d.mts +21 -0
  32. package/esm/protocols/asset/pipes/extract-factory-tokens.mjs +22 -0
  33. package/esm/protocols/asset/pipes/verify-itx-address.d.mts +32 -0
  34. package/esm/protocols/asset/pipes/verify-itx-address.mjs +56 -0
  35. package/esm/protocols/asset/pipes/verify-itx-assets.d.mts +18 -0
  36. package/esm/protocols/asset/pipes/verify-itx-assets.mjs +27 -0
  37. package/esm/protocols/asset/pipes/verify-itx-variables.d.mts +17 -0
  38. package/esm/protocols/asset/pipes/verify-itx-variables.mjs +20 -0
  39. package/esm/protocols/asset/pipes/verify-mint-limit.d.mts +15 -0
  40. package/esm/protocols/asset/pipes/verify-mint-limit.mjs +14 -0
  41. package/esm/protocols/asset/update.d.mts +4 -0
  42. package/esm/protocols/asset/update.mjs +111 -0
  43. package/esm/protocols/factory/create.d.mts +29 -0
  44. package/esm/protocols/factory/create.mjs +155 -0
  45. package/esm/protocols/governance/claim-stake.d.mts +27 -0
  46. package/esm/protocols/governance/claim-stake.mjs +220 -0
  47. package/esm/protocols/governance/return-stake.d.mts +27 -0
  48. package/esm/protocols/governance/return-stake.mjs +211 -0
  49. package/esm/protocols/governance/revoke-stake.d.mts +27 -0
  50. package/esm/protocols/governance/revoke-stake.mjs +178 -0
  51. package/esm/protocols/governance/slash-stake.d.mts +17 -0
  52. package/esm/protocols/governance/slash-stake.mjs +213 -0
  53. package/esm/protocols/governance/stake.d.mts +15 -0
  54. package/esm/protocols/governance/stake.mjs +270 -0
  55. package/esm/protocols/rollup/claim-reward.d.mts +11 -0
  56. package/esm/protocols/rollup/claim-reward.mjs +322 -0
  57. package/esm/protocols/rollup/close.d.mts +4 -0
  58. package/esm/protocols/rollup/close.mjs +105 -0
  59. package/esm/protocols/rollup/create-block.d.mts +11 -0
  60. package/esm/protocols/rollup/create-block.mjs +303 -0
  61. package/esm/protocols/rollup/create.d.mts +4 -0
  62. package/esm/protocols/rollup/create.mjs +164 -0
  63. package/esm/protocols/rollup/join.d.mts +4 -0
  64. package/esm/protocols/rollup/join.mjs +152 -0
  65. package/esm/protocols/rollup/leave.d.mts +4 -0
  66. package/esm/protocols/rollup/leave.mjs +137 -0
  67. package/esm/protocols/rollup/migrate.d.mts +4 -0
  68. package/esm/protocols/rollup/migrate.mjs +85 -0
  69. package/esm/protocols/rollup/pause.d.mts +4 -0
  70. package/esm/protocols/rollup/pause.mjs +76 -0
  71. package/esm/protocols/rollup/pipes/ensure-validator.d.mts +6 -0
  72. package/esm/protocols/rollup/pipes/ensure-validator.mjs +12 -0
  73. package/esm/protocols/rollup/pipes/verify-evidence.d.mts +15 -0
  74. package/esm/protocols/rollup/pipes/verify-evidence.mjs +29 -0
  75. package/esm/protocols/rollup/pipes/verify-signers.d.mts +15 -0
  76. package/esm/protocols/rollup/pipes/verify-signers.mjs +36 -0
  77. package/esm/protocols/rollup/pipes/verify-status.d.mts +13 -0
  78. package/esm/protocols/rollup/pipes/verify-status.mjs +26 -0
  79. package/esm/protocols/rollup/resume.d.mts +4 -0
  80. package/esm/protocols/rollup/resume.mjs +79 -0
  81. package/esm/protocols/rollup/update.d.mts +4 -0
  82. package/esm/protocols/rollup/update.mjs +111 -0
  83. package/esm/protocols/token/create.d.mts +4 -0
  84. package/esm/protocols/token/create.mjs +150 -0
  85. package/esm/protocols/token/deposit-v2.d.mts +11 -0
  86. package/esm/protocols/token/deposit-v2.mjs +216 -0
  87. package/esm/protocols/token/withdraw-v2.d.mts +9 -0
  88. package/esm/protocols/token/withdraw-v2.mjs +222 -0
  89. package/esm/protocols/token-factory/burn.d.mts +15 -0
  90. package/esm/protocols/token-factory/burn.mjs +233 -0
  91. package/esm/protocols/token-factory/create.d.mts +4 -0
  92. package/esm/protocols/token-factory/create.mjs +254 -0
  93. package/esm/protocols/token-factory/mint.d.mts +15 -0
  94. package/esm/protocols/token-factory/mint.mjs +234 -0
  95. package/esm/protocols/token-factory/pipes/calc-reserve.d.mts +21 -0
  96. package/esm/protocols/token-factory/pipes/calc-reserve.mjs +34 -0
  97. package/esm/protocols/token-factory/pipes/verify-icon.d.mts +14 -0
  98. package/esm/protocols/token-factory/pipes/verify-icon.mjs +18 -0
  99. package/esm/protocols/token-factory/pipes/verify-ownership.d.mts +12 -0
  100. package/esm/protocols/token-factory/pipes/verify-ownership.mjs +63 -0
  101. package/esm/protocols/token-factory/pipes/verify-url.d.mts +12 -0
  102. package/esm/protocols/token-factory/pipes/verify-url.mjs +26 -0
  103. package/esm/protocols/token-factory/update.d.mts +10 -0
  104. package/esm/protocols/token-factory/update.mjs +152 -0
  105. package/esm/protocols/trade/exchange-v2.d.mts +9 -0
  106. package/esm/protocols/trade/exchange-v2.mjs +239 -0
  107. package/esm/protocols/trade/transfer-v2.d.mts +9 -0
  108. package/esm/protocols/trade/transfer-v2.mjs +226 -0
  109. package/esm/protocols/trade/transfer-v3.d.mts +17 -0
  110. package/esm/protocols/trade/transfer-v3.mjs +270 -0
  111. package/esm/util.d.mts +141 -0
  112. package/esm/util.mjs +278 -0
  113. package/lib/_virtual/rolldown_runtime.cjs +29 -0
  114. package/lib/execute.cjs +231 -0
  115. package/lib/execute.d.cts +53 -0
  116. package/lib/index.cjs +105 -0
  117. package/lib/index.d.cts +95 -0
  118. package/lib/pipes/ensure-cost.cjs +141 -0
  119. package/lib/pipes/ensure-cost.d.cts +18 -0
  120. package/lib/pipes/ensure-gas.cjs +41 -0
  121. package/lib/pipes/ensure-gas.d.cts +14 -0
  122. package/lib/protocols/account/delegate.cjs +201 -0
  123. package/lib/protocols/account/delegate.d.cts +4 -0
  124. package/lib/protocols/account/migrate.cjs +135 -0
  125. package/lib/protocols/account/migrate.d.cts +4 -0
  126. package/lib/protocols/account/revoke-delegate.cjs +107 -0
  127. package/lib/protocols/account/revoke-delegate.d.cts +4 -0
  128. package/lib/protocols/asset/acquire-v2.cjs +216 -0
  129. package/lib/protocols/asset/acquire-v2.d.cts +9 -0
  130. package/lib/protocols/asset/acquire-v3.cjs +269 -0
  131. package/lib/protocols/asset/acquire-v3.d.cts +17 -0
  132. package/lib/protocols/asset/calls/transfer-token.cjs +40 -0
  133. package/lib/protocols/asset/calls/transfer-token.d.cts +4 -0
  134. package/lib/protocols/asset/calls/transfer.cjs +35 -0
  135. package/lib/protocols/asset/calls/transfer.d.cts +4 -0
  136. package/lib/protocols/asset/consume.cjs +95 -0
  137. package/lib/protocols/asset/consume.d.cts +4 -0
  138. package/lib/protocols/asset/create.cjs +140 -0
  139. package/lib/protocols/asset/create.d.cts +4 -0
  140. package/lib/protocols/asset/mint.cjs +159 -0
  141. package/lib/protocols/asset/mint.d.cts +4 -0
  142. package/lib/protocols/asset/pipes/exec-mint-hook.cjs +57 -0
  143. package/lib/protocols/asset/pipes/exec-mint-hook.d.cts +24 -0
  144. package/lib/protocols/asset/pipes/extract-factory-tokens.cjs +25 -0
  145. package/lib/protocols/asset/pipes/extract-factory-tokens.d.cts +21 -0
  146. package/lib/protocols/asset/pipes/verify-itx-address.cjs +59 -0
  147. package/lib/protocols/asset/pipes/verify-itx-address.d.cts +32 -0
  148. package/lib/protocols/asset/pipes/verify-itx-assets.cjs +29 -0
  149. package/lib/protocols/asset/pipes/verify-itx-assets.d.cts +18 -0
  150. package/lib/protocols/asset/pipes/verify-itx-variables.cjs +22 -0
  151. package/lib/protocols/asset/pipes/verify-itx-variables.d.cts +17 -0
  152. package/lib/protocols/asset/pipes/verify-mint-limit.cjs +16 -0
  153. package/lib/protocols/asset/pipes/verify-mint-limit.d.cts +15 -0
  154. package/lib/protocols/asset/update.cjs +114 -0
  155. package/lib/protocols/asset/update.d.cts +4 -0
  156. package/lib/protocols/factory/create.cjs +161 -0
  157. package/lib/protocols/factory/create.d.cts +29 -0
  158. package/lib/protocols/governance/claim-stake.cjs +223 -0
  159. package/lib/protocols/governance/claim-stake.d.cts +27 -0
  160. package/lib/protocols/governance/return-stake.cjs +215 -0
  161. package/lib/protocols/governance/return-stake.d.cts +27 -0
  162. package/lib/protocols/governance/revoke-stake.cjs +182 -0
  163. package/lib/protocols/governance/revoke-stake.d.cts +27 -0
  164. package/lib/protocols/governance/slash-stake.cjs +217 -0
  165. package/lib/protocols/governance/slash-stake.d.cts +17 -0
  166. package/lib/protocols/governance/stake.cjs +275 -0
  167. package/lib/protocols/governance/stake.d.cts +15 -0
  168. package/lib/protocols/rollup/claim-reward.cjs +328 -0
  169. package/lib/protocols/rollup/claim-reward.d.cts +11 -0
  170. package/lib/protocols/rollup/close.cjs +107 -0
  171. package/lib/protocols/rollup/close.d.cts +4 -0
  172. package/lib/protocols/rollup/create-block.cjs +309 -0
  173. package/lib/protocols/rollup/create-block.d.cts +11 -0
  174. package/lib/protocols/rollup/create.cjs +169 -0
  175. package/lib/protocols/rollup/create.d.cts +4 -0
  176. package/lib/protocols/rollup/join.cjs +157 -0
  177. package/lib/protocols/rollup/join.d.cts +4 -0
  178. package/lib/protocols/rollup/leave.cjs +141 -0
  179. package/lib/protocols/rollup/leave.d.cts +4 -0
  180. package/lib/protocols/rollup/migrate.cjs +87 -0
  181. package/lib/protocols/rollup/migrate.d.cts +4 -0
  182. package/lib/protocols/rollup/pause.cjs +78 -0
  183. package/lib/protocols/rollup/pause.d.cts +4 -0
  184. package/lib/protocols/rollup/pipes/ensure-validator.cjs +14 -0
  185. package/lib/protocols/rollup/pipes/ensure-validator.d.cts +6 -0
  186. package/lib/protocols/rollup/pipes/verify-evidence.cjs +32 -0
  187. package/lib/protocols/rollup/pipes/verify-evidence.d.cts +15 -0
  188. package/lib/protocols/rollup/pipes/verify-signers.cjs +39 -0
  189. package/lib/protocols/rollup/pipes/verify-signers.d.cts +15 -0
  190. package/lib/protocols/rollup/pipes/verify-status.cjs +28 -0
  191. package/lib/protocols/rollup/pipes/verify-status.d.cts +13 -0
  192. package/lib/protocols/rollup/resume.cjs +81 -0
  193. package/lib/protocols/rollup/resume.d.cts +4 -0
  194. package/lib/protocols/rollup/update.cjs +114 -0
  195. package/lib/protocols/rollup/update.d.cts +4 -0
  196. package/lib/protocols/token/create.cjs +156 -0
  197. package/lib/protocols/token/create.d.cts +4 -0
  198. package/lib/protocols/token/deposit-v2.cjs +219 -0
  199. package/lib/protocols/token/deposit-v2.d.cts +11 -0
  200. package/lib/protocols/token/withdraw-v2.cjs +225 -0
  201. package/lib/protocols/token/withdraw-v2.d.cts +9 -0
  202. package/lib/protocols/token-factory/burn.cjs +236 -0
  203. package/lib/protocols/token-factory/burn.d.cts +15 -0
  204. package/lib/protocols/token-factory/create.cjs +260 -0
  205. package/lib/protocols/token-factory/create.d.cts +4 -0
  206. package/lib/protocols/token-factory/mint.cjs +237 -0
  207. package/lib/protocols/token-factory/mint.d.cts +15 -0
  208. package/lib/protocols/token-factory/pipes/calc-reserve.cjs +38 -0
  209. package/lib/protocols/token-factory/pipes/calc-reserve.d.cts +21 -0
  210. package/lib/protocols/token-factory/pipes/verify-icon.cjs +22 -0
  211. package/lib/protocols/token-factory/pipes/verify-icon.d.cts +14 -0
  212. package/lib/protocols/token-factory/pipes/verify-ownership.cjs +66 -0
  213. package/lib/protocols/token-factory/pipes/verify-ownership.d.cts +12 -0
  214. package/lib/protocols/token-factory/pipes/verify-url.cjs +29 -0
  215. package/lib/protocols/token-factory/pipes/verify-url.d.cts +12 -0
  216. package/lib/protocols/token-factory/update.cjs +155 -0
  217. package/lib/protocols/token-factory/update.d.cts +10 -0
  218. package/lib/protocols/trade/exchange-v2.cjs +243 -0
  219. package/lib/protocols/trade/exchange-v2.d.cts +9 -0
  220. package/lib/protocols/trade/transfer-v2.cjs +229 -0
  221. package/lib/protocols/trade/transfer-v2.d.cts +9 -0
  222. package/lib/protocols/trade/transfer-v3.cjs +274 -0
  223. package/lib/protocols/trade/transfer-v3.d.cts +17 -0
  224. package/lib/util.cjs +296 -0
  225. package/lib/util.d.cts +141 -0
  226. package/package.json +49 -22
  227. package/tools/fixtures.ts +564 -0
  228. package/lib/execute.js +0 -254
  229. package/lib/index.js +0 -117
  230. package/lib/pipes/ensure-cost.js +0 -193
  231. package/lib/pipes/ensure-gas.js +0 -48
  232. package/lib/protocols/account/delegate.js +0 -223
  233. package/lib/protocols/account/migrate.js +0 -153
  234. package/lib/protocols/account/revoke-delegate.js +0 -110
  235. package/lib/protocols/asset/acquire-v2.js +0 -262
  236. package/lib/protocols/asset/acquire-v3.js +0 -330
  237. package/lib/protocols/asset/calls/README.md +0 -5
  238. package/lib/protocols/asset/calls/transfer-token.js +0 -36
  239. package/lib/protocols/asset/calls/transfer.js +0 -28
  240. package/lib/protocols/asset/consume.js +0 -105
  241. package/lib/protocols/asset/create.js +0 -151
  242. package/lib/protocols/asset/mint.js +0 -199
  243. package/lib/protocols/asset/pipes/exec-mint-hook.js +0 -62
  244. package/lib/protocols/asset/pipes/extract-factory-tokens.js +0 -18
  245. package/lib/protocols/asset/pipes/verify-itx-address.js +0 -54
  246. package/lib/protocols/asset/pipes/verify-itx-assets.js +0 -51
  247. package/lib/protocols/asset/pipes/verify-itx-variables.js +0 -26
  248. package/lib/protocols/asset/pipes/verify-mint-limit.js +0 -13
  249. package/lib/protocols/asset/update.js +0 -131
  250. package/lib/protocols/factory/create.js +0 -191
  251. package/lib/protocols/governance/claim-stake.js +0 -266
  252. package/lib/protocols/governance/return-stake.js +0 -248
  253. package/lib/protocols/governance/revoke-stake.js +0 -172
  254. package/lib/protocols/governance/slash-stake.js +0 -271
  255. package/lib/protocols/governance/stake.js +0 -303
  256. package/lib/protocols/rollup/claim-reward.js +0 -342
  257. package/lib/protocols/rollup/close.js +0 -104
  258. package/lib/protocols/rollup/create-block.js +0 -413
  259. package/lib/protocols/rollup/create.js +0 -197
  260. package/lib/protocols/rollup/join.js +0 -182
  261. package/lib/protocols/rollup/leave.js +0 -145
  262. package/lib/protocols/rollup/migrate.js +0 -85
  263. package/lib/protocols/rollup/pause.js +0 -75
  264. package/lib/protocols/rollup/pipes/ensure-validator.js +0 -12
  265. package/lib/protocols/rollup/pipes/verify-evidence.js +0 -37
  266. package/lib/protocols/rollup/pipes/verify-signers.js +0 -87
  267. package/lib/protocols/rollup/pipes/verify-status.js +0 -30
  268. package/lib/protocols/rollup/resume.js +0 -75
  269. package/lib/protocols/rollup/update.js +0 -122
  270. package/lib/protocols/token/create.js +0 -199
  271. package/lib/protocols/token/deposit-v2.js +0 -290
  272. package/lib/protocols/token/withdraw-v2.js +0 -305
  273. package/lib/protocols/token-factory/burn.js +0 -371
  274. package/lib/protocols/token-factory/create.js +0 -342
  275. package/lib/protocols/token-factory/mint.js +0 -385
  276. package/lib/protocols/token-factory/pipes/calc-reserve.js +0 -37
  277. package/lib/protocols/token-factory/pipes/verify-icon.js +0 -27
  278. package/lib/protocols/token-factory/pipes/verify-ownership.js +0 -93
  279. package/lib/protocols/token-factory/pipes/verify-url.js +0 -32
  280. package/lib/protocols/token-factory/update.js +0 -208
  281. package/lib/protocols/trade/exchange-v2.js +0 -239
  282. package/lib/protocols/trade/transfer-v2.js +0 -233
  283. package/lib/protocols/trade/transfer-v3.js +0 -333
  284. package/lib/util.js +0 -442
@@ -1,131 +0,0 @@
1
- const { diff: deepDiff } = require('deep-diff');
2
- const { CustomError: Error } = require('@ocap/util/lib/error');
3
- const { Joi } = require('@arcblock/validator');
4
- const { Runner, pipes } = require('@ocap/tx-pipeline');
5
- const { account, asset } = require('@ocap/state');
6
-
7
- const debug = require('debug')(`${require('../../../package.json').name}:update-asset`);
8
-
9
- const { decodeAnySafe } = require('../../util');
10
-
11
- const EnsureTxGas = require('../../pipes/ensure-gas');
12
- const EnsureTxCost = require('../../pipes/ensure-cost');
13
-
14
- const runner = new Runner();
15
-
16
- runner.use(pipes.VerifyMultiSig(0));
17
-
18
- // Verify itx
19
- const schema = Joi.object({
20
- address: Joi.DID().prefix().role('ROLE_ASSET').required(),
21
- moniker: Joi.string().min(2).max(255).optional().allow(null).allow(''),
22
- consumed: Joi.boolean().optional().allow(null).default(false),
23
- data: Joi.any().optional().allow(null),
24
- }).options({ stripUnknown: true, noDefaults: false });
25
- runner.use((context, next) => {
26
- const { itx } = context;
27
- const { error } = schema.validate(itx);
28
- if (error) {
29
- return next(new Error('INVALID_TX', `Invalid itx: ${error.message}`));
30
- }
31
- if (!itx.moniker && !itx.data) {
32
- return next(new Error('INVALID_TX', 'itx.moniker and itx.data can not be empty at the same time'));
33
- }
34
-
35
- context.newData = decodeAnySafe(itx.data);
36
- return next();
37
- });
38
-
39
- // Ensure asset exist
40
- runner.use(pipes.ExtractState({ from: 'itx.address', to: 'assetState', status: 'INVALID_ASSET', table: 'asset' }));
41
- runner.use(pipes.ExtractState({ from: 'assetState.issuer', to: 'issuerState', status: 'OK', table: 'account' }));
42
-
43
- // Ensure sender exist
44
- runner.use(
45
- pipes.ExtractState({ from: 'tx.from', to: 'senderState', status: 'INVALID_SENDER_STATE', table: 'account' })
46
- );
47
- runner.use(pipes.VerifyAccountMigration({ stateKey: 'senderState', addressKey: 'tx.from' }));
48
-
49
- // Ensure asset owned by sender and can be modified
50
- runner.use(pipes.VerifyUpdater({ assetKey: 'assetState', ownerKey: 'senderState', updaterKey: ['owner', 'issuer'] }));
51
- runner.use(
52
- pipes.VerifyInfo([
53
- {
54
- error: 'READONLY_ASSET',
55
- message: 'Can not update a readonly asset',
56
- fn: ({ assetState }) => assetState.readonly === false,
57
- persist: true,
58
- },
59
- {
60
- error: 'CONSUMED_ASSET',
61
- message: 'Can not consume an already consumed asset',
62
- fn: ({ assetState, itx }) => !(itx.consumed && assetState.consumedTime),
63
- persist: true,
64
- },
65
- ])
66
- );
67
-
68
- // Ensure we are in append-only mode update proposed by issuer
69
- runner.use((context, next) => {
70
- const { itx, newData, senderState, assetState, issuerState } = context;
71
- if (issuerState && senderState.address === issuerState.address) {
72
- if (itx.moniker !== assetState.moniker) {
73
- return next(new Error('FORBIDDEN', 'Asset moniker can only be updated by owner'));
74
- }
75
- if (newData.type !== assetState.data.type) {
76
- return next(new Error('FORBIDDEN', 'Asset data type can only be updated by owner'));
77
- }
78
- const dataDiff = deepDiff(assetState.data.value, newData.value) || [];
79
- const appendOnly = dataDiff.every((x) => x.kind === 'N' || (x.kind === 'A' && x.item.kind === 'N'));
80
- if (appendOnly === false) {
81
- return next(new Error('APPEND_ONLY', 'Asset data value can only be updated in append only mode'));
82
- }
83
- }
84
-
85
- return next();
86
- });
87
-
88
- // Ensure tx fee and gas
89
- runner.use(EnsureTxGas(() => ({ create: 0, update: 2, payment: 0 })));
90
- runner.use(EnsureTxCost({ attachSenderChanges: true }));
91
-
92
- // Save context snapshot before updating states
93
- runner.use(pipes.TakeStateSnapshot());
94
-
95
- // Update asset state
96
- runner.use(
97
- async (context, next) => {
98
- const { tx, itx, txTime, newData, statedb, senderState, senderUpdates, assetState, updateVaults } = context;
99
-
100
- const updates = { moniker: itx.moniker || assetState.moniker, data: newData || assetState.data };
101
- if (itx.consumed && !assetState.consumedTime) {
102
- updates.consumedTime = txTime;
103
- }
104
-
105
- const [newSenderState, newAssetState] = await Promise.all([
106
- // update owner state
107
- statedb.account.update(
108
- senderState.address,
109
- account.update(senderState, { nonce: tx.nonce, pk: tx.pk, ...senderUpdates }, context),
110
- context
111
- ),
112
-
113
- // update asset state
114
- statedb.asset.update(itx.address, asset.update(assetState, updates, context), context),
115
- ]);
116
-
117
- await updateVaults();
118
-
119
- context.senderState = newSenderState;
120
- context.assetState = newAssetState;
121
-
122
- debug('update', newAssetState);
123
-
124
- next();
125
- },
126
- { persistError: true }
127
- );
128
-
129
- runner.use(pipes.VerifyStateDiff());
130
-
131
- module.exports = runner;
@@ -1,191 +0,0 @@
1
- const get = require('lodash/get');
2
- const isEmpty = require('empty-value');
3
- const cloneDeep = require('lodash/cloneDeep');
4
- const { CustomError: Error } = require('@ocap/util/lib/error');
5
- const { isValidFactory } = require('@ocap/asset');
6
- const { formatMessage } = require('@ocap/message');
7
- const { Runner, pipes } = require('@ocap/tx-pipeline');
8
- const { BN } = require('@ocap/util');
9
- const { account, factory, delegation } = require('@ocap/state');
10
- const { toFactoryAddress } = require('@arcblock/did-util');
11
-
12
- const debug = require('debug')(`${require('../../../package.json').name}:create-factory`);
13
-
14
- const { decodeAnySafe, getDelegationRequirements } = require('../../util');
15
- const EnsureTxGas = require('../../pipes/ensure-gas');
16
- const EnsureTxCost = require('../../pipes/ensure-cost');
17
-
18
- const runner = new Runner();
19
-
20
- runner.use(pipes.VerifyMultiSig(0));
21
-
22
- // validate factory props
23
- runner.use((context, next) => {
24
- const factoryProps = formatMessage('CreateFactoryTx', context.itx);
25
-
26
- try {
27
- isValidFactory(factoryProps);
28
- } catch (err) {
29
- return next(new Error('INVALID_FACTORY_PROPS', err.message));
30
- }
31
-
32
- if (factoryProps.output.data) {
33
- factoryProps.output.data = decodeAnySafe(factoryProps.output.data);
34
- }
35
-
36
- if (factoryProps.name.length < 2 || factoryProps.name.length > 255) {
37
- return next(new Error('INVALID_FACTORY_PROPS', 'Length of factory name should between 2 and 255 characters'));
38
- }
39
-
40
- const props = cloneDeep(factoryProps);
41
- props.address = '';
42
- if (toFactoryAddress(props) !== factoryProps.address) {
43
- return next(new Error('INVALID_FACTORY_PROPS', 'Factory address is not valid'));
44
- }
45
-
46
- context.factoryTokens = (factoryProps.input.tokens || []).map((x) => x.address);
47
-
48
- // ensure max tokens length
49
- const maxListSize = get(context, 'config.transaction.maxListSize');
50
- if (context.factoryTokens.length > maxListSize) {
51
- return next(new Error('INVALID_FACTORY_INPUT', `input.tokens exceeded max allowed length: ${maxListSize}`));
52
- }
53
- if (factoryProps.input.assets.length > maxListSize) {
54
- return next(new Error('INVALID_FACTORY_INPUT', `input.assets exceeded max allowed length: ${maxListSize}`));
55
- }
56
-
57
- // For backwards compatibility, merge tokens
58
- if (new BN(factoryProps.input.value || 0).gt(new BN(0))) {
59
- context.factoryTokens.push(context.config.token.address);
60
- factoryProps.input.tokens.push({ address: context.config.token.address, value: factoryProps.input.value });
61
- factoryProps.input.value = '0';
62
- }
63
-
64
- context.factoryProps = factoryProps;
65
-
66
- return next();
67
- });
68
-
69
- // Ensure factory not exist
70
- runner.use(pipes.ExtractState({ from: 'itx.address', to: 'factoryState', status: 'OK' }));
71
- runner.use(
72
- pipes.VerifyInfo([
73
- {
74
- error: 'DUPLICATE_FACTORY',
75
- message: 'This asset factory already exist on chain',
76
- fn: (context) => isEmpty(context.factoryState),
77
- },
78
- ])
79
- );
80
-
81
- // Ensure sender exist
82
- runner.use(
83
- pipes.ExtractState({ from: 'tx.from', to: 'senderState', table: 'account', status: 'INVALID_SENDER_STATE' })
84
- );
85
- runner.use(pipes.VerifyAccountMigration({ stateKey: 'senderState', addressKey: 'tx.from' }));
86
-
87
- // Ensure delegation
88
- runner.use(pipes.ExtractState({ from: 'tx.delegator', to: 'delegatorState', status: 'OK', table: 'account' }));
89
- runner.use(pipes.VerifyAccountMigration({ stateKey: 'delegatorState', addressKey: 'tx.delegator' }));
90
- runner.use(
91
- pipes.VerifyDelegation({
92
- type: 'signature',
93
- signerKey: 'senderState',
94
- delegatorKey: 'delegatorState',
95
- getRequirements: getDelegationRequirements,
96
- })
97
- );
98
-
99
- // Ensure tokens exist if we are creating an factory that consume tokens
100
- runner.use(
101
- pipes.ExtractState({ from: 'factoryTokens', to: 'tokenStates', table: 'token', status: 'INVALID_FACTORY_INPUT' })
102
- );
103
-
104
- // ensure input.assets all exist on chain
105
- runner.use(
106
- pipes.ExtractState({ from: 'factoryProps.input.assets', to: 'inputAssetStates', table: 'asset', status: 'OK' })
107
- );
108
- runner.use(
109
- pipes.ExtractState({ from: 'factoryProps.input.assets', to: 'inputFactoryStates', table: 'factory', status: 'OK' })
110
- );
111
- runner.use((context, next) => {
112
- const { inputAssetStates = [], inputFactoryStates = [], factoryProps } = context;
113
- if (inputAssetStates.some((x) => !!x.consumedTime)) {
114
- return next(new Error('INVALID_FACTORY_INPUT', 'Some of input.assets already consumed'));
115
- }
116
-
117
- if (inputAssetStates.length + inputFactoryStates.length === factoryProps.input.assets.length) {
118
- return next();
119
- }
120
-
121
- return next(new Error('INVALID_FACTORY_INPUT', 'Not all input.assets exist on chain'));
122
- });
123
-
124
- // ensure issuer exists and not migrated
125
- runner.use(
126
- pipes.ExtractState({
127
- from: 'factoryProps.trustedIssuers',
128
- to: 'issuerStates',
129
- table: 'account',
130
- status: 'INVALID_ISSUER_STATE',
131
- })
132
- );
133
- runner.use(pipes.VerifyAccountMigration({ stateKey: 'issuerStates', addressKey: 'factoryProps.trustedIssuers' }));
134
-
135
- // Ensure tx fee and gas
136
- runner.use(EnsureTxGas(() => ({ create: 1, update: 2, payment: 0 })));
137
- runner.use(EnsureTxCost({ attachSenderChanges: true }));
138
-
139
- // Save context snapshot before updating states
140
- runner.use(pipes.TakeStateSnapshot());
141
-
142
- // Create factory state
143
- runner.use(
144
- async (context, next) => {
145
- const {
146
- tx,
147
- itx,
148
- statedb,
149
- senderState,
150
- delegatorState,
151
- delegationState,
152
- senderUpdates,
153
- factoryProps,
154
- updateVaults,
155
- } = context;
156
- const tokens = { [context.config.token.address]: '0' };
157
- const owner = delegatorState ? delegatorState.address : senderState.address;
158
-
159
- const [newSenderState, factoryState, newDelegationState] = await Promise.all([
160
- // Update owner state
161
- statedb.account.update(
162
- senderState.address,
163
- account.update(senderState, { nonce: tx.nonce, pk: tx.pk, ...senderUpdates }, context),
164
- context
165
- ),
166
-
167
- // Create factory state
168
- statedb.factory.create(itx.address, factory.create({ ...factoryProps, tokens, owner }, context), context),
169
-
170
- // Update delegation state
171
- context.isDelegationChanged
172
- ? statedb.delegation.update(delegationState.address, delegation.update(delegationState, {}, context), context)
173
- : delegationState,
174
- ]);
175
-
176
- await updateVaults();
177
-
178
- context.senderState = newSenderState;
179
- context.factoryState = factoryState;
180
- context.delegationState = newDelegationState;
181
-
182
- debug('createFactory', factoryState);
183
-
184
- next();
185
- },
186
- { persistError: true }
187
- );
188
-
189
- runner.use(pipes.VerifyStateDiff());
190
-
191
- module.exports = runner;
@@ -1,266 +0,0 @@
1
- const { CustomError: Error } = require('@ocap/util/lib/error');
2
- const { Joi, patterns } = require('@arcblock/validator');
3
- const { BN } = require('@ocap/util');
4
- const { Runner, pipes } = require('@ocap/tx-pipeline');
5
- const { account, asset, stake, evidence } = require('@ocap/state');
6
- const { getRelatedAddresses } = require('@ocap/util/lib/get-related-addr');
7
-
8
- const debug = require('debug')(`${require('../../../package.json').name}:claim-stake`);
9
-
10
- const { applyTokenUpdates, applyTokenChange } = require('../../util');
11
- const EnsureTxGas = require('../../pipes/ensure-gas');
12
- const EnsureTxCost = require('../../pipes/ensure-cost');
13
-
14
- const runner = new Runner();
15
-
16
- runner.use(pipes.VerifyMultiSig(0));
17
-
18
- // 1. verify itx output
19
- const schema = Joi.object({
20
- address: Joi.DID().prefix().role('ROLE_STAKE').required(),
21
- evidence: Joi.object({
22
- hash: Joi.string().regex(patterns.txHash).required(),
23
- }).required(),
24
- data: Joi.any().optional().allow(null),
25
- }).options({ stripUnknown: true, noDefaults: false });
26
- runner.use(({ itx }, next) => {
27
- const { error } = schema.validate(itx);
28
- return next(error ? new Error('INVALID_TX', `Invalid itx: ${error.message}`) : null);
29
- });
30
-
31
- // 2. verify stake state & sender state
32
- runner.use(
33
- pipes.ExtractState({ from: 'tx.from', to: 'senderState', status: 'INVALID_SENDER_STATE', table: 'account' })
34
- );
35
- runner.use(
36
- pipes.ExtractState({ from: 'itx.address', to: 'stakeState', status: 'INVALID_STAKE_STATE', table: 'stake' })
37
- );
38
- runner.use(pipes.VerifyAccountMigration({ stateKey: 'senderState', addressKey: 'tx.from' }));
39
- runner.use(
40
- pipes.VerifyInfo([
41
- {
42
- error: 'SENDER_NOT_MATCH',
43
- message: 'You are not allowed to claim stake from this address',
44
- fn: ({ senderState, stakeState }) => getRelatedAddresses(senderState).includes(stakeState.sender),
45
- },
46
- ])
47
- );
48
-
49
- // 3. verify evidence replay
50
- runner.use(pipes.ExtractState({ from: 'itx.evidence.hash', to: 'evidenceState', status: 'OK', table: 'evidence' }));
51
- runner.use(
52
- pipes.VerifyInfo([
53
- {
54
- error: 'ALREADY_CLAIMED',
55
- message: 'Revoke evidence already seen on this chain',
56
- fn: ({ evidenceState }) => !evidenceState,
57
- },
58
- ])
59
- );
60
-
61
- // 4. verify evidence tx
62
- runner.use(pipes.ExtractState({ from: 'itx.evidence.hash', to: 'txState', status: 'INVALID_TX', table: 'tx' }));
63
- runner.use(
64
- pipes.VerifyInfo([
65
- {
66
- error: 'INVALID_TX',
67
- message: 'Evidence tx is not valid',
68
- fn: ({ txState }) => txState.code === 'OK',
69
- },
70
- {
71
- error: 'INVALID_TX',
72
- message: 'Evidence tx type is not valid',
73
- fn: ({ txState }) => txState.type === 'revoke_stake',
74
- },
75
- {
76
- error: 'INVALID_TX',
77
- message: 'Evidence tx does not belong to same stake',
78
- fn: ({ txState, itx }) => txState.tx.itxJson.address === itx.address,
79
- },
80
- {
81
- error: 'WITHIN_WAITING_PERIOD',
82
- message: 'You can not claim stake before waiting period ends',
83
- fn: ({ txState, stakeState, txTime }) => {
84
- const end = +new Date(txState.time) + (stakeState.revokeWaitingPeriod || 0) * 1000;
85
- const now = +new Date(txTime);
86
- return now > end;
87
- },
88
- },
89
- ])
90
- );
91
-
92
- // 5. assemble output
93
- runner.use(
94
- pipes.VerifyTxInput({
95
- fieldKey: 'txState.tx.itxJson.outputs',
96
- inputsKey: 'outputs',
97
- sendersKey: 'receivers',
98
- tokensKey: 'tokens',
99
- assetsKey: 'assets',
100
- })
101
- );
102
-
103
- // 6. verify receiver states
104
- runner.use(
105
- pipes.ExtractState({ from: 'receivers', to: 'receiverStates', status: 'INVALID_RECEIVER_STATE', table: 'account' })
106
- );
107
-
108
- // 7. verify token state and balance
109
- runner.use(pipes.ExtractState({ from: 'tokens', to: 'tokenStates', status: 'INVALID_TOKEN', table: 'token' }));
110
- runner.use((context, next) => {
111
- const { outputs, stakeState } = context;
112
- const tokensToClaim = {};
113
- outputs.forEach(({ tokens }) => {
114
- tokens.forEach(({ address, value }) => {
115
- if (typeof tokensToClaim[address] === 'undefined') {
116
- tokensToClaim[address] = new BN(0);
117
- }
118
- tokensToClaim[address] = tokensToClaim[address].add(new BN(value));
119
- });
120
- });
121
-
122
- context.tokenCondition = {
123
- owner: stakeState.address,
124
- tokens: Object.keys(tokensToClaim).map((address) => ({ address, value: tokensToClaim[address] })),
125
- };
126
-
127
- next();
128
- });
129
- runner.use(
130
- pipes.VerifyTokenBalance({
131
- ownerKey: 'stakeState',
132
- conditionKey: 'tokenCondition',
133
- tokensKey: 'revokedTokens',
134
- })
135
- );
136
-
137
- // 7. verify asset state and ownership
138
- runner.use(pipes.ExtractState({ from: 'assets', to: 'assetStates', status: 'OK', table: 'asset' }));
139
- runner.use(pipes.VerifyTransferrable({ assets: 'assetStates' }));
140
- runner.use(pipes.VerifyUpdater({ assetKey: 'assetStates', ownerKey: 'stakeState' }));
141
-
142
- // Ensure tx fee and gas
143
- runner.use(
144
- EnsureTxGas((context) => {
145
- const result = { create: 1, update: 2, payment: 0 };
146
- if (context.receiverStates) {
147
- result.update += context.receiverStates.length;
148
- }
149
- if (context.assetStates) {
150
- result.update += context.assetStates.length;
151
- }
152
-
153
- return result;
154
- })
155
- );
156
- runner.use(EnsureTxCost({ attachSenderChanges: true }));
157
-
158
- // Save context snapshot before updating states
159
- runner.use(pipes.TakeStateSnapshot());
160
-
161
- // 8. update statedb
162
- runner.use(
163
- async (context, next) => {
164
- const {
165
- tx,
166
- itx,
167
- outputs,
168
- statedb,
169
- senderState,
170
- senderChange,
171
- stakeState,
172
- receiverStates,
173
- updateVaults,
174
- assetStates = [],
175
- } = context;
176
-
177
- const receiverUpdates = {};
178
- const assetUpdates = {};
179
- const stakeUpdates = {
180
- revokedTokens: stakeState.revokedTokens || {},
181
- revokedAssets: stakeState.revokedAssets || [],
182
- };
183
-
184
- outputs.forEach((x) => {
185
- const { owner, tokens, assets } = x;
186
-
187
- // Update receiver balance
188
- const ownerState = receiverStates.find((s) => getRelatedAddresses(s).includes(owner));
189
- receiverUpdates[ownerState.address] = applyTokenUpdates(tokens, ownerState, 'add');
190
- if (senderChange && ownerState.address === senderChange.address) {
191
- receiverUpdates[ownerState.address] = applyTokenChange(receiverUpdates[ownerState.address], senderChange);
192
- }
193
-
194
- // Update asset owner
195
- assets.forEach((a) => {
196
- assetUpdates[a] = { owner: ownerState.address };
197
- });
198
-
199
- // Update Stake Revoked fields
200
- const revoked = applyTokenUpdates(tokens, { tokens: stakeUpdates.revokedTokens }, 'sub');
201
- stakeUpdates.revokedTokens = revoked.tokens;
202
- stakeUpdates.revokedAssets = stakeUpdates.revokedAssets.filter((a) => assets.includes(a) === false);
203
- });
204
-
205
- const isAlsoSigner = !!receiverUpdates[senderState.address];
206
-
207
- const [newSenderState, newReceiverStates, newStakeState, newAssetStates, evidenceState] = await Promise.all([
208
- // Update sender state
209
- statedb.account.update(
210
- senderState.address,
211
- account.update(
212
- senderState,
213
- Object.assign(
214
- { nonce: tx.nonce },
215
- receiverUpdates[senderState.address] || (senderChange ? applyTokenChange(senderState, senderChange) : {})
216
- ),
217
- context
218
- ),
219
- context
220
- ),
221
-
222
- // Update receiver states
223
- Promise.all(
224
- receiverStates
225
- .filter((x) => x.address !== senderState.address)
226
- .map((x) =>
227
- statedb.account.update(x.address, account.update(x, receiverUpdates[x.address], context), context)
228
- )
229
- ),
230
-
231
- // Update stake state
232
- statedb.stake.update(stakeState.address, stake.update(stakeState, stakeUpdates, context), context),
233
-
234
- // Transfer assets to output account
235
- Promise.all(
236
- assetStates.map((x) =>
237
- statedb.asset.update(x.address, asset.update(x, assetUpdates[x.address], context), context)
238
- )
239
- ),
240
-
241
- // Create evidence state
242
- statedb.evidence.create(
243
- itx.evidence.hash,
244
- evidence.create({ hash: itx.evidence.hash, data: 'claim-stake' }, context),
245
- context
246
- ),
247
- ]);
248
-
249
- await updateVaults();
250
-
251
- context.senderState = newSenderState;
252
- context.receiverStates = isAlsoSigner ? newReceiverStates.concat(newSenderState) : newReceiverStates;
253
- context.stakeState = newStakeState;
254
- context.assetStates = newAssetStates;
255
- context.evidenceState = evidenceState;
256
-
257
- debug('claim-stake', { address: itx.address, stakeUpdates, receiverUpdates, assetUpdates });
258
-
259
- next();
260
- },
261
- { persistError: true }
262
- );
263
-
264
- runner.use(pipes.VerifyStateDiff());
265
-
266
- module.exports = runner;