@hyperscale0/udl 2.6.1 → 3.0.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.
- package/CHANGELOG.md +4 -328
- package/LICENSING.md +1 -2
- package/README.md +3 -114
- package/TRADEMARKS.md +2 -2
- package/dist/diagnostics.d.ts +21 -201
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js +29 -193
- package/dist/diagnostics.js.map +1 -1
- package/dist/evolution.d.ts +3 -132
- package/dist/evolution.d.ts.map +1 -1
- package/dist/evolution.js +29 -633
- package/dist/evolution.js.map +1 -1
- package/dist/finance.d.ts +5 -72
- package/dist/finance.d.ts.map +1 -1
- package/dist/finance.js +233 -737
- package/dist/finance.js.map +1 -1
- package/dist/index.d.ts +7 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -12
- package/dist/index.js.map +1 -1
- package/dist/instrument-references.d.ts.map +1 -1
- package/dist/instrument-references.js +3 -2
- package/dist/instrument-references.js.map +1 -1
- package/dist/schema.d.ts +2079 -4564
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +270 -1609
- package/dist/schema.js.map +1 -1
- package/dist/validation.d.ts +8 -104
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +653 -3271
- package/dist/validation.js.map +1 -1
- package/docs/README.md +148 -14
- package/package.json +7 -11
- package/spec/README.md +152 -164
- package/spec/darb.udl.json +249 -0
- package/spec/udl.schema.json +4104 -3202
- package/src/diagnostics.ts +51 -246
- package/src/evolution.ts +39 -1045
- package/src/finance.ts +287 -1127
- package/src/index.ts +18 -142
- package/src/instrument-references.ts +3 -2
- package/src/schema.ts +285 -1843
- package/src/validation.ts +870 -5611
- package/conformance/README.md +0 -82
- package/conformance/evolution/action-contract.expected.json +0 -10
- package/conformance/evolution/action-contract.live.udl +0 -44
- package/conformance/evolution/action-contract.next.udl +0 -45
- package/conformance/evolution/product-identity.expected.json +0 -10
- package/conformance/evolution/product-identity.live.udl +0 -55
- package/conformance/evolution/product-identity.next.udl +0 -55
- package/conformance/evolution/version-required.expected.json +0 -10
- package/conformance/evolution/version-required.live.udl +0 -55
- package/conformance/evolution/version-required.next.udl +0 -58
- package/conformance/invalid/action-without-transition.expected.json +0 -10
- package/conformance/invalid/action-without-transition.udl +0 -60
- package/conformance/invalid/agent-description-too-long.expected.json +0 -10
- package/conformance/invalid/agent-description-too-long.udl +0 -57
- package/conformance/invalid/blank-title.expected.json +0 -10
- package/conformance/invalid/blank-title.udl +0 -54
- package/conformance/invalid/call-binds-results.expected.json +0 -10
- package/conformance/invalid/call-binds-results.udl +0 -314
- package/conformance/invalid/call-unknown-action.expected.json +0 -10
- package/conformance/invalid/call-unknown-action.udl +0 -314
- package/conformance/invalid/composition-dial-duplicate-key.expected.json +0 -10
- package/conformance/invalid/composition-dial-duplicate-key.udl +0 -73
- package/conformance/invalid/depth-budget.expected.json +0 -10
- package/conformance/invalid/depth-budget.udl +0 -49
- package/conformance/invalid/duplicate-subject.expected.json +0 -10
- package/conformance/invalid/duplicate-subject.udl +0 -230
- package/conformance/invalid/forged-effects.expected.json +0 -10
- package/conformance/invalid/forged-effects.udl +0 -76
- package/conformance/invalid/format-version.expected.json +0 -10
- package/conformance/invalid/format-version.udl +0 -54
- package/conformance/invalid/instrument-id-not-snake-case.expected.json +0 -10
- package/conformance/invalid/instrument-id-not-snake-case.udl +0 -54
- package/conformance/invalid/invalid-aggregate-gate-shape.expected.json +0 -10
- package/conformance/invalid/invalid-aggregate-gate-shape.udl +0 -1819
- package/conformance/invalid/invalid-check-duration.expected.json +0 -10
- package/conformance/invalid/invalid-check-duration.udl +0 -219
- package/conformance/invalid/invalid-dial-anchor.expected.json +0 -10
- package/conformance/invalid/invalid-dial-anchor.udl +0 -219
- package/conformance/invalid/invalid-exception-parent-ref.expected.json +0 -10
- package/conformance/invalid/invalid-exception-parent-ref.udl +0 -2487
- package/conformance/invalid/invalid-exposure-shape.expected.json +0 -10
- package/conformance/invalid/invalid-exposure-shape.udl +0 -1819
- package/conformance/invalid/invalid-journeys.expected.json +0 -10
- package/conformance/invalid/invalid-journeys.udl +0 -77
- package/conformance/invalid/invalid-remainder.expected.json +0 -10
- package/conformance/invalid/invalid-remainder.udl +0 -220
- package/conformance/invalid/invalid-schema-keyword.expected.json +0 -10
- package/conformance/invalid/invalid-schema-keyword.udl +0 -220
- package/conformance/invalid/invalid-utf8.expected.json +0 -10
- package/conformance/invalid/invalid-utf8.udl +0 -1
- package/conformance/invalid/leaf-effect-mismatch.expected.json +0 -10
- package/conformance/invalid/leaf-effect-mismatch.udl +0 -314
- package/conformance/invalid/malformed-json.expected.json +0 -10
- package/conformance/invalid/malformed-json.udl +0 -1
- package/conformance/invalid/missing-create-action.expected.json +0 -10
- package/conformance/invalid/missing-create-action.udl +0 -48
- package/conformance/invalid/missing-exception-amount-field.expected.json +0 -10
- package/conformance/invalid/missing-exception-amount-field.udl +0 -2487
- package/conformance/invalid/missing-exception-contract.expected.json +0 -14
- package/conformance/invalid/missing-exception-contract.udl +0 -2523
- package/conformance/invalid/missing-exception-reason-field.expected.json +0 -10
- package/conformance/invalid/missing-exception-reason-field.udl +0 -2487
- package/conformance/invalid/not-an-object.expected.json +0 -10
- package/conformance/invalid/not-an-object.udl +0 -1
- package/conformance/invalid/payout-reconcile-not-a-bank-debit.expected.json +0 -10
- package/conformance/invalid/payout-reconcile-not-a-bank-debit.udl +0 -259
- package/conformance/invalid/piece-plan-without-partition.expected.json +0 -10
- package/conformance/invalid/piece-plan-without-partition.udl +0 -305
- package/conformance/invalid/private-action-independent-approval.expected.json +0 -10
- package/conformance/invalid/private-action-independent-approval.udl +0 -314
- package/conformance/invalid/quote-freeze-set-incomplete.expected.json +0 -10
- package/conformance/invalid/quote-freeze-set-incomplete.udl +0 -261
- package/conformance/invalid/quote-named-reference-gate.expected.json +0 -10
- package/conformance/invalid/quote-named-reference-gate.udl +0 -50
- package/conformance/invalid/reconcile-named-reference-gate.expected.json +0 -10
- package/conformance/invalid/reconcile-named-reference-gate.udl +0 -50
- package/conformance/invalid/unfund-order-not-reversed.expected.json +0 -10
- package/conformance/invalid/unfund-order-not-reversed.udl +0 -314
- package/conformance/invalid/unknown-key.expected.json +0 -10
- package/conformance/invalid/unknown-key.udl +0 -55
- package/conformance/invalid/unknown-reference-gate-field.expected.json +0 -10
- package/conformance/invalid/unknown-reference-gate-field.udl +0 -1819
- package/conformance/invalid/unknown-required-field.expected.json +0 -10
- package/conformance/invalid/unknown-required-field.udl +0 -220
- package/conformance/invalid/unreachable-state.expected.json +0 -10
- package/conformance/invalid/unreachable-state.udl +0 -55
- package/conformance/invalid/wrong-exception-amount-field.expected.json +0 -10
- package/conformance/invalid/wrong-exception-amount-field.udl +0 -2487
- package/conformance/invalid/wrong-exception-reason-field.expected.json +0 -10
- package/conformance/invalid/wrong-exception-reason-field.udl +0 -2487
- package/conformance/valid/agent-description.expected.json +0 -6
- package/conformance/valid/agent-description.udl +0 -66
- package/conformance/valid/attested.expected.json +0 -6
- package/conformance/valid/attested.udl +0 -251
- package/conformance/valid/cards.expected.json +0 -6
- package/conformance/valid/cards.udl +0 -1579
- package/conformance/valid/commerce-escrow.expected.json +0 -6
- package/conformance/valid/commerce-escrow.udl +0 -1512
- package/conformance/valid/compiled-crowdfunding.expected.json +0 -6
- package/conformance/valid/compiled-crowdfunding.udl +0 -1843
- package/conformance/valid/compiled-watch-club.expected.json +0 -6
- package/conformance/valid/compiled-watch-club.udl +0 -2486
- package/conformance/valid/complete-contract.expected.json +0 -6
- package/conformance/valid/complete-contract.udl +0 -218
- package/conformance/valid/effect-signatures.expected.json +0 -6
- package/conformance/valid/effect-signatures.udl +0 -75
- package/conformance/valid/hand-edited.expected.json +0 -6
- package/conformance/valid/hand-edited.udl +0 -1
- package/conformance/valid/insured-car-marketplace.expected.json +0 -6
- package/conformance/valid/insured-car-marketplace.udl +0 -1050
- package/conformance/valid/insured-travel.expected.json +0 -6
- package/conformance/valid/insured-travel.udl +0 -3469
- package/conformance/valid/minimal.expected.json +0 -6
- package/conformance/valid/minimal.udl +0 -62
- package/conformance/valid/piece-plan-calls.expected.json +0 -6
- package/conformance/valid/piece-plan-calls.udl +0 -314
- package/conformance/valid/protection.expected.json +0 -6
- package/conformance/valid/protection.udl +0 -1551
- package/conformance/valid/string-escaping.expected.json +0 -6
- package/conformance/valid/string-escaping.udl +0 -54
- package/conformance/valid/vocabulary.expected.json +0 -6
- package/conformance/valid/vocabulary.udl +0 -2012
- package/dist/allocation.d.ts +0 -60
- package/dist/allocation.d.ts.map +0 -1
- package/dist/allocation.js +0 -177
- package/dist/allocation.js.map +0 -1
- package/dist/check-profiles.d.ts +0 -57
- package/dist/check-profiles.d.ts.map +0 -1
- package/dist/check-profiles.js +0 -62
- package/dist/check-profiles.js.map +0 -1
- package/dist/distribution.d.ts +0 -15
- package/dist/distribution.d.ts.map +0 -1
- package/dist/distribution.js +0 -49
- package/dist/distribution.js.map +0 -1
- package/dist/effects.d.ts +0 -58
- package/dist/effects.d.ts.map +0 -1
- package/dist/effects.js +0 -1126
- package/dist/effects.js.map +0 -1
- package/dist/reference.d.ts +0 -3
- package/dist/reference.d.ts.map +0 -1
- package/dist/reference.js +0 -28
- package/dist/reference.js.map +0 -1
- package/dist/vocabulary.d.ts +0 -23
- package/dist/vocabulary.d.ts.map +0 -1
- package/dist/vocabulary.js +0 -1052
- package/dist/vocabulary.js.map +0 -1
- package/docs/funding-custody.md +0 -165
- package/docs/guide/01-a-document.md +0 -37
- package/docs/guide/02-money-steps.md +0 -23
- package/docs/guide/03-laws.md +0 -18
- package/docs/guide/04-fees-and-remainder.md +0 -36
- package/docs/guide/05-checks-updates-dials.md +0 -7
- package/docs/guide/06-effects.md +0 -11
- package/docs/guide/07-evolution.md +0 -11
- package/docs/guide/08-implementing.md +0 -13
- package/docs/guide/09-schedules-and-allocation.md +0 -132
- package/docs/llms-full.txt +0 -2008
- package/docs/llms.txt +0 -14
- package/docs/piece-plans.md +0 -148
- package/docs/reference/canonical.md +0 -16
- package/docs/reference/clauses.md +0 -1585
- package/docs/reference/cli.md +0 -24
- package/docs/reference/diagnostics.md +0 -38
- package/skills/udl/SKILL.md +0 -28
- package/src/allocation.ts +0 -259
- package/src/check-profiles.ts +0 -80
- package/src/distribution.ts +0 -61
- package/src/effects.ts +0 -1920
- package/src/reference.ts +0 -31
- package/src/vocabulary.ts +0 -1635
|
@@ -1,1843 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"instruments": [
|
|
3
|
-
{
|
|
4
|
-
"actionOrder": [
|
|
5
|
-
"create",
|
|
6
|
-
"fund_piece_1",
|
|
7
|
-
"accept_commitment",
|
|
8
|
-
"cancel",
|
|
9
|
-
"abandon"
|
|
10
|
-
],
|
|
11
|
-
"actions": {
|
|
12
|
-
"abandon": {
|
|
13
|
-
"agentDescription": "Close a lender commitment that was never funded. The escrow account must be empty, so this refuses once any piece is in it. It moves no money and the settlement ends here with no way back.",
|
|
14
|
-
"moves": [],
|
|
15
|
-
"publicAction": "abandonLenderCommitment",
|
|
16
|
-
"requiresDrainedAccount": {
|
|
17
|
-
"path": "refs.escrowAccountId"
|
|
18
|
-
},
|
|
19
|
-
"steps": [],
|
|
20
|
-
"summary": "Abandon the settlement before any money is held"
|
|
21
|
-
},
|
|
22
|
-
"accept_commitment": {
|
|
23
|
-
"agentDescription": "Confirm accept_commitment and start paying the held money out of escrow. The lender commitment must be funded first, and the caller must be servicing pool. Where the product requires a decision reference, supply it here. Money leaves escrow on this call and does not come back.",
|
|
24
|
-
"effects": {
|
|
25
|
-
"decides": [
|
|
26
|
-
{
|
|
27
|
-
"signature": "decides.tenant_port",
|
|
28
|
-
"source": "port"
|
|
29
|
-
}
|
|
30
|
-
],
|
|
31
|
-
"moves": [
|
|
32
|
-
{
|
|
33
|
-
"signature": "moves.transfer.internal",
|
|
34
|
-
"source": "moves[0]"
|
|
35
|
-
}
|
|
36
|
-
]
|
|
37
|
-
},
|
|
38
|
-
"input": {
|
|
39
|
-
"additionalProperties": false,
|
|
40
|
-
"properties": {
|
|
41
|
-
"acceptanceReference": {
|
|
42
|
-
"description": "Required decision reference retained in the operation receipt",
|
|
43
|
-
"maxLength": 180,
|
|
44
|
-
"minLength": 1,
|
|
45
|
-
"type": "string"
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
"required": [
|
|
49
|
-
"acceptanceReference"
|
|
50
|
-
],
|
|
51
|
-
"type": "object"
|
|
52
|
-
},
|
|
53
|
-
"moves": [
|
|
54
|
-
{
|
|
55
|
-
"bind": {
|
|
56
|
-
"amount": {
|
|
57
|
-
"from": "instance",
|
|
58
|
-
"path": "fields.committedAmount"
|
|
59
|
-
},
|
|
60
|
-
"currency": {
|
|
61
|
-
"from": "instance",
|
|
62
|
-
"path": "fields.currency"
|
|
63
|
-
},
|
|
64
|
-
"destinationAccountId": {
|
|
65
|
-
"from": "instance",
|
|
66
|
-
"path": "fields.servicingPoolAccountId"
|
|
67
|
-
},
|
|
68
|
-
"metadata.instrumentId": {
|
|
69
|
-
"from": "const",
|
|
70
|
-
"value": "lender_commitment"
|
|
71
|
-
},
|
|
72
|
-
"metadata.instrumentInstanceId": {
|
|
73
|
-
"from": "instance",
|
|
74
|
-
"path": "instrumentInstanceId"
|
|
75
|
-
},
|
|
76
|
-
"metadata.phase": {
|
|
77
|
-
"from": "const",
|
|
78
|
-
"value": "accept_commitment"
|
|
79
|
-
},
|
|
80
|
-
"productId": {
|
|
81
|
-
"from": "instance",
|
|
82
|
-
"path": "productId"
|
|
83
|
-
},
|
|
84
|
-
"sourceAccountId": {
|
|
85
|
-
"from": "instance",
|
|
86
|
-
"path": "refs.escrowAccountId"
|
|
87
|
-
}
|
|
88
|
-
},
|
|
89
|
-
"capture": {
|
|
90
|
-
"acceptCommitmentTransferTransferId": "transferId"
|
|
91
|
-
},
|
|
92
|
-
"key": "transfer",
|
|
93
|
-
"operation": "internal_transfer.create"
|
|
94
|
-
}
|
|
95
|
-
],
|
|
96
|
-
"port": {
|
|
97
|
-
"allowedParties": [
|
|
98
|
-
"beneficiary"
|
|
99
|
-
]
|
|
100
|
-
},
|
|
101
|
-
"publicAction": "acceptCommitmentLenderCommitment",
|
|
102
|
-
"steps": [],
|
|
103
|
-
"summary": "Confirm through accept_commitment and start the release payout"
|
|
104
|
-
},
|
|
105
|
-
"cancel": {
|
|
106
|
-
"agentDescription": "Cancel the lender commitment and start returning the held money to the lender. It must be funded and not yet released. Cancellation is final, and a cancelled settlement never releases. Where the product sets a release deadline, this call is refused once that date passes.",
|
|
107
|
-
"effects": {
|
|
108
|
-
"moves": [
|
|
109
|
-
{
|
|
110
|
-
"signature": "moves.transfer.internal",
|
|
111
|
-
"source": "moves[0]"
|
|
112
|
-
}
|
|
113
|
-
]
|
|
114
|
-
},
|
|
115
|
-
"moves": [
|
|
116
|
-
{
|
|
117
|
-
"bind": {
|
|
118
|
-
"amount": {
|
|
119
|
-
"from": "instance",
|
|
120
|
-
"path": "fields.committedAmount"
|
|
121
|
-
},
|
|
122
|
-
"currency": {
|
|
123
|
-
"from": "instance",
|
|
124
|
-
"path": "fields.currency"
|
|
125
|
-
},
|
|
126
|
-
"destinationAccountId": {
|
|
127
|
-
"from": "instance",
|
|
128
|
-
"path": "fields.lenderAccountId"
|
|
129
|
-
},
|
|
130
|
-
"metadata.instrumentId": {
|
|
131
|
-
"from": "const",
|
|
132
|
-
"value": "lender_commitment"
|
|
133
|
-
},
|
|
134
|
-
"metadata.instrumentInstanceId": {
|
|
135
|
-
"from": "instance",
|
|
136
|
-
"path": "instrumentInstanceId"
|
|
137
|
-
},
|
|
138
|
-
"metadata.phase": {
|
|
139
|
-
"from": "const",
|
|
140
|
-
"value": "cancel"
|
|
141
|
-
},
|
|
142
|
-
"productId": {
|
|
143
|
-
"from": "instance",
|
|
144
|
-
"path": "productId"
|
|
145
|
-
},
|
|
146
|
-
"sourceAccountId": {
|
|
147
|
-
"from": "instance",
|
|
148
|
-
"path": "refs.escrowAccountId"
|
|
149
|
-
}
|
|
150
|
-
},
|
|
151
|
-
"capture": {
|
|
152
|
-
"cancelTransferTransferId": "transferId"
|
|
153
|
-
},
|
|
154
|
-
"key": "transfer",
|
|
155
|
-
"operation": "internal_transfer.create"
|
|
156
|
-
}
|
|
157
|
-
],
|
|
158
|
-
"publicAction": "cancelLenderCommitment",
|
|
159
|
-
"steps": [],
|
|
160
|
-
"summary": "Cancel the settlement and start the unwind"
|
|
161
|
-
},
|
|
162
|
-
"create": {
|
|
163
|
-
"agentDescription": "Open the lender commitment and provision the escrow account that holds the funds. This is the first call, and every funding and release action moves money through that account. It does not move the held amount itself.",
|
|
164
|
-
"moves": [],
|
|
165
|
-
"publicAction": "createLenderCommitment",
|
|
166
|
-
"steps": [
|
|
167
|
-
{
|
|
168
|
-
"bind": {
|
|
169
|
-
"currency": {
|
|
170
|
-
"from": "instance",
|
|
171
|
-
"path": "fields.currency"
|
|
172
|
-
},
|
|
173
|
-
"owner.id": {
|
|
174
|
-
"from": "instance",
|
|
175
|
-
"path": "productId"
|
|
176
|
-
},
|
|
177
|
-
"owner.type": {
|
|
178
|
-
"from": "const",
|
|
179
|
-
"value": "product"
|
|
180
|
-
},
|
|
181
|
-
"productId": {
|
|
182
|
-
"from": "instance",
|
|
183
|
-
"path": "productId"
|
|
184
|
-
},
|
|
185
|
-
"role": {
|
|
186
|
-
"from": "const",
|
|
187
|
-
"value": "product_escrow"
|
|
188
|
-
}
|
|
189
|
-
},
|
|
190
|
-
"capture": {
|
|
191
|
-
"escrowAccountId": "accountId"
|
|
192
|
-
},
|
|
193
|
-
"operation": "account.escrow.provision"
|
|
194
|
-
}
|
|
195
|
-
],
|
|
196
|
-
"summary": "Create a lender commitment settlement"
|
|
197
|
-
},
|
|
198
|
-
"fund_piece_1": {
|
|
199
|
-
"agentDescription": "Move the lender's money into this settlement's escrow. Call it after create and before any release. It debits the lender for real, and where the product charges a payer-side fee that fee is taken on top in the same call. Only a later release or unwind moves the money again.",
|
|
200
|
-
"effects": {
|
|
201
|
-
"moves": [
|
|
202
|
-
{
|
|
203
|
-
"signature": "moves.collection.pay_in",
|
|
204
|
-
"source": "moves[0]"
|
|
205
|
-
}
|
|
206
|
-
]
|
|
207
|
-
},
|
|
208
|
-
"moves": [
|
|
209
|
-
{
|
|
210
|
-
"bind": {
|
|
211
|
-
"amount": {
|
|
212
|
-
"from": "instance",
|
|
213
|
-
"path": "fields.committedAmount"
|
|
214
|
-
},
|
|
215
|
-
"currency": {
|
|
216
|
-
"from": "instance",
|
|
217
|
-
"path": "fields.currency"
|
|
218
|
-
},
|
|
219
|
-
"destinationAccountId": {
|
|
220
|
-
"from": "instance",
|
|
221
|
-
"path": "refs.escrowAccountId"
|
|
222
|
-
},
|
|
223
|
-
"metadata.instrumentId": {
|
|
224
|
-
"from": "const",
|
|
225
|
-
"value": "lender_commitment"
|
|
226
|
-
},
|
|
227
|
-
"metadata.instrumentInstanceId": {
|
|
228
|
-
"from": "instance",
|
|
229
|
-
"path": "instrumentInstanceId"
|
|
230
|
-
},
|
|
231
|
-
"metadata.phase": {
|
|
232
|
-
"from": "const",
|
|
233
|
-
"value": "fund_piece_1"
|
|
234
|
-
},
|
|
235
|
-
"productId": {
|
|
236
|
-
"from": "instance",
|
|
237
|
-
"path": "productId"
|
|
238
|
-
},
|
|
239
|
-
"sourceAccountId": {
|
|
240
|
-
"from": "instance",
|
|
241
|
-
"path": "fields.lenderAccountId"
|
|
242
|
-
}
|
|
243
|
-
},
|
|
244
|
-
"capture": {
|
|
245
|
-
"fundPiece1TransferTransferId": "transferId"
|
|
246
|
-
},
|
|
247
|
-
"key": "transfer",
|
|
248
|
-
"operation": "internal_transfer.create"
|
|
249
|
-
}
|
|
250
|
-
],
|
|
251
|
-
"publicAction": "fundPiece1LenderCommitment",
|
|
252
|
-
"steps": [],
|
|
253
|
-
"summary": "Fund piece 1 of the held amount into escrow"
|
|
254
|
-
}
|
|
255
|
-
},
|
|
256
|
-
"agentDescription": "Reach for lender commitment when the lender must commit money up front and nobody is paid until accept_commitment fires. Funding moves committedAmount into this settlement's own escrow account, where it stays until a release or an unwind pays it out. A straight-through payment with no custody step is a different shape.",
|
|
257
|
-
"description": "Held payment: the lender funds committedAmount into this settlement's own escrow; servicing pool confirms through accept_commitment to release",
|
|
258
|
-
"fields": {
|
|
259
|
-
"committedAmount": {
|
|
260
|
-
"description": "The held amount in SAR minor units, funded and paid out whole",
|
|
261
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
262
|
-
"type": "string"
|
|
263
|
-
},
|
|
264
|
-
"currency": {
|
|
265
|
-
"description": "ISO 4217 currency code",
|
|
266
|
-
"maxLength": 3,
|
|
267
|
-
"minLength": 3,
|
|
268
|
-
"pattern": "^[A-Z]{3}$",
|
|
269
|
-
"type": "string"
|
|
270
|
-
},
|
|
271
|
-
"lenderAccountId": {
|
|
272
|
-
"description": "The lender account",
|
|
273
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
274
|
-
"type": "string",
|
|
275
|
-
"x-hyperscale-reference-filter": {
|
|
276
|
-
"column": "role",
|
|
277
|
-
"values": [
|
|
278
|
-
"customer_balance"
|
|
279
|
-
]
|
|
280
|
-
}
|
|
281
|
-
},
|
|
282
|
-
"platformAccountId": {
|
|
283
|
-
"description": "The product fee collection account",
|
|
284
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
285
|
-
"type": "string",
|
|
286
|
-
"x-hyperscale-fee-collection-port": true,
|
|
287
|
-
"x-hyperscale-reference-filter": {
|
|
288
|
-
"column": "role",
|
|
289
|
-
"values": [
|
|
290
|
-
"customer_balance",
|
|
291
|
-
"product_revenue"
|
|
292
|
-
]
|
|
293
|
-
}
|
|
294
|
-
},
|
|
295
|
-
"servicingPoolAccountId": {
|
|
296
|
-
"description": "The servicing pool account",
|
|
297
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
298
|
-
"type": "string",
|
|
299
|
-
"x-hyperscale-reference-filter": {
|
|
300
|
-
"column": "role",
|
|
301
|
-
"values": [
|
|
302
|
-
"customer_balance"
|
|
303
|
-
]
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
},
|
|
307
|
-
"id": "lender_commitment",
|
|
308
|
-
"idPrefix": "lc",
|
|
309
|
-
"lifecycle": {
|
|
310
|
-
"initial": "created",
|
|
311
|
-
"states": [
|
|
312
|
-
"created",
|
|
313
|
-
"funded",
|
|
314
|
-
"released",
|
|
315
|
-
"cancelled",
|
|
316
|
-
"abandoned"
|
|
317
|
-
],
|
|
318
|
-
"transitions": {
|
|
319
|
-
"abandon": {
|
|
320
|
-
"from": [
|
|
321
|
-
"created"
|
|
322
|
-
],
|
|
323
|
-
"to": "abandoned"
|
|
324
|
-
},
|
|
325
|
-
"accept_commitment": {
|
|
326
|
-
"from": [
|
|
327
|
-
"funded"
|
|
328
|
-
],
|
|
329
|
-
"to": "released"
|
|
330
|
-
},
|
|
331
|
-
"cancel": {
|
|
332
|
-
"from": [
|
|
333
|
-
"funded"
|
|
334
|
-
],
|
|
335
|
-
"to": "cancelled"
|
|
336
|
-
},
|
|
337
|
-
"fund_piece_1": {
|
|
338
|
-
"from": [
|
|
339
|
-
"created"
|
|
340
|
-
],
|
|
341
|
-
"to": "funded"
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
},
|
|
345
|
-
"parties": {
|
|
346
|
-
"beneficiary": "servicingPoolAccountId",
|
|
347
|
-
"payer": "lenderAccountId"
|
|
348
|
-
},
|
|
349
|
-
"required": [
|
|
350
|
-
"lenderAccountId",
|
|
351
|
-
"servicingPoolAccountId",
|
|
352
|
-
"platformAccountId",
|
|
353
|
-
"committedAmount",
|
|
354
|
-
"currency"
|
|
355
|
-
],
|
|
356
|
-
"summary": "Escrow-held payment from lender to servicing pool",
|
|
357
|
-
"title": "Lender commitment"
|
|
358
|
-
},
|
|
359
|
-
{
|
|
360
|
-
"actionOrder": [
|
|
361
|
-
"create",
|
|
362
|
-
"approve",
|
|
363
|
-
"advance",
|
|
364
|
-
"collect_installment_1",
|
|
365
|
-
"mark_installment_1_delinquent",
|
|
366
|
-
"collect_installment_2",
|
|
367
|
-
"mark_installment_2_delinquent",
|
|
368
|
-
"complete",
|
|
369
|
-
"write_off"
|
|
370
|
-
],
|
|
371
|
-
"actions": {
|
|
372
|
-
"advance": {
|
|
373
|
-
"agentDescription": "Pay the principal out to the advance recipient and put the obligation into repayment. The obligation must be approved. This moves the whole principal and does not reverse, so approve is the last point to stop.",
|
|
374
|
-
"effects": {
|
|
375
|
-
"moves": [
|
|
376
|
-
{
|
|
377
|
-
"signature": "moves.transfer.internal",
|
|
378
|
-
"source": "moves[0]"
|
|
379
|
-
}
|
|
380
|
-
]
|
|
381
|
-
},
|
|
382
|
-
"moves": [
|
|
383
|
-
{
|
|
384
|
-
"bind": {
|
|
385
|
-
"amount": {
|
|
386
|
-
"from": "instance",
|
|
387
|
-
"path": "fields.principalAmount"
|
|
388
|
-
},
|
|
389
|
-
"currency": {
|
|
390
|
-
"from": "instance",
|
|
391
|
-
"path": "fields.currency"
|
|
392
|
-
},
|
|
393
|
-
"destinationAccountId": {
|
|
394
|
-
"from": "instance",
|
|
395
|
-
"path": "fields.borrowerProceedsAccountId"
|
|
396
|
-
},
|
|
397
|
-
"metadata.instrumentId": {
|
|
398
|
-
"from": "const",
|
|
399
|
-
"value": "borrower_loan"
|
|
400
|
-
},
|
|
401
|
-
"metadata.instrumentInstanceId": {
|
|
402
|
-
"from": "instance",
|
|
403
|
-
"path": "instrumentInstanceId"
|
|
404
|
-
},
|
|
405
|
-
"metadata.phase": {
|
|
406
|
-
"from": "const",
|
|
407
|
-
"value": "advance"
|
|
408
|
-
},
|
|
409
|
-
"productId": {
|
|
410
|
-
"from": "instance",
|
|
411
|
-
"path": "productId"
|
|
412
|
-
},
|
|
413
|
-
"sourceAccountId": {
|
|
414
|
-
"from": "instance",
|
|
415
|
-
"path": "fields.servicingPoolAccountId"
|
|
416
|
-
}
|
|
417
|
-
},
|
|
418
|
-
"capture": {
|
|
419
|
-
"advanceAdvanceTransferId": "transferId"
|
|
420
|
-
},
|
|
421
|
-
"key": "advance",
|
|
422
|
-
"operation": "internal_transfer.create"
|
|
423
|
-
}
|
|
424
|
-
],
|
|
425
|
-
"publicAction": "advanceBorrowerLoan",
|
|
426
|
-
"steps": [],
|
|
427
|
-
"summary": "Advance the principal to the borrower proceeds; the internal ledger receipt is the confirmation"
|
|
428
|
-
},
|
|
429
|
-
"approve": {
|
|
430
|
-
"agentDescription": "Approve the draft obligation and freeze its principal partition and due anchors. The obligation must be in draft. No money moves. Where the product advances funds, approve is what makes advance available.",
|
|
431
|
-
"moves": [],
|
|
432
|
-
"publicAction": "approveBorrowerLoan",
|
|
433
|
-
"steps": [],
|
|
434
|
-
"summary": "Approve the immutable principal partition and stored anchors"
|
|
435
|
-
},
|
|
436
|
-
"collect_installment_1": {
|
|
437
|
-
"due": {
|
|
438
|
-
"field": "firstRepaymentDueAt"
|
|
439
|
-
},
|
|
440
|
-
"effects": {
|
|
441
|
-
"reads": [
|
|
442
|
-
{
|
|
443
|
-
"signature": "reads.requires_aggregate",
|
|
444
|
-
"source": "requiresAggregate"
|
|
445
|
-
}
|
|
446
|
-
],
|
|
447
|
-
"schedules": [
|
|
448
|
-
{
|
|
449
|
-
"signature": "schedules.due",
|
|
450
|
-
"source": "due"
|
|
451
|
-
}
|
|
452
|
-
]
|
|
453
|
-
},
|
|
454
|
-
"moves": [],
|
|
455
|
-
"requiresAggregate": [
|
|
456
|
-
{
|
|
457
|
-
"check": {
|
|
458
|
-
"amountField": "amount",
|
|
459
|
-
"kind": "sum_exactly",
|
|
460
|
-
"targetField": "installment1Amount"
|
|
461
|
-
},
|
|
462
|
-
"instrumentId": "borrower_loan_installment_1_payment",
|
|
463
|
-
"over": "children",
|
|
464
|
-
"refField": "borrowerLoanId",
|
|
465
|
-
"statuses": [
|
|
466
|
-
"paid"
|
|
467
|
-
]
|
|
468
|
-
}
|
|
469
|
-
],
|
|
470
|
-
"steps": [],
|
|
471
|
-
"summary": "Close delinquent installment 1 after linked payments reach its stored amount"
|
|
472
|
-
},
|
|
473
|
-
"collect_installment_2": {
|
|
474
|
-
"due": {
|
|
475
|
-
"field": "firstRepaymentDueAt",
|
|
476
|
-
"offset": "P30D"
|
|
477
|
-
},
|
|
478
|
-
"effects": {
|
|
479
|
-
"reads": [
|
|
480
|
-
{
|
|
481
|
-
"signature": "reads.requires_aggregate",
|
|
482
|
-
"source": "requiresAggregate"
|
|
483
|
-
}
|
|
484
|
-
],
|
|
485
|
-
"schedules": [
|
|
486
|
-
{
|
|
487
|
-
"signature": "schedules.due",
|
|
488
|
-
"source": "due"
|
|
489
|
-
}
|
|
490
|
-
]
|
|
491
|
-
},
|
|
492
|
-
"moves": [],
|
|
493
|
-
"requiresAggregate": [
|
|
494
|
-
{
|
|
495
|
-
"check": {
|
|
496
|
-
"amountField": "amount",
|
|
497
|
-
"kind": "sum_exactly",
|
|
498
|
-
"targetField": "installment2Amount"
|
|
499
|
-
},
|
|
500
|
-
"instrumentId": "borrower_loan_installment_2_payment",
|
|
501
|
-
"over": "children",
|
|
502
|
-
"refField": "borrowerLoanId",
|
|
503
|
-
"statuses": [
|
|
504
|
-
"paid"
|
|
505
|
-
]
|
|
506
|
-
}
|
|
507
|
-
],
|
|
508
|
-
"steps": [],
|
|
509
|
-
"summary": "Close delinquent installment 2 after linked payments reach its stored amount"
|
|
510
|
-
},
|
|
511
|
-
"complete": {
|
|
512
|
-
"due": {
|
|
513
|
-
"field": "firstRepaymentDueAt",
|
|
514
|
-
"offset": "P30D"
|
|
515
|
-
},
|
|
516
|
-
"effects": {
|
|
517
|
-
"reads": [
|
|
518
|
-
{
|
|
519
|
-
"signature": "reads.requires_aggregate",
|
|
520
|
-
"source": "requiresAggregate"
|
|
521
|
-
}
|
|
522
|
-
],
|
|
523
|
-
"schedules": [
|
|
524
|
-
{
|
|
525
|
-
"signature": "schedules.due",
|
|
526
|
-
"source": "due"
|
|
527
|
-
}
|
|
528
|
-
]
|
|
529
|
-
},
|
|
530
|
-
"moves": [],
|
|
531
|
-
"requiresAggregate": [
|
|
532
|
-
{
|
|
533
|
-
"check": {
|
|
534
|
-
"amountField": "amount",
|
|
535
|
-
"kind": "sum_exactly",
|
|
536
|
-
"targetField": "installment1Amount"
|
|
537
|
-
},
|
|
538
|
-
"instrumentId": "borrower_loan_installment_1_payment",
|
|
539
|
-
"over": "children",
|
|
540
|
-
"refField": "borrowerLoanId",
|
|
541
|
-
"statuses": [
|
|
542
|
-
"paid"
|
|
543
|
-
]
|
|
544
|
-
},
|
|
545
|
-
{
|
|
546
|
-
"check": {
|
|
547
|
-
"amountField": "amount",
|
|
548
|
-
"kind": "sum_exactly",
|
|
549
|
-
"targetField": "installment2Amount"
|
|
550
|
-
},
|
|
551
|
-
"instrumentId": "borrower_loan_installment_2_payment",
|
|
552
|
-
"over": "children",
|
|
553
|
-
"refField": "borrowerLoanId",
|
|
554
|
-
"statuses": [
|
|
555
|
-
"paid"
|
|
556
|
-
]
|
|
557
|
-
}
|
|
558
|
-
],
|
|
559
|
-
"steps": [],
|
|
560
|
-
"summary": "Close the obligation only after every stored anchor is paid exactly"
|
|
561
|
-
},
|
|
562
|
-
"create": {
|
|
563
|
-
"agentDescription": "Create the obligation in draft with its principal split across stored installment anchors. Approve is the next call. Where the product declares a derived fee, creating the obligation also moves that fee from its bearer to the platform account.",
|
|
564
|
-
"effects": {
|
|
565
|
-
"moves": [
|
|
566
|
-
{
|
|
567
|
-
"signature": "moves.transfer.internal",
|
|
568
|
-
"source": "moves[0]"
|
|
569
|
-
}
|
|
570
|
-
]
|
|
571
|
-
},
|
|
572
|
-
"moves": [
|
|
573
|
-
{
|
|
574
|
-
"bind": {
|
|
575
|
-
"amount": {
|
|
576
|
-
"from": "instance",
|
|
577
|
-
"path": "fields.platformFee"
|
|
578
|
-
},
|
|
579
|
-
"currency": {
|
|
580
|
-
"from": "instance",
|
|
581
|
-
"path": "fields.currency"
|
|
582
|
-
},
|
|
583
|
-
"destinationAccountId": {
|
|
584
|
-
"from": "instance",
|
|
585
|
-
"path": "fields.platformAccountId"
|
|
586
|
-
},
|
|
587
|
-
"metadata.instrumentId": {
|
|
588
|
-
"from": "const",
|
|
589
|
-
"value": "borrower_loan"
|
|
590
|
-
},
|
|
591
|
-
"metadata.instrumentInstanceId": {
|
|
592
|
-
"from": "instance",
|
|
593
|
-
"path": "instrumentInstanceId"
|
|
594
|
-
},
|
|
595
|
-
"metadata.phase": {
|
|
596
|
-
"from": "const",
|
|
597
|
-
"value": "create"
|
|
598
|
-
},
|
|
599
|
-
"productId": {
|
|
600
|
-
"from": "instance",
|
|
601
|
-
"path": "productId"
|
|
602
|
-
},
|
|
603
|
-
"sourceAccountId": {
|
|
604
|
-
"from": "instance",
|
|
605
|
-
"path": "fields.borrowerAccountId"
|
|
606
|
-
}
|
|
607
|
-
},
|
|
608
|
-
"capture": {
|
|
609
|
-
"createDerivedAmountTransferId": "transferId"
|
|
610
|
-
},
|
|
611
|
-
"key": "derived_amount",
|
|
612
|
-
"operation": "internal_transfer.create"
|
|
613
|
-
}
|
|
614
|
-
],
|
|
615
|
-
"publicAction": "createBorrowerLoan",
|
|
616
|
-
"steps": [],
|
|
617
|
-
"summary": "Create a borrower loan obligation"
|
|
618
|
-
},
|
|
619
|
-
"mark_installment_1_delinquent": {
|
|
620
|
-
"due": {
|
|
621
|
-
"field": "firstRepaymentDueAt"
|
|
622
|
-
},
|
|
623
|
-
"effects": {
|
|
624
|
-
"reads": [
|
|
625
|
-
{
|
|
626
|
-
"signature": "reads.requires_aggregate",
|
|
627
|
-
"source": "requiresAggregate"
|
|
628
|
-
}
|
|
629
|
-
],
|
|
630
|
-
"schedules": [
|
|
631
|
-
{
|
|
632
|
-
"signature": "schedules.due",
|
|
633
|
-
"source": "due"
|
|
634
|
-
}
|
|
635
|
-
]
|
|
636
|
-
},
|
|
637
|
-
"moves": [],
|
|
638
|
-
"requiresAggregate": [
|
|
639
|
-
{
|
|
640
|
-
"check": {
|
|
641
|
-
"amountField": "amount",
|
|
642
|
-
"kind": "sum_below",
|
|
643
|
-
"targetField": "installment1Amount"
|
|
644
|
-
},
|
|
645
|
-
"instrumentId": "borrower_loan_installment_1_payment",
|
|
646
|
-
"over": "children",
|
|
647
|
-
"refField": "borrowerLoanId",
|
|
648
|
-
"statuses": [
|
|
649
|
-
"paid"
|
|
650
|
-
]
|
|
651
|
-
}
|
|
652
|
-
],
|
|
653
|
-
"setsAt": {
|
|
654
|
-
"field": "installment1DelinquentAfter",
|
|
655
|
-
"marker": true,
|
|
656
|
-
"offset": "PT1S"
|
|
657
|
-
},
|
|
658
|
-
"steps": [],
|
|
659
|
-
"summary": "Mark installment 1 delinquent only when its due anchor is unmet"
|
|
660
|
-
},
|
|
661
|
-
"mark_installment_2_delinquent": {
|
|
662
|
-
"due": {
|
|
663
|
-
"field": "firstRepaymentDueAt",
|
|
664
|
-
"offset": "P30D"
|
|
665
|
-
},
|
|
666
|
-
"effects": {
|
|
667
|
-
"reads": [
|
|
668
|
-
{
|
|
669
|
-
"signature": "reads.requires_aggregate",
|
|
670
|
-
"source": "requiresAggregate"
|
|
671
|
-
}
|
|
672
|
-
],
|
|
673
|
-
"schedules": [
|
|
674
|
-
{
|
|
675
|
-
"signature": "schedules.due",
|
|
676
|
-
"source": "due"
|
|
677
|
-
}
|
|
678
|
-
]
|
|
679
|
-
},
|
|
680
|
-
"moves": [],
|
|
681
|
-
"requiresAggregate": [
|
|
682
|
-
{
|
|
683
|
-
"check": {
|
|
684
|
-
"amountField": "amount",
|
|
685
|
-
"kind": "sum_below",
|
|
686
|
-
"targetField": "installment2Amount"
|
|
687
|
-
},
|
|
688
|
-
"instrumentId": "borrower_loan_installment_2_payment",
|
|
689
|
-
"over": "children",
|
|
690
|
-
"refField": "borrowerLoanId",
|
|
691
|
-
"statuses": [
|
|
692
|
-
"paid"
|
|
693
|
-
]
|
|
694
|
-
}
|
|
695
|
-
],
|
|
696
|
-
"setsAt": {
|
|
697
|
-
"field": "installment2DelinquentAfter",
|
|
698
|
-
"marker": true,
|
|
699
|
-
"offset": "PT1S"
|
|
700
|
-
},
|
|
701
|
-
"steps": [],
|
|
702
|
-
"summary": "Mark installment 2 delinquent only when its due anchor is unmet"
|
|
703
|
-
},
|
|
704
|
-
"write_off": {
|
|
705
|
-
"agentDescription": "Write off the remaining exposure and stop the obligation. No money moves and nothing is refunded. This is the bookkeeping exit for debt that will not be collected. A written-off obligation never returns to repayment.",
|
|
706
|
-
"moves": [],
|
|
707
|
-
"publicAction": "writeOffBorrowerLoan",
|
|
708
|
-
"steps": [],
|
|
709
|
-
"summary": "Write off the remaining exposure without moving money"
|
|
710
|
-
}
|
|
711
|
-
},
|
|
712
|
-
"agentDescription": "Reach for scheduled when one payer owes one payee on a calendar. It covers a plan of fixed installments partitioning one total, an obligation whose installments are paid through child payment records and can go delinquent, and an open period charge that repeats until a cancel port fires. Rotating pool is for a group taking turns.",
|
|
713
|
-
"aggregateInvariants": [
|
|
714
|
-
{
|
|
715
|
-
"childField": "amount",
|
|
716
|
-
"childInstrumentId": "borrower_loan_installment_1_payment",
|
|
717
|
-
"childRefField": "borrowerLoanId",
|
|
718
|
-
"childStatuses": [
|
|
719
|
-
"paid"
|
|
720
|
-
],
|
|
721
|
-
"parentField": "installment1Amount"
|
|
722
|
-
},
|
|
723
|
-
{
|
|
724
|
-
"childField": "amount",
|
|
725
|
-
"childInstrumentId": "borrower_loan_installment_2_payment",
|
|
726
|
-
"childRefField": "borrowerLoanId",
|
|
727
|
-
"childStatuses": [
|
|
728
|
-
"paid"
|
|
729
|
-
],
|
|
730
|
-
"parentField": "installment2Amount"
|
|
731
|
-
}
|
|
732
|
-
],
|
|
733
|
-
"derivedAmounts": [
|
|
734
|
-
{
|
|
735
|
-
"field": "platformFee",
|
|
736
|
-
"rounding": "floor",
|
|
737
|
-
"rule": {
|
|
738
|
-
"bps": 200,
|
|
739
|
-
"kind": "percentage_of"
|
|
740
|
-
},
|
|
741
|
-
"sourceField": "principalAmount"
|
|
742
|
-
}
|
|
743
|
-
],
|
|
744
|
-
"description": "Installment obligation for borrower; borrower pays servicing pool against exact stored anchors",
|
|
745
|
-
"fields": {
|
|
746
|
-
"borrowerAccountId": {
|
|
747
|
-
"description": "The borrower account",
|
|
748
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
749
|
-
"type": "string",
|
|
750
|
-
"x-hyperscale-reference-filter": {
|
|
751
|
-
"column": "role",
|
|
752
|
-
"values": [
|
|
753
|
-
"customer_balance"
|
|
754
|
-
]
|
|
755
|
-
}
|
|
756
|
-
},
|
|
757
|
-
"borrowerProceedsAccountId": {
|
|
758
|
-
"description": "The borrower proceeds account",
|
|
759
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
760
|
-
"type": "string",
|
|
761
|
-
"x-hyperscale-reference-filter": {
|
|
762
|
-
"column": "role",
|
|
763
|
-
"values": [
|
|
764
|
-
"customer_balance"
|
|
765
|
-
]
|
|
766
|
-
}
|
|
767
|
-
},
|
|
768
|
-
"currency": {
|
|
769
|
-
"description": "ISO 4217 currency code",
|
|
770
|
-
"maxLength": 3,
|
|
771
|
-
"minLength": 3,
|
|
772
|
-
"pattern": "^[A-Z]{3}$",
|
|
773
|
-
"type": "string"
|
|
774
|
-
},
|
|
775
|
-
"firstRepaymentDueAt": {
|
|
776
|
-
"description": "Due date of the first installment; later anchors use fixed offsets of P30D",
|
|
777
|
-
"format": "hyperscale-date-time",
|
|
778
|
-
"type": "string"
|
|
779
|
-
},
|
|
780
|
-
"installment1Amount": {
|
|
781
|
-
"description": "Stored amount for installment 1 of 2 (carries the integer-division remainder)",
|
|
782
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
783
|
-
"type": "string"
|
|
784
|
-
},
|
|
785
|
-
"installment1DelinquentAfter": {
|
|
786
|
-
"description": "Machine-set marker proving installment 1 reached its stored due date while unpaid",
|
|
787
|
-
"format": "hyperscale-date-time",
|
|
788
|
-
"type": "string"
|
|
789
|
-
},
|
|
790
|
-
"installment2Amount": {
|
|
791
|
-
"description": "Stored amount for installment 2 of 2",
|
|
792
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
793
|
-
"type": "string"
|
|
794
|
-
},
|
|
795
|
-
"installment2DelinquentAfter": {
|
|
796
|
-
"description": "Machine-set marker proving installment 2 reached its stored due date while unpaid",
|
|
797
|
-
"format": "hyperscale-date-time",
|
|
798
|
-
"type": "string"
|
|
799
|
-
},
|
|
800
|
-
"platformAccountId": {
|
|
801
|
-
"description": "The product fee collection account",
|
|
802
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
803
|
-
"type": "string",
|
|
804
|
-
"x-hyperscale-fee-collection-port": true,
|
|
805
|
-
"x-hyperscale-reference-filter": {
|
|
806
|
-
"column": "role",
|
|
807
|
-
"values": [
|
|
808
|
-
"customer_balance",
|
|
809
|
-
"product_revenue"
|
|
810
|
-
]
|
|
811
|
-
}
|
|
812
|
-
},
|
|
813
|
-
"platformFee": {
|
|
814
|
-
"description": "Machine-computed 2% of principalAmount; callers never supply it",
|
|
815
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
816
|
-
"type": "string"
|
|
817
|
-
},
|
|
818
|
-
"principalAmount": {
|
|
819
|
-
"description": "The principal in SAR minor units; the stored installment anchors partition it exactly",
|
|
820
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
821
|
-
"type": "string"
|
|
822
|
-
},
|
|
823
|
-
"servicingPoolAccountId": {
|
|
824
|
-
"description": "The servicing pool account",
|
|
825
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
826
|
-
"type": "string",
|
|
827
|
-
"x-hyperscale-reference-filter": {
|
|
828
|
-
"column": "role",
|
|
829
|
-
"values": [
|
|
830
|
-
"customer_balance"
|
|
831
|
-
]
|
|
832
|
-
}
|
|
833
|
-
}
|
|
834
|
-
},
|
|
835
|
-
"id": "borrower_loan",
|
|
836
|
-
"idPrefix": "bl",
|
|
837
|
-
"lifecycle": {
|
|
838
|
-
"initial": "draft",
|
|
839
|
-
"states": [
|
|
840
|
-
"draft",
|
|
841
|
-
"approved",
|
|
842
|
-
"active",
|
|
843
|
-
"installment_1_delinquent",
|
|
844
|
-
"installment_2_delinquent",
|
|
845
|
-
"written_off",
|
|
846
|
-
"repaid"
|
|
847
|
-
],
|
|
848
|
-
"transitions": {
|
|
849
|
-
"advance": {
|
|
850
|
-
"from": [
|
|
851
|
-
"approved"
|
|
852
|
-
],
|
|
853
|
-
"to": "active"
|
|
854
|
-
},
|
|
855
|
-
"approve": {
|
|
856
|
-
"from": [
|
|
857
|
-
"draft"
|
|
858
|
-
],
|
|
859
|
-
"to": "approved"
|
|
860
|
-
},
|
|
861
|
-
"collect_installment_1": {
|
|
862
|
-
"from": [
|
|
863
|
-
"installment_1_delinquent",
|
|
864
|
-
"installment_2_delinquent"
|
|
865
|
-
],
|
|
866
|
-
"to": "active"
|
|
867
|
-
},
|
|
868
|
-
"collect_installment_2": {
|
|
869
|
-
"from": [
|
|
870
|
-
"installment_1_delinquent",
|
|
871
|
-
"installment_2_delinquent"
|
|
872
|
-
],
|
|
873
|
-
"to": "active"
|
|
874
|
-
},
|
|
875
|
-
"complete": {
|
|
876
|
-
"from": [
|
|
877
|
-
"active",
|
|
878
|
-
"installment_1_delinquent",
|
|
879
|
-
"installment_2_delinquent"
|
|
880
|
-
],
|
|
881
|
-
"to": "repaid"
|
|
882
|
-
},
|
|
883
|
-
"mark_installment_1_delinquent": {
|
|
884
|
-
"from": [
|
|
885
|
-
"active",
|
|
886
|
-
"installment_2_delinquent"
|
|
887
|
-
],
|
|
888
|
-
"to": "installment_1_delinquent"
|
|
889
|
-
},
|
|
890
|
-
"mark_installment_2_delinquent": {
|
|
891
|
-
"from": [
|
|
892
|
-
"active",
|
|
893
|
-
"installment_1_delinquent"
|
|
894
|
-
],
|
|
895
|
-
"to": "installment_2_delinquent"
|
|
896
|
-
},
|
|
897
|
-
"write_off": {
|
|
898
|
-
"from": [
|
|
899
|
-
"draft",
|
|
900
|
-
"approved",
|
|
901
|
-
"active",
|
|
902
|
-
"installment_1_delinquent",
|
|
903
|
-
"installment_2_delinquent"
|
|
904
|
-
],
|
|
905
|
-
"to": "written_off"
|
|
906
|
-
}
|
|
907
|
-
}
|
|
908
|
-
},
|
|
909
|
-
"parties": {
|
|
910
|
-
"beneficiary": "borrowerProceedsAccountId"
|
|
911
|
-
},
|
|
912
|
-
"partitions": [
|
|
913
|
-
{
|
|
914
|
-
"pieceFields": [
|
|
915
|
-
"installment1Amount",
|
|
916
|
-
"installment2Amount"
|
|
917
|
-
],
|
|
918
|
-
"totalField": "principalAmount"
|
|
919
|
-
}
|
|
920
|
-
],
|
|
921
|
-
"required": [
|
|
922
|
-
"borrowerProceedsAccountId",
|
|
923
|
-
"servicingPoolAccountId",
|
|
924
|
-
"borrowerAccountId",
|
|
925
|
-
"platformAccountId",
|
|
926
|
-
"currency",
|
|
927
|
-
"principalAmount",
|
|
928
|
-
"firstRepaymentDueAt",
|
|
929
|
-
"installment1Amount",
|
|
930
|
-
"installment2Amount"
|
|
931
|
-
],
|
|
932
|
-
"summary": "2-anchor obligation for borrower",
|
|
933
|
-
"title": "Borrower loan"
|
|
934
|
-
},
|
|
935
|
-
{
|
|
936
|
-
"actionOrder": [
|
|
937
|
-
"create",
|
|
938
|
-
"repay",
|
|
939
|
-
"refund"
|
|
940
|
-
],
|
|
941
|
-
"actions": {
|
|
942
|
-
"create": {
|
|
943
|
-
"agentDescription": "Open a payment record against installment 1. The parent obligation must be live. No money moves yet. Repay is what pays.",
|
|
944
|
-
"effects": {
|
|
945
|
-
"reads": [
|
|
946
|
-
{
|
|
947
|
-
"signature": "reads.requires_refs",
|
|
948
|
-
"source": "requiresRefs"
|
|
949
|
-
}
|
|
950
|
-
]
|
|
951
|
-
},
|
|
952
|
-
"moves": [],
|
|
953
|
-
"publicAction": "createBorrowerLoanInstallment1Payment",
|
|
954
|
-
"requiresRefs": [
|
|
955
|
-
{
|
|
956
|
-
"bind": {
|
|
957
|
-
"borrowerAccountId": "fields.borrowerAccountId",
|
|
958
|
-
"currency": "fields.currency",
|
|
959
|
-
"servicingPoolAccountId": "fields.servicingPoolAccountId"
|
|
960
|
-
},
|
|
961
|
-
"field": "borrowerLoanId",
|
|
962
|
-
"statuses": [
|
|
963
|
-
"active",
|
|
964
|
-
"installment_1_delinquent",
|
|
965
|
-
"installment_2_delinquent"
|
|
966
|
-
]
|
|
967
|
-
}
|
|
968
|
-
],
|
|
969
|
-
"steps": [],
|
|
970
|
-
"summary": "Create a payment record for installment 1"
|
|
971
|
-
},
|
|
972
|
-
"refund": {
|
|
973
|
-
"agentDescription": "Return one whole installment 1 payment to the payer. The record must be paid, and the refund is always its full amount, so split a payment across records when a partial refund could be needed. This moves money back.",
|
|
974
|
-
"effects": {
|
|
975
|
-
"moves": [
|
|
976
|
-
{
|
|
977
|
-
"signature": "moves.transfer.internal",
|
|
978
|
-
"source": "moves[0]"
|
|
979
|
-
}
|
|
980
|
-
],
|
|
981
|
-
"reads": [
|
|
982
|
-
{
|
|
983
|
-
"signature": "reads.requires_refs",
|
|
984
|
-
"source": "requiresRefs"
|
|
985
|
-
}
|
|
986
|
-
]
|
|
987
|
-
},
|
|
988
|
-
"moves": [
|
|
989
|
-
{
|
|
990
|
-
"bind": {
|
|
991
|
-
"amount": {
|
|
992
|
-
"from": "instance",
|
|
993
|
-
"path": "fields.amount"
|
|
994
|
-
},
|
|
995
|
-
"currency": {
|
|
996
|
-
"from": "instance",
|
|
997
|
-
"path": "fields.currency"
|
|
998
|
-
},
|
|
999
|
-
"destinationAccountId": {
|
|
1000
|
-
"from": "instance",
|
|
1001
|
-
"path": "fields.borrowerAccountId"
|
|
1002
|
-
},
|
|
1003
|
-
"metadata.instrumentId": {
|
|
1004
|
-
"from": "const",
|
|
1005
|
-
"value": "borrower_loan_installment_1_payment"
|
|
1006
|
-
},
|
|
1007
|
-
"metadata.instrumentInstanceId": {
|
|
1008
|
-
"from": "instance",
|
|
1009
|
-
"path": "instrumentInstanceId"
|
|
1010
|
-
},
|
|
1011
|
-
"metadata.phase": {
|
|
1012
|
-
"from": "const",
|
|
1013
|
-
"value": "refund"
|
|
1014
|
-
},
|
|
1015
|
-
"productId": {
|
|
1016
|
-
"from": "instance",
|
|
1017
|
-
"path": "productId"
|
|
1018
|
-
},
|
|
1019
|
-
"sourceAccountId": {
|
|
1020
|
-
"from": "instance",
|
|
1021
|
-
"path": "fields.servicingPoolAccountId"
|
|
1022
|
-
}
|
|
1023
|
-
},
|
|
1024
|
-
"capture": {
|
|
1025
|
-
"refundRefundTransferId": "transferId"
|
|
1026
|
-
},
|
|
1027
|
-
"key": "refund",
|
|
1028
|
-
"operation": "internal_transfer.create"
|
|
1029
|
-
}
|
|
1030
|
-
],
|
|
1031
|
-
"publicAction": "refundBorrowerLoanInstallment1Payment",
|
|
1032
|
-
"requiresRefs": [
|
|
1033
|
-
{
|
|
1034
|
-
"field": "borrowerLoanId",
|
|
1035
|
-
"match": {
|
|
1036
|
-
"fields.borrowerAccountId": "fields.borrowerAccountId",
|
|
1037
|
-
"fields.currency": "fields.currency",
|
|
1038
|
-
"fields.servicingPoolAccountId": "fields.servicingPoolAccountId"
|
|
1039
|
-
},
|
|
1040
|
-
"statuses": [
|
|
1041
|
-
"active",
|
|
1042
|
-
"installment_1_delinquent",
|
|
1043
|
-
"installment_2_delinquent"
|
|
1044
|
-
]
|
|
1045
|
-
}
|
|
1046
|
-
],
|
|
1047
|
-
"steps": [],
|
|
1048
|
-
"summary": "Refund this one stored installment 1 payment whole"
|
|
1049
|
-
},
|
|
1050
|
-
"repay": {
|
|
1051
|
-
"agentDescription": "Pay this record's amount toward installment 1. The record must be created and its obligation live. Refused when this amount plus the records already paid against that installment would pass the stored amount. This moves the payer's money. Where a mandate applies, only the payer may call it and an evidence reference is required.",
|
|
1052
|
-
"effects": {
|
|
1053
|
-
"moves": [
|
|
1054
|
-
{
|
|
1055
|
-
"signature": "moves.transfer.internal",
|
|
1056
|
-
"source": "moves[0]"
|
|
1057
|
-
}
|
|
1058
|
-
],
|
|
1059
|
-
"reads": [
|
|
1060
|
-
{
|
|
1061
|
-
"signature": "reads.requires_refs",
|
|
1062
|
-
"source": "requiresRefs"
|
|
1063
|
-
}
|
|
1064
|
-
]
|
|
1065
|
-
},
|
|
1066
|
-
"moves": [
|
|
1067
|
-
{
|
|
1068
|
-
"bind": {
|
|
1069
|
-
"amount": {
|
|
1070
|
-
"from": "instance",
|
|
1071
|
-
"path": "fields.amount"
|
|
1072
|
-
},
|
|
1073
|
-
"currency": {
|
|
1074
|
-
"from": "instance",
|
|
1075
|
-
"path": "fields.currency"
|
|
1076
|
-
},
|
|
1077
|
-
"destinationAccountId": {
|
|
1078
|
-
"from": "instance",
|
|
1079
|
-
"path": "fields.servicingPoolAccountId"
|
|
1080
|
-
},
|
|
1081
|
-
"metadata.instrumentId": {
|
|
1082
|
-
"from": "const",
|
|
1083
|
-
"value": "borrower_loan_installment_1_payment"
|
|
1084
|
-
},
|
|
1085
|
-
"metadata.instrumentInstanceId": {
|
|
1086
|
-
"from": "instance",
|
|
1087
|
-
"path": "instrumentInstanceId"
|
|
1088
|
-
},
|
|
1089
|
-
"metadata.phase": {
|
|
1090
|
-
"from": "const",
|
|
1091
|
-
"value": "repay"
|
|
1092
|
-
},
|
|
1093
|
-
"productId": {
|
|
1094
|
-
"from": "instance",
|
|
1095
|
-
"path": "productId"
|
|
1096
|
-
},
|
|
1097
|
-
"sourceAccountId": {
|
|
1098
|
-
"from": "instance",
|
|
1099
|
-
"path": "fields.borrowerAccountId"
|
|
1100
|
-
}
|
|
1101
|
-
},
|
|
1102
|
-
"capture": {
|
|
1103
|
-
"repayRepaymentTransferId": "transferId"
|
|
1104
|
-
},
|
|
1105
|
-
"key": "repayment",
|
|
1106
|
-
"operation": "internal_transfer.create"
|
|
1107
|
-
}
|
|
1108
|
-
],
|
|
1109
|
-
"publicAction": "repayBorrowerLoanInstallment1Payment",
|
|
1110
|
-
"requiresExposure": [
|
|
1111
|
-
{
|
|
1112
|
-
"amountField": "amount",
|
|
1113
|
-
"anchorField": "borrowerLoanId",
|
|
1114
|
-
"capField": "installment1Amount",
|
|
1115
|
-
"capOnAnchor": true,
|
|
1116
|
-
"childInstrumentId": "borrower_loan_installment_1_payment",
|
|
1117
|
-
"statuses": [
|
|
1118
|
-
"paid"
|
|
1119
|
-
]
|
|
1120
|
-
}
|
|
1121
|
-
],
|
|
1122
|
-
"requiresRefs": [
|
|
1123
|
-
{
|
|
1124
|
-
"field": "borrowerLoanId",
|
|
1125
|
-
"match": {
|
|
1126
|
-
"fields.borrowerAccountId": "fields.borrowerAccountId",
|
|
1127
|
-
"fields.currency": "fields.currency",
|
|
1128
|
-
"fields.servicingPoolAccountId": "fields.servicingPoolAccountId"
|
|
1129
|
-
},
|
|
1130
|
-
"statuses": [
|
|
1131
|
-
"active",
|
|
1132
|
-
"installment_1_delinquent",
|
|
1133
|
-
"installment_2_delinquent"
|
|
1134
|
-
]
|
|
1135
|
-
}
|
|
1136
|
-
],
|
|
1137
|
-
"steps": [],
|
|
1138
|
-
"summary": "Pay a partial or full amount against installment 1"
|
|
1139
|
-
}
|
|
1140
|
-
},
|
|
1141
|
-
"agentDescription": "One payment against installment 1 of the obligation. Payments can be partial, so create a record, repay it, and the parent installment closes once its paid records sum to the stored anchor amount.",
|
|
1142
|
-
"description": "One partial or full payment bound to installment 1 of borrower_loan; the operation name fixes the anchor and borrowerLoanId fixes the obligation",
|
|
1143
|
-
"fields": {
|
|
1144
|
-
"amount": {
|
|
1145
|
-
"description": "Positive payment amount capped with its paid siblings at installment1Amount",
|
|
1146
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
1147
|
-
"type": "string"
|
|
1148
|
-
},
|
|
1149
|
-
"borrowerAccountId": {
|
|
1150
|
-
"description": "The borrower account",
|
|
1151
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1152
|
-
"type": "string",
|
|
1153
|
-
"x-hyperscale-reference-filter": {
|
|
1154
|
-
"column": "role",
|
|
1155
|
-
"values": [
|
|
1156
|
-
"customer_balance"
|
|
1157
|
-
]
|
|
1158
|
-
}
|
|
1159
|
-
},
|
|
1160
|
-
"borrowerLoanId": {
|
|
1161
|
-
"description": "The exact borrower loan this payment belongs to",
|
|
1162
|
-
"pattern": "^bl_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1163
|
-
"type": "string"
|
|
1164
|
-
},
|
|
1165
|
-
"currency": {
|
|
1166
|
-
"description": "ISO 4217 currency code",
|
|
1167
|
-
"maxLength": 3,
|
|
1168
|
-
"minLength": 3,
|
|
1169
|
-
"pattern": "^[A-Z]{3}$",
|
|
1170
|
-
"type": "string"
|
|
1171
|
-
},
|
|
1172
|
-
"servicingPoolAccountId": {
|
|
1173
|
-
"description": "The servicing pool account",
|
|
1174
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1175
|
-
"type": "string",
|
|
1176
|
-
"x-hyperscale-reference-filter": {
|
|
1177
|
-
"column": "role",
|
|
1178
|
-
"values": [
|
|
1179
|
-
"customer_balance"
|
|
1180
|
-
]
|
|
1181
|
-
}
|
|
1182
|
-
}
|
|
1183
|
-
},
|
|
1184
|
-
"id": "borrower_loan_installment_1_payment",
|
|
1185
|
-
"idPrefix": "zzaa",
|
|
1186
|
-
"lifecycle": {
|
|
1187
|
-
"initial": "created",
|
|
1188
|
-
"states": [
|
|
1189
|
-
"created",
|
|
1190
|
-
"paid",
|
|
1191
|
-
"refunded"
|
|
1192
|
-
],
|
|
1193
|
-
"transitions": {
|
|
1194
|
-
"refund": {
|
|
1195
|
-
"from": [
|
|
1196
|
-
"paid"
|
|
1197
|
-
],
|
|
1198
|
-
"to": "refunded"
|
|
1199
|
-
},
|
|
1200
|
-
"repay": {
|
|
1201
|
-
"from": [
|
|
1202
|
-
"created"
|
|
1203
|
-
],
|
|
1204
|
-
"to": "paid"
|
|
1205
|
-
}
|
|
1206
|
-
}
|
|
1207
|
-
},
|
|
1208
|
-
"parties": {
|
|
1209
|
-
"beneficiary": "servicingPoolAccountId",
|
|
1210
|
-
"payer": "borrowerAccountId"
|
|
1211
|
-
},
|
|
1212
|
-
"required": [
|
|
1213
|
-
"servicingPoolAccountId",
|
|
1214
|
-
"borrowerAccountId",
|
|
1215
|
-
"amount",
|
|
1216
|
-
"currency",
|
|
1217
|
-
"borrowerLoanId"
|
|
1218
|
-
],
|
|
1219
|
-
"summary": "Anchor-bound payment for installment 1",
|
|
1220
|
-
"title": "Borrower loan Installment 1 Payment"
|
|
1221
|
-
},
|
|
1222
|
-
{
|
|
1223
|
-
"actionOrder": [
|
|
1224
|
-
"create",
|
|
1225
|
-
"repay",
|
|
1226
|
-
"refund"
|
|
1227
|
-
],
|
|
1228
|
-
"actions": {
|
|
1229
|
-
"create": {
|
|
1230
|
-
"agentDescription": "Open a payment record against installment 2. The parent obligation must be live. No money moves yet. Repay is what pays.",
|
|
1231
|
-
"effects": {
|
|
1232
|
-
"reads": [
|
|
1233
|
-
{
|
|
1234
|
-
"signature": "reads.requires_refs",
|
|
1235
|
-
"source": "requiresRefs"
|
|
1236
|
-
}
|
|
1237
|
-
]
|
|
1238
|
-
},
|
|
1239
|
-
"moves": [],
|
|
1240
|
-
"publicAction": "createBorrowerLoanInstallment2Payment",
|
|
1241
|
-
"requiresRefs": [
|
|
1242
|
-
{
|
|
1243
|
-
"bind": {
|
|
1244
|
-
"borrowerAccountId": "fields.borrowerAccountId",
|
|
1245
|
-
"currency": "fields.currency",
|
|
1246
|
-
"servicingPoolAccountId": "fields.servicingPoolAccountId"
|
|
1247
|
-
},
|
|
1248
|
-
"field": "borrowerLoanId",
|
|
1249
|
-
"statuses": [
|
|
1250
|
-
"active",
|
|
1251
|
-
"installment_1_delinquent",
|
|
1252
|
-
"installment_2_delinquent"
|
|
1253
|
-
]
|
|
1254
|
-
}
|
|
1255
|
-
],
|
|
1256
|
-
"steps": [],
|
|
1257
|
-
"summary": "Create a payment record for installment 2"
|
|
1258
|
-
},
|
|
1259
|
-
"refund": {
|
|
1260
|
-
"agentDescription": "Return one whole installment 2 payment to the payer. The record must be paid, and the refund is always its full amount, so split a payment across records when a partial refund could be needed. This moves money back.",
|
|
1261
|
-
"effects": {
|
|
1262
|
-
"moves": [
|
|
1263
|
-
{
|
|
1264
|
-
"signature": "moves.transfer.internal",
|
|
1265
|
-
"source": "moves[0]"
|
|
1266
|
-
}
|
|
1267
|
-
],
|
|
1268
|
-
"reads": [
|
|
1269
|
-
{
|
|
1270
|
-
"signature": "reads.requires_refs",
|
|
1271
|
-
"source": "requiresRefs"
|
|
1272
|
-
}
|
|
1273
|
-
]
|
|
1274
|
-
},
|
|
1275
|
-
"moves": [
|
|
1276
|
-
{
|
|
1277
|
-
"bind": {
|
|
1278
|
-
"amount": {
|
|
1279
|
-
"from": "instance",
|
|
1280
|
-
"path": "fields.amount"
|
|
1281
|
-
},
|
|
1282
|
-
"currency": {
|
|
1283
|
-
"from": "instance",
|
|
1284
|
-
"path": "fields.currency"
|
|
1285
|
-
},
|
|
1286
|
-
"destinationAccountId": {
|
|
1287
|
-
"from": "instance",
|
|
1288
|
-
"path": "fields.borrowerAccountId"
|
|
1289
|
-
},
|
|
1290
|
-
"metadata.instrumentId": {
|
|
1291
|
-
"from": "const",
|
|
1292
|
-
"value": "borrower_loan_installment_2_payment"
|
|
1293
|
-
},
|
|
1294
|
-
"metadata.instrumentInstanceId": {
|
|
1295
|
-
"from": "instance",
|
|
1296
|
-
"path": "instrumentInstanceId"
|
|
1297
|
-
},
|
|
1298
|
-
"metadata.phase": {
|
|
1299
|
-
"from": "const",
|
|
1300
|
-
"value": "refund"
|
|
1301
|
-
},
|
|
1302
|
-
"productId": {
|
|
1303
|
-
"from": "instance",
|
|
1304
|
-
"path": "productId"
|
|
1305
|
-
},
|
|
1306
|
-
"sourceAccountId": {
|
|
1307
|
-
"from": "instance",
|
|
1308
|
-
"path": "fields.servicingPoolAccountId"
|
|
1309
|
-
}
|
|
1310
|
-
},
|
|
1311
|
-
"capture": {
|
|
1312
|
-
"refundRefundTransferId": "transferId"
|
|
1313
|
-
},
|
|
1314
|
-
"key": "refund",
|
|
1315
|
-
"operation": "internal_transfer.create"
|
|
1316
|
-
}
|
|
1317
|
-
],
|
|
1318
|
-
"publicAction": "refundBorrowerLoanInstallment2Payment",
|
|
1319
|
-
"requiresRefs": [
|
|
1320
|
-
{
|
|
1321
|
-
"field": "borrowerLoanId",
|
|
1322
|
-
"match": {
|
|
1323
|
-
"fields.borrowerAccountId": "fields.borrowerAccountId",
|
|
1324
|
-
"fields.currency": "fields.currency",
|
|
1325
|
-
"fields.servicingPoolAccountId": "fields.servicingPoolAccountId"
|
|
1326
|
-
},
|
|
1327
|
-
"statuses": [
|
|
1328
|
-
"active",
|
|
1329
|
-
"installment_1_delinquent",
|
|
1330
|
-
"installment_2_delinquent"
|
|
1331
|
-
]
|
|
1332
|
-
}
|
|
1333
|
-
],
|
|
1334
|
-
"steps": [],
|
|
1335
|
-
"summary": "Refund this one stored installment 2 payment whole"
|
|
1336
|
-
},
|
|
1337
|
-
"repay": {
|
|
1338
|
-
"agentDescription": "Pay this record's amount toward installment 2. The record must be created and its obligation live. Refused when this amount plus the records already paid against that installment would pass the stored amount. This moves the payer's money. Where a mandate applies, only the payer may call it and an evidence reference is required.",
|
|
1339
|
-
"effects": {
|
|
1340
|
-
"moves": [
|
|
1341
|
-
{
|
|
1342
|
-
"signature": "moves.transfer.internal",
|
|
1343
|
-
"source": "moves[0]"
|
|
1344
|
-
}
|
|
1345
|
-
],
|
|
1346
|
-
"reads": [
|
|
1347
|
-
{
|
|
1348
|
-
"signature": "reads.requires_refs",
|
|
1349
|
-
"source": "requiresRefs"
|
|
1350
|
-
}
|
|
1351
|
-
]
|
|
1352
|
-
},
|
|
1353
|
-
"moves": [
|
|
1354
|
-
{
|
|
1355
|
-
"bind": {
|
|
1356
|
-
"amount": {
|
|
1357
|
-
"from": "instance",
|
|
1358
|
-
"path": "fields.amount"
|
|
1359
|
-
},
|
|
1360
|
-
"currency": {
|
|
1361
|
-
"from": "instance",
|
|
1362
|
-
"path": "fields.currency"
|
|
1363
|
-
},
|
|
1364
|
-
"destinationAccountId": {
|
|
1365
|
-
"from": "instance",
|
|
1366
|
-
"path": "fields.servicingPoolAccountId"
|
|
1367
|
-
},
|
|
1368
|
-
"metadata.instrumentId": {
|
|
1369
|
-
"from": "const",
|
|
1370
|
-
"value": "borrower_loan_installment_2_payment"
|
|
1371
|
-
},
|
|
1372
|
-
"metadata.instrumentInstanceId": {
|
|
1373
|
-
"from": "instance",
|
|
1374
|
-
"path": "instrumentInstanceId"
|
|
1375
|
-
},
|
|
1376
|
-
"metadata.phase": {
|
|
1377
|
-
"from": "const",
|
|
1378
|
-
"value": "repay"
|
|
1379
|
-
},
|
|
1380
|
-
"productId": {
|
|
1381
|
-
"from": "instance",
|
|
1382
|
-
"path": "productId"
|
|
1383
|
-
},
|
|
1384
|
-
"sourceAccountId": {
|
|
1385
|
-
"from": "instance",
|
|
1386
|
-
"path": "fields.borrowerAccountId"
|
|
1387
|
-
}
|
|
1388
|
-
},
|
|
1389
|
-
"capture": {
|
|
1390
|
-
"repayRepaymentTransferId": "transferId"
|
|
1391
|
-
},
|
|
1392
|
-
"key": "repayment",
|
|
1393
|
-
"operation": "internal_transfer.create"
|
|
1394
|
-
}
|
|
1395
|
-
],
|
|
1396
|
-
"publicAction": "repayBorrowerLoanInstallment2Payment",
|
|
1397
|
-
"requiresExposure": [
|
|
1398
|
-
{
|
|
1399
|
-
"amountField": "amount",
|
|
1400
|
-
"anchorField": "borrowerLoanId",
|
|
1401
|
-
"capField": "installment2Amount",
|
|
1402
|
-
"capOnAnchor": true,
|
|
1403
|
-
"childInstrumentId": "borrower_loan_installment_2_payment",
|
|
1404
|
-
"statuses": [
|
|
1405
|
-
"paid"
|
|
1406
|
-
]
|
|
1407
|
-
}
|
|
1408
|
-
],
|
|
1409
|
-
"requiresRefs": [
|
|
1410
|
-
{
|
|
1411
|
-
"field": "borrowerLoanId",
|
|
1412
|
-
"match": {
|
|
1413
|
-
"fields.borrowerAccountId": "fields.borrowerAccountId",
|
|
1414
|
-
"fields.currency": "fields.currency",
|
|
1415
|
-
"fields.servicingPoolAccountId": "fields.servicingPoolAccountId"
|
|
1416
|
-
},
|
|
1417
|
-
"statuses": [
|
|
1418
|
-
"active",
|
|
1419
|
-
"installment_1_delinquent",
|
|
1420
|
-
"installment_2_delinquent"
|
|
1421
|
-
]
|
|
1422
|
-
}
|
|
1423
|
-
],
|
|
1424
|
-
"steps": [],
|
|
1425
|
-
"summary": "Pay a partial or full amount against installment 2"
|
|
1426
|
-
}
|
|
1427
|
-
},
|
|
1428
|
-
"agentDescription": "One payment against installment 2 of the obligation. Payments can be partial, so create a record, repay it, and the parent installment closes once its paid records sum to the stored anchor amount.",
|
|
1429
|
-
"description": "One partial or full payment bound to installment 2 of borrower_loan; the operation name fixes the anchor and borrowerLoanId fixes the obligation",
|
|
1430
|
-
"fields": {
|
|
1431
|
-
"amount": {
|
|
1432
|
-
"description": "Positive payment amount capped with its paid siblings at installment2Amount",
|
|
1433
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
1434
|
-
"type": "string"
|
|
1435
|
-
},
|
|
1436
|
-
"borrowerAccountId": {
|
|
1437
|
-
"description": "The borrower account",
|
|
1438
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1439
|
-
"type": "string",
|
|
1440
|
-
"x-hyperscale-reference-filter": {
|
|
1441
|
-
"column": "role",
|
|
1442
|
-
"values": [
|
|
1443
|
-
"customer_balance"
|
|
1444
|
-
]
|
|
1445
|
-
}
|
|
1446
|
-
},
|
|
1447
|
-
"borrowerLoanId": {
|
|
1448
|
-
"description": "The exact borrower loan this payment belongs to",
|
|
1449
|
-
"pattern": "^bl_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1450
|
-
"type": "string"
|
|
1451
|
-
},
|
|
1452
|
-
"currency": {
|
|
1453
|
-
"description": "ISO 4217 currency code",
|
|
1454
|
-
"maxLength": 3,
|
|
1455
|
-
"minLength": 3,
|
|
1456
|
-
"pattern": "^[A-Z]{3}$",
|
|
1457
|
-
"type": "string"
|
|
1458
|
-
},
|
|
1459
|
-
"servicingPoolAccountId": {
|
|
1460
|
-
"description": "The servicing pool account",
|
|
1461
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1462
|
-
"type": "string",
|
|
1463
|
-
"x-hyperscale-reference-filter": {
|
|
1464
|
-
"column": "role",
|
|
1465
|
-
"values": [
|
|
1466
|
-
"customer_balance"
|
|
1467
|
-
]
|
|
1468
|
-
}
|
|
1469
|
-
}
|
|
1470
|
-
},
|
|
1471
|
-
"id": "borrower_loan_installment_2_payment",
|
|
1472
|
-
"idPrefix": "zzab",
|
|
1473
|
-
"lifecycle": {
|
|
1474
|
-
"initial": "created",
|
|
1475
|
-
"states": [
|
|
1476
|
-
"created",
|
|
1477
|
-
"paid",
|
|
1478
|
-
"refunded"
|
|
1479
|
-
],
|
|
1480
|
-
"transitions": {
|
|
1481
|
-
"refund": {
|
|
1482
|
-
"from": [
|
|
1483
|
-
"paid"
|
|
1484
|
-
],
|
|
1485
|
-
"to": "refunded"
|
|
1486
|
-
},
|
|
1487
|
-
"repay": {
|
|
1488
|
-
"from": [
|
|
1489
|
-
"created"
|
|
1490
|
-
],
|
|
1491
|
-
"to": "paid"
|
|
1492
|
-
}
|
|
1493
|
-
}
|
|
1494
|
-
},
|
|
1495
|
-
"parties": {
|
|
1496
|
-
"beneficiary": "servicingPoolAccountId",
|
|
1497
|
-
"payer": "borrowerAccountId"
|
|
1498
|
-
},
|
|
1499
|
-
"required": [
|
|
1500
|
-
"servicingPoolAccountId",
|
|
1501
|
-
"borrowerAccountId",
|
|
1502
|
-
"amount",
|
|
1503
|
-
"currency",
|
|
1504
|
-
"borrowerLoanId"
|
|
1505
|
-
],
|
|
1506
|
-
"summary": "Anchor-bound payment for installment 2",
|
|
1507
|
-
"title": "Borrower loan Installment 2 Payment"
|
|
1508
|
-
},
|
|
1509
|
-
{
|
|
1510
|
-
"actionOrder": [
|
|
1511
|
-
"create",
|
|
1512
|
-
"snapshot_lender_claims"
|
|
1513
|
-
],
|
|
1514
|
-
"actions": {
|
|
1515
|
-
"create": {
|
|
1516
|
-
"agentDescription": "Open a distribution and start recording entitlements. No money moves. The pool amount, the record date, and the exact recipient count are fixed here.",
|
|
1517
|
-
"moves": [],
|
|
1518
|
-
"publicAction": "createRepaymentDistribution",
|
|
1519
|
-
"steps": [],
|
|
1520
|
-
"summary": "Open entitlement recording"
|
|
1521
|
-
},
|
|
1522
|
-
"snapshot_lender_claims": {
|
|
1523
|
-
"agentDescription": "Freeze the entitlement set against a stated evidence reference. The distribution must still be open and its recorded entitlements must match the declared recipient count. Nothing can be recorded afterwards and there is no unfreeze. No money moves.",
|
|
1524
|
-
"captureInput": {
|
|
1525
|
-
"snapshotEvidenceReference": "evidenceReference"
|
|
1526
|
-
},
|
|
1527
|
-
"effects": {
|
|
1528
|
-
"decides": [
|
|
1529
|
-
{
|
|
1530
|
-
"signature": "decides.tenant_port",
|
|
1531
|
-
"source": "port"
|
|
1532
|
-
}
|
|
1533
|
-
]
|
|
1534
|
-
},
|
|
1535
|
-
"input": {
|
|
1536
|
-
"additionalProperties": false,
|
|
1537
|
-
"properties": {
|
|
1538
|
-
"evidenceReference": {
|
|
1539
|
-
"description": "Required decision reference retained in the operation receipt",
|
|
1540
|
-
"maxLength": 180,
|
|
1541
|
-
"minLength": 1,
|
|
1542
|
-
"type": "string"
|
|
1543
|
-
}
|
|
1544
|
-
},
|
|
1545
|
-
"required": [
|
|
1546
|
-
"evidenceReference"
|
|
1547
|
-
],
|
|
1548
|
-
"type": "object"
|
|
1549
|
-
},
|
|
1550
|
-
"moves": [],
|
|
1551
|
-
"port": {
|
|
1552
|
-
"allowedParties": [
|
|
1553
|
-
"payer"
|
|
1554
|
-
]
|
|
1555
|
-
},
|
|
1556
|
-
"publicAction": "snapshotLenderClaimsRepaymentDistribution",
|
|
1557
|
-
"steps": [],
|
|
1558
|
-
"summary": "Freeze the entitlement set from stored evidence"
|
|
1559
|
-
}
|
|
1560
|
-
},
|
|
1561
|
-
"agentDescription": "Reach for weighted distribution when one pool splits across many recipients by declared weights. Record one entitlement per recipient, freeze the set with the snapshot port, then each entitlement pays its own largest-remainder share, so the shares add back to the pool exactly. Settlement batch goes the other way, many charges into one payout.",
|
|
1562
|
-
"aggregateInvariants": [
|
|
1563
|
-
{
|
|
1564
|
-
"childInstrumentId": "repayment_distribution_entitlement",
|
|
1565
|
-
"childRefField": "repaymentDistributionId",
|
|
1566
|
-
"childStatuses": [
|
|
1567
|
-
"recorded",
|
|
1568
|
-
"paid"
|
|
1569
|
-
],
|
|
1570
|
-
"count": true,
|
|
1571
|
-
"parentField": "maxRecipients"
|
|
1572
|
-
}
|
|
1573
|
-
],
|
|
1574
|
-
"description": "Evidence-frozen weighted distribution",
|
|
1575
|
-
"fields": {
|
|
1576
|
-
"currency": {
|
|
1577
|
-
"description": "ISO 4217 currency code",
|
|
1578
|
-
"maxLength": 3,
|
|
1579
|
-
"minLength": 3,
|
|
1580
|
-
"pattern": "^[A-Z]{3}$",
|
|
1581
|
-
"type": "string"
|
|
1582
|
-
},
|
|
1583
|
-
"distributableAmount": {
|
|
1584
|
-
"description": "Distribution pool in SAR minor units",
|
|
1585
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
1586
|
-
"type": "string"
|
|
1587
|
-
},
|
|
1588
|
-
"maxRecipients": {
|
|
1589
|
-
"const": 250,
|
|
1590
|
-
"description": "Exactly 250 frozen entitlement rows",
|
|
1591
|
-
"type": "integer"
|
|
1592
|
-
},
|
|
1593
|
-
"returnRecordAt": {
|
|
1594
|
-
"description": "Stored record date",
|
|
1595
|
-
"format": "hyperscale-date-time",
|
|
1596
|
-
"type": "string"
|
|
1597
|
-
},
|
|
1598
|
-
"servicingPoolAccountId": {
|
|
1599
|
-
"description": "The servicing pool account",
|
|
1600
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1601
|
-
"type": "string",
|
|
1602
|
-
"x-hyperscale-reference-filter": {
|
|
1603
|
-
"column": "role",
|
|
1604
|
-
"values": [
|
|
1605
|
-
"customer_balance"
|
|
1606
|
-
]
|
|
1607
|
-
}
|
|
1608
|
-
}
|
|
1609
|
-
},
|
|
1610
|
-
"id": "repayment_distribution",
|
|
1611
|
-
"idPrefix": "rd",
|
|
1612
|
-
"lifecycle": {
|
|
1613
|
-
"initial": "open",
|
|
1614
|
-
"states": [
|
|
1615
|
-
"open",
|
|
1616
|
-
"snapshotted"
|
|
1617
|
-
],
|
|
1618
|
-
"transitions": {
|
|
1619
|
-
"snapshot_lender_claims": {
|
|
1620
|
-
"from": [
|
|
1621
|
-
"open"
|
|
1622
|
-
],
|
|
1623
|
-
"to": "snapshotted"
|
|
1624
|
-
}
|
|
1625
|
-
}
|
|
1626
|
-
},
|
|
1627
|
-
"parties": {
|
|
1628
|
-
"payer": "servicingPoolAccountId"
|
|
1629
|
-
},
|
|
1630
|
-
"required": [
|
|
1631
|
-
"servicingPoolAccountId",
|
|
1632
|
-
"currency",
|
|
1633
|
-
"distributableAmount",
|
|
1634
|
-
"returnRecordAt",
|
|
1635
|
-
"maxRecipients"
|
|
1636
|
-
],
|
|
1637
|
-
"summary": "Frozen largest-remainder distribution",
|
|
1638
|
-
"title": "Repayment distribution"
|
|
1639
|
-
},
|
|
1640
|
-
{
|
|
1641
|
-
"actionOrder": [
|
|
1642
|
-
"create",
|
|
1643
|
-
"payout"
|
|
1644
|
-
],
|
|
1645
|
-
"actions": {
|
|
1646
|
-
"create": {
|
|
1647
|
-
"agentDescription": "Record one recipient weight against an open distribution. The parent distribution must still be open, and the currency and source account are copied from it. No money moves. Do not supply a share. It is derived later from the frozen set.",
|
|
1648
|
-
"effects": {
|
|
1649
|
-
"reads": [
|
|
1650
|
-
{
|
|
1651
|
-
"signature": "reads.requires_refs",
|
|
1652
|
-
"source": "requiresRefs"
|
|
1653
|
-
}
|
|
1654
|
-
]
|
|
1655
|
-
},
|
|
1656
|
-
"moves": [],
|
|
1657
|
-
"publicAction": "createRepaymentDistributionEntitlement",
|
|
1658
|
-
"requiresRefs": [
|
|
1659
|
-
{
|
|
1660
|
-
"bind": {
|
|
1661
|
-
"currency": "fields.currency",
|
|
1662
|
-
"servicingPoolAccountId": "fields.servicingPoolAccountId"
|
|
1663
|
-
},
|
|
1664
|
-
"field": "repaymentDistributionId",
|
|
1665
|
-
"statuses": [
|
|
1666
|
-
"open"
|
|
1667
|
-
]
|
|
1668
|
-
}
|
|
1669
|
-
],
|
|
1670
|
-
"steps": [],
|
|
1671
|
-
"summary": "Record one entitlement before snapshot"
|
|
1672
|
-
},
|
|
1673
|
-
"payout": {
|
|
1674
|
-
"agentDescription": "Pay this recipient their largest-remainder share of the pool. The parent distribution must already be snapshotted. The amount is computed from the recorded weights, not supplied by the caller, and a zero share moves nothing. This moves money and does not reverse.",
|
|
1675
|
-
"distribute": {
|
|
1676
|
-
"amountRef": "payoutShare",
|
|
1677
|
-
"onZero": "skip_steps",
|
|
1678
|
-
"pool": {
|
|
1679
|
-
"from": "parent",
|
|
1680
|
-
"path": "fields.distributableAmount"
|
|
1681
|
-
},
|
|
1682
|
-
"refField": "repaymentDistributionId",
|
|
1683
|
-
"statuses": [
|
|
1684
|
-
"recorded",
|
|
1685
|
-
"paid"
|
|
1686
|
-
],
|
|
1687
|
-
"weightField": "committedWeight"
|
|
1688
|
-
},
|
|
1689
|
-
"effects": {
|
|
1690
|
-
"moves": [
|
|
1691
|
-
{
|
|
1692
|
-
"signature": "moves.transfer.internal",
|
|
1693
|
-
"source": "moves[0]"
|
|
1694
|
-
}
|
|
1695
|
-
],
|
|
1696
|
-
"reads": [
|
|
1697
|
-
{
|
|
1698
|
-
"signature": "reads.requires_refs",
|
|
1699
|
-
"source": "requiresRefs"
|
|
1700
|
-
}
|
|
1701
|
-
]
|
|
1702
|
-
},
|
|
1703
|
-
"moves": [
|
|
1704
|
-
{
|
|
1705
|
-
"bind": {
|
|
1706
|
-
"amount": {
|
|
1707
|
-
"from": "instance",
|
|
1708
|
-
"path": "refs.payoutShare"
|
|
1709
|
-
},
|
|
1710
|
-
"currency": {
|
|
1711
|
-
"from": "instance",
|
|
1712
|
-
"path": "fields.currency"
|
|
1713
|
-
},
|
|
1714
|
-
"destinationAccountId": {
|
|
1715
|
-
"from": "instance",
|
|
1716
|
-
"path": "fields.lenderAccountId"
|
|
1717
|
-
},
|
|
1718
|
-
"metadata.instrumentId": {
|
|
1719
|
-
"from": "const",
|
|
1720
|
-
"value": "repayment_distribution_entitlement"
|
|
1721
|
-
},
|
|
1722
|
-
"metadata.instrumentInstanceId": {
|
|
1723
|
-
"from": "instance",
|
|
1724
|
-
"path": "instrumentInstanceId"
|
|
1725
|
-
},
|
|
1726
|
-
"metadata.phase": {
|
|
1727
|
-
"from": "const",
|
|
1728
|
-
"value": "payout"
|
|
1729
|
-
},
|
|
1730
|
-
"productId": {
|
|
1731
|
-
"from": "instance",
|
|
1732
|
-
"path": "productId"
|
|
1733
|
-
},
|
|
1734
|
-
"sourceAccountId": {
|
|
1735
|
-
"from": "instance",
|
|
1736
|
-
"path": "fields.servicingPoolAccountId"
|
|
1737
|
-
}
|
|
1738
|
-
},
|
|
1739
|
-
"capture": {
|
|
1740
|
-
"payoutPayoutTransferId": "transferId"
|
|
1741
|
-
},
|
|
1742
|
-
"key": "payout",
|
|
1743
|
-
"operation": "internal_transfer.create"
|
|
1744
|
-
}
|
|
1745
|
-
],
|
|
1746
|
-
"publicAction": "payoutRepaymentDistributionEntitlement",
|
|
1747
|
-
"requiresRefs": [
|
|
1748
|
-
{
|
|
1749
|
-
"field": "repaymentDistributionId",
|
|
1750
|
-
"match": {
|
|
1751
|
-
"fields.currency": "fields.currency",
|
|
1752
|
-
"fields.servicingPoolAccountId": "fields.servicingPoolAccountId"
|
|
1753
|
-
},
|
|
1754
|
-
"statuses": [
|
|
1755
|
-
"snapshotted"
|
|
1756
|
-
]
|
|
1757
|
-
}
|
|
1758
|
-
],
|
|
1759
|
-
"steps": [],
|
|
1760
|
-
"summary": "Pay the deterministic largest-remainder share once"
|
|
1761
|
-
}
|
|
1762
|
-
},
|
|
1763
|
-
"agentDescription": "One recipient weighted claim on repayment_distribution. Record one per recipient before the snapshot. Its share is derived from its weight against the frozen set, never supplied by the caller.",
|
|
1764
|
-
"description": "One frozen weighted entitlement in repayment_distribution",
|
|
1765
|
-
"fields": {
|
|
1766
|
-
"committedWeight": {
|
|
1767
|
-
"description": "Stored non-negative entitlement weight",
|
|
1768
|
-
"pattern": "^[1-9][0-9]{0,17}$",
|
|
1769
|
-
"type": "string"
|
|
1770
|
-
},
|
|
1771
|
-
"currency": {
|
|
1772
|
-
"description": "ISO 4217 currency code",
|
|
1773
|
-
"maxLength": 3,
|
|
1774
|
-
"minLength": 3,
|
|
1775
|
-
"pattern": "^[A-Z]{3}$",
|
|
1776
|
-
"type": "string"
|
|
1777
|
-
},
|
|
1778
|
-
"lenderAccountId": {
|
|
1779
|
-
"description": "The lender account",
|
|
1780
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1781
|
-
"type": "string",
|
|
1782
|
-
"x-hyperscale-reference-filter": {
|
|
1783
|
-
"column": "role",
|
|
1784
|
-
"values": [
|
|
1785
|
-
"customer_balance"
|
|
1786
|
-
]
|
|
1787
|
-
}
|
|
1788
|
-
},
|
|
1789
|
-
"repaymentDistributionId": {
|
|
1790
|
-
"description": "The exact repayment_distribution",
|
|
1791
|
-
"pattern": "^rd_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1792
|
-
"type": "string"
|
|
1793
|
-
},
|
|
1794
|
-
"servicingPoolAccountId": {
|
|
1795
|
-
"description": "The servicing pool account",
|
|
1796
|
-
"pattern": "^acct_(sandbox|live)_[a-z0-9]{8,64}$",
|
|
1797
|
-
"type": "string",
|
|
1798
|
-
"x-hyperscale-reference-filter": {
|
|
1799
|
-
"column": "role",
|
|
1800
|
-
"values": [
|
|
1801
|
-
"customer_balance"
|
|
1802
|
-
]
|
|
1803
|
-
}
|
|
1804
|
-
}
|
|
1805
|
-
},
|
|
1806
|
-
"id": "repayment_distribution_entitlement",
|
|
1807
|
-
"idPrefix": "zzac",
|
|
1808
|
-
"lifecycle": {
|
|
1809
|
-
"initial": "recorded",
|
|
1810
|
-
"states": [
|
|
1811
|
-
"recorded",
|
|
1812
|
-
"paid"
|
|
1813
|
-
],
|
|
1814
|
-
"transitions": {
|
|
1815
|
-
"payout": {
|
|
1816
|
-
"from": [
|
|
1817
|
-
"recorded"
|
|
1818
|
-
],
|
|
1819
|
-
"to": "paid"
|
|
1820
|
-
}
|
|
1821
|
-
}
|
|
1822
|
-
},
|
|
1823
|
-
"parties": {
|
|
1824
|
-
"beneficiary": "lenderAccountId",
|
|
1825
|
-
"payer": "servicingPoolAccountId"
|
|
1826
|
-
},
|
|
1827
|
-
"required": [
|
|
1828
|
-
"lenderAccountId",
|
|
1829
|
-
"servicingPoolAccountId",
|
|
1830
|
-
"currency",
|
|
1831
|
-
"repaymentDistributionId",
|
|
1832
|
-
"committedWeight"
|
|
1833
|
-
],
|
|
1834
|
-
"summary": "Frozen entitlement in repayment_distribution",
|
|
1835
|
-
"title": "Repayment distribution Entitlement"
|
|
1836
|
-
}
|
|
1837
|
-
],
|
|
1838
|
-
"product": "crowdfunding_p2p",
|
|
1839
|
-
"subjects": [],
|
|
1840
|
-
"title": "Crowdfunding and peer lending",
|
|
1841
|
-
"udl": 1,
|
|
1842
|
-
"version": 1
|
|
1843
|
-
}
|