UNPKG

@lifi/compose-spec

Version:

Public wire-format types and schemas for Compose flows

526 lines (516 loc) 17.6 kB
"use strict"; 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, BindValueSchema: () => BindValueSchema, CallSchema: () => CallSchema, ComposeManifestZod: () => ComposeManifestZod, ContinuationSchema: () => ContinuationSchema, FlowInputSchema: () => FlowInputSchema, FlowSchema: () => FlowSchema, GuardCompatibilityZod: () => GuardCompatibilityZod, GuardSelectorZod: () => GuardSelectorZod, HANDLE_UNITS: () => HANDLE_UNITS, HandleInputSchema: () => HandleInputSchema, HandlePortZod: () => HandlePortZod, HandleUnitsZod: () => HandleUnitsZod, InputPortZod: () => InputPortZod, LiteralBindingSchema: () => LiteralBindingSchema, ManifestGuardZod: () => ManifestGuardZod, ManifestMaterialiserZod: () => ManifestMaterialiserZod, ManifestOperationZod: () => ManifestOperationZod, ManifestPreconditionZod: () => ManifestPreconditionZod, OutputPortZod: () => OutputPortZod, PROVIDER_KIND: () => PROVIDER_KIND, RESERVED_REF_SCOPES: () => RESERVED_REF_SCOPES, RefSchema: () => RefSchema, ResourceInputSchema: () => ResourceInputSchema, ResourceOutputPortZod: () => ResourceOutputPortZod, ResourcePortZod: () => ResourcePortZod, ResourceSchema: () => ResourceSchema, STATIC_SOL_TYPES: () => STATIC_SOL_TYPES, SolTypeSchema: () => SolTypeSchema, StaticSolTypeZod: () => StaticSolTypeZod, copy: () => copy, erc20: () => erc20, erc20Resource: () => erc20Resource, erc20Token: () => erc20Token, flowInputMode: () => flowInputMode, flowInputResource: () => flowInputResource, flowInputType: () => flowInputType, foldMaterialiserMetadata: () => foldMaterialiserMetadata, foldRef: () => foldRef, foldResource: () => foldResource, handle: () => handle, inputRef: () => inputRef, isContextKey: () => isContextKey, isERC20Resource: () => isERC20Resource, isHandlePort: () => isHandlePort, isMaterialiserInput: () => isMaterialiserInput, isNativeResource: () => isNativeResource, isRef: () => isRef, isResourceInput: () => isResourceInput, isResourceOutputPort: () => isResourceOutputPort, isResourcePort: () => isResourcePort, isStaticSolType: () => isStaticSolType, linear: () => linear, native: () => native, nativeResource: () => nativeResource, opHandle: () => opHandle, outputRef: () => outputRef, parseRef: () => parseRef, providerKindByName: () => providerKindByName, providerKindNames: () => providerKindNames, readResource: () => readResource, refKey: () => refKey, resource: () => resource, resourceKey: () => resourceKey, resourceOutput: () => resourceOutput, resourcesEqual: () => resourcesEqual }); module.exports = __toCommonJS(index_exports); // src/flowSchema.ts var import_effect = require("effect"); 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 ResourceSchema = 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 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), continuation: import_effect.Schema.optional(ContinuationSchema) }); // 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 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 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 != 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) }); var resourceOutput = (name, options) => { const opts = typeof options === "string" ? { availability: options } : options; 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/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 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() }); 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() }); // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AppliedGuardSchema, BindValueSchema, CallSchema, ComposeManifestZod, ContinuationSchema, FlowInputSchema, FlowSchema, GuardCompatibilityZod, GuardSelectorZod, HANDLE_UNITS, HandleInputSchema, HandlePortZod, HandleUnitsZod, InputPortZod, LiteralBindingSchema, ManifestGuardZod, ManifestMaterialiserZod, ManifestOperationZod, ManifestPreconditionZod, OutputPortZod, PROVIDER_KIND, RESERVED_REF_SCOPES, RefSchema, ResourceInputSchema, ResourceOutputPortZod, ResourcePortZod, ResourceSchema, STATIC_SOL_TYPES, SolTypeSchema, StaticSolTypeZod, copy, erc20, erc20Resource, erc20Token, flowInputMode, flowInputResource, flowInputType, foldMaterialiserMetadata, foldRef, foldResource, handle, inputRef, isContextKey, isERC20Resource, isHandlePort, isMaterialiserInput, isNativeResource, isRef, isResourceInput, isResourceOutputPort, isResourcePort, isStaticSolType, linear, native, nativeResource, opHandle, outputRef, parseRef, providerKindByName, providerKindNames, readResource, refKey, resource, resourceKey, resourceOutput, resourcesEqual });