@ottochain/sdk 0.2.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 (330) hide show
  1. package/README.md +305 -0
  2. package/dist/apps/contracts/index.d.ts +21 -0
  3. package/dist/apps/contracts/index.js +39 -0
  4. package/dist/apps/contracts/types.d.ts +24 -0
  5. package/dist/apps/contracts/types.js +48 -0
  6. package/dist/apps/identity/index.d.ts +22 -0
  7. package/dist/apps/identity/index.js +40 -0
  8. package/dist/apps/identity/types.d.ts +30 -0
  9. package/dist/apps/identity/types.js +53 -0
  10. package/dist/apps/index.d.ts +29 -0
  11. package/dist/apps/index.js +60 -0
  12. package/dist/apps/markets/index.d.ts +26 -0
  13. package/dist/apps/markets/index.js +46 -0
  14. package/dist/apps/markets/types.d.ts +185 -0
  15. package/dist/apps/markets/types.js +252 -0
  16. package/dist/apps/oracles/index.d.ts +26 -0
  17. package/dist/apps/oracles/index.js +46 -0
  18. package/dist/apps/oracles/types.d.ts +211 -0
  19. package/dist/apps/oracles/types.js +306 -0
  20. package/dist/cjs/apps/contracts/index.js +60 -0
  21. package/dist/cjs/apps/contracts/state-machines/contract.json +420 -0
  22. package/dist/cjs/apps/contracts/state-machines/escrow.json +426 -0
  23. package/dist/cjs/apps/contracts/types.js +48 -0
  24. package/dist/cjs/apps/corporate/index.js +112 -0
  25. package/dist/cjs/apps/corporate/state-machines/corporate-board.json +1064 -0
  26. package/dist/cjs/apps/corporate/state-machines/corporate-bylaws.json +751 -0
  27. package/dist/cjs/apps/corporate/state-machines/corporate-committee.json +957 -0
  28. package/dist/cjs/apps/corporate/state-machines/corporate-compliance.json +1293 -0
  29. package/dist/cjs/apps/corporate/state-machines/corporate-entity.json +861 -0
  30. package/dist/cjs/apps/corporate/state-machines/corporate-officers.json +843 -0
  31. package/dist/cjs/apps/corporate/state-machines/corporate-proxy.json +783 -0
  32. package/dist/cjs/apps/corporate/state-machines/corporate-resolution.json +1174 -0
  33. package/dist/cjs/apps/corporate/state-machines/corporate-securities.json +1215 -0
  34. package/dist/cjs/apps/corporate/state-machines/corporate-shareholders.json +1298 -0
  35. package/dist/cjs/apps/corporate/types.js +44 -0
  36. package/dist/cjs/apps/governance/index.js +203 -0
  37. package/dist/cjs/apps/governance/state-machines/dao-multisig.json +711 -0
  38. package/dist/cjs/apps/governance/state-machines/dao-single.json +258 -0
  39. package/dist/cjs/apps/governance/state-machines/dao-threshold.json +660 -0
  40. package/dist/cjs/apps/governance/state-machines/dao-token.json +680 -0
  41. package/dist/cjs/apps/governance/state-machines/governance-constitution.json +401 -0
  42. package/dist/cjs/apps/governance/state-machines/governance-executive.json +441 -0
  43. package/dist/cjs/apps/governance/state-machines/governance-judiciary.json +626 -0
  44. package/dist/cjs/apps/governance/state-machines/governance-legislature.json +726 -0
  45. package/dist/cjs/apps/governance/state-machines/governance-simple.json +679 -0
  46. package/dist/cjs/apps/governance/types.js +42 -0
  47. package/dist/cjs/apps/identity/constants.js +58 -0
  48. package/dist/cjs/apps/identity/index.js +78 -0
  49. package/dist/cjs/apps/identity/state-machines/agent-identity.json +320 -0
  50. package/dist/cjs/apps/identity/types.js +53 -0
  51. package/dist/cjs/apps/index.js +58 -0
  52. package/dist/cjs/apps/markets/index.js +55 -0
  53. package/dist/cjs/apps/markets/state-machines/market-universal.json +354 -0
  54. package/dist/cjs/apps/markets/types.js +219 -0
  55. package/dist/cjs/apps/oracles/index.js +62 -0
  56. package/dist/cjs/apps/oracles/state-machines/oracle.json +452 -0
  57. package/dist/cjs/apps/oracles/types.js +282 -0
  58. package/dist/cjs/errors.js +293 -0
  59. package/dist/cjs/generated/google/protobuf/struct.js +514 -0
  60. package/dist/cjs/generated/google/protobuf/timestamp.js +92 -0
  61. package/dist/cjs/generated/index.js +150 -0
  62. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract.js +873 -0
  63. package/dist/cjs/generated/ottochain/apps/contracts/v1/contract_pb.js +100 -0
  64. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate.js +4515 -0
  65. package/dist/cjs/generated/ottochain/apps/corporate/v1/corporate_pb.js +392 -0
  66. package/dist/cjs/generated/ottochain/apps/governance/v1/governance.js +3255 -0
  67. package/dist/cjs/generated/ottochain/apps/governance/v1/governance_pb.js +235 -0
  68. package/dist/cjs/generated/ottochain/apps/identity/v1/agent.js +619 -0
  69. package/dist/cjs/generated/ottochain/apps/identity/v1/agent_pb.js +116 -0
  70. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation.js +780 -0
  71. package/dist/cjs/generated/ottochain/apps/identity/v1/attestation_pb.js +79 -0
  72. package/dist/cjs/generated/ottochain/apps/markets/v1/market.js +1261 -0
  73. package/dist/cjs/generated/ottochain/apps/markets/v1/market_pb.js +151 -0
  74. package/dist/cjs/generated/ottochain/apps/oracles/v1/oracle.js +1223 -0
  75. package/dist/cjs/generated/ottochain/apps/oracles/v1/oracle_pb.js +109 -0
  76. package/dist/cjs/generated/ottochain/v1/common.js +10 -0
  77. package/dist/cjs/generated/ottochain/v1/common_pb.js +37 -0
  78. package/dist/cjs/generated/ottochain/v1/fiber.js +1057 -0
  79. package/dist/cjs/generated/ottochain/v1/fiber_pb.js +86 -0
  80. package/dist/cjs/generated/ottochain/v1/messages.js +740 -0
  81. package/dist/cjs/generated/ottochain/v1/messages_pb.js +44 -0
  82. package/dist/cjs/generated/ottochain/v1/records.js +1253 -0
  83. package/dist/cjs/generated/ottochain/v1/records_pb.js +44 -0
  84. package/dist/cjs/index.js +79 -0
  85. package/dist/cjs/metakit/binary.js +58 -0
  86. package/dist/cjs/metakit/canonicalize.js +40 -0
  87. package/dist/cjs/metakit/codec.js +45 -0
  88. package/dist/cjs/metakit/currency-transaction.js +319 -0
  89. package/dist/cjs/metakit/currency-types.js +13 -0
  90. package/dist/cjs/metakit/hash.js +84 -0
  91. package/dist/cjs/metakit/index.js +74 -0
  92. package/dist/cjs/metakit/network/client.js +78 -0
  93. package/dist/cjs/metakit/network/currency-l1-client.js +101 -0
  94. package/dist/cjs/metakit/network/data-l1-client.js +76 -0
  95. package/dist/cjs/metakit/network/index.js +16 -0
  96. package/dist/cjs/metakit/network/types.js +20 -0
  97. package/dist/cjs/metakit/sign.js +120 -0
  98. package/dist/cjs/metakit/signed-object.js +100 -0
  99. package/dist/cjs/metakit/types.js +14 -0
  100. package/dist/cjs/metakit/verify.js +217 -0
  101. package/dist/cjs/metakit/wallet.js +127 -0
  102. package/dist/cjs/ottochain/index.js +47 -0
  103. package/dist/cjs/ottochain/metagraph-client.js +157 -0
  104. package/dist/cjs/ottochain/snapshot.js +110 -0
  105. package/dist/cjs/ottochain/types.js +11 -0
  106. package/dist/cjs/package.json +1 -0
  107. package/dist/cjs/types.js +25 -0
  108. package/dist/cjs/validation.js +312 -0
  109. package/dist/errors.d.ts +221 -0
  110. package/dist/errors.js +293 -0
  111. package/dist/esm/apps/contracts/index.js +42 -0
  112. package/dist/esm/apps/contracts/state-machines/contract.json +420 -0
  113. package/dist/esm/apps/contracts/state-machines/escrow.json +426 -0
  114. package/dist/esm/apps/contracts/types.js +44 -0
  115. package/dist/esm/apps/corporate/index.js +57 -0
  116. package/dist/esm/apps/corporate/state-machines/corporate-board.json +1064 -0
  117. package/dist/esm/apps/corporate/state-machines/corporate-bylaws.json +751 -0
  118. package/dist/esm/apps/corporate/state-machines/corporate-committee.json +957 -0
  119. package/dist/esm/apps/corporate/state-machines/corporate-compliance.json +1293 -0
  120. package/dist/esm/apps/corporate/state-machines/corporate-entity.json +861 -0
  121. package/dist/esm/apps/corporate/state-machines/corporate-officers.json +843 -0
  122. package/dist/esm/apps/corporate/state-machines/corporate-proxy.json +783 -0
  123. package/dist/esm/apps/corporate/state-machines/corporate-resolution.json +1174 -0
  124. package/dist/esm/apps/corporate/state-machines/corporate-securities.json +1215 -0
  125. package/dist/esm/apps/corporate/state-machines/corporate-shareholders.json +1298 -0
  126. package/dist/esm/apps/corporate/types.js +38 -0
  127. package/dist/esm/apps/governance/index.js +154 -0
  128. package/dist/esm/apps/governance/state-machines/dao-multisig.json +711 -0
  129. package/dist/esm/apps/governance/state-machines/dao-single.json +258 -0
  130. package/dist/esm/apps/governance/state-machines/dao-threshold.json +660 -0
  131. package/dist/esm/apps/governance/state-machines/dao-token.json +680 -0
  132. package/dist/esm/apps/governance/state-machines/governance-constitution.json +401 -0
  133. package/dist/esm/apps/governance/state-machines/governance-executive.json +441 -0
  134. package/dist/esm/apps/governance/state-machines/governance-judiciary.json +626 -0
  135. package/dist/esm/apps/governance/state-machines/governance-legislature.json +726 -0
  136. package/dist/esm/apps/governance/state-machines/governance-simple.json +679 -0
  137. package/dist/esm/apps/governance/types.js +35 -0
  138. package/dist/esm/apps/identity/constants.js +53 -0
  139. package/dist/esm/apps/identity/index.js +50 -0
  140. package/dist/esm/apps/identity/state-machines/agent-identity.json +320 -0
  141. package/dist/esm/apps/identity/types.js +50 -0
  142. package/dist/esm/apps/index.js +32 -0
  143. package/dist/esm/apps/markets/index.js +34 -0
  144. package/dist/esm/apps/markets/state-machines/market-universal.json +354 -0
  145. package/dist/esm/apps/markets/types.js +206 -0
  146. package/dist/esm/apps/oracles/index.js +42 -0
  147. package/dist/esm/apps/oracles/state-machines/oracle.json +452 -0
  148. package/dist/esm/apps/oracles/types.js +267 -0
  149. package/dist/esm/errors.js +283 -0
  150. package/dist/esm/generated/google/protobuf/struct.js +508 -0
  151. package/dist/esm/generated/google/protobuf/timestamp.js +89 -0
  152. package/dist/esm/generated/index.js +26 -0
  153. package/dist/esm/generated/ottochain/apps/contracts/v1/contract.js +867 -0
  154. package/dist/esm/generated/ottochain/apps/contracts/v1/contract_pb.js +97 -0
  155. package/dist/esm/generated/ottochain/apps/corporate/v1/corporate.js +4493 -0
  156. package/dist/esm/generated/ottochain/apps/corporate/v1/corporate_pb.js +389 -0
  157. package/dist/esm/generated/ottochain/apps/governance/v1/governance.js +3240 -0
  158. package/dist/esm/generated/ottochain/apps/governance/v1/governance_pb.js +232 -0
  159. package/dist/esm/generated/ottochain/apps/identity/v1/agent.js +610 -0
  160. package/dist/esm/generated/ottochain/apps/identity/v1/agent_pb.js +113 -0
  161. package/dist/esm/generated/ottochain/apps/identity/v1/attestation.js +774 -0
  162. package/dist/esm/generated/ottochain/apps/identity/v1/attestation_pb.js +76 -0
  163. package/dist/esm/generated/ottochain/apps/markets/v1/market.js +1252 -0
  164. package/dist/esm/generated/ottochain/apps/markets/v1/market_pb.js +148 -0
  165. package/dist/esm/generated/ottochain/apps/oracles/v1/oracle.js +1217 -0
  166. package/dist/esm/generated/ottochain/apps/oracles/v1/oracle_pb.js +106 -0
  167. package/dist/esm/generated/ottochain/v1/common.js +7 -0
  168. package/dist/esm/generated/ottochain/v1/common_pb.js +34 -0
  169. package/dist/esm/generated/ottochain/v1/fiber.js +1051 -0
  170. package/dist/esm/generated/ottochain/v1/fiber_pb.js +83 -0
  171. package/dist/esm/generated/ottochain/v1/messages.js +737 -0
  172. package/dist/esm/generated/ottochain/v1/messages_pb.js +41 -0
  173. package/dist/esm/generated/ottochain/v1/records.js +1250 -0
  174. package/dist/esm/generated/ottochain/v1/records_pb.js +41 -0
  175. package/dist/esm/index.js +33 -0
  176. package/dist/esm/metakit/binary.js +53 -0
  177. package/dist/esm/metakit/canonicalize.js +33 -0
  178. package/dist/esm/metakit/codec.js +38 -0
  179. package/dist/esm/metakit/currency-transaction.js +306 -0
  180. package/dist/esm/metakit/currency-types.js +10 -0
  181. package/dist/esm/metakit/hash.js +77 -0
  182. package/dist/esm/metakit/index.js +30 -0
  183. package/dist/esm/metakit/network/client.js +74 -0
  184. package/dist/esm/metakit/network/currency-l1-client.js +97 -0
  185. package/dist/esm/metakit/network/data-l1-client.js +72 -0
  186. package/dist/esm/metakit/network/index.js +9 -0
  187. package/dist/esm/metakit/network/types.js +16 -0
  188. package/dist/esm/metakit/sign.js +114 -0
  189. package/dist/esm/metakit/signed-object.js +94 -0
  190. package/dist/esm/metakit/types.js +11 -0
  191. package/dist/esm/metakit/verify.js +210 -0
  192. package/dist/esm/metakit/wallet.js +117 -0
  193. package/dist/esm/ottochain/index.js +13 -0
  194. package/dist/esm/ottochain/metagraph-client.js +153 -0
  195. package/dist/esm/ottochain/snapshot.js +100 -0
  196. package/dist/esm/ottochain/types.js +10 -0
  197. package/dist/esm/package.json +1 -0
  198. package/dist/esm/types.js +20 -0
  199. package/dist/esm/validation.js +301 -0
  200. package/dist/generated/index.d.ts +15 -0
  201. package/dist/generated/index.js +34 -0
  202. package/dist/generated/ottochain/apps/contracts/v1/contract_pb.d.ts +274 -0
  203. package/dist/generated/ottochain/apps/contracts/v1/contract_pb.js +100 -0
  204. package/dist/generated/ottochain/apps/identity/v1/agent_pb.d.ts +211 -0
  205. package/dist/generated/ottochain/apps/identity/v1/agent_pb.js +116 -0
  206. package/dist/generated/ottochain/apps/identity/v1/attestation_pb.d.ts +238 -0
  207. package/dist/generated/ottochain/apps/identity/v1/attestation_pb.js +79 -0
  208. package/dist/generated/ottochain/apps/markets/v1/market_pb.d.ts +436 -0
  209. package/dist/generated/ottochain/apps/markets/v1/market_pb.js +151 -0
  210. package/dist/generated/ottochain/apps/oracles/v1/oracle_pb.d.ts +393 -0
  211. package/dist/generated/ottochain/apps/oracles/v1/oracle_pb.js +109 -0
  212. package/dist/generated/ottochain/v1/common_pb.d.ts +86 -0
  213. package/dist/generated/ottochain/v1/common_pb.js +37 -0
  214. package/dist/generated/ottochain/v1/fiber_pb.d.ts +292 -0
  215. package/dist/generated/ottochain/v1/fiber_pb.js +86 -0
  216. package/dist/generated/ottochain/v1/messages_pb.d.ts +190 -0
  217. package/dist/generated/ottochain/v1/messages_pb.js +44 -0
  218. package/dist/generated/ottochain/v1/records_pb.d.ts +221 -0
  219. package/dist/generated/ottochain/v1/records_pb.js +44 -0
  220. package/dist/index.d.ts +21 -0
  221. package/dist/index.js +77 -0
  222. package/dist/metakit/binary.d.ts +38 -0
  223. package/dist/metakit/binary.js +58 -0
  224. package/dist/metakit/canonicalize.d.ts +26 -0
  225. package/dist/metakit/canonicalize.js +40 -0
  226. package/dist/metakit/codec.d.ts +16 -0
  227. package/dist/metakit/codec.js +45 -0
  228. package/dist/metakit/currency-transaction.d.ts +157 -0
  229. package/dist/metakit/currency-transaction.js +319 -0
  230. package/dist/metakit/currency-types.d.ts +55 -0
  231. package/dist/metakit/currency-types.js +13 -0
  232. package/dist/metakit/hash.d.ts +50 -0
  233. package/dist/metakit/hash.js +84 -0
  234. package/dist/metakit/index.d.ts +23 -0
  235. package/dist/metakit/index.js +74 -0
  236. package/dist/metakit/network/client.d.ts +23 -0
  237. package/dist/metakit/network/client.js +78 -0
  238. package/dist/metakit/network/currency-l1-client.d.ts +71 -0
  239. package/dist/metakit/network/currency-l1-client.js +101 -0
  240. package/dist/metakit/network/data-l1-client.d.ts +57 -0
  241. package/dist/metakit/network/data-l1-client.js +76 -0
  242. package/dist/metakit/network/index.d.ts +10 -0
  243. package/dist/metakit/network/index.js +16 -0
  244. package/dist/metakit/network/types.d.ts +74 -0
  245. package/dist/metakit/network/types.js +20 -0
  246. package/dist/metakit/sign.d.ts +65 -0
  247. package/dist/metakit/sign.js +120 -0
  248. package/dist/metakit/signed-object.d.ts +66 -0
  249. package/dist/metakit/signed-object.js +100 -0
  250. package/dist/metakit/types.d.ts +67 -0
  251. package/dist/metakit/types.js +14 -0
  252. package/dist/metakit/verify.d.ts +55 -0
  253. package/dist/metakit/verify.js +217 -0
  254. package/dist/metakit/wallet.d.ts +70 -0
  255. package/dist/metakit/wallet.js +127 -0
  256. package/dist/ottochain/index.d.ts +13 -0
  257. package/dist/ottochain/index.js +45 -0
  258. package/dist/ottochain/metagraph-client.d.ts +111 -0
  259. package/dist/ottochain/metagraph-client.js +157 -0
  260. package/dist/ottochain/snapshot.d.ts +86 -0
  261. package/dist/ottochain/snapshot.js +110 -0
  262. package/dist/ottochain/types.d.ts +278 -0
  263. package/dist/ottochain/types.js +11 -0
  264. package/dist/types/apps/contracts/index.d.ts +30 -0
  265. package/dist/types/apps/contracts/types.d.ts +24 -0
  266. package/dist/types/apps/corporate/index.d.ts +27 -0
  267. package/dist/types/apps/corporate/types.d.ts +9861 -0
  268. package/dist/types/apps/governance/index.d.ts +77 -0
  269. package/dist/types/apps/governance/types.d.ts +344 -0
  270. package/dist/types/apps/identity/constants.d.ts +27 -0
  271. package/dist/types/apps/identity/index.d.ts +39 -0
  272. package/dist/types/apps/identity/types.d.ts +30 -0
  273. package/dist/types/apps/index.d.ts +31 -0
  274. package/dist/types/apps/markets/index.d.ts +26 -0
  275. package/dist/types/apps/markets/types.d.ts +155 -0
  276. package/dist/types/apps/oracles/index.d.ts +34 -0
  277. package/dist/types/apps/oracles/types.d.ts +193 -0
  278. package/dist/types/errors.d.ts +221 -0
  279. package/dist/types/generated/google/protobuf/struct.d.ts +134 -0
  280. package/dist/types/generated/google/protobuf/timestamp.d.ts +134 -0
  281. package/dist/types/generated/index.d.ts +18 -0
  282. package/dist/types/generated/ottochain/apps/contracts/v1/contract.d.ts +112 -0
  283. package/dist/types/generated/ottochain/apps/contracts/v1/contract_pb.d.ts +274 -0
  284. package/dist/types/generated/ottochain/apps/corporate/v1/corporate.d.ts +376 -0
  285. package/dist/types/generated/ottochain/apps/corporate/v1/corporate_pb.d.ts +1172 -0
  286. package/dist/types/generated/ottochain/apps/governance/v1/governance.d.ts +296 -0
  287. package/dist/types/generated/ottochain/apps/governance/v1/governance_pb.d.ts +772 -0
  288. package/dist/types/generated/ottochain/apps/identity/v1/agent.d.ts +94 -0
  289. package/dist/types/generated/ottochain/apps/identity/v1/agent_pb.d.ts +211 -0
  290. package/dist/types/generated/ottochain/apps/identity/v1/attestation.d.ts +102 -0
  291. package/dist/types/generated/ottochain/apps/identity/v1/attestation_pb.d.ts +238 -0
  292. package/dist/types/generated/ottochain/apps/markets/v1/market.d.ts +174 -0
  293. package/dist/types/generated/ottochain/apps/markets/v1/market_pb.d.ts +436 -0
  294. package/dist/types/generated/ottochain/apps/oracles/v1/oracle.d.ts +150 -0
  295. package/dist/types/generated/ottochain/apps/oracles/v1/oracle_pb.d.ts +393 -0
  296. package/dist/types/generated/ottochain/v1/common.d.ts +1 -0
  297. package/dist/types/generated/ottochain/v1/common_pb.d.ts +86 -0
  298. package/dist/types/generated/ottochain/v1/fiber.d.ts +130 -0
  299. package/dist/types/generated/ottochain/v1/fiber_pb.d.ts +292 -0
  300. package/dist/types/generated/ottochain/v1/messages.d.ts +89 -0
  301. package/dist/types/generated/ottochain/v1/messages_pb.d.ts +190 -0
  302. package/dist/types/generated/ottochain/v1/records.d.ts +128 -0
  303. package/dist/types/generated/ottochain/v1/records_pb.d.ts +221 -0
  304. package/dist/types/index.d.ts +22 -0
  305. package/dist/types/metakit/binary.d.ts +38 -0
  306. package/dist/types/metakit/canonicalize.d.ts +26 -0
  307. package/dist/types/metakit/codec.d.ts +16 -0
  308. package/dist/types/metakit/currency-transaction.d.ts +157 -0
  309. package/dist/types/metakit/currency-types.d.ts +55 -0
  310. package/dist/types/metakit/hash.d.ts +50 -0
  311. package/dist/types/metakit/index.d.ts +23 -0
  312. package/dist/types/metakit/network/client.d.ts +23 -0
  313. package/dist/types/metakit/network/currency-l1-client.d.ts +71 -0
  314. package/dist/types/metakit/network/data-l1-client.d.ts +57 -0
  315. package/dist/types/metakit/network/index.d.ts +10 -0
  316. package/dist/types/metakit/network/types.d.ts +74 -0
  317. package/dist/types/metakit/sign.d.ts +65 -0
  318. package/dist/types/metakit/signed-object.d.ts +66 -0
  319. package/dist/types/metakit/types.d.ts +67 -0
  320. package/dist/types/metakit/verify.d.ts +55 -0
  321. package/dist/types/metakit/wallet.d.ts +70 -0
  322. package/dist/types/ottochain/index.d.ts +13 -0
  323. package/dist/types/ottochain/metagraph-client.d.ts +111 -0
  324. package/dist/types/ottochain/snapshot.d.ts +86 -0
  325. package/dist/types/ottochain/types.d.ts +210 -0
  326. package/dist/types/types.d.ts +51 -0
  327. package/dist/types/validation.d.ts +449 -0
  328. package/dist/validation.d.ts +449 -0
  329. package/dist/validation.js +312 -0
  330. package/package.json +136 -0
