@kaspacom/kcc20-tx-builder 0.7.0 → 0.8.0-fee.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/RELEASING.md +9 -5
  3. package/artifacts/KCC20FeeEscrowV1.placeholder.json +75648 -0
  4. package/artifacts/KCC20FeePolicyV1.manifest.json +86 -0
  5. package/artifacts/KCC20FeeRecipientV1.placeholder.json +3493 -0
  6. package/artifacts/KCC20OrderbookFeeAskV1.placeholder.json +199068 -0
  7. package/artifacts/KCC20OrderbookFeeBidV1.placeholder.json +13815 -0
  8. package/artifacts/KCC20OrderbookFeeHolderV1.placeholder.json +171404 -0
  9. package/artifacts/KCC20OrderbookFeeRootV1.placeholder.json +11488 -0
  10. package/artifacts/KCC20WrapperFeeArgentV1.placeholder.json +28365 -0
  11. package/artifacts/KCC20WrapperFeeV1.placeholder.json +27233 -0
  12. package/dist/artifacts.d.ts +20 -0
  13. package/dist/artifacts.d.ts.map +1 -1
  14. package/dist/artifacts.js +20 -0
  15. package/dist/artifacts.js.map +1 -1
  16. package/dist/cjs/artifacts.d.ts +20 -0
  17. package/dist/cjs/artifacts.js +21 -1
  18. package/dist/cjs/artifacts.js.map +1 -1
  19. package/dist/cjs/escrow-fee.d.ts +79 -0
  20. package/dist/cjs/escrow-fee.js +155 -0
  21. package/dist/cjs/escrow-fee.js.map +1 -0
  22. package/dist/cjs/escrow-group.d.ts +22 -0
  23. package/dist/cjs/escrow-group.js +80 -0
  24. package/dist/cjs/escrow-group.js.map +1 -0
  25. package/dist/cjs/escrow-policy.d.ts +72 -0
  26. package/dist/cjs/escrow-policy.js +118 -0
  27. package/dist/cjs/escrow-policy.js.map +1 -0
  28. package/dist/cjs/index.d.ts +3 -0
  29. package/dist/cjs/index.js +3 -0
  30. package/dist/cjs/index.js.map +1 -1
  31. package/dist/escrow-fee.d.ts +80 -0
  32. package/dist/escrow-fee.d.ts.map +1 -0
  33. package/dist/escrow-fee.js +148 -0
  34. package/dist/escrow-fee.js.map +1 -0
  35. package/dist/escrow-group.d.ts +23 -0
  36. package/dist/escrow-group.d.ts.map +1 -0
  37. package/dist/escrow-group.js +75 -0
  38. package/dist/escrow-group.js.map +1 -0
  39. package/dist/escrow-policy.d.ts +73 -0
  40. package/dist/escrow-policy.d.ts.map +1 -0
  41. package/dist/escrow-policy.js +111 -0
  42. package/dist/escrow-policy.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +3 -0
  46. package/dist/index.js.map +1 -1
  47. package/docs/COMPATIBILITY.json +1 -1
  48. package/docs/escrow-fees.md +56 -0
  49. package/package.json +3 -2
  50. package/src/artifacts.ts +31 -0
  51. package/src/escrow-fee.ts +181 -0
  52. package/src/escrow-group.ts +105 -0
  53. package/src/escrow-policy.ts +130 -0
  54. package/src/index.ts +3 -0
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encodeKcc20EscrowPolicy = encodeKcc20EscrowPolicy;
4
+ exports.decodeKcc20EscrowPolicy = decodeKcc20EscrowPolicy;
5
+ exports.kcc20EscrowPolicyId = kcc20EscrowPolicyId;
6
+ exports.kcc20CreatorFeeConsent = kcc20CreatorFeeConsent;
7
+ exports.kcc20FeeClaimCommitment = kcc20FeeClaimCommitment;
8
+ const blake3_1 = require("@noble/hashes/blake3");
9
+ const blake2b_1 = require("@noble/hashes/blake2b");
10
+ const escrow_fee_js_1 = require("./escrow-fee.js");
11
+ const ZERO = "0".repeat(64);
12
+ function hex32(value, allowZero = false) {
13
+ if (typeof value !== "string" || !/^[0-9a-fA-F]{64}$/.test(value) || (!allowZero && value === ZERO)) {
14
+ throw new Error("expected nonzero 32-byte identity");
15
+ }
16
+ return Uint8Array.from(value.match(/../g).map(byte => Number.parseInt(byte, 16)));
17
+ }
18
+ function hex(value) {
19
+ return Array.from(value, byte => byte.toString(16).padStart(2, "0")).join("");
20
+ }
21
+ function int64(value) {
22
+ if (typeof value !== "bigint" || value < 0n || value > 0x7fffffffffffffffn)
23
+ throw new Error("expected nonnegative int64");
24
+ const result = new Uint8Array(8);
25
+ new DataView(result.buffer).setBigUint64(0, value, true);
26
+ return result;
27
+ }
28
+ function concat(...parts) {
29
+ const result = new Uint8Array(parts.reduce((length, part) => length + part.length, 0));
30
+ let offset = 0;
31
+ for (const part of parts) {
32
+ result.set(part, offset);
33
+ offset += part.length;
34
+ }
35
+ return result;
36
+ }
37
+ function template(value) {
38
+ for (const length of [value.prefixLength, value.suffixLength]) {
39
+ if (!Number.isSafeInteger(length) || length <= 0)
40
+ throw new Error("template lengths must be positive safe integers");
41
+ }
42
+ return concat(hex32(value.hash), int64(BigInt(value.prefixLength)), int64(BigInt(value.suffixLength)));
43
+ }
44
+ function encodeKcc20EscrowPolicy(policy) {
45
+ if (policy.version !== 1)
46
+ throw new Error("unsupported fee policy version");
47
+ if (!Number.isInteger(policy.creatorFeeBps) || policy.creatorFeeBps < 0 || policy.creatorFeeBps > 500)
48
+ throw new Error("creator rate must be 0 to 500 bps");
49
+ const protocol = hex32(policy.protocolAccountId);
50
+ const creator = hex32(policy.creatorAccountId, policy.creatorFeeBps === 0);
51
+ if (hex(protocol) === hex(creator))
52
+ throw new Error("fee account identities must differ");
53
+ if ((policy.creatorFeeBps === 0) !== (hex(creator) === ZERO))
54
+ throw new Error("creator rate and account do not match");
55
+ return concat(Uint8Array.of(1), int64(BigInt(policy.creatorFeeBps)), protocol, creator, template(policy.receiptTemplate), template(policy.rootTemplate), template(policy.holderTemplate), template(policy.askTemplate), template(policy.bidTemplate), template(policy.ticketTemplate));
56
+ }
57
+ function decodeKcc20EscrowPolicy(bytes) {
58
+ if (!(bytes instanceof Uint8Array) || bytes.length !== 361 || bytes[0] !== 1)
59
+ throw new Error("invalid fee policy encoding");
60
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
61
+ const integer = (offset) => {
62
+ const value = view.getBigUint64(offset, true);
63
+ if (value > BigInt(Number.MAX_SAFE_INTEGER))
64
+ throw new Error("noncanonical or oversized policy integer");
65
+ return Number(value);
66
+ };
67
+ const readTemplate = (offset) => ({ hash: hex(bytes.slice(offset, offset + 32)),
68
+ prefixLength: integer(offset + 32), suffixLength: integer(offset + 40) });
69
+ const policy = {
70
+ version: 1, creatorFeeBps: integer(1),
71
+ protocolAccountId: hex(bytes.slice(9, 41)), creatorAccountId: hex(bytes.slice(41, 73)),
72
+ receiptTemplate: readTemplate(73), rootTemplate: readTemplate(121),
73
+ holderTemplate: readTemplate(169), askTemplate: readTemplate(217),
74
+ bidTemplate: readTemplate(265), ticketTemplate: readTemplate(313),
75
+ };
76
+ encodeKcc20EscrowPolicy(policy);
77
+ return policy;
78
+ }
79
+ function kcc20EscrowPolicyId(input) {
80
+ if (typeof input.priceScale !== "bigint" || input.priceScale <= 0n)
81
+ throw new Error("priceScale must be positive");
82
+ return hex((0, blake3_1.blake3)(concat(hex32(input.tokenId), hex32(input.feeTicketId, true), int64(input.priceScale), encodeKcc20EscrowPolicy(input.policy))));
83
+ }
84
+ /** Public consent can be reused only for this TN10 market and fixed fee policy.
85
+ * Send `message` to the wallet's standard personal-message signing API. A wallet
86
+ * signature is still required; creating this payload does not establish authority.
87
+ */
88
+ function kcc20CreatorFeeConsent(input) {
89
+ if (typeof input.priceScale !== "bigint" || input.priceScale <= 0n)
90
+ throw new Error("priceScale must be positive");
91
+ const policy = encodeKcc20EscrowPolicy(input.policy);
92
+ if (input.policy.creatorFeeBps === 0)
93
+ throw new Error("creator consent is only used when creator fees are enabled");
94
+ const commitment = hex((0, blake3_1.blake3)(concat(Uint8Array.of(0xc1), hex32(input.tokenId), hex32(input.marketId), hex32(input.feeTicketId, true), int64(input.priceScale), policy)));
95
+ const message = `KCC20 creator fee consent v1 (TN10)\n${commitment}`;
96
+ const encoder = new TextEncoder();
97
+ const personalMessageHash = hex((0, blake2b_1.blake2b)(encoder.encode(message), {
98
+ dkLen: 32, key: encoder.encode("PersonalMessageSigningHash"),
99
+ }));
100
+ return { commitment, message, personalMessageHash };
101
+ }
102
+ function outpoint(value) {
103
+ if (!Number.isInteger(value.index) || value.index < 0 || value.index > 0xffffffff)
104
+ throw new Error("outpoint index must be uint32");
105
+ return concat(hex32(value.transactionId, true), int64(BigInt(value.index)));
106
+ }
107
+ /** Input order must match the covenant family's consensus input order. */
108
+ function kcc20FeeClaimCommitment(input) {
109
+ const amounts = (0, escrow_fee_js_1.calculateKcc20FeeClaim)(input.receipts, input.party);
110
+ if (!(input.payoutScriptPublicKey instanceof Uint8Array) || input.payoutScriptPublicKey.length < 3)
111
+ throw new Error("serialized payout ScriptPublicKey is required");
112
+ let receiptHash = new Uint8Array(32);
113
+ for (const receipt of input.receipts)
114
+ receiptHash = (0, blake3_1.blake3)(concat(receiptHash, outpoint(receipt.outpoint)));
115
+ const first = input.receipts[0];
116
+ return hex((0, blake3_1.blake3)(concat(Uint8Array.of(0xf1), hex32(first.tokenId), hex32(first.marketId), hex32(first.policyId), receiptHash, outpoint(input.accountOutpoint), int64(input.party === "creator" ? 1n : 0n), int64(amounts.claimSompi), int64(amounts.remainderSompi), (0, blake3_1.blake3)(input.payoutScriptPublicKey))));
117
+ }
118
+ //# sourceMappingURL=escrow-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-policy.js","sourceRoot":"","sources":["../../src/escrow-policy.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,9 @@ export * from "./paid-mint-amount.js";
18
18
  export * from "./token-amount.js";
