@lifi/compose-spec
Version:
Public wire-format types and schemas for Compose flows
1,014 lines (996 loc) • 35.5 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var index_exports = {};
__export(index_exports, {
AppliedGuardSchema: () => AppliedGuardSchema,
AssertedErc20BalanceGteSpecSchema: () => AssertedErc20BalanceGteSpecSchema,
AssertedNativeBalanceGteSpecSchema: () => AssertedNativeBalanceGteSpecSchema,
AssertedPredicateSchema: () => AssertedPredicateSchema,
AssertedPredicateZod: () => AssertedPredicateZod,
AssertionOwnerSchema: () => AssertionOwnerSchema,
AssertionSpecSchema: () => AssertionSpecSchema,
AssertionSpecZod: () => AssertionSpecZod,
BindValueSchema: () => BindValueSchema,
Bytes32HexSchema: () => Bytes32HexSchema,
CONTINUATION_COMMITMENT_OP_ID: () => CONTINUATION_COMMITMENT_OP_ID,
CallCheckSpecSchema: () => CallCheckSpecSchema,
CallSchema: () => CallSchema,
CheckSchema: () => CheckSchema,
CheckZod: () => CheckZod,
ComposeManifestZod: () => ComposeManifestZod,
ContinuationIntentSchema: () => ContinuationIntentSchema,
ContinuationOutcomeSchema: () => ContinuationOutcomeSchema,
ContinuationPlanSchema: () => ContinuationPlanSchema,
ContinuationPlanZod: () => ContinuationPlanZod,
ContinuationSchema: () => ContinuationSchema,
EVM_NATIVE_SENTINEL: () => EVM_NATIVE_SENTINEL,
Erc20BalanceDeltaGteSpecSchema: () => Erc20BalanceDeltaGteSpecSchema,
Erc20BalanceGteSpecSchema: () => Erc20BalanceGteSpecSchema,
FlowInputSchema: () => FlowInputSchema,
FlowSchema: () => FlowSchema,
GuardCompatibilityZod: () => GuardCompatibilityZod,
GuardSelectorZod: () => GuardSelectorZod,
HANDLE_UNITS: () => HANDLE_UNITS,
HandleInputSchema: () => HandleInputSchema,
HandlePortZod: () => HandlePortZod,
HandleUnitsZod: () => HandleUnitsZod,
HexStringSchema: () => HexStringSchema,
InputPortZod: () => InputPortZod,
LiteralBindingSchema: () => LiteralBindingSchema,
ManifestGuardZod: () => ManifestGuardZod,
ManifestMaterialiserZod: () => ManifestMaterialiserZod,
ManifestOperationZod: () => ManifestOperationZod,
ManifestPreconditionZod: () => ManifestPreconditionZod,
NativeBalanceDeltaGteSpecSchema: () => NativeBalanceDeltaGteSpecSchema,
NativeBalanceGteSpecSchema: () => NativeBalanceGteSpecSchema,
OutputPortZod: () => OutputPortZod,
PROVIDER_KIND: () => PROVIDER_KIND,
Phase1ArtifactSchema: () => Phase1ArtifactSchema,
Phase1ArtifactZod: () => Phase1ArtifactZod,
RESERVED_REF_SCOPES: () => RESERVED_REF_SCOPES,
RefSchema: () => RefSchema,
ResourceInputSchema: () => ResourceInputSchema,
ResourceOutputPortZod: () => ResourceOutputPortZod,
ResourcePortZod: () => ResourcePortZod,
ResourceSchema: () => ResourceSchema,
SIMULATE_MAX_REQUIREMENTS: () => SIMULATE_MAX_REQUIREMENTS,
SIMULATE_MAX_TRACKED_BALANCES: () => SIMULATE_MAX_TRACKED_BALANCES,
STATIC_SOL_TYPES: () => STATIC_SOL_TYPES,
SolTypeSchema: () => SolTypeSchema,
StaticSolTypeZod: () => StaticSolTypeZod,
TEMPO_CHAIN_ID: () => TEMPO_CHAIN_ID,
TEMPO_NATIVE_ERC20: () => TEMPO_NATIVE_ERC20,
VerificationDescriptorSchema: () => VerificationDescriptorSchema,
VerificationDescriptorZod: () => VerificationDescriptorZod,
canonicalAssertedPredicate: () => canonicalAssertedPredicate,
canonicalNativeAddress: () => canonicalNativeAddress,
copy: () => copy,
erc20: () => erc20,
erc20Allowance: () => erc20Allowance,
erc20Balance: () => erc20Balance,
erc20Resource: () => erc20Resource,
erc20Token: () => erc20Token,
flowInputMode: () => flowInputMode,
flowInputResource: () => flowInputResource,
flowInputType: () => flowInputType,
foldMaterialiserMetadata: () => foldMaterialiserMetadata,
foldRef: () => foldRef,
foldResource: () => foldResource,
getChainCapabilities: () => getChainCapabilities,
handle: () => handle,
inputRef: () => inputRef,
isAsErc20Chain: () => isAsErc20Chain,
isContextKey: () => isContextKey,
isEQCheck: () => isEQCheck,
isERC20Resource: () => isERC20Resource,
isErc20AllowancePrecondition: () => isErc20AllowancePrecondition,
isFutureResourceOutput: () => isFutureResourceOutput,
isGTECheck: () => isGTECheck,
isHandlePort: () => isHandlePort,
isLTECheck: () => isLTECheck,
isMaterialiserInput: () => isMaterialiserInput,
isMsgValueNative: () => isMsgValueNative,
isNativeAddressForChain: () => isNativeAddressForChain,
isNativeBalancePrecondition: () => isNativeBalancePrecondition,
isNativeResource: () => isNativeResource,
isRef: () => isRef,
isResourceInput: () => isResourceInput,
isResourceOutputPort: () => isResourceOutputPort,
isResourcePort: () => isResourcePort,
isStaticSolType: () => isStaticSolType,
linear: () => linear,
native: () => native,
nativeBalance: () => nativeBalance,
nativeResource: () => nativeResource,
normalizeNativeTokenAddress: () => normalizeNativeTokenAddress,
normalizeResource: () => normalizeResource,
opHandle: () => opHandle,
outputRef: () => outputRef,
parseRef: () => parseRef,
providerKindByName: () => providerKindByName,
providerKindNames: () => providerKindNames,
readResource: () => readResource,
refKey: () => refKey,
resource: () => resource,
resourceKey: () => resourceKey,
resourceOutput: () => resourceOutput,
resourceToken: () => resourceToken,
resourcesEqual: () => resourcesEqual
});
module.exports = __toCommonJS(index_exports);
// src/flowSchema.ts
var import_effect = require("effect");
// src/chainCapabilities.ts
var EVM_NATIVE_SENTINEL = (
// eslint-disable-next-line @lifi/prefer-utils-constants -- compose-spec is the wire-format leaf and must not import @lifi/utils (enforced by scripts/check-compose-boundaries.mjs); the literal is intentional here
"0x0000000000000000000000000000000000000000"
);
var isNativeSentinel = (address) => address.toLowerCase() === EVM_NATIVE_SENTINEL.toLowerCase();
var TEMPO_CHAIN_ID = 4217;
var TEMPO_NATIVE_ERC20 = {
token: "0x20C0000000000000000000000000000000000000",
symbol: "pathUSD",
decimals: 6
};
var REGISTRY = /* @__PURE__ */ new Map([
[
TEMPO_CHAIN_ID,
{
kind: "as-erc20",
chainId: TEMPO_CHAIN_ID,
nativeErc20: TEMPO_NATIVE_ERC20
}
]
]);
var getChainCapabilities = (chainId) => REGISTRY.get(chainId) ?? { kind: "evm-native", chainId };
var isAsErc20Chain = (chainId) => getChainCapabilities(chainId).kind === "as-erc20";
var canonicalNativeAddress = (chainId) => {
const caps = getChainCapabilities(chainId);
return caps.kind === "as-erc20" ? caps.nativeErc20.token : EVM_NATIVE_SENTINEL;
};
var isNativeAddressForChain = (chainId, address) => {
const caps = getChainCapabilities(chainId);
const target = caps.kind === "as-erc20" ? caps.nativeErc20.token : EVM_NATIVE_SENTINEL;
return address.toLowerCase() === target.toLowerCase();
};
var isMsgValueNative = (chainId, address) => !isAsErc20Chain(chainId) && isNativeSentinel(address);
var normalizeResource = (r) => {
if (r.kind !== "native") return r;
const caps = getChainCapabilities(r.chainId);
if (caps.kind !== "as-erc20") return r;
return {
kind: "erc20",
chainId: r.chainId,
token: caps.nativeErc20.token
};
};
var normalizeNativeTokenAddress = (token, chainId) => isAsErc20Chain(chainId) && isNativeSentinel(token) ? canonicalNativeAddress(chainId) : token;
// src/flowSchema.ts
var SolTypeSchema = import_effect.Schema.Literal(
"uint8",
"uint16",
"uint32",
"uint64",
"uint128",
"uint256",
"int128",
"int256",
"address",
"bool",
"bytes",
"bytes4",
"bytes32",
"string"
);
var ChainIdSchema = import_effect.Schema.Number.pipe(
import_effect.Schema.int(),
import_effect.Schema.positive()
);
var RawResourceSchema = import_effect.Schema.Union(
import_effect.Schema.Struct({ kind: import_effect.Schema.Literal("native"), chainId: ChainIdSchema }),
import_effect.Schema.Struct({
kind: import_effect.Schema.Literal("erc20"),
token: import_effect.Schema.String,
chainId: ChainIdSchema
})
);
var ResourceSchema = import_effect.Schema.transform(
RawResourceSchema,
import_effect.Schema.typeSchema(RawResourceSchema),
{
strict: true,
decode: (raw) => normalizeResource(raw),
encode: (resource2) => resource2
}
);
var ResourceInputSchema = import_effect.Schema.Struct({
name: import_effect.Schema.String,
resource: ResourceSchema
});
var HandleInputSchema = import_effect.Schema.Struct({
name: import_effect.Schema.String,
type: SolTypeSchema
});
var FlowInputSchema = import_effect.Schema.Union(
ResourceInputSchema,
HandleInputSchema
);
var RefSchema = import_effect.Schema.Struct({
$ref: import_effect.Schema.String.pipe(
import_effect.Schema.filter((s) => s.indexOf(".") > 0, {
message: () => '$ref must be a dotpath like "input.name" or "nodeId.port"'
})
)
});
var LiteralBindingSchema = import_effect.Schema.Struct({
kind: SolTypeSchema,
value: import_effect.Schema.String
});
var BindValueSchema = import_effect.Schema.Union(RefSchema, LiteralBindingSchema);
var AppliedGuardSchema = import_effect.Schema.Struct(
{ kind: import_effect.Schema.String },
{ key: import_effect.Schema.String, value: import_effect.Schema.Unknown }
);
var CallSchema = import_effect.Schema.Struct({
id: import_effect.Schema.String,
op: import_effect.Schema.String,
bind: import_effect.Schema.optionalWith(
import_effect.Schema.Record({ key: import_effect.Schema.String, value: BindValueSchema }),
{ default: () => ({}) }
),
config: import_effect.Schema.optionalWith(
import_effect.Schema.Record({ key: import_effect.Schema.String, value: import_effect.Schema.Unknown }),
{ default: () => ({}) }
),
guards: import_effect.Schema.optional(import_effect.Schema.Array(AppliedGuardSchema))
});
var ContinuationSchema = import_effect.Schema.Struct({
awaits: import_effect.Schema.String,
flowId: import_effect.Schema.String
});
var FlowSchema = import_effect.Schema.Struct({
version: import_effect.Schema.Literal(1),
id: import_effect.Schema.String,
chainId: ChainIdSchema,
inputs: import_effect.Schema.Array(FlowInputSchema),
nodes: import_effect.Schema.Array(CallSchema),
continuations: import_effect.Schema.optional(import_effect.Schema.Array(ContinuationSchema))
});
// src/continuation.ts
var import_effect2 = require("effect");
var CONTINUATION_COMMITMENT_OP_ID = "continuation.commitment";
var RawContinuationOutcomeSchema = import_effect2.Schema.Struct({
token: import_effect2.Schema.String,
minAmount: import_effect2.Schema.String,
destination: import_effect2.Schema.String,
chainId: ChainIdSchema
});
var ContinuationOutcomeSchema = import_effect2.Schema.transform(
RawContinuationOutcomeSchema,
import_effect2.Schema.typeSchema(RawContinuationOutcomeSchema),
{
strict: true,
decode: (raw) => ({
...raw,
token: normalizeNativeTokenAddress(raw.token, raw.chainId)
}),
encode: (outcome) => outcome
}
);
var ContinuationIntentSchema = import_effect2.Schema.Struct({
// `NonEmptyArray` enforces ≥1 outcome at the parse boundary, so downstream needs no guard.
outcomes: import_effect2.Schema.NonEmptyArray(ContinuationOutcomeSchema),
continuationFlow: import_effect2.Schema.optional(FlowSchema),
validity: import_effect2.Schema.Struct({ expiresAtMs: import_effect2.Schema.Number }),
perpetual: import_effect2.Schema.optional(import_effect2.Schema.Boolean),
provider: import_effect2.Schema.optional(import_effect2.Schema.String)
});
var Phase1ArtifactSchema = import_effect2.Schema.Union(
import_effect2.Schema.Struct({
kind: import_effect2.Schema.Literal("transaction"),
transactionRequest: import_effect2.Schema.optional(
import_effect2.Schema.Struct({
to: import_effect2.Schema.String,
data: import_effect2.Schema.String,
value: import_effect2.Schema.String
})
)
}),
import_effect2.Schema.Struct({
kind: import_effect2.Schema.Literal("signables"),
typedData: import_effect2.Schema.Array(import_effect2.Schema.Unknown)
}),
import_effect2.Schema.Struct({ kind: import_effect2.Schema.Literal("none") })
);
var HexStringSchema = import_effect2.Schema.String.pipe(import_effect2.Schema.startsWith("0x"));
var AssertionOwnerSchema = import_effect2.Schema.Union(
HexStringSchema,
import_effect2.Schema.Literal("escrow", "delivery")
);
var Erc20BalanceGteSpecSchema = import_effect2.Schema.Struct({
kind: import_effect2.Schema.Literal("erc20BalanceGte"),
chainId: ChainIdSchema,
token: HexStringSchema,
owner: HexStringSchema,
minAmount: import_effect2.Schema.String
});
var NativeBalanceGteSpecSchema = import_effect2.Schema.Struct({
kind: import_effect2.Schema.Literal("nativeBalanceGte"),
chainId: ChainIdSchema,
owner: HexStringSchema,
minAmount: import_effect2.Schema.String
});
var CallCheckSpecSchema = import_effect2.Schema.Struct({
kind: import_effect2.Schema.Literal("call"),
chainId: ChainIdSchema,
to: HexStringSchema,
calldata: HexStringSchema,
comparator: import_effect2.Schema.Literal("gte", "eq", "lte"),
value: import_effect2.Schema.String
});
var asErc20BalanceGteCheck = (chainId, owner, minAmount) => ({
kind: "erc20BalanceGte",
chainId,
token: canonicalNativeAddress(chainId),
owner,
minAmount
});
var RawCheckSchema = import_effect2.Schema.Union(
Erc20BalanceGteSpecSchema,
NativeBalanceGteSpecSchema,
CallCheckSpecSchema
);
var CheckSchema = import_effect2.Schema.transform(
RawCheckSchema,
import_effect2.Schema.typeSchema(RawCheckSchema),
{
strict: true,
decode: (check) => check.kind === "nativeBalanceGte" && isAsErc20Chain(check.chainId) ? asErc20BalanceGteCheck(check.chainId, check.owner, check.minAmount) : check,
encode: (check) => check
}
);
var Erc20BalanceDeltaGteSpecSchema = import_effect2.Schema.Struct({
kind: import_effect2.Schema.Literal("erc20BalanceDeltaGte"),
chainId: ChainIdSchema,
token: HexStringSchema,
owner: AssertionOwnerSchema,
minDelta: import_effect2.Schema.String
});
var NativeBalanceDeltaGteSpecSchema = import_effect2.Schema.Struct({
kind: import_effect2.Schema.Literal("nativeBalanceDeltaGte"),
chainId: ChainIdSchema,
owner: AssertionOwnerSchema,
minDelta: import_effect2.Schema.String
});
var AssertionSpecSchema = import_effect2.Schema.Union(
Erc20BalanceGteSpecSchema,
NativeBalanceGteSpecSchema,
CallCheckSpecSchema,
Erc20BalanceDeltaGteSpecSchema,
NativeBalanceDeltaGteSpecSchema
);
var ContinuationPlanSchema = import_effect2.Schema.Struct({
chainId: ChainIdSchema,
nextFlow: FlowSchema,
check: CheckSchema,
validity: import_effect2.Schema.Struct({ expiresAtMs: import_effect2.Schema.Number }),
correlationId: import_effect2.Schema.optional(import_effect2.Schema.String)
});
var isGTECheck = (check) => check.kind === "call" && check.comparator === "gte";
var isLTECheck = (check) => check.kind === "call" && check.comparator === "lte";
var isEQCheck = (check) => check.kind === "call" && check.comparator === "eq";
// src/descriptor.ts
var import_effect3 = require("effect");
// src/hexPatterns.ts
var BYTES32_LOWER_HEX = /^0x[0-9a-f]{64}$/;
// src/descriptor.ts
var Bytes32HexSchema = import_effect3.Schema.String.pipe(
import_effect3.Schema.pattern(BYTES32_LOWER_HEX)
);
var AssertedErc20BalanceGteSpecSchema = import_effect3.Schema.Struct({
kind: import_effect3.Schema.Literal("erc20BalanceGte"),
chainId: ChainIdSchema,
token: HexStringSchema,
owner: AssertionOwnerSchema,
minAmount: import_effect3.Schema.String
});
var AssertedNativeBalanceGteSpecSchema = import_effect3.Schema.Struct({
kind: import_effect3.Schema.Literal("nativeBalanceGte"),
chainId: ChainIdSchema,
owner: AssertionOwnerSchema,
minAmount: import_effect3.Schema.String
});
var RawAssertedPredicateSchema = import_effect3.Schema.Union(
AssertedErc20BalanceGteSpecSchema,
AssertedNativeBalanceGteSpecSchema,
CallCheckSpecSchema,
Erc20BalanceDeltaGteSpecSchema,
NativeBalanceDeltaGteSpecSchema
);
var AssertedPredicateSchema = import_effect3.Schema.transform(
RawAssertedPredicateSchema,
import_effect3.Schema.typeSchema(RawAssertedPredicateSchema),
{
strict: true,
decode: (pred) => pred.kind === "nativeBalanceGte" && isAsErc20Chain(pred.chainId) ? asErc20BalanceGteCheck(pred.chainId, pred.owner, pred.minAmount) : pred,
encode: (pred) => pred
}
);
var VerificationDescriptorSchema = import_effect3.Schema.Struct({
validationProgramHash: Bytes32HexSchema,
// The C5 echo's second hash (verified continuations, plan GD-8): `keccak256`
// over the canonical params vector (`paramsHash`, GD-2 seam C1). Required and
// jointly necessary with `validationProgramHash` — the program hash is
// value-blind (it never binds the delivery address or amounts), so a descriptor
// that enforces only it is a fund-redirect hole. Empty params still yield a
// present `0x00…00`, so a real descriptor never omits it. Strict 32-byte
// lowercase hex, same rule as `validationProgramHash`.
paramsHash: Bytes32HexSchema,
assertedPredicate: import_effect3.Schema.Array(AssertedPredicateSchema)
});
var canonicalJson = (value) => {
if (Array.isArray(value)) {
return `[${value.map(canonicalJson).join(",")}]`;
}
if (value !== null && typeof value === "object") {
const record = value;
const entries = Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`);
return `{${entries.join(",")}}`;
}
return JSON.stringify(value);
};
var canonicalAssertedPredicate = (specs) => canonicalJson(specs);
// src/flow.ts
var isResourceInput = (input) => "resource" in input;
var flowInputType = (input) => isResourceInput(input) ? "uint256" : input.type;
var flowInputMode = (input) => isResourceInput(input) ? "linear" : "copy";
var flowInputResource = (input) => isResourceInput(input) ? input.resource : void 0;
var isResourcePort = (port) => port.kind === "resource";
var isHandlePort = (port) => port.kind === "handle";
var isResourceOutputPort = (port) => port.kind === "resource_output";
var isFutureResourceOutput = (port) => isResourceOutputPort(port) && port.availability === "future";
var isMaterialiserInput = (s) => typeof s === "object" && s !== null && "kind" in s;
// src/resource.ts
var erc20Resource = (token, chainId) => ({
kind: "erc20",
token,
chainId
});
var nativeResource = (chainId) => ({
kind: "native",
chainId
});
var isERC20Resource = (r) => r.kind === "erc20";
var isNativeResource = (r) => r.kind === "native";
var resourcesEqual = (a, b) => {
if (isNativeResource(a) && isNativeResource(b)) {
return a.chainId === b.chainId;
}
if (isERC20Resource(a) && isERC20Resource(b)) {
return a.chainId === b.chainId && a.token.toLowerCase() === b.token.toLowerCase();
}
return false;
};
var foldResource = (r, cases) => r.kind === "native" ? cases.native(r.chainId) : cases.erc20(r.token, r.chainId);
var resourceToken = (r) => foldResource(r, {
native: () => EVM_NATIVE_SENTINEL,
erc20: (token) => token
});
var resourceKey = (r) => foldResource(r, {
native: (chainId) => `native:${chainId}`,
erc20: (token, chainId) => `erc20:${token.toLowerCase()}:${chainId}`
});
var erc20Token = (r) => {
if (r.kind !== "erc20")
throw new Error(`Expected erc20 resource, got ${r.kind}`);
return r.token;
};
// src/flashloan.ts
var PROVIDER_KIND = {
AAVE_V3: 0,
ERC3156: 1,
BALANCER_V2: 2,
MORPHO_BLUE: 3
};
var providerKindNames = [
"aave-v3",
"erc3156",
"balancer-v2",
"morpho-blue"
];
var providerKindByName = {
"aave-v3": PROVIDER_KIND.AAVE_V3,
erc3156: PROVIDER_KIND.ERC3156,
"balancer-v2": PROVIDER_KIND.BALANCER_V2,
"morpho-blue": PROVIDER_KIND.MORPHO_BLUE
};
// src/constructors.ts
var inputRef = (port) => ({ $ref: `input.${port}` });
var outputRef = (node, port) => ({
$ref: `${node}.${port}`
});
var optionalProp = (key, value) => value !== void 0 && value !== null ? { [key]: value } : {};
var linear = (name, type) => ({
name,
type,
mode: "linear",
availability: "now"
});
var copy = (name, type) => ({
name,
type,
mode: "copy",
availability: "now"
});
var handle = (name, type) => ({ name, type });
var native = (name, chainId) => ({
name,
resource: nativeResource(chainId)
});
var erc20 = (name, token, chainId) => ({
name,
resource: erc20Resource(token, chainId)
});
var resource = (name, accepts, options) => ({
kind: "resource",
name,
accepts,
mode: "linear",
...optionalProp("optional", options?.optional)
});
var readResource = (name, accepts) => ({
kind: "resource",
name,
accepts,
mode: "copy"
});
var opHandle = (name, type, options) => ({
kind: "handle",
name,
type,
mode: "copy",
...optionalProp("expose", options?.expose),
...optionalProp("units", options?.units),
...optionalProp("optional", options?.optional)
});
var resourceOutput = (name, options) => {
const raw = options;
const opts = typeof raw === "string" ? { availability: raw } : raw;
return {
kind: "resource_output",
name,
mode: "linear",
...optionalProp("availability", opts?.availability),
...optionalProp("providesMinimum", opts?.providesMinimum),
...optionalProp("omitIfZero", opts?.omitIfZero),
...optionalProp("deliveryAddressInput", opts?.deliveryAddressInput)
};
};
// src/ref.ts
var isContextKey = (key) => key === "sender" || key === "executionAddress";
var RESERVED_REF_SCOPES = /* @__PURE__ */ new Set([
"input",
"context",
"literal"
]);
var isRef = (v) => typeof v === "object" && v !== null && "$ref" in v && typeof v.$ref === "string";
var parseRef = (ref) => {
const dot = ref.$ref.indexOf(".");
if (dot === -1)
throw new Error(`Invalid ref: "${ref.$ref}" (must contain a dot)`);
const prefix = ref.$ref.slice(0, dot);
const suffix = ref.$ref.slice(dot + 1);
if (prefix === "input") return { scope: "input", port: suffix };
if (prefix === "context") {
if (!isContextKey(suffix))
throw new Error(`Unknown context key: "${suffix}"`);
return { scope: "context", key: suffix };
}
return { scope: "output", node: prefix, port: suffix };
};
var foldRef = (ref, cases) => {
if (ref.scope === "input") return cases.input(ref.port);
if (ref.scope === "context") return cases.context(ref.key);
return cases.output(ref.node, ref.port);
};
var refKey = (ref) => foldRef(parseRef(ref), {
input: (port) => `input:${port}`,
context: (key) => `context:${key}`,
output: (node, port) => `output:${node}:${port}`
});
// src/preconditions.ts
var erc20Balance = (config) => ({ type: "Erc20Balance", ...config });
var nativeBalance = (config) => ({ type: "NativeBalance", ...config });
var erc20Allowance = (config) => ({ type: "Erc20Allowance", ...config });
var isErc20AllowancePrecondition = (p) => p.type === "Erc20Allowance";
var isNativeBalancePrecondition = (p) => p.type === "NativeBalance";
// src/simulate.ts
var SIMULATE_MAX_TRACKED_BALANCES = 40;
var SIMULATE_MAX_REQUIREMENTS = 40;
// src/materialiserMetadata.ts
var foldMaterialiserMetadata = (meta, cases) => {
if (meta.kind === "exact") return cases.exact(meta.amount);
if (meta.kind === "exact-native") return cases.exactNative(meta.amount);
return cases.runtime();
};
// src/zodSchemas.ts
var import_zod = __toESM(require("zod"), 1);
var chainIdZod = import_zod.default.number().int().positive();
var SolTypeZod = import_zod.default.enum([
"uint8",
"uint16",
"uint32",
"uint64",
"uint128",
"uint256",
"int128",
"int256",
"address",
"bool",
"bytes",
"bytes4",
"bytes32",
"string"
]);
var ResourcePortZod = import_zod.default.object({
kind: import_zod.default.literal("resource"),
name: import_zod.default.string(),
accepts: import_zod.default.enum(["erc20", "native", "any"]),
mode: import_zod.default.enum(["linear", "copy"]),
optional: import_zod.default.boolean().optional()
});
var HANDLE_UNITS = [
"raw",
"wad",
"ray",
"bps",
"token-decimals"
];
var STATIC_SOL_TYPES = [
"uint256",
"uint128",
"uint64",
"uint32",
"uint16",
"uint8",
"address",
"bool",
"bytes32"
];
var HandleUnitsZod = import_zod.default.enum(HANDLE_UNITS);
var StaticSolTypeZod = import_zod.default.enum(STATIC_SOL_TYPES);
var STATIC_SOL_TYPE_SET = new Set(STATIC_SOL_TYPES);
var isStaticSolType = (value) => STATIC_SOL_TYPE_SET.has(value);
var HandlePortZod = import_zod.default.object({
kind: import_zod.default.literal("handle"),
name: import_zod.default.string(),
type: SolTypeZod,
mode: import_zod.default.enum(["linear", "copy"]),
expose: import_zod.default.boolean().optional(),
units: HandleUnitsZod.optional(),
optional: import_zod.default.boolean().optional()
});
var InputPortZod = import_zod.default.discriminatedUnion("kind", [
ResourcePortZod,
HandlePortZod
]);
var ResourceOutputPortZod = import_zod.default.object({
kind: import_zod.default.literal("resource_output"),
name: import_zod.default.string(),
mode: import_zod.default.enum(["linear", "copy"]),
availability: import_zod.default.enum(["now", "future"]).optional(),
providesMinimum: import_zod.default.boolean().optional(),
omitIfZero: import_zod.default.boolean().optional(),
deliveryAddressInput: import_zod.default.string().optional()
});
var OutputPortZod = import_zod.default.discriminatedUnion("kind", [
ResourceOutputPortZod,
HandlePortZod
]);
var ManifestOperationZod = import_zod.default.object({
id: import_zod.default.string(),
description: import_zod.default.string().optional(),
inputs: import_zod.default.array(InputPortZod),
outputs: import_zod.default.array(OutputPortZod),
configSchema: import_zod.default.unknown().optional()
});
var PortKindEnum = import_zod.default.enum(["resource", "resource_output", "handle"]);
var SelectorMatchZod = import_zod.default.object({
kind: import_zod.default.union([PortKindEnum, import_zod.default.array(PortKindEnum)]),
mode: import_zod.default.enum(["linear", "copy"]).optional(),
type: import_zod.default.enum(["erc20", "native", "any"]).optional()
});
var ConfigSelectionZod = import_zod.default.object({
kind: import_zod.default.literal("config"),
configKey: import_zod.default.string(),
cardinality: import_zod.default.enum(["one", "many"])
});
var AllMatchingSelectionZod = import_zod.default.object({
kind: import_zod.default.literal("all_matching")
});
var SelectorSelectionZod = import_zod.default.discriminatedUnion("kind", [
ConfigSelectionZod,
AllMatchingSelectionZod
]);
var GuardSelectorZod = import_zod.default.object({
binding: import_zod.default.string(),
source: import_zod.default.enum(["inputs", "outputs"]),
match: SelectorMatchZod,
selection: SelectorSelectionZod
});
var GuardCompatibilityZod = import_zod.default.object({
selectors: import_zod.default.array(GuardSelectorZod)
});
var ManifestGuardZod = import_zod.default.object({
kind: import_zod.default.string(),
description: import_zod.default.string().optional(),
configSchema: import_zod.default.unknown().optional(),
compatibility: GuardCompatibilityZod.optional()
});
var ManifestMaterialiserZod = import_zod.default.object({
kind: import_zod.default.string(),
description: import_zod.default.string().optional(),
accepts: import_zod.default.enum(["resource", "handle", "any"]),
configSchema: import_zod.default.unknown().optional()
});
var ManifestPreconditionZod = import_zod.default.object({
type: import_zod.default.string(),
description: import_zod.default.string().optional(),
configSchema: import_zod.default.unknown().optional()
});
var ComposeManifestZod = import_zod.default.object({
manifestVersion: import_zod.default.number(),
manifestHash: import_zod.default.string(),
flowSchema: import_zod.default.object({}).passthrough(),
operations: import_zod.default.array(ManifestOperationZod),
guards: import_zod.default.array(ManifestGuardZod),
materialisers: import_zod.default.array(ManifestMaterialiserZod),
preconditions: import_zod.default.array(ManifestPreconditionZod).optional()
});
var Phase1ArtifactZod = import_zod.default.discriminatedUnion("kind", [
import_zod.default.object({
kind: import_zod.default.literal("transaction"),
transactionRequest: import_zod.default.object({
to: import_zod.default.string(),
data: import_zod.default.string(),
value: import_zod.default.string()
}).optional()
}),
import_zod.default.object({
kind: import_zod.default.literal("signables"),
typedData: import_zod.default.array(import_zod.default.unknown())
}),
import_zod.default.object({
kind: import_zod.default.literal("none")
})
]);
var hexStringZod = import_zod.default.string().startsWith("0x");
var assertionOwnerZod = import_zod.default.union([
hexStringZod,
import_zod.default.enum(["escrow", "delivery"])
]);
var CheckZod = import_zod.default.discriminatedUnion("kind", [
import_zod.default.object({
kind: import_zod.default.literal("erc20BalanceGte"),
chainId: chainIdZod,
token: hexStringZod,
owner: hexStringZod,
minAmount: import_zod.default.string()
}),
import_zod.default.object({
kind: import_zod.default.literal("nativeBalanceGte"),
chainId: chainIdZod,
owner: hexStringZod,
minAmount: import_zod.default.string()
}),
import_zod.default.object({
kind: import_zod.default.literal("call"),
chainId: chainIdZod,
to: hexStringZod,
calldata: hexStringZod,
comparator: import_zod.default.enum(["gte", "eq", "lte"]),
value: import_zod.default.string()
})
]);
var AssertionSpecZod = import_zod.default.discriminatedUnion("kind", [
...CheckZod.options,
import_zod.default.object({
kind: import_zod.default.literal("erc20BalanceDeltaGte"),
chainId: import_zod.default.number().int().positive(),
token: hexStringZod,
owner: assertionOwnerZod,
minDelta: import_zod.default.string()
}),
import_zod.default.object({
kind: import_zod.default.literal("nativeBalanceDeltaGte"),
chainId: import_zod.default.number().int().positive(),
owner: assertionOwnerZod,
minDelta: import_zod.default.string()
})
]);
var assertionSpecOptionByKind = (kind) => {
const option = AssertionSpecZod.options.find(
(o) => o.shape.kind.value === kind
);
if (option === void 0) {
throw new Error(`AssertionSpecZod has no member with kind "${kind}"`);
}
return option;
};
var AssertedPredicateZod = import_zod.default.discriminatedUnion("kind", [
import_zod.default.object({
kind: import_zod.default.literal("erc20BalanceGte"),
chainId: import_zod.default.number().int().positive(),
token: hexStringZod,
owner: assertionOwnerZod,
minAmount: import_zod.default.string()
}),
import_zod.default.object({
kind: import_zod.default.literal("nativeBalanceGte"),
chainId: import_zod.default.number().int().positive(),
owner: assertionOwnerZod,
minAmount: import_zod.default.string()
}),
assertionSpecOptionByKind("call"),
assertionSpecOptionByKind("erc20BalanceDeltaGte"),
assertionSpecOptionByKind("nativeBalanceDeltaGte")
]);
var VerificationDescriptorZod = import_zod.default.object({
validationProgramHash: import_zod.default.string().regex(BYTES32_LOWER_HEX),
// The C5 echo's second hash (GD-8): the params-vector content hash
// (`paramsHash`, C1). Required and jointly necessary with the value-blind
// `validationProgramHash`.
paramsHash: import_zod.default.string().regex(BYTES32_LOWER_HEX),
assertedPredicate: import_zod.default.array(AssertedPredicateZod)
});
var ContinuationPlanZod = import_zod.default.object({
chainId: chainIdZod,
nextFlow: import_zod.default.unknown(),
check: CheckZod,
validity: import_zod.default.object({ expiresAtMs: import_zod.default.number() }),
correlationId: import_zod.default.string().optional()
});
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
AppliedGuardSchema,
AssertedErc20BalanceGteSpecSchema,
AssertedNativeBalanceGteSpecSchema,
AssertedPredicateSchema,
AssertedPredicateZod,
AssertionOwnerSchema,
AssertionSpecSchema,
AssertionSpecZod,
BindValueSchema,
Bytes32HexSchema,
CONTINUATION_COMMITMENT_OP_ID,
CallCheckSpecSchema,
CallSchema,
CheckSchema,
CheckZod,
ComposeManifestZod,
ContinuationIntentSchema,
ContinuationOutcomeSchema,
ContinuationPlanSchema,
ContinuationPlanZod,
ContinuationSchema,
EVM_NATIVE_SENTINEL,
Erc20BalanceDeltaGteSpecSchema,
Erc20BalanceGteSpecSchema,
FlowInputSchema,
FlowSchema,
GuardCompatibilityZod,
GuardSelectorZod,
HANDLE_UNITS,
HandleInputSchema,
HandlePortZod,
HandleUnitsZod,
HexStringSchema,
InputPortZod,
LiteralBindingSchema,
ManifestGuardZod,
ManifestMaterialiserZod,
ManifestOperationZod,
ManifestPreconditionZod,
NativeBalanceDeltaGteSpecSchema,
NativeBalanceGteSpecSchema,
OutputPortZod,
PROVIDER_KIND,
Phase1ArtifactSchema,
Phase1ArtifactZod,
RESERVED_REF_SCOPES,
RefSchema,
ResourceInputSchema,
ResourceOutputPortZod,
ResourcePortZod,
ResourceSchema,
SIMULATE_MAX_REQUIREMENTS,
SIMULATE_MAX_TRACKED_BALANCES,
STATIC_SOL_TYPES,
SolTypeSchema,
StaticSolTypeZod,
TEMPO_CHAIN_ID,
TEMPO_NATIVE_ERC20,
VerificationDescriptorSchema,
VerificationDescriptorZod,
canonicalAssertedPredicate,
canonicalNativeAddress,
copy,
erc20,
erc20Allowance,
erc20Balance,
erc20Resource,
erc20Token,
flowInputMode,
flowInputResource,
flowInputType,
foldMaterialiserMetadata,
foldRef,
foldResource,
getChainCapabilities,
handle,
inputRef,
isAsErc20Chain,
isContextKey,
isEQCheck,
isERC20Resource,
isErc20AllowancePrecondition,
isFutureResourceOutput,
isGTECheck,
isHandlePort,
isLTECheck,
isMaterialiserInput,
isMsgValueNative,
isNativeAddressForChain,
isNativeBalancePrecondition,
isNativeResource,
isRef,
isResourceInput,
isResourceOutputPort,
isResourcePort,
isStaticSolType,
linear,
native,
nativeBalance,
nativeResource,
normalizeNativeTokenAddress,
normalizeResource,
opHandle,
outputRef,
parseRef,
providerKindByName,
providerKindNames,
readResource,
refKey,
resource,
resourceKey,
resourceOutput,
resourceToken,
resourcesEqual
});