@hyperscale0/hsx 1.0.0-rc.1 → 1.0.123
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 +5 -239
- package/LICENSE.md +356 -0
- package/NOTICE.md +8 -0
- package/README.md +45 -43
- package/bin/hsx.ts +0 -5
- package/dist/bin/hsx.d.ts +0 -4
- package/dist/bin/hsx.d.ts.map +1 -1
- package/dist/bin/hsx.js +0 -4
- package/dist/bin/hsx.js.map +1 -1
- package/dist/src/ast.d.ts +113 -302
- package/dist/src/ast.d.ts.map +1 -1
- package/dist/src/ast.js +7 -47
- package/dist/src/ast.js.map +1 -1
- package/dist/src/attachment-economics.d.ts +5 -0
- package/dist/src/attachment-economics.d.ts.map +1 -0
- package/dist/src/attachment-economics.js +55 -0
- package/dist/src/attachment-economics.js.map +1 -0
- package/dist/src/binding-contract.d.ts +22 -0
- package/dist/src/binding-contract.d.ts.map +1 -0
- package/dist/src/binding-contract.js +74 -0
- package/dist/src/binding-contract.js.map +1 -0
- package/dist/src/cli.d.ts +4 -17
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +92 -259
- package/dist/src/cli.js.map +1 -1
- package/dist/src/compile.d.ts +34 -68
- package/dist/src/compile.d.ts.map +1 -1
- package/dist/src/compile.js +2949 -118
- package/dist/src/compile.js.map +1 -1
- package/dist/src/cost.d.ts +8 -75
- package/dist/src/cost.d.ts.map +1 -1
- package/dist/src/cost.js +54 -364
- package/dist/src/cost.js.map +1 -1
- package/dist/src/diagnostics.d.ts +14 -9
- package/dist/src/diagnostics.d.ts.map +1 -1
- package/dist/src/diagnostics.js +39 -416
- package/dist/src/diagnostics.js.map +1 -1
- package/dist/src/examples-bundle.d.ts +3 -0
- package/dist/src/examples-bundle.d.ts.map +1 -0
- package/dist/src/examples-bundle.js +18 -0
- package/dist/src/examples-bundle.js.map +1 -0
- package/dist/src/examples.d.ts +10 -0
- package/dist/src/examples.d.ts.map +1 -0
- package/dist/src/examples.js +2 -0
- package/dist/src/examples.js.map +1 -0
- package/dist/src/format.d.ts +8 -7
- package/dist/src/format.d.ts.map +1 -1
- package/dist/src/format.js +9 -175
- package/dist/src/format.js.map +1 -1
- package/dist/src/header-source.d.ts +3 -0
- package/dist/src/header-source.d.ts.map +1 -0
- package/dist/src/header-source.js +41 -0
- package/dist/src/header-source.js.map +1 -0
- package/dist/src/headers.d.ts +64 -0
- package/dist/src/headers.d.ts.map +1 -0
- package/dist/src/headers.js +167 -0
- package/dist/src/headers.js.map +1 -0
- package/dist/src/index.d.ts +8 -11
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -8
- package/dist/src/index.js.map +1 -1
- package/dist/src/keywords.d.ts +56 -0
- package/dist/src/keywords.d.ts.map +1 -0
- package/dist/src/keywords.js +133 -0
- package/dist/src/keywords.js.map +1 -0
- package/dist/src/language.d.ts +26 -0
- package/dist/src/language.d.ts.map +1 -0
- package/dist/src/language.js +440 -0
- package/dist/src/language.js.map +1 -0
- package/dist/src/lex.d.ts +13 -28
- package/dist/src/lex.d.ts.map +1 -1
- package/dist/src/lex.js +119 -145
- package/dist/src/lex.js.map +1 -1
- package/dist/src/parse.d.ts +4 -17
- package/dist/src/parse.d.ts.map +1 -1
- package/dist/src/parse.js +484 -1036
- package/dist/src/parse.js.map +1 -1
- package/dist/src/std-bundle.d.ts +2 -0
- package/dist/src/std-bundle.d.ts.map +1 -0
- package/dist/src/std-bundle.js +15 -0
- package/dist/src/std-bundle.js.map +1 -0
- package/dist/src/std-library.d.ts +5 -0
- package/dist/src/std-library.d.ts.map +1 -0
- package/dist/src/std-library.js +5 -0
- package/dist/src/std-library.js.map +1 -0
- package/dist/src/tunables.d.ts +7 -0
- package/dist/src/tunables.d.ts.map +1 -0
- package/dist/src/tunables.js +27 -0
- package/dist/src/tunables.js.map +1 -0
- package/docs/README.md +528 -23
- package/docs/assets/brand/hsx-horizontal-white.svg +1 -0
- package/docs/assets/brand/hsx-horizontal.svg +1 -0
- package/docs/assets/brand/hsx-stacked-white.svg +1 -0
- package/docs/assets/brand/hsx-stacked.svg +1 -0
- package/docs/assets/brand/manifest.json +30 -0
- package/docs/assets/hsx.svg +11 -0
- package/examples/cards.hsx +34 -0
- package/examples/collections.hsx +37 -0
- package/examples/cost-table.json +633 -385
- package/examples/escrow.hsx +24 -0
- package/examples/financing.hsx +32 -0
- package/examples/insurance.hsx +30 -0
- package/examples/lending.hsx +57 -0
- package/examples/library.hsx +15 -0
- package/examples/marketplace.hsx +32 -0
- package/examples/money.hsx +19 -0
- package/examples/rental-deposit.hsx +60 -0
- package/examples/repair-approval.hsx +44 -0
- package/examples/reporting.hsx +28 -0
- package/examples/savings.hsx +21 -0
- package/examples/serviced.hsx +25 -0
- package/examples/wallet.hsx +24 -0
- package/package.json +27 -17
- package/src/ast.ts +84 -411
- package/src/attachment-economics.ts +103 -0
- package/src/binding-contract.ts +104 -0
- package/src/cli.ts +98 -309
- package/src/compile.ts +4063 -212
- package/src/cost.ts +71 -574
- package/src/diagnostics.ts +57 -437
- package/src/examples-bundle.ts +19 -0
- package/src/examples.ts +9 -0
- package/src/format.ts +12 -256
- package/src/header-source.ts +54 -0
- package/src/headers.ts +195 -0
- package/src/index.ts +16 -29
- package/src/keywords.ts +134 -0
- package/src/language.ts +629 -0
- package/src/lex.ts +131 -192
- package/src/parse.ts +489 -1195
- package/src/std-bundle.ts +15 -0
- package/src/std-library.ts +7 -0
- package/src/tunables.ts +36 -0
- package/std/cards.hsx +85 -0
- package/std/collections.hsx +90 -0
- package/std/escrow.hsx +73 -0
- package/std/financing.hsx +683 -0
- package/std/insurance.hsx +89 -0
- package/std/lending.hsx +138 -0
- package/std/marketplace.hsx +123 -0
- package/std/money.hsx +173 -0
- package/std/reporting.hsx +753 -0
- package/std/savings.hsx +68 -0
- package/std/wallet.hsx +57 -0
- package/LICENSE +0 -661
- package/LICENSING.md +0 -52
- package/TRADEMARKS.md +0 -35
- package/dist/src/emit.d.ts +0 -35
- package/dist/src/emit.d.ts.map +0 -1
- package/dist/src/emit.js +0 -359
- package/dist/src/emit.js.map +0 -1
- package/dist/src/entry-overrides.d.ts +0 -58
- package/dist/src/entry-overrides.d.ts.map +0 -1
- package/dist/src/entry-overrides.js +0 -284
- package/dist/src/entry-overrides.js.map +0 -1
- package/dist/src/ir.d.ts +0 -66
- package/dist/src/ir.d.ts.map +0 -1
- package/dist/src/ir.js +0 -15
- package/dist/src/ir.js.map +0 -1
- package/dist/src/limits.d.ts +0 -21
- package/dist/src/limits.d.ts.map +0 -1
- package/dist/src/limits.js +0 -21
- package/dist/src/limits.js.map +0 -1
- package/dist/src/modules.d.ts +0 -36
- package/dist/src/modules.d.ts.map +0 -1
- package/dist/src/modules.js +0 -372
- package/dist/src/modules.js.map +0 -1
- package/dist/src/typecheck.d.ts +0 -8
- package/dist/src/typecheck.d.ts.map +0 -1
- package/dist/src/typecheck.js +0 -2958
- package/dist/src/typecheck.js.map +0 -1
- package/dist/src/version.d.ts +0 -5
- package/dist/src/version.d.ts.map +0 -1
- package/dist/src/version.js +0 -5
- package/dist/src/version.js.map +0 -1
- package/docs/guide/01-first-program.md +0 -24
- package/docs/guide/02-money.md +0 -25
- package/docs/guide/03-instruments.md +0 -22
- package/docs/guide/04-lifecycles.md +0 -25
- package/docs/guide/05-fees-and-splits.md +0 -45
- package/docs/guide/06-schedules.md +0 -22
- package/docs/guide/07-composition.md +0 -46
- package/docs/guide/08-writing-a-module.md +0 -26
- package/docs/guide/09-cost.md +0 -24
- package/docs/guide/10-diagnostics.md +0 -27
- package/docs/llms-full.txt +0 -1738
- package/docs/llms.txt +0 -45
- package/docs/reference/cli.md +0 -33
- package/docs/reference/diagnostics.md +0 -619
- package/docs/reference/grammar.md +0 -39
- package/docs/reference/std/advance.md +0 -35
- package/docs/reference/std/cancellable_booking.md +0 -35
- package/docs/reference/std/captured_payment.md +0 -43
- package/docs/reference/std/conditional_disbursement.md +0 -33
- package/docs/reference/std/credit_facility.md +0 -35
- package/docs/reference/std/held_payment.md +0 -64
- package/docs/reference/std/instant_transfer.md +0 -30
- package/docs/reference/std/metered.md +0 -27
- package/docs/reference/std/pooled_split.md +0 -26
- package/docs/reference/std/premium_forward.md +0 -39
- package/docs/reference/std/reconciled_payout.md +0 -33
- package/docs/reference/std/recurring_collection.md +0 -25
- package/docs/reference/std/rotating_pool.md +0 -42
- package/docs/reference/std/scheduled.md +0 -51
- package/docs/reference/std/security_deposit.md +0 -46
- package/docs/reference/std/settlement_batch.md +0 -42
- package/docs/reference/std/swap.md +0 -46
- package/docs/reference/std/threshold_pool.md +0 -47
- package/docs/reference/std/weighted_distribution.md +0 -39
- package/docs/reference/types.md +0 -20
- package/docs/reference/udl-output.md +0 -14
- package/docs/sessions/2026-09-02-two-instruments.hsx +0 -21
- package/docs/sessions/2026-09-02-two-instruments.md +0 -41
- package/examples/01-first-program/README.md +0 -45
- package/examples/01-first-program/tip-jar.hsx +0 -17
- package/examples/02-imports-and-archetypes/README.md +0 -99
- package/examples/02-imports-and-archetypes/photo-booth.hsx +0 -37
- package/examples/03-diagnostics/README.md +0 -68
- package/examples/03-diagnostics/corner-shop-fixed.hsx +0 -22
- package/examples/03-diagnostics/corner-shop.hsx +0 -19
- package/examples/04-complete-product/README.md +0 -87
- package/examples/04-complete-product/study-hall.hsx +0 -67
- package/examples/05-watch-club/README.md +0 -9
- package/examples/05-watch-club/watch-club.hsx +0 -124
- package/examples/README.md +0 -18
- package/examples/advance/README.md +0 -3
- package/examples/advance/advance.hsx +0 -13
- package/examples/advance/advance.udl +0 -339
- package/examples/cancellable_booking/README.md +0 -3
- package/examples/cancellable_booking/cancellable_booking.hsx +0 -14
- package/examples/cancellable_booking/cancellable_booking.udl +0 -391
- package/examples/captured_payment/README.md +0 -3
- package/examples/captured_payment/captured_payment.hsx +0 -21
- package/examples/captured_payment/captured_payment.udl +0 -677
- package/examples/conditional_disbursement/README.md +0 -3
- package/examples/conditional_disbursement/conditional_disbursement.hsx +0 -17
- package/examples/conditional_disbursement/conditional_disbursement.udl +0 -412
- package/examples/credit_facility/README.md +0 -3
- package/examples/credit_facility/credit_facility.hsx +0 -27
- package/examples/credit_facility/credit_facility.udl +0 -1373
- package/examples/held_payment/README.md +0 -3
- package/examples/held_payment/held_payment.hsx +0 -13
- package/examples/held_payment/held_payment.udl +0 -507
- package/examples/instant_transfer/README.md +0 -3
- package/examples/instant_transfer/instant_transfer.hsx +0 -16
- package/examples/instant_transfer/instant_transfer.udl +0 -364
- package/examples/metered/README.md +0 -3
- package/examples/metered/metered.hsx +0 -13
- package/examples/metered/metered.udl +0 -247
- package/examples/pooled_split/README.md +0 -3
- package/examples/pooled_split/pooled_split.hsx +0 -15
- package/examples/pooled_split/pooled_split.udl +0 -425
- package/examples/premium_forward/README.md +0 -3
- package/examples/premium_forward/premium_forward.hsx +0 -19
- package/examples/premium_forward/premium_forward.udl +0 -594
- package/examples/reconciled_payout/README.md +0 -3
- package/examples/reconciled_payout/reconciled_payout.hsx +0 -13
- package/examples/reconciled_payout/reconciled_payout.udl +0 -303
- package/examples/recurring_collection/README.md +0 -3
- package/examples/recurring_collection/recurring_collection.hsx +0 -21
- package/examples/recurring_collection/recurring_collection.udl +0 -1130
- package/examples/rotating_pool/README.md +0 -3
- package/examples/rotating_pool/rotating_pool.hsx +0 -18
- package/examples/rotating_pool/rotating_pool.udl +0 -4352
- package/examples/scheduled/README.md +0 -3
- package/examples/scheduled/scheduled.hsx +0 -12
- package/examples/scheduled/scheduled.udl +0 -335
- package/examples/security_deposit/README.md +0 -3
- package/examples/security_deposit/security_deposit.hsx +0 -21
- package/examples/security_deposit/security_deposit.udl +0 -293
- package/examples/settlement_batch/README.md +0 -3
- package/examples/settlement_batch/settlement_batch.hsx +0 -19
- package/examples/settlement_batch/settlement_batch.udl +0 -753
- package/examples/swap/README.md +0 -3
- package/examples/swap/swap.hsx +0 -19
- package/examples/swap/swap.udl +0 -876
- package/examples/threshold_pool/README.md +0 -3
- package/examples/threshold_pool/threshold_pool.hsx +0 -16
- package/examples/threshold_pool/threshold_pool.udl +0 -667
- package/examples/weighted_distribution/README.md +0 -3
- package/examples/weighted_distribution/weighted_distribution.hsx +0 -20
- package/examples/weighted_distribution/weighted_distribution.udl +0 -337
- package/skills/hsx/SKILL.md +0 -483
- package/src/emit.ts +0 -447
- package/src/entry-overrides.ts +0 -428
- package/src/ir.ts +0 -99
- package/src/limits.ts +0 -20
- package/src/modules.ts +0 -444
- package/src/typecheck.ts +0 -3876
- package/src/version.ts +0 -5
- package/std/SEMANTICS.md +0 -130
- package/std/settlements/advance.hsx +0 -177
- package/std/settlements/cancellable_booking.hsx +0 -87
- package/std/settlements/captured_payment.hsx +0 -144
- package/std/settlements/conditional_disbursement.hsx +0 -185
- package/std/settlements/credit_facility.hsx +0 -167
- package/std/settlements/held_payment.hsx +0 -578
- package/std/settlements/index.hsx +0 -3
- package/std/settlements/instant_transfer.hsx +0 -190
- package/std/settlements/metered.hsx +0 -67
- package/std/settlements/pooled_split.hsx +0 -68
- package/std/settlements/premium_forward.hsx +0 -257
- package/std/settlements/reconciled_payout.hsx +0 -77
- package/std/settlements/recurring_collection.hsx +0 -27
- package/std/settlements/rotating_pool.hsx +0 -252
- package/std/settlements/scheduled.hsx +0 -641
- package/std/settlements/security_deposit.hsx +0 -166
- package/std/settlements/settlement_batch.hsx +0 -122
- package/std/settlements/swap.hsx +0 -1114
- package/std/settlements/threshold_pool.hsx +0 -221
- package/std/settlements/weighted_distribution.hsx +0 -141
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { fail } from "./diagnostics.js";
|
|
2
|
+
/** Bounds use UDL units: minor units, basis points and milliseconds. */
|
|
3
|
+
export function tunableBounds(type) {
|
|
4
|
+
const name = type.kind === "call" || type.kind === "type"
|
|
5
|
+
? type.name
|
|
6
|
+
: type.kind === "name"
|
|
7
|
+
? type.value
|
|
8
|
+
: "";
|
|
9
|
+
if (name === "money")
|
|
10
|
+
return { minimum: "0", maximum: "999999999999999999" };
|
|
11
|
+
if (name === "percent")
|
|
12
|
+
return { minimum: 0, maximum: 10000 };
|
|
13
|
+
if (name === "duration")
|
|
14
|
+
return { minimum: 1, maximum: Number.MAX_SAFE_INTEGER };
|
|
15
|
+
if (name !== "integer")
|
|
16
|
+
return;
|
|
17
|
+
if (type.kind === "call") {
|
|
18
|
+
const numbers = type.args.map((arg) => arg.kind === "number" ? Number(arg.value) : NaN);
|
|
19
|
+
if (numbers.length !== 2 ||
|
|
20
|
+
numbers.some((value) => !Number.isSafeInteger(value)) ||
|
|
21
|
+
numbers[0] > numbers[1])
|
|
22
|
+
fail(type, "integer tunable needs ordered safe integer bounds", "write integer(1, 12)");
|
|
23
|
+
return { minimum: numbers[0], maximum: numbers[1] };
|
|
24
|
+
}
|
|
25
|
+
return { minimum: 0, maximum: Number.MAX_SAFE_INTEGER };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=tunables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunables.js","sourceRoot":"","sources":["../../src/tunables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,wEAAwE;AACxE,MAAM,UAAU,aAAa,CAC3B,IAAU;IAEV,MAAM,IAAI,GACR,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;QAC1C,CAAC,CAAC,IAAI,CAAC,IAAI;QACX,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;YACpB,CAAC,CAAC,IAAI,CAAC,KAAK;YACZ,CAAC,CAAC,EAAE,CAAC;IACX,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAC7E,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC9D,IAAI,IAAI,KAAK,UAAU;QACrB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC;IAC1D,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACpC,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAChD,CAAC;QACF,IACE,OAAO,CAAC,MAAM,KAAK,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACrD,OAAO,CAAC,CAAC,CAAE,GAAG,OAAO,CAAC,CAAC,CAAE;YAEzB,IAAI,CACF,IAAI,EACJ,mDAAmD,EACnD,sBAAsB,CACvB,CAAC;QACJ,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAE,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC;AAC1D,CAAC"}
|
package/docs/README.md
CHANGED
|
@@ -1,23 +1,528 @@
|
|
|
1
|
-
# HSX
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
1
|
+
# HSX
|
|
2
|
+
|
|
3
|
+
HSX composes a company's objects, agreements and actions into a typed program.
|
|
4
|
+
A repair approval can change state without moving money. A rental can collect a
|
|
5
|
+
deposit and refund it under declared rules. Headers supply reusable instruments;
|
|
6
|
+
you can also write an instrument with its own fields, lifecycle and actions.
|
|
7
|
+
The compiler emits UDL, the Universal Domain Language contract an executor reads.
|
|
8
|
+
It does not run the business or move money. This release supports SAR only.
|
|
9
|
+
|
|
10
|
+
## First program
|
|
11
|
+
|
|
12
|
+
The package supplies the `hsx` executable. Save this as `lesson.hsx`:
|
|
13
|
+
|
|
14
|
+
```hsx
|
|
15
|
+
program tutoring "Tutoring studio"
|
|
16
|
+
use money
|
|
17
|
+
object lesson "Lesson" {
|
|
18
|
+
fields { student: text }
|
|
19
|
+
columns: [student]
|
|
20
|
+
attach payment = money.transfer {
|
|
21
|
+
payer: owner, payee: operator, amount: 150 SAR
|
|
22
|
+
expose create as book_lesson
|
|
23
|
+
expose pay as pay_for_lesson
|
|
24
|
+
expose cancel as cancel_lesson
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
An object is the business record. An instrument holds an agreement's state and
|
|
30
|
+
money rules. An attachment connects the instrument to an object kind. A tunable
|
|
31
|
+
is a header parameter, such as `amount`, fixed by this program. An exposed action
|
|
32
|
+
is a public name for an instrument action. Exposing it does not grant permission.
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
hsx check lesson.hsx
|
|
36
|
+
hsx build lesson.hsx --out lesson.udl.json
|
|
37
|
+
hsx cost lesson.hsx
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
`check` exits zero without output on success. `build` writes canonical UDL;
|
|
41
|
+
without `--out` it prints to stdout. `cost` prints instruction counts, described
|
|
42
|
+
below. `format` prints formatted source or writes it with `--out`. `headers --json`
|
|
43
|
+
prints the header manifest. These commands have no `--strict` or `--catalog` option.
|
|
44
|
+
Exit 1 means invalid source; exit 2 means a command or file error. Diagnostics name
|
|
45
|
+
the source, line, column, code, problem and suggested fix. UDL validation keeps
|
|
46
|
+
its UDL diagnostic codes; binding errors can have names such as
|
|
47
|
+
`subject_party_unbound`. Read the message and fix, not just the code.
|
|
48
|
+
|
|
49
|
+
At runtime, create a lesson object first, then call `book_lesson` to create its
|
|
50
|
+
agreement. Call `pay_for_lesson` on that agreement to move 150 SAR from its bound
|
|
51
|
+
owner to the operator. Object creation alone creates no agreement. Object
|
|
52
|
+
metadata such as `student` is optional until an action requires it. Account IDs
|
|
53
|
+
and party IDs are not metadata supplied by the caller.
|
|
54
|
+
|
|
55
|
+
## A rental deposit in one hour
|
|
56
|
+
|
|
57
|
+
Open [rental-deposit.hsx](../examples/rental-deposit.hsx). It is a complete source
|
|
58
|
+
file for a business renting equipment from the program operator. Copy it to
|
|
59
|
+
`rental.hsx` and run the same check, build and cost commands against that file.
|
|
60
|
+
No header import is needed because it declares its own instrument.
|
|
61
|
+
|
|
62
|
+
The terms are a 1,000 SAR deposit and a one-time 50 SAR late fee. The supplied
|
|
63
|
+
`dueAt` timestamp is the cutoff: a return before it gets the whole deposit back;
|
|
64
|
+
a return at or after it gets 950 SAR back. The operator receives the other 50 SAR.
|
|
65
|
+
The late fee is not a daily charge and is not `financing.late_charge`, which
|
|
66
|
+
requires a financing plan and an overdue installment.
|
|
67
|
+
|
|
68
|
+
| Step | Public action | Actor and required values | Money effect |
|
|
69
|
+
| ---------------------------- | ----------------------- | ------------------------------------------------------------------------------------- | -------------------------------------------------- |
|
|
70
|
+
| Create the object | Host object creation | Optional `equipment` metadata | None |
|
|
71
|
+
| Agree terms | `agree_rental` | Bound renter; `dueAt`, for example `2027-01-10T12:00:00+03:00`, must be in the future | Creates the agreement's held account |
|
|
72
|
+
| Fund before the cutoff | `pay_deposit` | Bound renter with 1,000 SAR available | Renter pays 1,000 SAR into held |
|
|
73
|
+
| Record an on-time return | `return_equipment` | Operator; `returnReference` metadata | Held pays 1,000 SAR to renter |
|
|
74
|
+
| Or record a late return | `return_equipment_late` | Operator; `returnReference` metadata | Held pays 50 SAR to operator and 950 SAR to renter |
|
|
75
|
+
| Cancel an unfunded agreement | `cancel_rental` | Bound renter, while pending | None |
|
|
76
|
+
|
|
77
|
+
Choose one return action. Both finish the agreement, so the fee and refund cannot
|
|
78
|
+
repeat. The late action calculates the refund from the held balance before either
|
|
79
|
+
move runs. Both paths empty the held account. `returnReference` records the
|
|
80
|
+
operator's return evidence; it does not verify the physical return. Time means
|
|
81
|
+
the executor's current time when the action runs, not a caller-supplied return date.
|
|
82
|
+
A late `due` permits the operator action; it does not schedule that action.
|
|
83
|
+
|
|
84
|
+
This sample binds a declared business named `renter` in Product configuration.
|
|
85
|
+
It uses fixed parties because this compiler rejects parameterized instruments
|
|
86
|
+
inside a program. Changing the renter binding is a Build configuration decision,
|
|
87
|
+
not a different party ID on each request. Use header party parameters bound to
|
|
88
|
+
`owner` or `actor` for per-object participants. Reusable custom headers require a
|
|
89
|
+
host-supplied `StandardLibrary`; `use` cannot load a local file through this CLI.
|
|
90
|
+
|
|
91
|
+
Inspect `objects` in the compiled UDL for the attachment and public names, then
|
|
92
|
+
its instrument for fields, transitions, actors, requirements and ordered moves.
|
|
93
|
+
The `hide deposit.*` lines remove public names from the unattached declaration;
|
|
94
|
+
the attachment exposes its own copy. `money.hold` and `escrow.hold` both refund
|
|
95
|
+
whole amounts, so neither implements this partial-refund policy by itself.
|
|
96
|
+
|
|
97
|
+
A local compile gives you a contract. Executing it needs a host with authenticated
|
|
98
|
+
parties, object actions, funded accounts and a saved Product Build. A Build is the
|
|
99
|
+
frozen contract and configuration used by its agreements. Existing agreements
|
|
100
|
+
keep that Build when the program changes. The package includes no local money
|
|
101
|
+
executor. Compilation cannot establish balances, permissions or provider readiness.
|
|
102
|
+
|
|
103
|
+
## Objects, metadata and parties
|
|
104
|
+
|
|
105
|
+
Every attached party parameter binds to `owner`, `actor`, `operator`, a declared
|
|
106
|
+
business, or a declared staff party with a supported role. Configure declared
|
|
107
|
+
business participants per Build. Declared person parties cannot bind attachments.
|
|
108
|
+
`owner` is the object's resolved customer or business, `actor` is the authenticated
|
|
109
|
+
caller, and `operator` is the program operator. A parameter with one of these
|
|
110
|
+
names binds by name. Other party parameters use a same-named eligible declaration,
|
|
111
|
+
a header default, or an explicit binding. Explicit bindings take precedence.
|
|
112
|
+
Unbound parameters report `subject_party_unbound`. These bindings are frozen in
|
|
113
|
+
UDL `objects[].attachments[].parties`; no caller supplies party IDs at creation.
|
|
114
|
+
|
|
115
|
+
Object `fields` are authored metadata. `columns` names up to eight normalized
|
|
116
|
+
fields. An action's `subject { price: money }` declares its metadata requirement;
|
|
117
|
+
`subject { adapter: verification }` inherits a selected ADL declaration. The
|
|
118
|
+
compiler freezes the adapter identity, digest and requirements. An unavailable
|
|
119
|
+
declaration leaves a null snapshot in compiled output. Product creation and
|
|
120
|
+
recomposition reject unresolved or changed declarations during Build admission.
|
|
121
|
+
Execution checks the frozen declaration too; later adapter unavailability can
|
|
122
|
+
block actions on an already saved Build.
|
|
123
|
+
|
|
124
|
+
An attachment can use `rename { price: salePrice }` to separate requirements with
|
|
125
|
+
different meanings. Matching names must match types and constraints. The compiler
|
|
126
|
+
reports `subject_field_conflict` with both origins, or `subject_field_unknown` for
|
|
127
|
+
unknown rename sources, columns or subject expressions. Action admission reports
|
|
128
|
+
`subject_requirement_missing` or `subject_adapter_unbound` before dispatch.
|
|
129
|
+
|
|
130
|
+
Creation accepts `{}`. Every normalized field, including adapter requirements,
|
|
131
|
+
is optional at creation. Only a named action requires its subject metadata.
|
|
132
|
+
Use `attach` inside the object block to configure its financial instruments.
|
|
133
|
+
|
|
134
|
+
## Headers and tunables
|
|
135
|
+
|
|
136
|
+
The header defines the available policies. The company chooses percentages, amounts, durations,
|
|
137
|
+
parties and typed references. `funds: sale` links the stored records through the
|
|
138
|
+
library's declared reference type. References can name a child, such as
|
|
139
|
+
`receipt: plan.settlement`. A header tunable declared `ref<T>[]` accepts one object or a list of up to 16
|
|
140
|
+
objects of type T. `on: [plan_3, plan_6]` creates one late-charge or collections
|
|
141
|
+
policy. Its references can point into either plan; selections can span both.
|
|
142
|
+
A plain `ref<T>` accepts one object only.
|
|
143
|
+
Tunable constructors are `enum(choices)` and `integer(minimum, maximum)`.
|
|
144
|
+
Other constructors, including `party(business)` and bounded `money(...)`, are
|
|
145
|
+
rejected as tunable types. A default selector such as `payer: party = party(person)`
|
|
146
|
+
is different: its type is plain `party`, and the call chooses a default binding.
|
|
147
|
+
Use explicit `payer: owner` or `payer: actor` bindings when the participant comes
|
|
148
|
+
from the object or session.
|
|
149
|
+
Imports are `use header`; there are no file imports, macros or executable strings.
|
|
150
|
+
|
|
151
|
+
## Values and money
|
|
152
|
+
|
|
153
|
+
Amounts use `750 SAR`; percentages use `2.5%`; durations use `48h`, `3d`, or `1w`.
|
|
154
|
+
Dates use `2026-11-28` or a timestamp with an explicit offset. Money has at most two
|
|
155
|
+
decimal places and percentages at most two. The compiler uses integer minor units
|
|
156
|
+
and basis points. Fee and tax calculations round down. Split percentages sum to
|
|
157
|
+
100%; the last declared recipient receives the rounding remainder. Finite
|
|
158
|
+
schedules use positions 1 through n and put the division remainder in position 1.
|
|
159
|
+
Tax binds `programTax`. Fees default to `programOperator`. Fine, recovery and
|
|
160
|
+
residual destinations are party tunables.
|
|
161
|
+
|
|
162
|
+
Attached actions are private unless the attachment exposes them with
|
|
163
|
+
`expose fund as sell`. Exposure grants no authority. Clock and parent actions
|
|
164
|
+
remain executor-owned. Instruments have no standalone create route: an
|
|
165
|
+
attachment exposes its create action by name (`expose create as finance`) or
|
|
166
|
+
keeps it internal. Callers create objects and run their attached actions.
|
|
167
|
+
|
|
168
|
+
Accounts use cash or claim books. A move stays in one book. `account of buyer`
|
|
169
|
+
aliases the default cash account; `account of self` provisions an owned account.
|
|
170
|
+
`account(lender, cash, "capital")` binds a named account.
|
|
171
|
+
`account(adapter(insurer), cash, "premium")` binds the account of the provider
|
|
172
|
+
selected by `insurer`. Declare that binding with `subject { adapter: insurer }`
|
|
173
|
+
in an action of the same instrument. A text tunable may supply its binding name.
|
|
174
|
+
The agreement retains the provider identity; aliases for that provider share the
|
|
175
|
+
same book and key within the Product. Providers remain outside parties.
|
|
176
|
+
A missing binding refuses before money moves. Reference paths such as
|
|
177
|
+
`self.cover.insurer` use the referenced agreement's account.
|
|
178
|
+
|
|
179
|
+
`account(buyer, claim, contra, "debt")` declares the borrower's claim contra account.
|
|
180
|
+
Provider confirmation belongs on a reserved move with `boundary adapter`,
|
|
181
|
+
followed by instruction-bound evidence and a post or void.
|
|
182
|
+
Outstanding debt is an account balance. The library pairs cash repayment with
|
|
183
|
+
claim reduction and represents receipts as immutable child records. Cash and loss
|
|
184
|
+
shares round down; the declared residual account receives leftover minor units.
|
|
185
|
+
|
|
186
|
+
Money moves require a positive amount by default. An action may declare
|
|
187
|
+
`allowZero: true` when a calculated piece can be zero, such as an exhausted
|
|
188
|
+
repayment slice, a floored fee or a rounding remainder. A zero create move in
|
|
189
|
+
that action posts no transfer and captures no receipt. The permission belongs
|
|
190
|
+
to that action only and does not pass to invoked actions. Reserve, post and
|
|
191
|
+
void still require real reservation receipts. Keep a positive requirement on
|
|
192
|
+
an authored total when only its calculated pieces may be zero.
|
|
193
|
+
|
|
194
|
+
```hsx
|
|
195
|
+
action collect {
|
|
196
|
+
from: pending, to: paid
|
|
197
|
+
allowZero: true
|
|
198
|
+
moves self.calculatedPiece from payer to payee
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
The four transfer instructions are create, reserve, post and void under
|
|
203
|
+
`internal_transfer`. A captured transfer exposes reserved, posted, settled,
|
|
204
|
+
reversed or voided status. Voided means a released reservation. Settled means
|
|
205
|
+
provider confirmation, not an internal account balance change.
|
|
206
|
+
|
|
207
|
+
## Authored instruments and actions
|
|
208
|
+
|
|
209
|
+
An action is the business instruction: its actor, state, requirements and effects
|
|
210
|
+
define when it is valid. The executor still checks those conditions on each call.
|
|
211
|
+
The four transfer instructions below that action are its money effects. There is
|
|
212
|
+
no general-purpose `instruction` declaration; `instruction` in an evidence clause
|
|
213
|
+
binds external evidence to a captured boundary instruction.
|
|
214
|
+
|
|
215
|
+
For a new record type, declare `instrument name { fields { ... } lifecycle { ... }
|
|
216
|
+
action create { ... } }`. Fields are `money`, `account of buyer`, `ref<order>`,
|
|
217
|
+
`date`, `duration`, `text`, `integer`, `percent`, `boolean`, `enum(a, b)` or
|
|
218
|
+
`list(date, 12)`. `?` makes a plain type or `ref<T>` optional. Call types such as
|
|
219
|
+
`list(date, 12)` do not accept `?`. `= value` fixes a constant or a typed
|
|
220
|
+
calculation. Actions declare `input { reason: text }`. Headers and expert records
|
|
221
|
+
write ordered requirements and moves as expressions:
|
|
222
|
+
|
|
223
|
+
```hsx
|
|
224
|
+
requires self.payer == self.order.buyer
|
|
225
|
+
requires self.order in [placed]
|
|
226
|
+
moves self.price from payer to self.held
|
|
227
|
+
moves self.price from self.held to payee fee fee
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
Comparisons accept `==`, `!=`, `<`, `<=`, `>` and `>=`. A path beginning with
|
|
231
|
+
`self`, `input`, `party` or `subject` is a field operand; a quoted string, amount or number is
|
|
232
|
+
a literal. `requires unique "order" on [self.order]` fixes an identity namespace.
|
|
233
|
+
`requires count of { instrument: child, reference: "parent", anchor: self.id,
|
|
234
|
+
states: [pending], limit: 12 } == 12` checks a typed selection; `sum "amount" of`
|
|
235
|
+
uses the same selection syntax. `invariants` accepts these requirement expressions.
|
|
236
|
+
`requires hours self.now between 8 and 20 timezone "Asia/Riyadh"` checks local hours.
|
|
237
|
+
`requires evidence self.payer family registry check ownership result verified
|
|
238
|
+
maxAge 1d` requires a recent completed provider check.
|
|
239
|
+
|
|
240
|
+
`moves reserve amount from payer to payee capture receipt` reserves a transfer;
|
|
241
|
+
`moves post self.receipt` posts it and `moves void self.receipt` releases it.
|
|
242
|
+
`moves amount from payer shares shares` expands a declared split. Optional `fee`,
|
|
243
|
+
`capture`, `key` and `boundary` modifiers describe a move. `boundary` applies
|
|
244
|
+
only to reservations. Fees settle with create moves, never reservations. Repeated clauses keep
|
|
245
|
+
their declaration order. The JSON-like clause form remains accepted and lowers
|
|
246
|
+
to the same [UDL clauses](https://github.com/hyperscale0/hyperscale-udl/blob/main/spec/README.md).
|
|
247
|
+
Use `economics { purpose: earning, sourceParty: merchant }` on a move to
|
|
248
|
+
classify posted money. Other purposes are `principal`, `participant_payout`,
|
|
249
|
+
`internal`, `prepaid_credit`, and `pass_through`. `reversalOf: self.originalTransfer` links a
|
|
250
|
+
reversal. The source party must own the source account, except when an earning
|
|
251
|
+
releases the retained payer’s money from an agreement-bound instrument account
|
|
252
|
+
to a company account outside the agreement. A reservation passes its economics
|
|
253
|
+
to its post. Fee shorthand accepts separate economics for each expanded leg.
|
|
254
|
+
They cannot add kernel instructions. `at(list, position)` reads a dated list;
|
|
255
|
+
`aggregate(selection, "amount")` sums selected money; `ratio(amount, weight, total)`
|
|
256
|
+
floors a weighted share. `records` declares child types. `invoke` can create a child
|
|
257
|
+
with typed input in the same transaction.
|
|
258
|
+
|
|
259
|
+
The compiler removes branches excluded by fixed enum tunables. An invalid program reports its source line
|
|
260
|
+
and a correction. No artifact is returned with diagnostics.
|
|
261
|
+
|
|
262
|
+
## Financing policies
|
|
263
|
+
|
|
264
|
+
`financing.installments` keeps principal and fixed flat profit as claims from
|
|
265
|
+
activation. The company chooses where funding goes and when profit becomes earned.
|
|
266
|
+
All choices use accounts, calculations and moves in the same two books.
|
|
267
|
+
|
|
268
|
+
| Tunable | Default | Selected behavior |
|
|
269
|
+
| ---------------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
270
|
+
| `disburse_to` | `funds` | `funds` pays down payment and principal into the hold and confirms it. `borrower` credits principal to the borrower's balance. |
|
|
271
|
+
| `profit_earned` | `on_payment` | `on_payment` collects unearned profit on payment. `by_schedule` moves unearned claims to earned claims at each slice's date. `at_disbursement` makes that move at activation. Cash arrives only on payment. |
|
|
272
|
+
| `apply` | `fines_profit_principal` | Visit each slice in position order; within that slice collect assessed fines by overdue date, evidenced costs, profit, then principal. `principal_profit` collects each slice in position order, principal before profit. `pro_rata` uses the slice's fixed principal:profit ratio, caps each side by its collectible balance, and assigns the remainder without stranding cash. |
|
|
273
|
+
| `payoff_rebate` | `100%` | Reverse this share of unearned profit to borrower debt. Collect the remainder and all earned profit with outstanding principal. |
|
|
274
|
+
| `late_charge.fines_to` | `programOperator` | Receive fine cash and fund its refunds. |
|
|
275
|
+
| `late_charge.costs_to` | `programOperator` | Receive evidenced recovery cash and fund its refunds. |
|
|
276
|
+
| `collections.case.fee` | `20%` | After payment succeeds, transfer this share of the payment amount from plan capital to the agency. |
|
|
277
|
+
| `lending.distribution.residual_to` | `programOperator` | Receive the cash remainder and own the claim loss remainder after weighted distribution. |
|
|
278
|
+
|
|
279
|
+
Each slice owns separate unearned and earned claim accounts. Scheduled recognition
|
|
280
|
+
uses a dated child record so a partial payment cannot disable the maturity clock.
|
|
281
|
+
A normal payment collects only earned profit for the schedule and disbursement
|
|
282
|
+
choices; payoff can also collect non-rebated unearned profit. Partial fines and
|
|
283
|
+
costs stay assessed until their receivable reaches zero. Immutable receipts let
|
|
284
|
+
a refund restore only what that payment collected. The plan's payment receipt
|
|
285
|
+
records actual principal and profit after all ordered collections finish.
|
|
286
|
+
Write-off moves principal and earned profit claims to loss and reverses unearned
|
|
287
|
+
profit to debt. `write_off_after` sets how long a slice must be overdue before a capital-authorized
|
|
288
|
+
write-off request can apply. There is no provision policy.
|
|
289
|
+
|
|
290
|
+
## Header branches and bounds
|
|
291
|
+
|
|
292
|
+
A header may select action clauses at compile time:
|
|
293
|
+
|
|
294
|
+
```hsx
|
|
295
|
+
when disburse_to is borrower {
|
|
296
|
+
moves self.principal from self.capital to self.borrower
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
`when <reference tunable> has <field>` includes its clauses only when the bound
|
|
301
|
+
object declares that field. The compiler checks the object's declared shape,
|
|
302
|
+
regardless of declaration order, and emits no runtime branch.
|
|
303
|
+
|
|
304
|
+
`when <enum tunable> is <value>` accepts requirements, calculations, moves and
|
|
305
|
+
invocations, including nested branches. The compiler emits only the selected
|
|
306
|
+
clauses and preserves their order within each UDL phase. Lifecycle and actor
|
|
307
|
+
clauses stay outside branches. Calculations and requirements run before moves;
|
|
308
|
+
invocations run after moves. A collections fee therefore uses an internal action
|
|
309
|
+
invoked after payment. Clock and parent actions have no public API name.
|
|
310
|
+
|
|
311
|
+
`integer(1, 366)` declares an inclusive tunable bound. The compiler-owned manifest
|
|
312
|
+
publishes enum values, numeric minima and maxima, and cross-tunable constraints.
|
|
313
|
+
Bounds use minor units for money, basis points for percentages and milliseconds
|
|
314
|
+
for durations. Money spans 0 through 999999999999999999 minor units; percentages
|
|
315
|
+
span 0 through 10000 basis points. Durations start at 1 millisecond. Integers
|
|
316
|
+
default to 0 through 9007199254740991 unless their declaration narrows the range. For example, `constraints { contact_from: less_than(contact_until) }`
|
|
317
|
+
requires a valid hours interval. `at_most` and `greater_than` are also supported.
|
|
318
|
+
A refusal names the tunable. Empty `all(type)` selections lower to zero aggregates
|
|
319
|
+
or no invocations, so a plan does not require a late-charge object.
|
|
320
|
+
|
|
321
|
+
Headers can declare conditional bindings and parameter policy diagnostics:
|
|
322
|
+
|
|
323
|
+
```hsx
|
|
324
|
+
dependencies {
|
|
325
|
+
funds {
|
|
326
|
+
selector: destination, is: held
|
|
327
|
+
message: "Attachment `{attachment}` needs a funds binding."
|
|
328
|
+
fix: "Bind funds to a hold attachment."
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
parameterDiagnostics {
|
|
332
|
+
amount {
|
|
333
|
+
accepts: "a fixed amount"
|
|
334
|
+
percentage: "a percentage-based charge"
|
|
335
|
+
fix: "Author a rate calculation when the policy varies with a base amount."
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
Each dependency names a declared tunable, an enum selector and one of its choices.
|
|
341
|
+
The compiler checks selected dependencies before lowering and the manifest retains
|
|
342
|
+
them. `{attachment}` in the message expands to the authored attachment name.
|
|
343
|
+
Parameter diagnostics name a declared tunable and explain its accepted value,
|
|
344
|
+
unsupported percentage semantics and repair. They do not change the tunable type.
|
|
345
|
+
UDL refusals retain their UDL codes. A terminal-money refusal includes the owned
|
|
346
|
+
account and the prover's action path in related diagnostic information.
|
|
347
|
+
|
|
348
|
+
## Instruction cost
|
|
349
|
+
|
|
350
|
+
`hsx cost company.hsx` reports `transfers`, `accounts` and `invocations` per
|
|
351
|
+
instrument action after lowering. Transfers count declared move instructions,
|
|
352
|
+
including reserve, post and void. Accounts count self-owned accounts created by
|
|
353
|
+
`create`, not every party account. Bounded invocations include child costs up to
|
|
354
|
+
the selection limit, so a count is an upper bound rather than observed usage.
|
|
355
|
+
Zero-valued moves can cost fewer actual transfers than their static count.
|
|
356
|
+
|
|
357
|
+
The rental attachment's create declares one owned account, fund declares one
|
|
358
|
+
transfer, on-time return one, and late return two. These are counts, not SAR
|
|
359
|
+
prices. The executor's tariff supplies commercial prices and actual usage.
|
|
360
|
+
|
|
361
|
+
The compiler API is `compile(source)`. On success, `result.verdict` is `valid`
|
|
362
|
+
and `result.artifacts` contains `document`, `costManifest` and `originMap`.
|
|
363
|
+
On refusal, inspect `result.diagnostics`; no artifact is returned.
|
|
364
|
+
|
|
365
|
+
`hsx headers` prints the instrument inventory from the declarations. The
|
|
366
|
+
[object example](../examples/library.hsx) shows authenticated role bindings.
|
|
367
|
+
The [playground](../playground/index.html) compiles locally in the browser.
|
|
368
|
+
|
|
369
|
+
## Standard-library behavior
|
|
370
|
+
|
|
371
|
+
Read the instrument's states, time gates and moves before promising a money
|
|
372
|
+
outcome. A compiler pass does not prove that required actions are exposed,
|
|
373
|
+
adapters are bound, participants have funds, or the flow can finish.
|
|
374
|
+
|
|
375
|
+
| Instrument | Behavior |
|
|
376
|
+
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
377
|
+
| `financing.installments` | `share` allocates collected profit to a cash payable owned by `capital`. It does not itself pay operator income. |
|
|
378
|
+
| `financing.limits` | `per_borrower` caps outstanding principal. Both borrower and portfolio limits must be approved before disbursement; attaching them does not approve them. |
|
|
379
|
+
| `lending.round` | The target is the linked plan's principal. Closing requires commitments and held funds to equal that amount. |
|
|
380
|
+
| `lending.distribution` | Cash distribution needs an eligible recorded settlement, `prepare_cash`, one share record per funded commitment, then `distribute_cash`. Attaching it moves nothing. |
|
|
381
|
+
| `insurance.cover.slice` | `collect` credits premium net of commission to the insurer account. The tenant retains commission. `refund` returns both portions; claims reserve insurer funds. External settlement uses the boundary protocol. |
|
|
382
|
+
| `financing.installments`, `savings.circle` | Supply explicit date lists when creating agreements. A term count does not generate a monthly calendar. Savings supports at most 60 distinct member seats. |
|
|
383
|
+
| `escrow.hold` | `fund` takes the whole price. Financing into pending escrow collects the remaining down payment and adds capital principal at disbursement; `fund` is not a down-payment checkout. |
|
|
384
|
+
| `escrow.hold` | Acceptance timeout enters `disputed` without paying the seller. Delivery and return verification belong to `payee`; rebinding it also changes who receives accepted funds. |
|
|
385
|
+
| `financing.late_charge` | `fine` is a fixed money amount, not a percentage of overdue principal. |
|
|
386
|
+
| `cards.card` | `spend_limit` is a per-authorization ceiling, not a monthly aggregate. |
|
|
387
|
+
|
|
388
|
+
A seller-owned marketplace object can declare `entryActions: [create_order]`
|
|
389
|
+
when `create_order` exposes an attachment's create action with its buyer bound
|
|
390
|
+
to `actor`. This admits active enrolled customers to that action. The default
|
|
391
|
+
is closed. A retained buyer can read the record and run its buyer actions;
|
|
392
|
+
the seller remains owner. Entry never grants access to an existing escrow.
|
|
393
|
+
|
|
394
|
+
`financing.limits` and `financing.portfolio_limit` declare `scope: product`.
|
|
395
|
+
Create and approve the portfolio limit once per Product and the borrower limit
|
|
396
|
+
once per borrower. Plans on later records resolve those shared references.
|
|
397
|
+
Ordinary references remain on the current record; shared references must match
|
|
398
|
+
the bound party accounts. The aggregate caps still apply across all plans.
|
|
399
|
+
|
|
400
|
+
`programTax` transfers use an operator-owned cash account keyed `programTax`.
|
|
401
|
+
The account primitive creates it automatically and shares it across the Product.
|
|
402
|
+
Zero-tax escrow releases need no additional party setup.
|
|
403
|
+
|
|
404
|
+
The financing, collections and lending samples expose payment creation, payment,
|
|
405
|
+
refund and payoff quotes through the object's existing action routes. A child
|
|
406
|
+
alias names the full attachment path, for example:
|
|
407
|
+
|
|
408
|
+
```hsx
|
|
409
|
+
expose enrolment.tuition.payment.create as create_payment
|
|
410
|
+
expose enrolment.tuition.payment.pay as pay_instalment
|
|
411
|
+
expose enrolment.tuition.payoff_quote.create as request_payoff_quote
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
Read the parent object's actions and follow pagination to discover child actions.
|
|
415
|
+
Use the returned target, Build, digest and object revision when executing. Creation
|
|
416
|
+
targets the child attachment; later actions target the child's instance ID on the
|
|
417
|
+
same object. The caller must satisfy the header's actor rule. Parties bind from
|
|
418
|
+
the session and object ownership. Retry the same request with the same
|
|
419
|
+
Idempotency-Key to retrieve its result without moving money again.
|
|
420
|
+
|
|
421
|
+
Supply payment amount and identity at creation. Pass the quote instance as the
|
|
422
|
+
parent payoff's `quote` input. For a late charge on a multi-instalment plan, select
|
|
423
|
+
the overdue child with the creation input `slice`. Repayment uses the declared
|
|
424
|
+
allocation order and payoff rebate; aliases do not change those terms.
|
|
425
|
+
|
|
426
|
+
The [lending sample](../examples/lending.hsx) also exposes share creation. Callers
|
|
427
|
+
still need dates, agreement inputs, funded wallets and eligible settlements.
|
|
428
|
+
References without an explicit creation input require one matching agreement on
|
|
429
|
+
the object. In particular, lending distributions with multiple settlements or
|
|
430
|
+
commitments need authored selectors before callers can choose among them.
|
|
431
|
+
Insurance needs premium-slice records and actions. Savings needs dated
|
|
432
|
+
contribution records. Read each header's creation and lifecycle requirements.
|
|
433
|
+
|
|
434
|
+
## Checkout and reversals
|
|
435
|
+
|
|
436
|
+
For financed checkout, expose `installments.collect_down_payment` after `create`
|
|
437
|
+
and `sign`. It credits the linked pending escrow with the missing down payment.
|
|
438
|
+
It does not disburse principal or activate the plan. The later `disburse` action
|
|
439
|
+
uses that credit before collecting any remainder. Borrower-directed financing
|
|
440
|
+
has no checkout collection action. The plan and escrow must agree on payer and
|
|
441
|
+
price.
|
|
442
|
+
|
|
443
|
+
Expose escrow `cancel` to return money credited before full funding. Plan `void`
|
|
444
|
+
cancels the signed financing agreement but does not cancel its escrow. After
|
|
445
|
+
funding and delivery, the default return path needs three separate aliases for
|
|
446
|
+
`dispute`, `verify_return` and `refund`. The payee supplies return evidence and
|
|
447
|
+
returns the full price to the payer. `accept` pays the payee instead.
|
|
448
|
+
Marketplace order fulfillment alone does not execute any of these money actions.
|
|
449
|
+
|
|
450
|
+
Expose `late_charge.create` to create an assessment with matching plan, slice
|
|
451
|
+
and borrower. Only that existing assessment can reach clock-owned `assess` after
|
|
452
|
+
grace. A payment can collect part of a fine without settling the rest. A recovery
|
|
453
|
+
cost assessment is a separate record.
|
|
454
|
+
|
|
455
|
+
## Separate payments and states
|
|
456
|
+
|
|
457
|
+
Bind `insurance.cover.broker` to the agency that receives commission. Collection
|
|
458
|
+
pays the insurer's net premium and the broker's commission as two moves. Refunds
|
|
459
|
+
reverse those same portions. The default broker is the program operator.
|
|
460
|
+
`claim.deny` accepts only `submitted`; after approval, `pay` or expiry consumes
|
|
461
|
+
the reservation.
|
|
462
|
+
|
|
463
|
+
A booking cancellation refunds only its own held cash. Expose `cover.cancel`
|
|
464
|
+
separately for eligible premium refunds before the paid period starts. Active
|
|
465
|
+
and expired premium periods are excluded. A card transaction needs a captured
|
|
466
|
+
authorization and its own record before refund, but no authorization-expiry wait.
|
|
467
|
+
|
|
468
|
+
A savings membership becomes `received` after its pot payout. Its contribution
|
|
469
|
+
records become `paid` independently. Future contributions can remain pending
|
|
470
|
+
after the member receives the pot; paying a contribution does not advance their
|
|
471
|
+
payout seat. Late contributions remain eligible while the membership is
|
|
472
|
+
`active` or `received` and the circle is `active`. These guards do not promise
|
|
473
|
+
scheduler retries or permit a payout larger than the available cash.
|
|
474
|
+
|
|
475
|
+
## Posted economics in the money flows
|
|
476
|
+
|
|
477
|
+
An attachment can declare the purpose of an imported action's money:
|
|
478
|
+
|
|
479
|
+
```hsx
|
|
480
|
+
attach visit = wallet.spend {
|
|
481
|
+
wallet: balance, payee: operator
|
|
482
|
+
economics pay { purpose: earning, sourceParty: owner }
|
|
483
|
+
expose pay as charge_visit
|
|
484
|
+
}
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
Name the original action, before its public alias. If it has several moves,
|
|
488
|
+
select a move key, for example `economics pay.move1 { ... }`. The compiler
|
|
489
|
+
refuses an unknown action or move, a repeated selection, a void, or economics
|
|
490
|
+
that conflict with the instrument or its reservation. Cash purposes require
|
|
491
|
+
cash accounts. `sourceParty` resolves a party parameter, a subject role or a
|
|
492
|
+
declared business. The attachment retains this binding even when only economics
|
|
493
|
+
uses it. The credited account supplies the destination participant.
|
|
494
|
+
|
|
495
|
+
The compiler writes the declaration into that attachment's UDL move. Imported
|
|
496
|
+
instruments stay generic. New Builds carry the purpose; existing agreements
|
|
497
|
+
and postings keep their retained Build and classification.
|
|
498
|
+
|
|
499
|
+
Held customer funding and its unspent return are `principal`. A release for the
|
|
500
|
+
company's sale is `earning`. A payment from company cash to another participant
|
|
501
|
+
is `participant_payout`. Claims, waivers, write-offs and own-account allocations
|
|
502
|
+
are `internal`; prepaid balance topups and returns are `prepaid_credit`. Tax is
|
|
503
|
+
`pass_through`, excluded from earnings and costs. Unpaid claims count as neither.
|
|
504
|
+
Refunds of paid profit, company charges and commission capture the original
|
|
505
|
+
transfer and use `reversalOf`, so refunds reduce the original purpose.
|
|
506
|
+
|
|
507
|
+
Fee shorthand accepts separate move economics: `economics { payee: { purpose:
|
|
508
|
+
earning, sourceParty: payer }, fee: { purpose: earning, sourceParty: payer },
|
|
509
|
+
tax: { purpose: pass_through, sourceParty: payer } }`. These describe authored
|
|
510
|
+
product fees. Automatic platform fees keep their commercial classification.
|
|
511
|
+
|
|
512
|
+
A move's economics block can select by a resolved party: `economics { recipient:
|
|
513
|
+
recipient, company: { purpose: earning, sourceParty: payer }, participant:
|
|
514
|
+
{ purpose: participant_payout, sourceParty: programOperator } }`. The compiler
|
|
515
|
+
chooses `company` for `operator`, `programOperator`, or a declared party with the
|
|
516
|
+
`program_operator` role; it chooses `participant` for other bound parties.
|
|
517
|
+
Both branches must be supplied. A branch may be `unclassified` when no purpose
|
|
518
|
+
is established. Outside financing-profit and recovery recipients refund directly
|
|
519
|
+
to the customer, not the company that funded the payout; those refund branches
|
|
520
|
+
remain unclassified because they cannot reverse that company payout. Std
|
|
521
|
+
recovery charges use this rule to avoid counting company receipts as participant
|
|
522
|
+
costs. Direct customer payments to
|
|
523
|
+
outside recipients are pass-through; payments from held company cash are costs.
|
|
524
|
+
|
|
525
|
+
Generic transfers and mixed principal/profit distributions remain unclassified
|
|
526
|
+
when their structure does not establish a purpose. Adapter-owned premium and
|
|
527
|
+
claim accounts and credit-line advances also lack an authored source party.
|
|
528
|
+
Their reports remain incomplete rather than guessing a company earning or cost.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="446.72" height="112" viewBox="0 0 446.72 112" color="#ffffff" fill="#ffffff" role="img" aria-label="Hyperscale HSX horizontal lockup"><g transform="translate(24 24) scale(2)" fill="none" stroke="#ffffff" stroke-width="0.8200000000000001" stroke-linecap="round" stroke-linejoin="round"><path d="M16 3.5L28.5 9.75V22.25L16 28.5L3.5 22.25V9.75Z"/><path d="M3.5 9.75L16 16L28.5 9.75"/><path d="M16 16V28.5"/><path d="M16 5L24 9V17L16 21L8 17V9Z"/><path d="M8 9L16 13L24 9"/><path d="M16 13V21"/><path d="M16 7L20 9V13L16 15L12 13V9Z"/><path d="M12 9L16 11L20 9"/><path d="M16 11V15"/></g><g transform="translate(104 68)"><path transform="translate(0 0) scale(0.032 -0.032)" d="M91 0V707H148V372H578V707H635V0H578V321H148V0Z"/><path transform="translate(24.992 0) scale(0.032 -0.032)" d="M269 0V266L18 707H86L298 324L510 707H575L326 267V0Z"/><path transform="translate(45.728 0) scale(0.032 -0.032)" d="M91 0V707H329Q406 707 460.5 682.5Q515 658 544.0 607.0Q573 556 573 477Q573 399 538.5 347.5Q504 296 444.5 270.0Q385 244 310 244H148V0ZM148 295H307Q400 295 457.0 339.5Q514 384 514 481Q514 573 464.0 614.0Q414 655 324 655H148Z"/><path transform="translate(67.52 0) scale(0.032 -0.032)" d="M91 0V707H553V655H148V377H512V325H148V52H553V0Z"/><path transform="translate(88.64 0) scale(0.032 -0.032)" d="M91 0V707H351Q407 707 452.5 695.5Q498 684 530.5 659.0Q563 634 580.5 592.5Q598 551 598 492Q598 437 578.0 396.0Q558 355 520.0 328.0Q482 301 430 289L584 0H521L371 279H148V0ZM148 330H323Q365 330 404.0 336.5Q443 343 473.5 361.0Q504 379 521.5 411.5Q539 444 539 495Q540 557 514.5 592.0Q489 627 444.5 641.0Q400 655 341 655H148Z"/><path transform="translate(111.36 0) scale(0.032 -0.032)" d="M337 -8Q276 -8 219.5 8.0Q163 24 121.0 61.5Q79 99 61 161H123Q142 117 176.0 91.0Q210 65 252.5 53.5Q295 42 337 42Q384 42 427.0 56.5Q470 71 497.0 101.0Q524 131 524 180Q524 219 508.5 243.0Q493 267 466.5 281.5Q440 296 405 306Q379 314 352.0 320.5Q325 327 299.5 334.0Q274 341 251 349Q220 358 189.5 371.0Q159 384 135.5 404.0Q112 424 97.5 453.0Q83 482 83 524Q83 567 96.0 599.0Q109 631 133.0 653.0Q157 675 188.0 688.5Q219 702 254.5 708.5Q290 715 327 715Q384 715 433.5 699.0Q483 683 518.0 647.0Q553 611 562 550H504Q494 593 466.5 618.0Q439 643 402.0 654.0Q365 665 326 665Q295 665 263.0 658.5Q231 652 204.0 637.0Q177 622 160.0 596.5Q143 571 143 532Q143 493 159.5 468.0Q176 443 202.5 428.0Q229 413 262 402Q306 388 353.0 377.5Q400 367 442 353Q472 344 498.0 329.5Q524 315 543.0 295.0Q562 275 573.0 249.5Q584 224 584 192Q584 137 563.5 99.0Q543 61 508.0 37.0Q473 13 429.0 2.5Q385 -8 337 -8Z"/><path transform="translate(133.792 0) scale(0.032 -0.032)" d="M375 -8Q265 -8 193.5 39.0Q122 86 87.0 167.5Q52 249 52 353Q52 456 87.5 537.5Q123 619 195.5 667.0Q268 715 378 715Q442 715 495.5 696.0Q549 677 586.5 640.0Q624 603 642 546H583Q559 605 504.5 635.0Q450 665 379 665Q286 665 226.5 622.0Q167 579 138.5 509.0Q110 439 110 355Q110 271 138.0 199.5Q166 128 225.5 85.0Q285 42 377 42Q423 42 466.0 55.0Q509 68 542.0 95.0Q575 122 590 161H655Q635 106 593.5 68.0Q552 30 496.0 11.0Q440 -8 375 -8Z"/><path transform="translate(157.984 0) scale(0.032 -0.032)" d="M14 0 287 707H360L635 0H571L509 159H138L77 0ZM157 210H490L324 648Z"/><path transform="translate(180.512 0) scale(0.032 -0.032)" d="M91 0V707H148V52H553V0Z"/><path transform="translate(200.512 0) scale(0.032 -0.032)" d="M91 0V707H553V655H148V377H512V325H148V52H553V0Z"/><path transform="translate(222.432 -7.68) scale(0.024 -0.024)" d="M318 445V707H414L466 592L518 707H613V445H550V643L484 499H447L381 643V445ZM144 445V648H59V707H294V648H208V445Z"/><g transform="translate(254.56 0)"><path transform="translate(0 0) scale(0.032 -0.032)" d="M83 0V707H189V396H543V707H649V0H543V299H189V0Z"/><path transform="translate(23.424 0) scale(0.032 -0.032)" d="M342 -8Q273 -8 212.0 12.0Q151 32 109.0 77.0Q67 122 53 196H162Q175 154 204.0 130.5Q233 107 271.5 98.0Q310 89 349 89Q386 89 418.5 99.0Q451 109 472.0 132.0Q493 155 493 192Q493 220 482.0 238.0Q471 256 451.5 267.5Q432 279 405 286Q374 296 338.5 303.0Q303 310 268.5 319.0Q234 328 204 342Q179 352 155.5 366.5Q132 381 115.0 401.5Q98 422 87.5 450.0Q77 478 77 514Q77 562 92.5 596.0Q108 630 133.5 653.0Q159 676 192.5 689.5Q226 703 263.0 709.0Q300 715 335 715Q399 715 453.0 695.0Q507 675 542.5 631.5Q578 588 581 517H478Q474 555 452.5 577.5Q431 600 399.0 609.5Q367 619 331 619Q305 619 279.0 614.5Q253 610 231.5 598.5Q210 587 197.5 568.0Q185 549 185 521Q185 497 195.0 478.5Q205 460 223.5 447.5Q242 435 265 426Q307 410 357.0 401.5Q407 393 451 378Q483 368 511.0 353.5Q539 339 559.0 318.5Q579 298 590.0 270.5Q601 243 601 207Q601 148 580.0 106.5Q559 65 523.0 40.0Q487 15 440.0 3.5Q393 -8 342 -8Z"/><path transform="translate(44.384 0) scale(0.032 -0.032)" d="M11 0 243 353 18 707H147L310 437L473 707H599L375 356L607 0H479L308 271L134 0Z"/></g></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="446.72" height="112" viewBox="0 0 446.72 112" color="#2d4bf2" fill="#171717" role="img" aria-label="Hyperscale HSX horizontal lockup"><g transform="translate(24 24) scale(2)" fill="none" stroke="#2d4bf2" stroke-width="0.8200000000000001" stroke-linecap="round" stroke-linejoin="round"><path d="M16 3.5L28.5 9.75V22.25L16 28.5L3.5 22.25V9.75Z"/><path d="M3.5 9.75L16 16L28.5 9.75"/><path d="M16 16V28.5"/><path d="M16 5L24 9V17L16 21L8 17V9Z"/><path d="M8 9L16 13L24 9"/><path d="M16 13V21"/><path d="M16 7L20 9V13L16 15L12 13V9Z"/><path d="M12 9L16 11L20 9"/><path d="M16 11V15"/></g><g transform="translate(104 68)"><path transform="translate(0 0) scale(0.032 -0.032)" d="M91 0V707H148V372H578V707H635V0H578V321H148V0Z"/><path transform="translate(24.992 0) scale(0.032 -0.032)" d="M269 0V266L18 707H86L298 324L510 707H575L326 267V0Z"/><path transform="translate(45.728 0) scale(0.032 -0.032)" d="M91 0V707H329Q406 707 460.5 682.5Q515 658 544.0 607.0Q573 556 573 477Q573 399 538.5 347.5Q504 296 444.5 270.0Q385 244 310 244H148V0ZM148 295H307Q400 295 457.0 339.5Q514 384 514 481Q514 573 464.0 614.0Q414 655 324 655H148Z"/><path transform="translate(67.52 0) scale(0.032 -0.032)" d="M91 0V707H553V655H148V377H512V325H148V52H553V0Z"/><path transform="translate(88.64 0) scale(0.032 -0.032)" d="M91 0V707H351Q407 707 452.5 695.5Q498 684 530.5 659.0Q563 634 580.5 592.5Q598 551 598 492Q598 437 578.0 396.0Q558 355 520.0 328.0Q482 301 430 289L584 0H521L371 279H148V0ZM148 330H323Q365 330 404.0 336.5Q443 343 473.5 361.0Q504 379 521.5 411.5Q539 444 539 495Q540 557 514.5 592.0Q489 627 444.5 641.0Q400 655 341 655H148Z"/><path transform="translate(111.36 0) scale(0.032 -0.032)" d="M337 -8Q276 -8 219.5 8.0Q163 24 121.0 61.5Q79 99 61 161H123Q142 117 176.0 91.0Q210 65 252.5 53.5Q295 42 337 42Q384 42 427.0 56.5Q470 71 497.0 101.0Q524 131 524 180Q524 219 508.5 243.0Q493 267 466.5 281.5Q440 296 405 306Q379 314 352.0 320.5Q325 327 299.5 334.0Q274 341 251 349Q220 358 189.5 371.0Q159 384 135.5 404.0Q112 424 97.5 453.0Q83 482 83 524Q83 567 96.0 599.0Q109 631 133.0 653.0Q157 675 188.0 688.5Q219 702 254.5 708.5Q290 715 327 715Q384 715 433.5 699.0Q483 683 518.0 647.0Q553 611 562 550H504Q494 593 466.5 618.0Q439 643 402.0 654.0Q365 665 326 665Q295 665 263.0 658.5Q231 652 204.0 637.0Q177 622 160.0 596.5Q143 571 143 532Q143 493 159.5 468.0Q176 443 202.5 428.0Q229 413 262 402Q306 388 353.0 377.5Q400 367 442 353Q472 344 498.0 329.5Q524 315 543.0 295.0Q562 275 573.0 249.5Q584 224 584 192Q584 137 563.5 99.0Q543 61 508.0 37.0Q473 13 429.0 2.5Q385 -8 337 -8Z"/><path transform="translate(133.792 0) scale(0.032 -0.032)" d="M375 -8Q265 -8 193.5 39.0Q122 86 87.0 167.5Q52 249 52 353Q52 456 87.5 537.5Q123 619 195.5 667.0Q268 715 378 715Q442 715 495.5 696.0Q549 677 586.5 640.0Q624 603 642 546H583Q559 605 504.5 635.0Q450 665 379 665Q286 665 226.5 622.0Q167 579 138.5 509.0Q110 439 110 355Q110 271 138.0 199.5Q166 128 225.5 85.0Q285 42 377 42Q423 42 466.0 55.0Q509 68 542.0 95.0Q575 122 590 161H655Q635 106 593.5 68.0Q552 30 496.0 11.0Q440 -8 375 -8Z"/><path transform="translate(157.984 0) scale(0.032 -0.032)" d="M14 0 287 707H360L635 0H571L509 159H138L77 0ZM157 210H490L324 648Z"/><path transform="translate(180.512 0) scale(0.032 -0.032)" d="M91 0V707H148V52H553V0Z"/><path transform="translate(200.512 0) scale(0.032 -0.032)" d="M91 0V707H553V655H148V377H512V325H148V52H553V0Z"/><path transform="translate(222.432 -7.68) scale(0.024 -0.024)" d="M318 445V707H414L466 592L518 707H613V445H550V643L484 499H447L381 643V445ZM144 445V648H59V707H294V648H208V445Z"/><g transform="translate(254.56 0)"><path transform="translate(0 0) scale(0.032 -0.032)" d="M83 0V707H189V396H543V707H649V0H543V299H189V0Z"/><path transform="translate(23.424 0) scale(0.032 -0.032)" d="M342 -8Q273 -8 212.0 12.0Q151 32 109.0 77.0Q67 122 53 196H162Q175 154 204.0 130.5Q233 107 271.5 98.0Q310 89 349 89Q386 89 418.5 99.0Q451 109 472.0 132.0Q493 155 493 192Q493 220 482.0 238.0Q471 256 451.5 267.5Q432 279 405 286Q374 296 338.5 303.0Q303 310 268.5 319.0Q234 328 204 342Q179 352 155.5 366.5Q132 381 115.0 401.5Q98 422 87.5 450.0Q77 478 77 514Q77 562 92.5 596.0Q108 630 133.5 653.0Q159 676 192.5 689.5Q226 703 263.0 709.0Q300 715 335 715Q399 715 453.0 695.0Q507 675 542.5 631.5Q578 588 581 517H478Q474 555 452.5 577.5Q431 600 399.0 609.5Q367 619 331 619Q305 619 279.0 614.5Q253 610 231.5 598.5Q210 587 197.5 568.0Q185 549 185 521Q185 497 195.0 478.5Q205 460 223.5 447.5Q242 435 265 426Q307 410 357.0 401.5Q407 393 451 378Q483 368 511.0 353.5Q539 339 559.0 318.5Q579 298 590.0 270.5Q601 243 601 207Q601 148 580.0 106.5Q559 65 523.0 40.0Q487 15 440.0 3.5Q393 -8 342 -8Z"/><path transform="translate(44.384 0) scale(0.032 -0.032)" d="M11 0 243 353 18 707H147L310 437L473 707H599L375 356L607 0H479L308 271L134 0Z"/></g></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="226.92" height="184" viewBox="0 0 226.92 184" color="#ffffff" fill="#ffffff" role="img" aria-label="Hyperscale HSX stacked lockup"><g transform="translate(81.46 24) scale(2)" fill="none" stroke="#ffffff" stroke-width="0.8200000000000001" stroke-linecap="round" stroke-linejoin="round"><path d="M16 3.5L28.5 9.75V22.25L16 28.5L3.5 22.25V9.75Z"/><path d="M3.5 9.75L16 16L28.5 9.75"/><path d="M16 16V28.5"/><path d="M16 5L24 9V17L16 21L8 17V9Z"/><path d="M8 9L16 13L24 9"/><path d="M16 13V21"/><path d="M16 7L20 9V13L16 15L12 13V9Z"/><path d="M12 9L16 11L20 9"/><path d="M16 11V15"/></g><g transform="translate(24 128)"><path transform="translate(0 0) scale(0.024 -0.024)" d="M91 0V707H148V372H578V707H635V0H578V321H148V0Z"/><path transform="translate(18.744 0) scale(0.024 -0.024)" d="M269 0V266L18 707H86L298 324L510 707H575L326 267V0Z"/><path transform="translate(34.296 0) scale(0.024 -0.024)" d="M91 0V707H329Q406 707 460.5 682.5Q515 658 544.0 607.0Q573 556 573 477Q573 399 538.5 347.5Q504 296 444.5 270.0Q385 244 310 244H148V0ZM148 295H307Q400 295 457.0 339.5Q514 384 514 481Q514 573 464.0 614.0Q414 655 324 655H148Z"/><path transform="translate(50.64 0) scale(0.024 -0.024)" d="M91 0V707H553V655H148V377H512V325H148V52H553V0Z"/><path transform="translate(66.48 0) scale(0.024 -0.024)" d="M91 0V707H351Q407 707 452.5 695.5Q498 684 530.5 659.0Q563 634 580.5 592.5Q598 551 598 492Q598 437 578.0 396.0Q558 355 520.0 328.0Q482 301 430 289L584 0H521L371 279H148V0ZM148 330H323Q365 330 404.0 336.5Q443 343 473.5 361.0Q504 379 521.5 411.5Q539 444 539 495Q540 557 514.5 592.0Q489 627 444.5 641.0Q400 655 341 655H148Z"/><path transform="translate(83.52 0) scale(0.024 -0.024)" d="M337 -8Q276 -8 219.5 8.0Q163 24 121.0 61.5Q79 99 61 161H123Q142 117 176.0 91.0Q210 65 252.5 53.5Q295 42 337 42Q384 42 427.0 56.5Q470 71 497.0 101.0Q524 131 524 180Q524 219 508.5 243.0Q493 267 466.5 281.5Q440 296 405 306Q379 314 352.0 320.5Q325 327 299.5 334.0Q274 341 251 349Q220 358 189.5 371.0Q159 384 135.5 404.0Q112 424 97.5 453.0Q83 482 83 524Q83 567 96.0 599.0Q109 631 133.0 653.0Q157 675 188.0 688.5Q219 702 254.5 708.5Q290 715 327 715Q384 715 433.5 699.0Q483 683 518.0 647.0Q553 611 562 550H504Q494 593 466.5 618.0Q439 643 402.0 654.0Q365 665 326 665Q295 665 263.0 658.5Q231 652 204.0 637.0Q177 622 160.0 596.5Q143 571 143 532Q143 493 159.5 468.0Q176 443 202.5 428.0Q229 413 262 402Q306 388 353.0 377.5Q400 367 442 353Q472 344 498.0 329.5Q524 315 543.0 295.0Q562 275 573.0 249.5Q584 224 584 192Q584 137 563.5 99.0Q543 61 508.0 37.0Q473 13 429.0 2.5Q385 -8 337 -8Z"/><path transform="translate(100.344 0) scale(0.024 -0.024)" d="M375 -8Q265 -8 193.5 39.0Q122 86 87.0 167.5Q52 249 52 353Q52 456 87.5 537.5Q123 619 195.5 667.0Q268 715 378 715Q442 715 495.5 696.0Q549 677 586.5 640.0Q624 603 642 546H583Q559 605 504.5 635.0Q450 665 379 665Q286 665 226.5 622.0Q167 579 138.5 509.0Q110 439 110 355Q110 271 138.0 199.5Q166 128 225.5 85.0Q285 42 377 42Q423 42 466.0 55.0Q509 68 542.0 95.0Q575 122 590 161H655Q635 106 593.5 68.0Q552 30 496.0 11.0Q440 -8 375 -8Z"/><path transform="translate(118.488 0) scale(0.024 -0.024)" d="M14 0 287 707H360L635 0H571L509 159H138L77 0ZM157 210H490L324 648Z"/><path transform="translate(135.384 0) scale(0.024 -0.024)" d="M91 0V707H148V52H553V0Z"/><path transform="translate(150.384 0) scale(0.024 -0.024)" d="M91 0V707H553V655H148V377H512V325H148V52H553V0Z"/><path transform="translate(166.824 -5.76) scale(0.018 -0.018)" d="M318 445V707H414L466 592L518 707H613V445H550V643L484 499H447L381 643V445ZM144 445V648H59V707H294V648H208V445Z"/></g><g transform="translate(89.4 160)"><path transform="translate(0 0) scale(0.024 -0.024)" d="M83 0V707H189V396H543V707H649V0H543V299H189V0Z"/><path transform="translate(17.568 0) scale(0.024 -0.024)" d="M342 -8Q273 -8 212.0 12.0Q151 32 109.0 77.0Q67 122 53 196H162Q175 154 204.0 130.5Q233 107 271.5 98.0Q310 89 349 89Q386 89 418.5 99.0Q451 109 472.0 132.0Q493 155 493 192Q493 220 482.0 238.0Q471 256 451.5 267.5Q432 279 405 286Q374 296 338.5 303.0Q303 310 268.5 319.0Q234 328 204 342Q179 352 155.5 366.5Q132 381 115.0 401.5Q98 422 87.5 450.0Q77 478 77 514Q77 562 92.5 596.0Q108 630 133.5 653.0Q159 676 192.5 689.5Q226 703 263.0 709.0Q300 715 335 715Q399 715 453.0 695.0Q507 675 542.5 631.5Q578 588 581 517H478Q474 555 452.5 577.5Q431 600 399.0 609.5Q367 619 331 619Q305 619 279.0 614.5Q253 610 231.5 598.5Q210 587 197.5 568.0Q185 549 185 521Q185 497 195.0 478.5Q205 460 223.5 447.5Q242 435 265 426Q307 410 357.0 401.5Q407 393 451 378Q483 368 511.0 353.5Q539 339 559.0 318.5Q579 298 590.0 270.5Q601 243 601 207Q601 148 580.0 106.5Q559 65 523.0 40.0Q487 15 440.0 3.5Q393 -8 342 -8Z"/><path transform="translate(33.288 0) scale(0.024 -0.024)" d="M11 0 243 353 18 707H147L310 437L473 707H599L375 356L607 0H479L308 271L134 0Z"/></g></svg>
|