19
19
  export * from "./token-operation.js";
20
20
  export * from "./trade-fee.js";
21
+ export * from "./escrow-fee.js";
22
+ export * from "./escrow-policy.js";
23
+ export * from "./escrow-group.js";
21
24
  export * from "./trading-operation.js";
22
25
  export * from "./protocol.js";
23
26
  export * from "./runtime.js";
package/dist/cjs/index.js CHANGED
@@ -35,6 +35,9 @@ __exportStar(require("./paid-mint-amount.js"), exports);
35
35
  __exportStar(require("./token-amount.js"), exports);
36
36
  __exportStar(require("./token-operation.js"), exports);
37
37
  __exportStar(require("./trade-fee.js"), exports);
38
+ __exportStar(require("./escrow-fee.js"), exports);
39
+ __exportStar(require("./escrow-policy.js"), exports);
40
+ __exportStar(require("./escrow-group.js"), exports);
38
41
  __exportStar(require("./trading-operation.js"), exports);
39
42
  __exportStar(require("./protocol.js"), exports);
40
43
  __exportStar(require("./runtime.js"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,sDAAoC;AACpC,gEAA8C;AAC9C,8DAA4C;AAC5C,2CAAyB;AACzB,+CAA6B;AAC7B,wDAAsC;AACtC,sDAAoC;AACpC,8CAA4B;AAC5B,gDAA8B;AAC9B,8CAA4B;AAC5B,4DAA0C;AAC1C,2DAAyC;AACzC,mEAAiD;AACjD,8CAA4B;AAC5B,kDAAgC;AAChC,wDAAsC;AACtC,oDAAkC;AAClC,uDAAqC;AACrC,iDAA+B;AAC/B,yDAAuC;AACvC,gDAA8B;AAC9B,+CAA6B;AAC7B,iDAA+C;AAC/C,uDAAqC;AACrC,yDAAuC;AACvC,0DAAwC;AACxC,2DAAyC;AACzC,wEAAsD;AACtD,qDAAmC;AACnC,wDAAsC;AACtC,yDAAuC;AACvC,wDAAsC;AAEtC,uDAAqD;AACrD,gFAA8E;AAC9E,2DAAyC;AACzC,6DAA2C;AAE3C,2DAAyC;AAEzC,wDAAsC;AACtC,wDAAsC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,sDAAoC;AACpC,gEAA8C;AAC9C,8DAA4C;AAC5C,2CAAyB;AACzB,+CAA6B;AAC7B,wDAAsC;AACtC,sDAAoC;AACpC,8CAA4B;AAC5B,gDAA8B;AAC9B,8CAA4B;AAC5B,4DAA0C;AAC1C,2DAAyC;AACzC,mEAAiD;AACjD,8CAA4B;AAC5B,kDAAgC;AAChC,wDAAsC;AACtC,oDAAkC;AAClC,uDAAqC;AACrC,iDAA+B;AAC/B,kDAAgC;AAChC,qDAAmC;AACnC,oDAAkC;AAClC,yDAAuC;AACvC,gDAA8B;AAC9B,+CAA6B;AAC7B,iDAA+C;AAC/C,uDAAqC;AACrC,yDAAuC;AACvC,0DAAwC;AACxC,2DAAyC;AACzC,wEAAsD;AACtD,qDAAmC;AACnC,wDAAsC;AACtC,yDAAuC;AACvC,wDAAsC;AAEtC,uDAAqD;AACrD,gFAA8E;AAC9E,2DAAyC;AACzC,6DAA2C;AAE3C,2DAAyC;AAEzC,wDAAsC;AACtC,wDAAsC"}
@@ -0,0 +1,80 @@
1
+ /** Fee arithmetic for new escrow markets only. Legacy trading is unchanged. */
2
+ export declare const KCC20_ESCROW_POLICY_VERSION: 1;
3
+ export declare const KCC20_ESCROW_PROTOCOL_BPS = 100;
4
+ export declare const KCC20_ESCROW_MAX_CREATOR_BPS = 500;
5
+ export declare const KCC20_ESCROW_MIN_FEE_SOMPI = 50000000n;
6
+ export declare const KCC20_ESCROW_MAX_CLAIM_RECEIPTS = 5;
7
+ export declare const KCC20_ESCROW_MAX_INT = 9223372036854775807n;
8
+ export interface Kcc20EscrowFeeAmounts {
9
+ protocolFeeSompi: bigint;
10
+ creatorFeeSompi: bigint;
11
+ totalFeeSompi: bigint;
12
+ }
13
+ /** A waiver here is a quote assumption, never proof of FeeTicket eligibility. */
14
+ export declare function calculateKcc20EscrowFees(input: {
15
+ grossSompi: bigint;
16
+ creatorFeeBps: number;
17
+ protocolWaived: boolean;
18
+ }): Kcc20EscrowFeeAmounts;
19
+ /** Trading-price components only; excludes network fees and storage deposits.
20
+ * One matched ask/bid is one fill. Call separately for independent fills. */
21
+ export declare function quoteKcc20EscrowSettlement(input: {
22
+ grossSompi: bigint;
23
+ creatorFeeBps: number;
24
+ protocolWaived: boolean;
25
+ kind: "take-ask" | "fill-bid" | "cross-match";
26
+ }): {
27
+ grossSompi: bigint;
28
+ buyerPaysSompi: bigint;
29
+ sellerReceivesSompi: bigint;
30
+ matcherPaysSompi: bigint;
31
+ requiresFeeOutput: boolean;
32
+ protocolFeeSompi: bigint;
33
+ creatorFeeSompi: bigint;
34
+ totalFeeSompi: bigint;
35
+ };
36
+ /** Arithmetic for one atomic trade group. Artifact and UTXO checks belong to
37
+ * the signed transaction builder; this quote does not authorize a FeeTicket. */
38
+ export declare function quoteKcc20EscrowTradeGroup(input: {
39
+ kind: "take-ask" | "fill-bid" | "cross-match";
40
+ fillGrossSompi: readonly bigint[];
41
+ creatorFeeBps: number;
42
+ protocolWaived: boolean;
43
+ }): {
44
+ feeVector: {
45
+ protocolFeeSompi: bigint;
46
+ creatorFeeSompi: bigint;
47
+ }[];
48
+ receiptValueSompi: bigint;
49
+ requiresFeeOutput: boolean;
50
+ grossSompi: bigint;
51
+ protocolFeeSompi: bigint;
52
+ creatorFeeSompi: bigint;
53
+ buyerPaysSompi: bigint;
54
+ sellerReceivesSompi: bigint;
55
+ matcherPaysSompi: bigint;
56
+ };
57
+ /** Accounting description only. The transaction builder must authenticate scripts and live UTXOs. */
58
+ export interface Kcc20FeeReceiptAmounts {
59
+ outpoint: {
60
+ transactionId: string;
61
+ index: number;
62
+ };
63
+ tokenId: string;
64
+ marketId: string;
65
+ policyId: string;
66
+ protocolAccountId: string;
67
+ creatorAccountId: string;
68
+ valueSompi: bigint;
69
+ protocolSompi: bigint;
70
+ creatorSompi: bigint;
71
+ }
72
+ /** Computes a single claim's conservation amounts, without authorizing a spend. */
73
+ export declare function calculateKcc20FeeClaim(receipts: readonly Kcc20FeeReceiptAmounts[], party: "protocol" | "creator"): {
74
+ claimSompi: bigint;
75
+ remainingProtocolSompi: bigint;
76
+ remainingCreatorSompi: bigint;
77
+ consumedSompi: bigint;
78
+ remainderSompi: bigint;
79
+ };
80
+ //# sourceMappingURL=escrow-fee.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-fee.d.ts","sourceRoot":"","sources":["../src/escrow-fee.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,EAAG,CAAU,CAAC;AACtD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,eAAO,MAAM,0BAA0B,YAAc,CAAC;AACtD,eAAO,MAAM,+BAA+B,IAAI,CAAC;AACjD,eAAO,MAAM,oBAAoB,uBAA6B,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAoBD,iFAAiF;AACjF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;CACzB,GAAG,qBAAqB,CAUxB;AAED;6EAC6E;AAC7E,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,aAAa,CAAC;CAC/C;;;;;;sBA/CmB,MAAM;qBACP,MAAM;mBACR,MAAM;EA2DtB;AAED;gFACgF;AAChF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,aAAa,CAAC;IAC9C,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;CACzB;;;;;;;;;;;;;EAiCA;AAED,qGAAqG;AACrG,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAOD,mFAAmF;AACnF,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,EAC3C,KAAK,EAAE,UAAU,GAAG,SAAS;;;;;;EA6C9B"}
@@ -0,0 +1,148 @@
1
+ /** Fee arithmetic for new escrow markets only. Legacy trading is unchanged. */
2
+ export const KCC20_ESCROW_POLICY_VERSION = 1;
3
+ export const KCC20_ESCROW_PROTOCOL_BPS = 100;
4
+ export const KCC20_ESCROW_MAX_CREATOR_BPS = 500;
5
+ export const KCC20_ESCROW_MIN_FEE_SOMPI = 50000000n;
6
+ export const KCC20_ESCROW_MAX_CLAIM_RECEIPTS = 5;
7
+ export const KCC20_ESCROW_MAX_INT = 9223372036854775807n;
8
+ function amount(value, name) {
9
+ if (typeof value !== "bigint" || value < 0n || value > KCC20_ESCROW_MAX_INT) {
10
+ throw new Error(`${name} must be a nonnegative signed-64-bit bigint`);
11
+ }
12
+ return value;
13
+ }
14
+ function add(left, right) {
15
+ return amount(left + right, "sum");
16
+ }
17
+ function fee(gross, bps) {
18
+ // Match the contract without overflowing the intermediate multiplication.
19
+ const rate = BigInt(bps);
20
+ const percentage = (gross / 10000n) * rate + ((gross % 10000n) * rate) / 10000n;
21
+ return percentage < KCC20_ESCROW_MIN_FEE_SOMPI ? KCC20_ESCROW_MIN_FEE_SOMPI : percentage;
22
+ }
23
+ /** A waiver here is a quote assumption, never proof of FeeTicket eligibility. */
24
+ export function calculateKcc20EscrowFees(input) {
25
+ const gross = amount(input.grossSompi, "grossSompi");
26
+ if (gross < 50000000n)
27
+ throw new Error("fill gross must be at least 0.5 KAS");
28
+ if (!Number.isInteger(input.creatorFeeBps) || input.creatorFeeBps < 0 || input.creatorFeeBps > KCC20_ESCROW_MAX_CREATOR_BPS) {
29
+ throw new Error("creatorFeeBps must be an integer from 0 to 500");
30
+ }
31
+ if (typeof input.protocolWaived !== "boolean")
32
+ throw new Error("protocolWaived must be boolean");
33
+ const protocolFeeSompi = input.protocolWaived ? 0n : fee(gross, KCC20_ESCROW_PROTOCOL_BPS);
34
+ const creatorFeeSompi = input.creatorFeeBps === 0 ? 0n : fee(gross, input.creatorFeeBps);
35
+ return { protocolFeeSompi, creatorFeeSompi, totalFeeSompi: add(protocolFeeSompi, creatorFeeSompi) };
36
+ }
37
+ /** Trading-price components only; excludes network fees and storage deposits.
38
+ * One matched ask/bid is one fill. Call separately for independent fills. */
39
+ export function quoteKcc20EscrowSettlement(input) {
40
+ const fees = calculateKcc20EscrowFees(input);
41
+ if (!["take-ask", "fill-bid", "cross-match"].includes(input.kind))
42
+ throw new Error("unsupported settlement kind");
43
+ if (input.kind === "fill-bid" && input.grossSompi < fees.totalFeeSompi) {
44
+ throw new Error("fill gross cannot cover protocol and creator fees");
45
+ }
46
+ return {
47
+ ...fees,
48
+ grossSompi: input.grossSompi,
49
+ buyerPaysSompi: input.kind === "take-ask" ? add(input.grossSompi, fees.totalFeeSompi) : input.grossSompi,
50
+ sellerReceivesSompi: input.kind === "fill-bid" ? input.grossSompi - fees.totalFeeSompi : input.grossSompi,
51
+ matcherPaysSompi: input.kind === "cross-match" ? fees.totalFeeSompi : 0n,
52
+ requiresFeeOutput: fees.totalFeeSompi > 0n,
53
+ };
54
+ }
55
+ /** Arithmetic for one atomic trade group. Artifact and UTXO checks belong to
56
+ * the signed transaction builder; this quote does not authorize a FeeTicket. */
57
+ export function quoteKcc20EscrowTradeGroup(input) {
58
+ const maxFills = input.kind === "take-ask" ? 16 : input.kind === "fill-bid" ? 10 : input.kind === "cross-match" ? 1 : 0;
59
+ if (!Array.isArray(input.fillGrossSompi) || input.fillGrossSompi.length < 1 || input.fillGrossSompi.length > maxFills) {
60
+ throw new Error("invalid trade group size");
61
+ }
62
+ if (input.kind === "cross-match" && input.protocolWaived) {
63
+ throw new Error("crossed matches cannot use a FeeTicket");
64
+ }
65
+ const feeVector = input.fillGrossSompi.map(grossSompi => quoteKcc20EscrowSettlement({
66
+ grossSompi, creatorFeeBps: input.creatorFeeBps,
67
+ protocolWaived: input.protocolWaived, kind: input.kind,
68
+ }));
69
+ const totals = feeVector.reduce((sum, fill) => ({
70
+ grossSompi: add(sum.grossSompi, fill.grossSompi),
71
+ protocolFeeSompi: add(sum.protocolFeeSompi, fill.protocolFeeSompi),
72
+ creatorFeeSompi: add(sum.creatorFeeSompi, fill.creatorFeeSompi),
73
+ buyerPaysSompi: add(sum.buyerPaysSompi, fill.buyerPaysSompi),
74
+ sellerReceivesSompi: add(sum.sellerReceivesSompi, fill.sellerReceivesSompi),
75
+ matcherPaysSompi: add(sum.matcherPaysSompi, fill.matcherPaysSompi),
76
+ }), {
77
+ grossSompi: 0n, protocolFeeSompi: 0n, creatorFeeSompi: 0n,
78
+ buyerPaysSompi: 0n, sellerReceivesSompi: 0n, matcherPaysSompi: 0n,
79
+ });
80
+ return {
81
+ ...totals,
82
+ feeVector: feeVector.map(fill => ({
83
+ protocolFeeSompi: fill.protocolFeeSompi,
84
+ creatorFeeSompi: fill.creatorFeeSompi,
85
+ })),
86
+ receiptValueSompi: add(totals.protocolFeeSompi, totals.creatorFeeSompi),
87
+ requiresFeeOutput: totals.protocolFeeSompi + totals.creatorFeeSompi > 0n,
88
+ };
89
+ }
90
+ function id(value) {
91
+ if (typeof value !== "string" || !/^[0-9a-fA-F]{64}$/.test(value))
92
+ throw new Error("identity must be 32-byte hex");
93
+ return value.toLowerCase();
94
+ }
95
+ /** Computes a single claim's conservation amounts, without authorizing a spend. */
96
+ export function calculateKcc20FeeClaim(receipts, party) {
97
+ if (party !== "protocol" && party !== "creator")
98
+ throw new Error("unknown claiming party");
99
+ if (!Array.isArray(receipts) || receipts.length < 1 || receipts.length > KCC20_ESCROW_MAX_CLAIM_RECEIPTS) {
100
+ throw new Error("claim must select between one and five receipts");
101
+ }
102
+ const seen = new Set();
103
+ let group;
104
+ let protocol = 0n;
105
+ let creator = 0n;
106
+ let consumed = 0n;
107
+ for (const receipt of receipts) {
108
+ const txid = id(receipt.outpoint.transactionId);
109
+ if (!Number.isInteger(receipt.outpoint.index) || receipt.outpoint.index < 0 || receipt.outpoint.index > 0xffffffff) {
110
+ throw new Error("outpoint index must be uint32");
111
+ }
112
+ const outpoint = `${txid}:${receipt.outpoint.index}`;
113
+ if (seen.has(outpoint))
114
+ throw new Error("duplicate receipt outpoint");
115
+ seen.add(outpoint);
116
+ const identity = [receipt.tokenId, receipt.marketId, receipt.policyId, receipt.protocolAccountId, receipt.creatorAccountId].map(id).join(":");
117
+ const zero = "0".repeat(64);
118
+ if ([receipt.tokenId, receipt.marketId, receipt.policyId, receipt.protocolAccountId].some(value => id(value) === zero)) {
119
+ throw new Error("token, market, policy and protocol account must be nonzero");
120
+ }
121
+ if (id(receipt.protocolAccountId) === id(receipt.creatorAccountId))
122
+ throw new Error("fee accounts must differ");
123
+ if (id(receipt.creatorAccountId) === zero && receipt.creatorSompi !== 0n)
124
+ throw new Error("disabled creator account cannot hold fees");
125
+ if (group !== undefined && identity !== group)
126
+ throw new Error("receipts must share token, market, policy and accounts");
127
+ group = identity;
128
+ const p = amount(receipt.protocolSompi, "protocolSompi");
129
+ const c = amount(receipt.creatorSompi, "creatorSompi");
130
+ const value = amount(receipt.valueSompi, "valueSompi");
131
+ if (value === 0n || value !== add(p, c))
132
+ throw new Error("receipt value must equal nonzero entitlements");
133
+ if ((p > 0n && p < KCC20_ESCROW_MIN_FEE_SOMPI) || (c > 0n && c < KCC20_ESCROW_MIN_FEE_SOMPI)) {
134
+ throw new Error("nonzero entitlement is below the policy minimum");
135
+ }
136
+ if ((party === "protocol" ? p : c) === 0n)
137
+ throw new Error("receipt has no entitlement for claimant");
138
+ protocol = add(protocol, p);
139
+ creator = add(creator, c);
140
+ consumed = add(consumed, value);
141
+ }
142
+ const claimSompi = party === "protocol" ? protocol : creator;
143
+ const remainingProtocolSompi = party === "protocol" ? 0n : protocol;
144
+ const remainingCreatorSompi = party === "creator" ? 0n : creator;
145
+ return { claimSompi, remainingProtocolSompi, remainingCreatorSompi, consumedSompi: consumed,
146
+ remainderSompi: add(remainingProtocolSompi, remainingCreatorSompi) };
147
+ }
148
+ //# sourceMappingURL=escrow-fee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-fee.js","sourceRoot":"","sources":["../src/escrow-fee.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface Kcc20FeeGroupOutpoint {
2
+ transactionId: string;
3
+ index: number;
4
+ }
5
+ export interface Kcc20FeeGroupSlot {
6
+ protocolFeeSompi: bigint;
7
+ creatorFeeSompi: bigint;
8
+ }
9
+ /** Contract fee-vector encoding: one checked protocol/creator pair per fill. */
10
+ export declare function encodeKcc20FeeVector(slots: readonly Kcc20FeeGroupSlot[]): Uint8Array;
11
+ /** Hashes the complete, ordered market input set. Funding and ticket inputs are excluded. */
12
+ export declare function kcc20MarketInputHash(inputs: readonly Kcc20FeeGroupOutpoint[]): string;
13
+ /** Commitment used by the grouped receipt. The signed builder must still verify live inputs. */
14
+ export declare function kcc20FeeGroupCommitment(input: {
15
+ tokenId: string;
16
+ marketId: string;
17
+ policyId: string;
18
+ taker: string;
19
+ marketInputs: readonly Kcc20FeeGroupOutpoint[];
20
+ feeSlots: readonly Kcc20FeeGroupSlot[];
21
+ ticketOutpoint?: Kcc20FeeGroupOutpoint | null;
22
+ }): string;
23
+ //# sourceMappingURL=escrow-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-group.d.ts","sourceRoot":"","sources":["../src/escrow-group.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACzB;AAuCD,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,GAAG,UAAU,CAiBpF;AAED,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,qBAAqB,EAAE,GAAG,MAAM,CASrF;AAED,gGAAgG;AAChG,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC/C,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACvC,cAAc,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC/C,GAAG,MAAM,CAWT"}
@@ -0,0 +1,75 @@
1
+ import { blake3 } from "@noble/hashes/blake3";
2
+ const MAX_I64 = 0x7fffffffffffffffn;
3
+ const ZERO_OUTPOINT = new Uint8Array(40);
4
+ function bytes32(value, label) {
5
+ if (typeof value !== "string" || !/^[0-9a-fA-F]{64}$/.test(value)) {
6
+ throw new Error(`${label} must be 32-byte hex`);
7
+ }
8
+ return Uint8Array.from(value.match(/../g).map(byte => Number.parseInt(byte, 16)));
9
+ }
10
+ function i64(value, label) {
11
+ if (typeof value !== "bigint" || value < 0n || value > MAX_I64) {
12
+ throw new Error(`${label} must be a nonnegative signed-64-bit integer`);
13
+ }
14
+ const bytes = new Uint8Array(8);
15
+ new DataView(bytes.buffer).setBigUint64(0, value, true);
16
+ return bytes;
17
+ }
18
+ function join(...parts) {
19
+ const bytes = new Uint8Array(parts.reduce((size, part) => size + part.length, 0));
20
+ let offset = 0;
21
+ for (const part of parts) {
22
+ bytes.set(part, offset);
23
+ offset += part.length;
24
+ }
25
+ return bytes;
26
+ }
27
+ function hex(bytes) {
28
+ return Array.from(bytes, byte => byte.toString(16).padStart(2, "0")).join("");
29
+ }
30
+ function outpoint(value, label) {
31
+ if (!value || !Number.isInteger(value.index) || value.index < 0 || value.index > 0xffff_ffff) {
32
+ throw new Error(`${label} index must be uint32`);
33
+ }
34
+ return join(bytes32(value.transactionId, `${label} transactionId`), i64(BigInt(value.index), `${label} index`));
35
+ }
36
+ /** Contract fee-vector encoding: one checked protocol/creator pair per fill. */
37
+ export function encodeKcc20FeeVector(slots) {
38
+ if (!Array.isArray(slots) || slots.length < 1 || slots.length > 16) {
39
+ throw new Error("fee vector needs one through 16 fills");
40
+ }
41
+ let protocol = 0n;
42
+ let creator = 0n;
43
+ const pairs = slots.map((slot, index) => {
44
+ const p = i64(slot.protocolFeeSompi, `fill ${index} protocol fee`);
45
+ const c = i64(slot.creatorFeeSompi, `fill ${index} creator fee`);
46
+ protocol += slot.protocolFeeSompi;
47
+ creator += slot.creatorFeeSompi;
48
+ if (protocol > MAX_I64 || creator > MAX_I64 || protocol + creator > MAX_I64) {
49
+ throw new Error("grouped fee total exceeds signed-64-bit range");
50
+ }
51
+ return join(p, c);
52
+ });
53
+ return join(...pairs);
54
+ }
55
+ /** Hashes the complete, ordered market input set. Funding and ticket inputs are excluded. */
56
+ export function kcc20MarketInputHash(inputs) {
57
+ if (!Array.isArray(inputs) || inputs.length < 1 || inputs.length > 17) {
58
+ throw new Error("market input set needs one through 17 outpoints");
59
+ }
60
+ const encoded = inputs.map((input, index) => outpoint(input, `market input ${index}`));
61
+ if (new Set(encoded.map(hex)).size !== encoded.length) {
62
+ throw new Error("market input set repeats an outpoint");
63
+ }
64
+ return hex(blake3(join(Uint8Array.of(0xe1), i64(BigInt(inputs.length), "market input count"), ...encoded)));
65
+ }
66
+ /** Commitment used by the grouped receipt. The signed builder must still verify live inputs. */
67
+ export function kcc20FeeGroupCommitment(input) {
68
+ if (input.feeSlots.length !== input.marketInputs.length && input.feeSlots.length + 1 !== input.marketInputs.length) {
69
+ throw new Error("fee slots must match the market input group");
70
+ }
71
+ const hash = bytes32(kcc20MarketInputHash(input.marketInputs), "market input hash");
72
+ const ticket = input.ticketOutpoint ? outpoint(input.ticketOutpoint, "ticket") : ZERO_OUTPOINT;
73
+ return hex(blake3(join(Uint8Array.of(0xe2), bytes32(input.tokenId, "token"), bytes32(input.marketId, "market"), bytes32(input.policyId, "policy"), bytes32(input.taker, "taker"), ticket, hash, encodeKcc20FeeVector(input.feeSlots))));
74
+ }
75
+ //# sourceMappingURL=escrow-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-group.js","sourceRoot":"","sources":["../src/escrow-group.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import { type Kcc20FeeReceiptAmounts } from "./escrow-fee.js";
2
+ /** Fixed 361-byte policy for the versioned fee roles. Decoding is not artifact authentication. */
3
+ export interface Kcc20EscrowPolicy {
4
+ version: 1;
5
+ creatorFeeBps: number;
6
+ protocolAccountId: string;
7
+ creatorAccountId: string;
8
+ receiptTemplate: {
9
+ hash: string;
10
+ prefixLength: number;
11
+ suffixLength: number;
12
+ };
13
+ rootTemplate: {
14
+ hash: string;
15
+ prefixLength: number;
16
+ suffixLength: number;
17
+ };
18
+ holderTemplate: {
19
+ hash: string;
20
+ prefixLength: number;
21
+ suffixLength: number;
22
+ };
23
+ askTemplate: {
24
+ hash: string;
25
+ prefixLength: number;
26
+ suffixLength: number;
27
+ };
28
+ bidTemplate: {
29
+ hash: string;
30
+ prefixLength: number;
31
+ suffixLength: number;
32
+ };
33
+ ticketTemplate: {
34
+ hash: string;
35
+ prefixLength: number;
36
+ suffixLength: number;
37
+ };
38
+ }
39
+ export declare function encodeKcc20EscrowPolicy(policy: Kcc20EscrowPolicy): Uint8Array;
40
+ export declare function decodeKcc20EscrowPolicy(bytes: Uint8Array): Kcc20EscrowPolicy;
41
+ export declare function kcc20EscrowPolicyId(input: {
42
+ tokenId: string;
43
+ feeTicketId: string;
44
+ priceScale: bigint;
45
+ policy: Kcc20EscrowPolicy;
46
+ }): string;
47
+ /** Public consent can be reused only for this TN10 market and fixed fee policy.
48
+ * Send `message` to the wallet's standard personal-message signing API. A wallet
49
+ * signature is still required; creating this payload does not establish authority.
50
+ */
51
+ export declare function kcc20CreatorFeeConsent(input: {
52
+ tokenId: string;
53
+ marketId: string;
54
+ feeTicketId: string;
55
+ priceScale: bigint;
56
+ policy: Kcc20EscrowPolicy;
57
+ }): {
58
+ commitment: string;
59
+ message: string;
60
+ personalMessageHash: string;
61
+ };
62
+ /** Input order must match the covenant family's consensus input order. */
63
+ export declare function kcc20FeeClaimCommitment(input: {
64
+ receipts: readonly Kcc20FeeReceiptAmounts[];
65
+ party: "protocol" | "creator";
66
+ accountOutpoint: {
67
+ transactionId: string;
68
+ index: number;
69
+ };
70
+ /** Serialized ScriptPublicKey, including its two-byte little-endian version. */
71
+ payoutScriptPublicKey: Uint8Array;
72
+ }): string;
73
+ //# sourceMappingURL=escrow-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escrow-policy.d.ts","sourceRoot":"","sources":["../src/escrow-policy.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEtF,kGAAkG;AAClG,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9E,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3E,cAAc,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7E,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,cAAc,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9E;AA+BD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,UAAU,CAU7E;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,UAAU,GAAG,iBAAiB,CAmB5E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;CACrF,GAAG,MAAM,CAIT;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;CACvG,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,CAYvE;AAOD,0EAA0E;AAC1E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,QAAQ,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC5C,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9B,eAAe,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,gFAAgF;IAChF,qBAAqB,EAAE,UAAU,CAAC;CACnC,GAAG,MAAM,CAST"}