@@ -0,0 +1,1064 @@
1
+ {
2
+ "$schema": "https://ottochain.dev/schemas/state-machine-v1.json",
3
+ "name": "corporate-board",
4
+ "version": "1.0.0",
5
+ "category": "corporate-governance",
6
+ "description": "Board of directors state machine managing director seats, meetings, quorum, and formal board actions. Supports staggered boards with classified directors.",
7
+ "context": {
8
+ "boardId": {
9
+ "type": "string",
10
+ "description": "Unique identifier for this board instance"
11
+ },
12
+ "entityId": {
13
+ "type": "string",
14
+ "description": "Reference to parent corporate-entity"
15
+ },
16
+ "directors": {
17
+ "type": "array",
18
+ "items": {
19
+ "type": "object",
20
+ "properties": {
21
+ "directorId": {
22
+ "type": "string"
23
+ },
24
+ "name": {
25
+ "type": "string"
26
+ },
27
+ "email": {
28
+ "type": "string"
29
+ },
30
+ "termStart": {
31
+ "type": "string",
32
+ "format": "date"
33
+ },
34
+ "termEnd": {
35
+ "type": "string",
36
+ "format": "date"
37
+ },
38
+ "class": {
39
+ "type": "string",
40
+ "enum": [
41
+ "CLASS_I",
42
+ "CLASS_II",
43
+ "CLASS_III",
44
+ "UNCLASSIFIED"
45
+ ],
46
+ "description": "For staggered boards"
47
+ },
48
+ "status": {
49
+ "type": "string",
50
+ "enum": [
51
+ "ACTIVE",
52
+ "RESIGNED",
53
+ "REMOVED",
54
+ "TERM_EXPIRED"
55
+ ]
56
+ },
57
+ "isIndependent": {
58
+ "type": "boolean",
59
+ "description": "Independence under applicable rules"
60
+ },
61
+ "isChair": {
62
+ "type": "boolean",
63
+ "default": false
64
+ },
65
+ "isLeadIndependent": {
66
+ "type": "boolean",
67
+ "default": false
68
+ },
69
+ "committees": {
70
+ "type": "array",
71
+ "items": {
72
+ "type": "string"
73
+ },
74
+ "description": "Committee memberships by committee ID"
75
+ },
76
+ "electedBy": {
77
+ "type": "string",
78
+ "description": "Resolution reference for election"
79
+ },
80
+ "compensationAgreementRef": {
81
+ "type": "string",
82
+ "nullable": true
83
+ }
84
+ }
85
+ }
86
+ },
87
+ "seats": {
88
+ "type": "object",
89
+ "properties": {
90
+ "authorized": {
91
+ "type": "integer",
92
+ "description": "Number of board seats authorized by bylaws"
93
+ },
94
+ "filled": {
95
+ "type": "integer"
96
+ },
97
+ "vacant": {
98
+ "type": "integer"
99
+ }
100
+ }
101
+ },
102
+ "boardStructure": {
103
+ "type": "object",
104
+ "properties": {
105
+ "isClassified": {
106
+ "type": "boolean",
107
+ "description": "Whether board has staggered terms"
108
+ },
109
+ "termYears": {
110
+ "type": "integer",
111
+ "default": 1,
112
+ "description": "Director term length"
113
+ },
114
+ "classTerms": {
115
+ "type": "object",
116
+ "properties": {
117
+ "CLASS_I": {
118
+ "type": "integer"
119
+ },
120
+ "CLASS_II": {
121
+ "type": "integer"
122
+ },
123
+ "CLASS_III": {
124
+ "type": "integer"
125
+ }
126
+ }
127
+ }
128
+ }
129
+ },
130
+ "quorumRules": {
131
+ "type": "object",
132
+ "properties": {
133
+ "type": {
134
+ "type": "string",
135
+ "enum": [
136
+ "MAJORITY",
137
+ "SUPERMAJORITY",
138
+ "FIXED_NUMBER"
139
+ ],
140
+ "default": "MAJORITY"
141
+ },
142
+ "threshold": {
143
+ "type": "number",
144
+ "description": "Fraction for majority/super, or count for fixed"
145
+ },
146
+ "minimumRequired": {
147
+ "type": "integer",
148
+ "description": "Absolute minimum regardless of formula"
149
+ }
150
+ }
151
+ },
152
+ "votingRules": {
153
+ "type": "object",
154
+ "properties": {
155
+ "standardApproval": {
156
+ "type": "string",
157
+ "enum": [
158
+ "MAJORITY_PRESENT",
159
+ "MAJORITY_FULL_BOARD"
160
+ ],
161
+ "default": "MAJORITY_PRESENT"
162
+ },
163
+ "supermajorityMatters": {
164
+ "type": "array",
165
+ "items": {
166
+ "type": "string"
167
+ },
168
+ "description": "Action types requiring supermajority"
169
+ },
170
+ "supermajorityThreshold": {
171
+ "type": "number",
172
+ "default": 0.6667
173
+ }
174
+ }
175
+ },
176
+ "currentMeeting": {
177
+ "type": "object",
178
+ "nullable": true,
179
+ "properties": {
180
+ "meetingId": {
181
+ "type": "string"
182
+ },
183
+ "type": {
184
+ "type": "string",
185
+ "enum": [
186
+ "REGULAR",
187
+ "SPECIAL",
188
+ "ANNUAL",
189
+ "ORGANIZATIONAL"
190
+ ]
191
+ },
192
+ "scheduledDate": {
193
+ "type": "string",
194
+ "format": "date-time"
195
+ },
196
+ "location": {
197
+ "type": "string"
198
+ },
199
+ "isVirtual": {
200
+ "type": "boolean"
201
+ },
202
+ "calledBy": {
203
+ "type": "string"
204
+ },
205
+ "noticeDate": {
206
+ "type": "string",
207
+ "format": "date"
208
+ },
209
+ "agenda": {
210
+ "type": "array",
211
+ "items": {
212
+ "type": "string"
213
+ }
214
+ },
215
+ "attendees": {
216
+ "type": "array",
217
+ "items": {
218
+ "type": "object",
219
+ "properties": {
220
+ "directorId": {
221
+ "type": "string"
222
+ },
223
+ "present": {
224
+ "type": "boolean"
225
+ },
226
+ "arrivedAt": {
227
+ "type": "string",
228
+ "format": "date-time",
229
+ "nullable": true
230
+ },
231
+ "departedAt": {
232
+ "type": "string",
233
+ "format": "date-time",
234
+ "nullable": true
235
+ },
236
+ "viaProxy": {
237
+ "type": "boolean",
238
+ "default": false
239
+ }
240
+ }
241
+ }
242
+ },
243
+ "quorumPresent": {
244
+ "type": "boolean"
245
+ },
246
+ "quorumCount": {
247
+ "type": "integer"
248
+ },
249
+ "openedAt": {
250
+ "type": "string",
251
+ "format": "date-time",
252
+ "nullable": true
253
+ },
254
+ "closedAt": {
255
+ "type": "string",
256
+ "format": "date-time",
257
+ "nullable": true
258
+ },
259
+ "minutesRef": {
260
+ "type": "string",
261
+ "nullable": true
262
+ }
263
+ }
264
+ },
265
+ "meetingHistory": {
266
+ "type": "array",
267
+ "items": {
268
+ "type": "object",
269
+ "properties": {
270
+ "meetingId": {
271
+ "type": "string"
272
+ },
273
+ "type": {
274
+ "type": "string"
275
+ },
276
+ "date": {
277
+ "type": "string",
278
+ "format": "date"
279
+ },
280
+ "quorumAchieved": {
281
+ "type": "boolean"
282
+ },
283
+ "attendeeCount": {
284
+ "type": "integer"
285
+ },
286
+ "resolutionsPassed": {
287
+ "type": "array",
288
+ "items": {
289
+ "type": "string"
290
+ }
291
+ },
292
+ "minutesRef": {
293
+ "type": "string"
294
+ }
295
+ }
296
+ }
297
+ },
298
+ "createdAt": {
299
+ "type": "string",
300
+ "format": "date-time"
301
+ },
302
+ "updatedAt": {
303
+ "type": "string",
304
+ "format": "date-time"
305
+ }
306
+ },
307
+ "states": {
308
+ "ACTIVE": {
309
+ "description": "Board is constituted and able to conduct business. Default state between meetings.",
310
+ "metadata": null
311
+ },
312
+ "IN_MEETING": {
313
+ "description": "Board meeting is in session with quorum present. Can take formal actions.",
314
+ "metadata": null
315
+ },
316
+ "QUORUM_LOST": {
317
+ "description": "Meeting in progress but quorum lost due to departures. No further action until quorum restored or adjourned.",
318
+ "metadata": null
319
+ }
320
+ },
321
+ "initialState": "ACTIVE",
322
+ "transitions": {
323
+ "elect_director": {
324
+ "from": "ACTIVE",
325
+ "to": "ACTIVE",
326
+ "description": "Add a new director to the board (election typically done at shareholder meeting or by board to fill vacancy)",
327
+ "event": {
328
+ "name": "elect_director",
329
+ "payload": {
330
+ "directorId": {
331
+ "type": "string",
332
+ "required": true
333
+ },
334
+ "name": {
335
+ "type": "string",
336
+ "required": true
337
+ },
338
+ "email": {
339
+ "type": "string"
340
+ },
341
+ "termStart": {
342
+ "type": "string",
343
+ "format": "date",
344
+ "required": true
345
+ },
346
+ "termEnd": {
347
+ "type": "string",
348
+ "format": "date",
349
+ "required": true
350
+ },
351
+ "class": {
352
+ "type": "string",
353
+ "enum": [
354
+ "CLASS_I",
355
+ "CLASS_II",
356
+ "CLASS_III",
357
+ "UNCLASSIFIED"
358
+ ]
359
+ },
360
+ "isIndependent": {
361
+ "type": "boolean",
362
+ "required": true
363
+ },
364
+ "electionResolutionRef": {
365
+ "type": "string",
366
+ "required": true,
367
+ "description": "Shareholder or board resolution"
368
+ },
369
+ "isFillingVacancy": {
370
+ "type": "boolean",
371
+ "default": false
372
+ }
373
+ }
374
+ },
375
+ "guards": [
376
+ {
377
+ "name": "hasAvailableSeat",
378
+ "description": "Must have vacant seat or be filling expired term",
379
+ "expression": "context.seats.vacant > 0 || event.isFillingVacancy"
380
+ },
381
+ {
382
+ "name": "hasElectionResolution",
383
+ "description": "Must have valid election resolution (shareholder for annual, board for vacancy fill)",
384
+ "expression": "event.electionResolutionRef != null"
385
+ },
386
+ {
387
+ "name": "notAlreadyDirector",
388
+ "description": "Person not already serving on board",
389
+ "expression": "!context.directors.some(d => d.directorId === event.directorId && d.status === 'ACTIVE')"
390
+ }
391
+ ],
392
+ "effects": [
393
+ {
394
+ "type": "APPEND_ARRAY",
395
+ "path": "directors",
396
+ "value": {
397
+ "directorId": "{{ event.directorId }}",
398
+ "name": "{{ event.name }}",
399
+ "email": "{{ event.email }}",
400
+ "termStart": "{{ event.termStart }}",
401
+ "termEnd": "{{ event.termEnd }}",
402
+ "class": "{{ event.class }}",
403
+ "status": "ACTIVE",
404
+ "isIndependent": "{{ event.isIndependent }}",
405
+ "isChair": false,
406
+ "isLeadIndependent": false,
407
+ "committees": [],
408
+ "electedBy": "{{ event.electionResolutionRef }}"
409
+ }
410
+ },
411
+ {
412
+ "type": "INCREMENT",
413
+ "path": "seats.filled",
414
+ "amount": 1
415
+ },
416
+ {
417
+ "type": "DECREMENT",
418
+ "path": "seats.vacant",
419
+ "amount": 1
420
+ },
421
+ {
422
+ "type": "EMIT_EVENT",
423
+ "eventType": "DIRECTOR_ELECTED",
424
+ "payload": {
425
+ "boardId": "{{ context.boardId }}",
426
+ "directorId": "{{ event.directorId }}",
427
+ "name": "{{ event.name }}",
428
+ "termEnd": "{{ event.termEnd }}"
429
+ }
430
+ }
431
+ ]
432
+ },
433
+ "resign_director": {
434
+ "from": [
435
+ "ACTIVE",
436
+ "IN_MEETING"
437
+ ],
438
+ "to": "ACTIVE",
439
+ "description": "Director resigns from the board",
440
+ "event": {
441
+ "name": "resign_director",
442
+ "payload": {
443
+ "directorId": {
444
+ "type": "string",
445
+ "required": true
446
+ },
447
+ "effectiveDate": {
448
+ "type": "string",
449
+ "format": "date",
450
+ "required": true
451
+ },
452
+ "reason": {
453
+ "type": "string"
454
+ },
455
+ "resignationLetter": {
456
+ "type": "string",
457
+ "description": "Document reference"
458
+ }
459
+ }
460
+ },
461
+ "guards": [
462
+ {
463
+ "name": "isActiveDirector",
464
+ "expression": "context.directors.some(d => d.directorId === event.directorId && d.status === 'ACTIVE')"
465
+ }
466
+ ],
467
+ "effects": [
468
+ {
469
+ "type": "UPDATE_ARRAY_ITEM",
470
+ "path": "directors",
471
+ "matchKey": "directorId",
472
+ "matchValue": "{{ event.directorId }}",
473
+ "updates": {
474
+ "status": "RESIGNED",
475
+ "termEnd": "{{ event.effectiveDate }}"
476
+ }
477
+ },
478
+ {
479
+ "type": "DECREMENT",
480
+ "path": "seats.filled",
481
+ "amount": 1
482
+ },
483
+ {
484
+ "type": "INCREMENT",
485
+ "path": "seats.vacant",
486
+ "amount": 1
487
+ },
488
+ {
489
+ "type": "EMIT_EVENT",
490
+ "eventType": "DIRECTOR_RESIGNED",
491
+ "payload": {
492
+ "boardId": "{{ context.boardId }}",
493
+ "directorId": "{{ event.directorId }}",
494
+ "effectiveDate": "{{ event.effectiveDate }}"
495
+ }
496
+ }
497
+ ]
498
+ },
499
+ "remove_for_cause": {
500
+ "from": "ACTIVE",
501
+ "to": "ACTIVE",
502
+ "description": "Remove a director for cause (requires board or shareholder action depending on bylaws)",
503
+ "event": {
504
+ "name": "remove_for_cause",
505
+ "payload": {
506
+ "directorId": {
507
+ "type": "string",
508
+ "required": true
509
+ },
510
+ "cause": {
511
+ "type": "string",
512
+ "required": true
513
+ },
514
+ "removalResolutionRef": {
515
+ "type": "string",
516
+ "required": true
517
+ },
518
+ "effectiveDate": {
519
+ "type": "string",
520
+ "format": "date",
521
+ "required": true
522
+ }
523
+ }
524
+ },
525
+ "guards": [
526
+ {
527
+ "name": "isActiveDirector",
528
+ "expression": "context.directors.some(d => d.directorId === event.directorId && d.status === 'ACTIVE')"
529
+ },
530
+ {
531
+ "name": "hasRemovalResolution",
532
+ "crossMachine": {
533
+ "machine": "corporate-resolution",
534
+ "instanceRef": "{{ event.removalResolutionRef }}",
535
+ "requiredState": "EXECUTED"
536
+ }
537
+ }
538
+ ],
539
+ "effects": [
540
+ {
541
+ "type": "UPDATE_ARRAY_ITEM",
542
+ "path": "directors",
543
+ "matchKey": "directorId",
544
+ "matchValue": "{{ event.directorId }}",
545
+ "updates": {
546
+ "status": "REMOVED",
547
+ "termEnd": "{{ event.effectiveDate }}"
548
+ }
549
+ },
550
+ {
551
+ "type": "DECREMENT",
552
+ "path": "seats.filled",
553
+ "amount": 1
554
+ },
555
+ {
556
+ "type": "INCREMENT",
557
+ "path": "seats.vacant",
558
+ "amount": 1
559
+ },
560
+ {
561
+ "type": "EMIT_EVENT",
562
+ "eventType": "DIRECTOR_REMOVED",
563
+ "payload": {
564
+ "boardId": "{{ context.boardId }}",
565
+ "directorId": "{{ event.directorId }}",
566
+ "cause": "{{ event.cause }}"
567
+ }
568
+ }
569
+ ]
570
+ },
571
+ "designate_chair": {
572
+ "from": "ACTIVE",
573
+ "to": "ACTIVE",
574
+ "description": "Designate a director as board chair",
575
+ "event": {
576
+ "name": "designate_chair",
577
+ "payload": {
578
+ "directorId": {
579
+ "type": "string",
580
+ "required": true
581
+ },
582
+ "resolutionRef": {
583
+ "type": "string",
584
+ "required": true
585
+ }
586
+ }
587
+ },
588
+ "guards": [
589
+ {
590
+ "name": "isActiveDirector",
591
+ "expression": "context.directors.some(d => d.directorId === event.directorId && d.status === 'ACTIVE')"
592
+ }
593
+ ],
594
+ "effects": [
595
+ {
596
+ "type": "UPDATE_ARRAY_ALL",
597
+ "path": "directors",
598
+ "updates": {
599
+ "isChair": false
600
+ }
601
+ },
602
+ {
603
+ "type": "UPDATE_ARRAY_ITEM",
604
+ "path": "directors",
605
+ "matchKey": "directorId",
606
+ "matchValue": "{{ event.directorId }}",
607
+ "updates": {
608
+ "isChair": true
609
+ }
610
+ }
611
+ ]
612
+ },
613
+ "call_meeting": {
614
+ "from": "ACTIVE",
615
+ "to": "ACTIVE",
616
+ "description": "Schedule a board meeting (can be called by chair, CEO, or directors per bylaws)",
617
+ "event": {
618
+ "name": "call_meeting",
619
+ "payload": {
620
+ "meetingId": {
621
+ "type": "string",
622
+ "required": true
623
+ },
624
+ "type": {
625
+ "type": "string",
626
+ "enum": [
627
+ "REGULAR",
628
+ "SPECIAL",
629
+ "ANNUAL",
630
+ "ORGANIZATIONAL"
631
+ ],
632
+ "required": true
633
+ },
634
+ "scheduledDate": {
635
+ "type": "string",
636
+ "format": "date-time",
637
+ "required": true
638
+ },
639
+ "location": {
640
+ "type": "string"
641
+ },
642
+ "isVirtual": {
643
+ "type": "boolean",
644
+ "default": false
645
+ },
646
+ "calledBy": {
647
+ "type": "string",
648
+ "required": true,
649
+ "description": "Director ID or officer title"
650
+ },
651
+ "noticeDate": {
652
+ "type": "string",
653
+ "format": "date",
654
+ "required": true
655
+ },
656
+ "agenda": {
657
+ "type": "array",
658
+ "items": {
659
+ "type": "string"
660
+ }
661
+ },
662
+ "waiverOfNotice": {
663
+ "type": "boolean",
664
+ "default": false,
665
+ "description": "If all directors waive notice"
666
+ }
667
+ }
668
+ },
669
+ "guards": [
670
+ {
671
+ "name": "sufficientNotice",
672
+ "description": "Must provide notice per bylaws (typically 2-10 days for special, less for regular)",
673
+ "expression": "event.waiverOfNotice || (new Date(event.scheduledDate) - new Date(event.noticeDate)) >= 2 * 24 * 60 * 60 * 1000"
674
+ },
675
+ {
676
+ "name": "noConflictingMeeting",
677
+ "description": "No other meeting currently scheduled/in progress",
678
+ "expression": "context.currentMeeting == null || context.currentMeeting.closedAt != null"
679
+ }
680
+ ],
681
+ "effects": [
682
+ {
683
+ "type": "SET_CONTEXT",
684
+ "path": "currentMeeting",
685
+ "value": {
686
+ "meetingId": "{{ event.meetingId }}",
687
+ "type": "{{ event.type }}",
688
+ "scheduledDate": "{{ event.scheduledDate }}",
689
+ "location": "{{ event.location }}",
690
+ "isVirtual": "{{ event.isVirtual }}",
691
+ "calledBy": "{{ event.calledBy }}",
692
+ "noticeDate": "{{ event.noticeDate }}",
693
+ "agenda": "{{ event.agenda }}",
694
+ "attendees": [],
695
+ "quorumPresent": false,
696
+ "quorumCount": 0
697
+ }
698
+ },
699
+ {
700
+ "type": "EMIT_EVENT",
701
+ "eventType": "BOARD_MEETING_SCHEDULED",
702
+ "payload": {
703
+ "boardId": "{{ context.boardId }}",
704
+ "meetingId": "{{ event.meetingId }}",
705
+ "scheduledDate": "{{ event.scheduledDate }}"
706
+ }
707
+ }
708
+ ]
709
+ },
710
+ "record_attendance": {
711
+ "from": "ACTIVE",
712
+ "to": "ACTIVE",
713
+ "description": "Record a director's attendance before meeting opens",
714
+ "event": {
715
+ "name": "record_attendance",
716
+ "payload": {
717
+ "directorId": {
718
+ "type": "string",
719
+ "required": true
720
+ },
721
+ "present": {
722
+ "type": "boolean",
723
+ "required": true
724
+ },
725
+ "arrivedAt": {
726
+ "type": "string",
727
+ "format": "date-time"
728
+ }
729
+ }
730
+ },
731
+ "guards": [
732
+ {
733
+ "name": "hasPendingMeeting",
734
+ "expression": "context.currentMeeting != null && context.currentMeeting.openedAt == null"
735
+ },
736
+ {
737
+ "name": "isActiveDirector",
738
+ "expression": "context.directors.some(d => d.directorId === event.directorId && d.status === 'ACTIVE')"
739
+ }
740
+ ],
741
+ "effects": [
742
+ {
743
+ "type": "APPEND_ARRAY",
744
+ "path": "currentMeeting.attendees",
745
+ "value": {
746
+ "directorId": "{{ event.directorId }}",
747
+ "present": "{{ event.present }}",
748
+ "arrivedAt": "{{ event.arrivedAt }}",
749
+ "viaProxy": false
750
+ }
751
+ },
752
+ {
753
+ "type": "COMPUTE",
754
+ "path": "currentMeeting.quorumCount",
755
+ "expression": "context.currentMeeting.attendees.filter(a => a.present).length"
756
+ },
757
+ {
758
+ "type": "COMPUTE",
759
+ "path": "currentMeeting.quorumPresent",
760
+ "expression": "context.currentMeeting.attendees.filter(a => a.present).length >= Math.ceil(context.seats.filled * 0.5)"
761
+ }
762
+ ]
763
+ },
764
+ "open_meeting": {
765
+ "from": "ACTIVE",
766
+ "to": "IN_MEETING",
767
+ "description": "Officially open the board meeting once quorum is established",
768
+ "event": {
769
+ "name": "open_meeting",
770
+ "payload": {
771
+ "openedAt": {
772
+ "type": "string",
773
+ "format": "date-time",
774
+ "required": true
775
+ },
776
+ "chairPresiding": {
777
+ "type": "string",
778
+ "description": "Director ID presiding"
779
+ }
780
+ }
781
+ },
782
+ "guards": [
783
+ {
784
+ "name": "hasPendingMeeting",
785
+ "expression": "context.currentMeeting != null && context.currentMeeting.openedAt == null"
786
+ },
787
+ {
788
+ "name": "quorumPresent",
789
+ "description": "Cannot open meeting without quorum",
790
+ "expression": "context.currentMeeting.quorumPresent === true"
791
+ }
792
+ ],
793
+ "effects": [
794
+ {
795
+ "type": "SET_CONTEXT",
796
+ "path": "currentMeeting.openedAt",
797
+ "value": "{{ event.openedAt }}"
798
+ },
799
+ {
800
+ "type": "EMIT_EVENT",
801
+ "eventType": "BOARD_MEETING_OPENED",
802
+ "payload": {
803
+ "boardId": "{{ context.boardId }}",
804
+ "meetingId": "{{ context.currentMeeting.meetingId }}",
805
+ "quorumCount": "{{ context.currentMeeting.quorumCount }}"
806
+ }
807
+ }
808
+ ]
809
+ },
810
+ "director_departs": {
811
+ "from": "IN_MEETING",
812
+ "to": "IN_MEETING",
813
+ "description": "Record a director leaving the meeting (may affect quorum)",
814
+ "event": {
815
+ "name": "director_departs",
816
+ "payload": {
817
+ "directorId": {
818
+ "type": "string",
819
+ "required": true
820
+ },
821
+ "departedAt": {
822
+ "type": "string",
823
+ "format": "date-time",
824
+ "required": true
825
+ }
826
+ }
827
+ },
828
+ "effects": [
829
+ {
830
+ "type": "UPDATE_ARRAY_ITEM",
831
+ "path": "currentMeeting.attendees",
832
+ "matchKey": "directorId",
833
+ "matchValue": "{{ event.directorId }}",
834
+ "updates": {
835
+ "present": false,
836
+ "departedAt": "{{ event.departedAt }}"
837
+ }
838
+ },
839
+ {
840
+ "type": "COMPUTE",
841
+ "path": "currentMeeting.quorumCount",
842
+ "expression": "context.currentMeeting.attendees.filter(a => a.present).length"
843
+ },
844
+ {
845
+ "type": "COMPUTE",
846
+ "path": "currentMeeting.quorumPresent",
847
+ "expression": "context.currentMeeting.attendees.filter(a => a.present).length >= Math.ceil(context.seats.filled * 0.5)"
848
+ }
849
+ ]
850
+ },
851
+ "quorum_lost": {
852
+ "from": "IN_MEETING",
853
+ "to": "QUORUM_LOST",
854
+ "description": "Automatic transition when quorum is lost during meeting",
855
+ "event": {
856
+ "name": "quorum_lost",
857
+ "payload": {
858
+ "lostAt": {
859
+ "type": "string",
860
+ "format": "date-time",
861
+ "required": true
862
+ }
863
+ }
864
+ },
865
+ "guards": [
866
+ {
867
+ "name": "noLongerQuorate",
868
+ "expression": "context.currentMeeting.quorumPresent === false"
869
+ }
870
+ ],
871
+ "effects": [
872
+ {
873
+ "type": "EMIT_EVENT",
874
+ "eventType": "BOARD_QUORUM_LOST",
875
+ "payload": {
876
+ "boardId": "{{ context.boardId }}",
877
+ "meetingId": "{{ context.currentMeeting.meetingId }}",
878
+ "remainingDirectors": "{{ context.currentMeeting.quorumCount }}"
879
+ }
880
+ }
881
+ ]
882
+ },
883
+ "quorum_restored": {
884
+ "from": "QUORUM_LOST",
885
+ "to": "IN_MEETING",
886
+ "description": "Quorum restored after additional director(s) join",
887
+ "event": {
888
+ "name": "quorum_restored",
889
+ "payload": {
890
+ "restoredAt": {
891
+ "type": "string",
892
+ "format": "date-time",
893
+ "required": true
894
+ },
895
+ "directorId": {
896
+ "type": "string",
897
+ "required": true,
898
+ "description": "Joining director"
899
+ }
900
+ }
901
+ },
902
+ "guards": [
903
+ {
904
+ "name": "nowQuorate",
905
+ "expression": "context.currentMeeting.quorumPresent === true"
906
+ }
907
+ ],
908
+ "effects": [
909
+ {
910
+ "type": "EMIT_EVENT",
911
+ "eventType": "BOARD_QUORUM_RESTORED",
912
+ "payload": {
913
+ "boardId": "{{ context.boardId }}",
914
+ "meetingId": "{{ context.currentMeeting.meetingId }}"
915
+ }
916
+ }
917
+ ]
918
+ },
919
+ "adjourn": {
920
+ "from": [
921
+ "IN_MEETING",
922
+ "QUORUM_LOST"
923
+ ],
924
+ "to": "ACTIVE",
925
+ "description": "Adjourn the board meeting",
926
+ "event": {
927
+ "name": "adjourn",
928
+ "payload": {
929
+ "closedAt": {
930
+ "type": "string",
931
+ "format": "date-time",
932
+ "required": true
933
+ },
934
+ "minutesRef": {
935
+ "type": "string",
936
+ "description": "Reference to meeting minutes document"
937
+ },
938
+ "resolutionsPassed": {
939
+ "type": "array",
940
+ "items": {
941
+ "type": "string"
942
+ }
943
+ },
944
+ "adjournedTo": {
945
+ "type": "string",
946
+ "format": "date-time",
947
+ "nullable": true,
948
+ "description": "If adjourning to later date"
949
+ }
950
+ }
951
+ },
952
+ "effects": [
953
+ {
954
+ "type": "SET_CONTEXT",
955
+ "path": "currentMeeting.closedAt",
956
+ "value": "{{ event.closedAt }}"
957
+ },
958
+ {
959
+ "type": "SET_CONTEXT",
960
+ "path": "currentMeeting.minutesRef",
961
+ "value": "{{ event.minutesRef }}"
962
+ },
963
+ {
964
+ "type": "APPEND_ARRAY",
965
+ "path": "meetingHistory",
966
+ "value": {
967
+ "meetingId": "{{ context.currentMeeting.meetingId }}",
968
+ "type": "{{ context.currentMeeting.type }}",
969
+ "date": "{{ context.currentMeeting.scheduledDate }}",
970
+ "quorumAchieved": "{{ context.currentMeeting.quorumPresent }}",
971
+ "attendeeCount": "{{ context.currentMeeting.attendees.filter(a => a.present).length }}",
972
+ "resolutionsPassed": "{{ event.resolutionsPassed }}",
973
+ "minutesRef": "{{ event.minutesRef }}"
974
+ }
975
+ },
976
+ {
977
+ "type": "SET_CONTEXT",
978
+ "path": "currentMeeting",
979
+ "value": null
980
+ },
981
+ {
982
+ "type": "EMIT_EVENT",
983
+ "eventType": "BOARD_MEETING_ADJOURNED",
984
+ "payload": {
985
+ "boardId": "{{ context.boardId }}",
986
+ "meetingId": "{{ context.currentMeeting.meetingId }}",
987
+ "resolutionsPassed": "{{ event.resolutionsPassed }}"
988
+ }
989
+ }
990
+ ]
991
+ },
992
+ "update_seats": {
993
+ "from": "ACTIVE",
994
+ "to": "ACTIVE",
995
+ "description": "Change the number of authorized board seats (requires bylaw amendment)",
996
+ "event": {
997
+ "name": "update_seats",
998
+ "payload": {
999
+ "newAuthorizedSeats": {
1000
+ "type": "integer",
1001
+ "required": true
1002
+ },
1003
+ "bylawAmendmentRef": {
1004
+ "type": "string",
1005
+ "required": true
1006
+ }
1007
+ }
1008
+ },
1009
+ "guards": [
1010
+ {
1011
+ "name": "seatsNotLessThanFilled",
1012
+ "description": "Cannot reduce below current filled seats",
1013
+ "expression": "event.newAuthorizedSeats >= context.seats.filled"
1014
+ }
1015
+ ],
1016
+ "effects": [
1017
+ {
1018
+ "type": "SET_CONTEXT",
1019
+ "path": "seats.authorized",
1020
+ "value": "{{ event.newAuthorizedSeats }}"
1021
+ },
1022
+ {
1023
+ "type": "COMPUTE",
1024
+ "path": "seats.vacant",
1025
+ "expression": "event.newAuthorizedSeats - context.seats.filled"
1026
+ }
1027
+ ]
1028
+ }
1029
+ },
1030
+ "crossMachineRefs": {
1031
+ "entity": {
1032
+ "machine": "corporate-entity",
1033
+ "description": "Parent corporate entity",
1034
+ "foreignKey": "entityId"
1035
+ },
1036
+ "resolutions": {
1037
+ "machine": "corporate-resolution",
1038
+ "description": "Board resolutions",
1039
+ "foreignKey": "boardId"
1040
+ },
1041
+ "committees": {
1042
+ "machine": "corporate-committee",
1043
+ "description": "Board committees",
1044
+ "foreignKey": "boardId"
1045
+ },
1046
+ "officers": {
1047
+ "machine": "corporate-officers",
1048
+ "description": "Officers appointed by board",
1049
+ "foreignKey": "entityId"
1050
+ }
1051
+ },
1052
+ "metadata": {
1053
+ "author": "OttoChain",
1054
+ "license": "MIT",
1055
+ "tags": [
1056
+ "corporate",
1057
+ "governance",
1058
+ "board",
1059
+ "directors",
1060
+ "meetings"
1061
+ ],
1062
+ "documentation": "https://ottochain.dev/docs/corporate/board"
1063
+ }
1064
+ }