From 63c09a4eb705faafc0b79fc41854d1edb5e5194c Mon Sep 17 00:00:00 2001 From: Hernan Rajchert Date: Tue, 8 Aug 2023 11:50:02 -0300 Subject: [PATCH] Wip-fix e2e test build --- Readme.md | 28 +++++--- jest.config-deprecated.js | 49 ------------- jest.config.console-deprecated.js | 1 - .../language/core/v1/src/examples/index.ts | 1 + .../v1/src/semantics/contract/common/token.ts | 2 +- .../semantics/contract/common/tokenValue.ts | 5 +- .../core/v1/src/semantics/contract/index.ts | 9 ++- .../core/v1/src/semantics/next/index.ts | 1 + packages/legacy-runtime/package.json | 8 ++- .../legacy-runtime/src/contract/details.ts | 9 ++- .../src/contract/endpoints/collection.ts | 23 +++--- packages/legacy-runtime/src/contract/role.ts | 4 +- .../src/contract/transaction/details.ts | 12 ++-- .../transaction/endpoints/collection.ts | 8 +-- .../src/contract/transaction/header.ts | 5 +- .../src/contract/transaction/index.ts | 1 + .../src/runtimeSingleAddress.ts | 2 +- .../src/wallet/singleAddress/index.ts | 12 ++-- packages/legacy-runtime/test/context.ts | 9 ++- .../test/endpoints/contracts.spec.e2e.ts | 19 +++-- .../test/endpoints/transactions.spec.e2e.ts | 49 +++++++------ .../test/endpoints/withdrawals.spec.e2e.ts | 24 +++---- .../test/examples/swap.ada.token.spec.e2e.ts | 21 +++--- .../legacy-runtime/test/jest.e2e.config.mjs | 28 ++++++++ packages/legacy-runtime/test/provisionning.ts | 72 +++++++++---------- packages/legacy-runtime/test/tsconfig.json | 18 +++++ test/global.d.ts | 3 - test/tsconfig.json | 8 --- 28 files changed, 216 insertions(+), 215 deletions(-) delete mode 100644 jest.config-deprecated.js delete mode 100644 jest.config.console-deprecated.js create mode 100644 packages/legacy-runtime/src/contract/transaction/index.ts create mode 100644 packages/legacy-runtime/test/jest.e2e.config.mjs create mode 100644 packages/legacy-runtime/test/tsconfig.json delete mode 100644 test/global.d.ts delete mode 100644 test/tsconfig.json diff --git a/Readme.md b/Readme.md index ace9f960..404a6b4b 100644 --- a/Readme.md +++ b/Readme.md @@ -1,17 +1,26 @@ +# WIP WARNING +> The TypeScript SDK is a work in progress, it's API might change so use with caution. + # Marlowe TS-SDK -TODO +The Marlowe TypeScript SDK is a set of libraries and utilities to work with Marlowe contracts. The project uses [npm workspaces](https://docs.npmjs.com/cli/v7/using-npm/workspaces) to divide itself in the following packages: + +* `language/core/v1`: The `@marlowe/language-core-v1` library that contains the core Marlowe language definitions and utilities. +* `legacy-adapter`: The `@marlowe/legacy-adapter` library that contains common utilities. +* `legacy-runtime`: The `@marlowe/legacy-runtime` library that contains the initial abstraction over the Marlowe runtime ## Developer notes ### Build -To build all packages +In order to start develop the SDK you need to install the dependencies and build the packages. ``` +$ npm i $ npm run build ``` -To build a single package +If you want to build a single package you can use the `-w` flag or execute the build command from the package folder. + ``` # From the root folder $ npm run build -w @marlowe/language-core-v1 @@ -20,20 +29,21 @@ $ cd packages/language/core/v1 $ npm run build ``` -To clean all packages +In order to clean the build artifacts you can use the `clean` command. ``` $ npm run clean ``` +To run the unit test you can execute the `test` command. -TODO migrage - "test": "yarn node --experimental-vm-modules $(yarn bin jest -c ./jest.config.js)" - - -### Run tests +``` +$ npm run test +``` +### E2E tests +TODO: Fix the E2E tests In order to run the E2E tests you need to create a `env/.env.test` file that points to a working version of the marlowe runtime and a working Blockfrost instance and a faucet PK TODO: explain how to get the Faucet PK diff --git a/jest.config-deprecated.js b/jest.config-deprecated.js deleted file mode 100644 index d6bfb2b7..00000000 --- a/jest.config-deprecated.js +++ /dev/null @@ -1,49 +0,0 @@ -module.exports = { - - projects: [ - { - displayName: "e2e test", - testMatch: ["./**/*.spec.e2e.ts"], - runner: "jest-serial-runner", - extensionsToTreatAsEsm: ['.ts'], - preset: 'ts-jest/presets/default-esm', - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1' - }, - globalSetup: "./dotenv/dotenv-test.js", - setupFilesAfterEnv: ["./jest.config.console.js"], - transform: { - // '^.+\\.[tj]sx?$' to process js/ts with `ts-jest` - // '^.+\\.m?[tj]sx?$' to process js/ts/mjs/mts with `ts-jest` - '^.+\\.m?[tj]sx?$': [ - 'ts-jest', - { - useESM: true, - }, - ], - }, - }, - { - displayName: "unit test", - testMatch: ["./**/*.spec.ts"], - extensionsToTreatAsEsm: ['.ts'], - preset: 'ts-jest/presets/default-esm', - moduleNameMapper: { - '^(\\.{1,2}/.*)\\.js$': '$1' - }, - globalSetup: "./dotenv/dotenv-test.js", - setupFilesAfterEnv: ["./jest.config.console.js"], - transform: { - // '^.+\\.[tj]sx?$' to process js/ts with `ts-jest` - // '^.+\\.m?[tj]sx?$' to process js/ts/mjs/mts with `ts-jest` - '^.+\\.m?[tj]sx?$': [ - 'ts-jest', - { - useESM: true, - }, - ], - }, - } - ] -}; - diff --git a/jest.config.console-deprecated.js b/jest.config.console-deprecated.js deleted file mode 100644 index 6dddd4f1..00000000 --- a/jest.config.console-deprecated.js +++ /dev/null @@ -1 +0,0 @@ -global.console = require('console'); \ No newline at end of file diff --git a/packages/language/core/v1/src/examples/index.ts b/packages/language/core/v1/src/examples/index.ts index f3029d0b..7786a79d 100644 --- a/packages/language/core/v1/src/examples/index.ts +++ b/packages/language/core/v1/src/examples/index.ts @@ -1,4 +1,5 @@ export * as SwapADAToken from './swaps/swap-token-token.js'; +export {oneNotifyTrue} from './contract-one-notify.js'; diff --git a/packages/language/core/v1/src/semantics/contract/common/token.ts b/packages/language/core/v1/src/semantics/contract/common/token.ts index 12d2bdca..aa3c0ffb 100644 --- a/packages/language/core/v1/src/semantics/contract/common/token.ts +++ b/packages/language/core/v1/src/semantics/contract/common/token.ts @@ -11,7 +11,7 @@ export const Token = t.type({currency_symbol:PolicyId,token_name:TokenName}) export const token = (currency_symbol :PolicyId,token_name: TokenName) => ({ currency_symbol: currency_symbol, token_name: token_name }) -export const toString : (token : Token) => string = (token) => `${token.currency_symbol}|${token.token_name}` +export const tokenToString : (token : Token) => string = (token) => `${token.currency_symbol}|${token.token_name}` export const lovelaceToken : Token = token('','') export const adaToken: Token = lovelaceToken diff --git a/packages/language/core/v1/src/semantics/contract/common/tokenValue.ts b/packages/language/core/v1/src/semantics/contract/common/tokenValue.ts index bfa345d0..81264020 100644 --- a/packages/language/core/v1/src/semantics/contract/common/tokenValue.ts +++ b/packages/language/core/v1/src/semantics/contract/common/tokenValue.ts @@ -1,10 +1,7 @@ import * as t from "io-ts" -import { PolicyId } from "./policyId.js"; import * as T from "./token.js"; - - -export const toString : (token : TokenValue) => string = (tokenValue) => `${tokenValue.amount} - ${T.toString(tokenValue.token)}` +export const toString : (token : TokenValue) => string = (tokenValue) => `${tokenValue.amount} - ${T.tokenToString(tokenValue.token)}` export type TokenValue = t.TypeOf diff --git a/packages/language/core/v1/src/semantics/contract/index.ts b/packages/language/core/v1/src/semantics/contract/index.ts index ddf4a707..1d81411b 100644 --- a/packages/language/core/v1/src/semantics/contract/index.ts +++ b/packages/language/core/v1/src/semantics/contract/index.ts @@ -8,14 +8,19 @@ import { Let } from "./let.js"; import { Pay } from "./pay.js"; import { When } from "./when/index.js"; export { Assert } from "./assert.js"; -export { Close } from "./close.js"; +export { Close, close } from "./close.js"; export { If } from "./if.js"; export { Let } from "./let.js"; export { Pay } from "./pay.js"; -export { When } from "./when/index.js"; +export { When, datetoTimeout } from "./when/index.js"; export { Action } from "./when/action/index.js"; +export { inputNotify } from "./when/input/notify.js"; +export { Input, BuiltinByteString } from "./when/input/index.js"; export { Value } from "./common/value.js"; export { Accounts } from "./common/payee/account.js"; +export { Token, TokenName, tokenToString, token } from './common/token.js'; +export { TokenValue, tokenValue, adaValue } from './common/tokenValue.js'; +export { PolicyId } from './common/policyId.js'; export type Contract = | Close diff --git a/packages/language/core/v1/src/semantics/next/index.ts b/packages/language/core/v1/src/semantics/next/index.ts index 63f5563a..4b64fd62 100644 --- a/packages/language/core/v1/src/semantics/next/index.ts +++ b/packages/language/core/v1/src/semantics/next/index.ts @@ -1,5 +1,6 @@ import * as t from "io-ts"; import { ApplicableInputs } from "./applicables/index.js"; +export { toInput } from "./applicables/canDeposit.js"; export type Next = t.TypeOf export const Next diff --git a/packages/legacy-runtime/package.json b/packages/legacy-runtime/package.json index 0d8b5219..325d4b99 100644 --- a/packages/legacy-runtime/package.json +++ b/packages/legacy-runtime/package.json @@ -15,14 +15,18 @@ "scripts": { "build": "tsc --build src", "clean": "tsc --build --clean src", - "test": "echo 'runtime test'" + "test": "echo 'The legact runtime doesnt have unit tests'", + "test:e2e": "NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest --config test/jest.e2e.config.mjs", + "build:e2e": "tsc --build test" }, "type": "module", "exports": { ".": "./dist/index.js", "./restAPI": "./dist/restAPI.js", "./runtimeCIP30": "./dist/runtimeCIP30.js", - "./runtimeSingleAddress": "./dist/runtimeSingleAddress.js" + "./runtimeSingleAddress": "./dist/runtimeSingleAddress.js", + "./transaction": "./dist/contract/transaction/index.js", + "./write/command": "./dist/write/command.js" }, "dependencies": { "@blockfrost/blockfrost-js": "5.2.0", diff --git a/packages/legacy-runtime/src/contract/details.ts b/packages/legacy-runtime/src/contract/details.ts index b572cb17..5f461fd6 100644 --- a/packages/legacy-runtime/src/contract/details.ts +++ b/packages/legacy-runtime/src/contract/details.ts @@ -1,16 +1,15 @@ - -import { ContractId } from "./id.js"; -import { TextEnvelope } from "../common/textEnvelope.js"; import { optionFromNullable } from "io-ts-types"; import * as t from "io-ts"; +import { Contract } from "@marlowe/language-core-v1"; +import { MarloweState } from "@marlowe/language-core-v1/state"; +import { ContractId } from "./id.js"; +import { TextEnvelope } from "../common/textEnvelope.js"; import { BlockHeader } from "../common/block.js"; import { MarloweVersion } from "../common/version.js"; import { PolicyId } from "../common/policyId.js"; import { Metadata } from "../common/metadata/index.js"; import { TxStatus } from "./transaction/status.js"; import { TxOutRef } from "../common/tx/outRef.js"; -import { Contract } from "@marlowe/language-core-v1/semantics/contract/index.js"; -import { MarloweState } from "@marlowe/language-core-v1/semantics/state.js"; import { RoleName } from "./role.js"; diff --git a/packages/legacy-runtime/src/contract/endpoints/collection.ts b/packages/legacy-runtime/src/contract/endpoints/collection.ts index 852844d7..5c3473b9 100644 --- a/packages/legacy-runtime/src/contract/endpoints/collection.ts +++ b/packages/legacy-runtime/src/contract/endpoints/collection.ts @@ -1,34 +1,31 @@ import { AxiosInstance, ParamEncoder, ParamsSerializerOptions } from 'axios'; +import * as t from "io-ts"; import * as TE from 'fp-ts/lib/TaskEither.js' import { pipe } from 'fp-ts/lib/function.js'; +import * as E from 'fp-ts/lib/Either.js' +import * as A from 'fp-ts/lib/Array.js' +import * as O from 'fp-ts/lib/Option.js'; import { Newtype, iso } from 'newtype-ts' +import { formatValidationErrors } from 'jsonbigint-io-ts-reporters' +import { fromNewtype, optionFromNullable } from 'io-ts-types'; +import { stringify } from 'qs'; + +import { Contract } from '@marlowe/language-core-v1'; + import * as HTTP from '../../common/http.js'; import { Header } from '../header.js'; - import { RolesConfig } from '../role.js'; - import { Metadata, Tag, Tags } from '../../common/metadata/index.js'; - import { TextEnvelope } from '../../common/textEnvelope.js'; import { ContractId } from '../id.js'; -import * as t from "io-ts"; -import { formatValidationErrors } from 'jsonbigint-io-ts-reporters' import { DecodingError } from '../../common/codec.js'; -import * as E from 'fp-ts/lib/Either.js' -import * as A from 'fp-ts/lib/Array.js' import { MarloweVersion } from '../../common/version.js'; import { unAddressBech32 } from '../../common/address.js'; - -import { fromNewtype, optionFromNullable } from 'io-ts-types'; -import * as O from 'fp-ts/lib/Option.js'; -import { Contract } from '@marlowe/language-core-v1/semantics/contract/index.js'; import { AddressesAndCollaterals } from '../../wallet/api.js'; -import { stringify } from 'qs'; import { unTxOutRef } from '../../common/tx/outRef.js'; - export interface ContractsRange extends Newtype<{ readonly ContractsRange: unique symbol }, string> {} export const ContractsRange = fromNewtype(t.string) export const unContractsRange = iso().unwrap diff --git a/packages/legacy-runtime/src/contract/role.ts b/packages/legacy-runtime/src/contract/role.ts index 45ed30af..fe118d23 100644 --- a/packages/legacy-runtime/src/contract/role.ts +++ b/packages/legacy-runtime/src/contract/role.ts @@ -1,7 +1,7 @@ -import { AddressBech32 } from "../common/address.js"; import * as t from "io-ts" -import { PolicyId } from "@marlowe/language-core-v1/semantics/contract/common/policyId.js"; import { optionFromNullable } from "io-ts-types"; +import { PolicyId } from "@marlowe/language-core-v1"; +import { AddressBech32 } from "../common/address.js"; export type RoleName = string export const RoleName = t.string diff --git a/packages/legacy-runtime/src/contract/transaction/details.ts b/packages/legacy-runtime/src/contract/transaction/details.ts index 32314ad9..0f0200fb 100644 --- a/packages/legacy-runtime/src/contract/transaction/details.ts +++ b/packages/legacy-runtime/src/contract/transaction/details.ts @@ -1,17 +1,19 @@ import { optionFromNullable } from "io-ts-types"; +import * as t from "io-ts"; + +import { ISO8601 } from "@marlowe/legacy-adapter/time"; +import { BuiltinByteString, Input } from "@marlowe/language-core-v1"; +import { MarloweState } from "@marlowe/language-core-v1/state"; +import { Contract } from "@marlowe/language-core-v1"; + import { BlockHeader } from "../../common/block.js"; import { Metadata } from "../../common/metadata/index.js"; import { ContractId } from "../id.js"; import { TransactionId } from "./id.js"; import { TxOutRef } from "../../common/tx/outRef.js"; import { TxStatus } from "./status.js"; -import * as t from "io-ts"; -import { BuiltinByteString, Input } from "@marlowe/language-core-v1/semantics/contract/when/input/index.js"; import { Tags } from "../../common/metadata/tag.js"; -import { Contract } from "@marlowe/language-core-v1/semantics/contract/index.js"; -import { MarloweState } from "@marlowe/language-core-v1/semantics/state.js"; import { TxId } from "../../common/tx/id.js"; -import { ISO8601 } from "@marlowe/legacy-adapter/time"; import { TextEnvelope } from "../../common/textEnvelope.js"; export type Details = t.TypeOf diff --git a/packages/legacy-runtime/src/contract/transaction/endpoints/collection.ts b/packages/legacy-runtime/src/contract/transaction/endpoints/collection.ts index 1e3430f4..442330c5 100644 --- a/packages/legacy-runtime/src/contract/transaction/endpoints/collection.ts +++ b/packages/legacy-runtime/src/contract/transaction/endpoints/collection.ts @@ -4,12 +4,14 @@ import * as E from 'fp-ts/lib/Either.js' import * as A from 'fp-ts/lib/Array.js' import * as O from 'fp-ts/lib/Option.js'; import * as TE from 'fp-ts/lib/TaskEither.js' +import { pipe } from 'fp-ts/lib/function.js'; import { formatValidationErrors } from "jsonbigint-io-ts-reporters"; import { fromNewtype, optionFromNullable } from 'io-ts-types'; -import { pipe } from 'fp-ts/lib/function.js'; - import { AxiosInstance } from "axios"; +import { ISO8601 } from "@marlowe/legacy-adapter/time"; +import { Input } from "@marlowe/language-core-v1"; + import * as HTTP from '../../../common/http.js'; import { unAddressBech32 } from "../../../common/address.js"; import { Metadata } from "../../../common/metadata/index.js"; @@ -17,9 +19,7 @@ import { AddressesAndCollaterals } from "../../../wallet/api.js"; import { DecodingError } from "../../../common/codec.js"; import { TextEnvelope } from "../../../common/textEnvelope.js"; import { MarloweVersion } from "../../../common/version.js"; -import { ISO8601 } from "@marlowe/legacy-adapter/time"; import { Tags } from "../../../common/metadata/tag.js"; -import { Input } from "@marlowe/language-core-v1/semantics/contract/when/input/index.js"; import { Header } from "../header.js"; import { TransactionId } from ".././id.js"; import { ContractId, unContractId } from "../../id.js"; diff --git a/packages/legacy-runtime/src/contract/transaction/header.ts b/packages/legacy-runtime/src/contract/transaction/header.ts index a7b4a64d..3c72d489 100644 --- a/packages/legacy-runtime/src/contract/transaction/header.ts +++ b/packages/legacy-runtime/src/contract/transaction/header.ts @@ -1,12 +1,13 @@ +import * as t from "io-ts"; import { optionFromNullable } from "io-ts-types"; +import { BuiltinByteString } from "@marlowe/language-core-v1"; + import { BlockHeader } from "../../common/block.js"; import { Metadata } from "../../common/metadata/index.js"; import { ContractId } from "../id.js"; import { TransactionId } from "./id.js"; import { TxOutRef } from "../../common/tx/outRef.js"; import { TxStatus } from "./status.js"; -import * as t from "io-ts"; -import { BuiltinByteString } from "@marlowe/language-core-v1/semantics/contract/when/input/index.js"; import { Tags } from "../../common/metadata/tag.js"; export type Header = t.TypeOf diff --git a/packages/legacy-runtime/src/contract/transaction/index.ts b/packages/legacy-runtime/src/contract/transaction/index.ts new file mode 100644 index 00000000..4315bd62 --- /dev/null +++ b/packages/legacy-runtime/src/contract/transaction/index.ts @@ -0,0 +1 @@ +export * from "./id.js" \ No newline at end of file diff --git a/packages/legacy-runtime/src/runtimeSingleAddress.ts b/packages/legacy-runtime/src/runtimeSingleAddress.ts index 73d041aa..2b50e5cc 100644 --- a/packages/legacy-runtime/src/runtimeSingleAddress.ts +++ b/packages/legacy-runtime/src/runtimeSingleAddress.ts @@ -4,7 +4,7 @@ import { pipe } from 'fp-ts/lib/function.js'; import * as S from './wallet/singleAddress/index.js'; import { mkRuntime, Runtime } from './index.js'; - +export {Context, SingleAddressWallet, PrivateKeysAsHex, getPrivateKeyFromHexString} from './wallet/singleAddress/index.js'; export const mkRuntimeSingleAddress diff --git a/packages/legacy-runtime/src/wallet/singleAddress/index.ts b/packages/legacy-runtime/src/wallet/singleAddress/index.ts index 859965f2..0cebefc7 100644 --- a/packages/legacy-runtime/src/wallet/singleAddress/index.ts +++ b/packages/legacy-runtime/src/wallet/singleAddress/index.ts @@ -1,17 +1,19 @@ -import { pipe } from 'fp-ts/lib/function.js'; -import * as A from 'fp-ts/lib/Array.js'; import * as API from '@blockfrost/blockfrost-js' import { Blockfrost, Lucid, C, Network, PrivateKey, PolicyId, getAddressDetails, toUnit, fromText, NativeScript, Tx , TxSigned, TxComplete, Script, fromHex, toHex, Core, fromUnit, Unit } from 'lucid-cardano'; +import * as A from 'fp-ts/lib/Array.js'; +import { pipe } from 'fp-ts/lib/function.js'; import * as O from 'fp-ts/lib/Option.js' -import { log } from '@marlowe/legacy-adapter/logging' import * as TE from 'fp-ts/lib/TaskEither.js' import * as T from 'fp-ts/lib/Task.js' + +import { Token, token, TokenValue, adaValue, tokenValue } from '@marlowe/language-core-v1'; +import { log } from '@marlowe/legacy-adapter/logging' + import { WalletAPI } from '../api.js'; import { addressBech32, AddressBech32, unAddressBech32 } from '../../common/address.js'; import { HexTransactionWitnessSet , MarloweTxCBORHex} from '../../common/textEnvelope.js'; import { TxOutRef } from '../../common/tx/outRef.js'; -import { Token, token } from '@marlowe/language-core-v1/semantics/contract/common/token.js'; -import { TokenValue, adaValue, tokenValue } from '@marlowe/language-core-v1/semantics/contract/common/tokenValue.js'; +export { PrivateKeysAsHex } from "./privateKeys.js"; export type Address = string; diff --git a/packages/legacy-runtime/test/context.ts b/packages/legacy-runtime/test/context.ts index 44952c2e..2c7b80c6 100644 --- a/packages/legacy-runtime/test/context.ts +++ b/packages/legacy-runtime/test/context.ts @@ -1,5 +1,5 @@ import { Network } from "lucid-cardano"; -import { Context, getPrivateKeyFromHexString } from "../../src/wallet/singleAddress"; +import { Context, getPrivateKeyFromHexString } from '@marlowe/legacy-runtime/runtimeSingleAddress'; export function getBlockfrostContext () : Context { @@ -8,15 +8,14 @@ export function getBlockfrostContext () : Context { , BLOCKFROST_URL as string , NETWORK_ID as Network); }; - + export function getBankPrivateKey () : string { const { BANK_PK_HEX } = process.env; return getPrivateKeyFromHexString(BANK_PK_HEX as string) } - + export function getMarloweRuntimeUrl () : string { const { MARLOWE_WEB_SERVER_URL} = process.env; return MARLOWE_WEB_SERVER_URL as string }; - - \ No newline at end of file + diff --git a/packages/legacy-runtime/test/endpoints/contracts.spec.e2e.ts b/packages/legacy-runtime/test/endpoints/contracts.spec.e2e.ts index 4ed59100..661b2f07 100644 --- a/packages/legacy-runtime/test/endpoints/contracts.spec.e2e.ts +++ b/packages/legacy-runtime/test/endpoints/contracts.spec.e2e.ts @@ -1,15 +1,14 @@ -import { pipe } from 'fp-ts/function' -import * as O from 'fp-ts/lib/Option'; -import * as TE from 'fp-ts/TaskEither' -import { close } from '../../../src/language/core/v1/semantics/contract/close' -import { mkRuntimeRestAPI } from '../../../src/runtime/restAPI'; -import { initialise } from '../../../src/runtime/write/command'; -import { initialiseBankAndverifyProvisionning } from '../provisionning' -import { getBankPrivateKey, getBlockfrostContext, getMarloweRuntimeUrl } from '../context'; -import { RolesConfig } from '../../../src/runtime/contract/role'; -import { unAddressBech32 } from '../../../src/runtime/common/address'; +import { pipe } from 'fp-ts/lib/function.js' +import * as TE from 'fp-ts/lib/TaskEither.js'; +import * as O from 'fp-ts/lib/Option.js'; +import { close } from '@marlowe/language-core-v1' +import { mkRuntimeRestAPI } from '@marlowe/legacy-runtime/restAPI'; +import { initialise } from '@marlowe/legacy-runtime/write/command'; + +import { initialiseBankAndverifyProvisionning } from '../provisionning.js'; +import { getBankPrivateKey, getBlockfrostContext, getMarloweRuntimeUrl } from '../context.js'; describe('contracts endpoints', () => { diff --git a/packages/legacy-runtime/test/endpoints/transactions.spec.e2e.ts b/packages/legacy-runtime/test/endpoints/transactions.spec.e2e.ts index d28234cc..8b774ca7 100644 --- a/packages/legacy-runtime/test/endpoints/transactions.spec.e2e.ts +++ b/packages/legacy-runtime/test/endpoints/transactions.spec.e2e.ts @@ -1,35 +1,34 @@ -import { pipe } from 'fp-ts/function' -import * as TE from 'fp-ts/TaskEither' -import * as O from 'fp-ts/lib/Option'; - -import { getBankPrivateKey, getBlockfrostContext, getMarloweRuntimeUrl } from '../context'; -import { addDays } from 'date-fns/fp' -import { datetoTimeout } from '../../../src/language/core/v1/semantics/contract/when' -import * as Tx from '../../../src/runtime/contract/transaction/id' +import { pipe } from 'fp-ts/lib/function.js' +import * as TE from 'fp-ts/lib/TaskEither.js' +import * as O from 'fp-ts/lib/Option.js'; +import { addDays } from 'date-fns/fp'; import { addMinutes, subMinutes } from 'date-fns' -import { datetoIso8601, datetoIso8601Bis } from '../../../src/adapter/time' -import { inputNotify } from '../../../src/language/core/v1/semantics/contract/when/input/notify' -import { initialiseBankAndverifyProvisionning } from '../provisionning' -import { oneNotifyTrue } from '../../../src/language/core/v1/examples/contract-one-notify' -import { mkRuntimeRestAPI } from '../../../src/runtime/restAPI'; + +import { datetoTimeout, inputNotify } from '@marlowe/language-core-v1'; +import { oneNotifyTrue } from '@marlowe/language-core-v1/examples' +import { datetoIso8601Bis } from '@marlowe/legacy-adapter/time' +import { mkRuntimeRestAPI } from '@marlowe/legacy-runtime/restAPI'; + +import { getBankPrivateKey, getBlockfrostContext, getMarloweRuntimeUrl } from '../context.js'; +import { initialiseBankAndverifyProvisionning } from '../provisionning.js' describe('Contracts/{contractd}/Transactions endpoints', () => { - it('can Build Apply Input Tx : ' + - '(can POST: /contracts/{contractId}/transactions => ask to build the Tx to apply input on an initialised Marlowe Contract)', async () => { - await + it('can Build Apply Input Tx : ' + + '(can POST: /contracts/{contractId}/transactions => ask to build the Tx to apply input on an initialised Marlowe Contract)', async () => { + await pipe( initialiseBankAndverifyProvisionning (mkRuntimeRestAPI(getMarloweRuntimeUrl())) (getBlockfrostContext ()) - (getBankPrivateKey()) + (getBankPrivateKey()) , TE.let (`notifyTimeout`, () => pipe(Date.now(),addDays(1),datetoTimeout)) , TE.bind('result',({runtimeRestAPI,runtime,bank,notifyTimeout}) => pipe ( runtime.initialise ( { contract: oneNotifyTrue(notifyTimeout)}) - , TE.chainW ((contractId) => + , TE.chainW ((contractId) => runtimeRestAPI.contracts.contract.transactions.post (contractId , { version : "v1" @@ -47,18 +46,18 @@ describe('Contracts/{contractd}/Transactions endpoints', () => { (e) => { console.dir(e, { depth: null }); expect(e).not.toBeDefined()}, () => {}) ) () - + },100_000), - it('can Apply Inputs : ' + - '(can POST: /contracts/{contractId}/transactions => ask to build the Tx to apply input on an initialised Marlowe Contract' + - ' , PUT: /contracts/{contractId}/transactions/{transactionId} => Append the Applied Input Tx to the ledger' + + it('can Apply Inputs : ' + + '(can POST: /contracts/{contractId}/transactions => ask to build the Tx to apply input on an initialised Marlowe Contract' + + ' , PUT: /contracts/{contractId}/transactions/{transactionId} => Append the Applied Input Tx to the ledger' + ' , GET: /contracts/{contractId}/transactions/{transactionId} => retrieve the Tx state' + ' and GET : /contracts/{contractId}/transactions => should see the unsigned transaction listed)', async () => { - await + await pipe( initialiseBankAndverifyProvisionning (mkRuntimeRestAPI(getMarloweRuntimeUrl())) (getBlockfrostContext ()) - (getBankPrivateKey()) + (getBankPrivateKey()) , TE.let (`notifyTimeout`, () => pipe(Date.now(),addDays(1),datetoTimeout)) , TE.bind('result',({runtimeRestAPI,runtime,bank,notifyTimeout}) => pipe @@ -69,7 +68,7 @@ describe('Contracts/{contractd}/Transactions endpoints', () => { , TE.match( (e) => { console.dir(e, { depth: null }); expect(e).not.toBeDefined()}, () => {}) - ) () + ) () },100_000) }) diff --git a/packages/legacy-runtime/test/endpoints/withdrawals.spec.e2e.ts b/packages/legacy-runtime/test/endpoints/withdrawals.spec.e2e.ts index acc612db..a75ad137 100644 --- a/packages/legacy-runtime/test/endpoints/withdrawals.spec.e2e.ts +++ b/packages/legacy-runtime/test/endpoints/withdrawals.spec.e2e.ts @@ -1,15 +1,15 @@ -import { pipe } from 'fp-ts/function' -import * as Examples from '../../../src/language/core/v1/examples/swaps/swap-token-token' -import { addDays } from 'date-fns/fp' -import * as TE from 'fp-ts/TaskEither' -import * as O from 'fp-ts/Option' -import { getBankPrivateKey, getBlockfrostContext, getMarloweRuntimeUrl } from '../context'; -import { datetoTimeout } from '../../../src/language/core/v1/semantics/contract/when' -import { mkRuntimeRestAPI } from '../../../src/runtime/restAPI' -import { provisionAnAdaAndTokenProvider } from '../provisionning' -import { adaValue } from '../../../src/language/core/v1/semantics/contract/common/tokenValue' -import { toInput } from '../../../src/language/core/v1/semantics/next/applicables/canDeposit' +import { pipe } from 'fp-ts/lib/function.js'; +import * as TE from 'fp-ts/lib/TaskEither.js'; +import * as O from 'fp-ts/lib/Option.js'; +import { addDays } from 'date-fns/fp'; +import * as Examples from '@marlowe/language-core-v1/examples'; +import { datetoTimeout, adaValue } from '@marlowe/language-core-v1'; +import { toInput } from '@marlowe/language-core-v1/next'; +import { mkRuntimeRestAPI } from '@marlowe/legacy-runtime/restAPI'; + +import { getBankPrivateKey, getBlockfrostContext, getMarloweRuntimeUrl } from '../context.js'; +import { provisionAnAdaAndTokenProvider } from '../provisionning.js'; describe('withdrawals endpoints ', () => { @@ -34,7 +34,7 @@ describe('withdrawals endpoints ', () => { , depositTimeout : pipe(Date.now(),addDays(2),datetoTimeout) , value : tokenValueMinted} })) - , TE.let (`swapContract`, ({swapRequest}) => Examples.mkSwapContract(swapRequest)) + , TE.let (`swapContract`, ({swapRequest}) => Examples.SwapADAToken.mkSwapContract(swapRequest)) , TE.bindW('contractId',({runtime,adaProvider,tokenProvider,swapRequest,swapContract}) => pipe( runtime(adaProvider).initialise ( { contract: swapContract diff --git a/packages/legacy-runtime/test/examples/swap.ada.token.spec.e2e.ts b/packages/legacy-runtime/test/examples/swap.ada.token.spec.e2e.ts index 1d956211..401c6610 100644 --- a/packages/legacy-runtime/test/examples/swap.ada.token.spec.e2e.ts +++ b/packages/legacy-runtime/test/examples/swap.ada.token.spec.e2e.ts @@ -1,15 +1,16 @@ -import { pipe } from 'fp-ts/function' -import * as Examples from '../../../src/language/core/v1/examples/swaps/swap-token-token' +import { pipe } from 'fp-ts/lib/function.js' +import * as TE from 'fp-ts/lib/TaskEither.js' import { addDays } from 'date-fns/fp' -import * as TE from 'fp-ts/TaskEither' -import { getBankPrivateKey, getBlockfrostContext, getMarloweRuntimeUrl } from '../context'; -import { datetoTimeout } from '../../../src/language/core/v1/semantics/contract/when' -import { provisionAnAdaAndTokenProvider } from '../provisionning' -import { mkRuntimeRestAPI } from '../../../src/runtime/restAPI'; -import { adaValue } from '../../../src/language/core/v1/semantics/contract/common/tokenValue'; -import { toInput } from '../../../src/language/core/v1/semantics/next/applicables/canDeposit'; + +import { toInput } from '@marlowe/language-core-v1/next'; +import * as Examples from '@marlowe/language-core-v1/examples' +import { datetoTimeout, adaValue } from '@marlowe/language-core-v1' +import { mkRuntimeRestAPI } from '@marlowe/legacy-runtime/restAPI'; + +import { getBankPrivateKey, getBlockfrostContext, getMarloweRuntimeUrl } from '../context.js'; +import { provisionAnAdaAndTokenProvider } from '../provisionning.js' describe('swap', () => { @@ -35,7 +36,7 @@ describe('swap', () => { , depositTimeout : pipe(Date.now(),addDays(2),datetoTimeout) , value : tokenValueMinted} })) - , TE.let (`swapContract`, ({swapRequest}) => Examples.mkSwapContract(swapRequest)) + , TE.let (`swapContract`, ({swapRequest}) => Examples.SwapADAToken.mkSwapContract(swapRequest)) , TE.bindW('swapClosedResult',({runtime,adaProvider,tokenProvider,swapRequest,swapContract}) => pipe( runtime(adaProvider).initialise ( { contract: swapContract diff --git a/packages/legacy-runtime/test/jest.e2e.config.mjs b/packages/legacy-runtime/test/jest.e2e.config.mjs new file mode 100644 index 00000000..c365c62c --- /dev/null +++ b/packages/legacy-runtime/test/jest.e2e.config.mjs @@ -0,0 +1,28 @@ +import { fileURLToPath } from "node:url"; + +const relative = (file) => fileURLToPath(new URL(file, import.meta.url)); + +const moduleNameMapper = { + '^@marlowe/legacy-adapter/(.*)$': relative('../../legacy-adapter/dist/$1.js'), + '^@marlowe/language\\-core\\-v1$': relative("../../language/core/v1/dist/semantics/contract/index.js"), + '^@marlowe/language\\-core\\-v1/next$': relative('../../language/core/v1/dist/semantics/next/index.js'), + '^@marlowe/language\\-core\\-v1/examples$': relative('../../language/core/v1/dist/examples/index.js'), + '^@marlowe/legacy\\-runtime/restAPI': relative('../dist/restAPI.js'), + '^(\\.{1,2}/.*)\\.js$': '$1', +} + + +const config = { + testEnvironment: "node", + displayName: "legacy-runtime-e2e", + extensionsToTreatAsEsm: ['.ts'], + testRegex: ".*e2e.ts$", + // testRegex: "swap.ada.token.spec.e2e.ts$", + modulePaths: [relative('.')], + moduleNameMapper, + transform: { + "^.+\\.ts$": ["ts-jest", { tsconfig:"test/tsconfig.json", useESM: true, isolatedModules: true }], + }, +}; + +export default config; \ No newline at end of file diff --git a/packages/legacy-runtime/test/provisionning.ts b/packages/legacy-runtime/test/provisionning.ts index 4b28272a..c1bd4d84 100644 --- a/packages/legacy-runtime/test/provisionning.ts +++ b/packages/legacy-runtime/test/provisionning.ts @@ -1,24 +1,22 @@ -import * as TE from 'fp-ts/TaskEither' -import * as T from 'fp-ts/Task' -import { pipe } from 'fp-ts/function' -import { Context, SingleAddressWallet } from '../../src/wallet/singleAddress' -import {PrivateKeysAsHex} from '../../src/wallet/singleAddress/privateKeys' -import { log } from '../../src/adapter/logging' -import * as ADA from '../../src/adapter/ada' -import { toString, TokenName } from '../../src/language/core/v1/semantics/contract/common/token' -import { mkRuntime } from '../../src/runtime' -import { RuntimeRestAPI } from '../../src/runtime/restAPI' - -export type ProvisionScheme = +import * as TE from 'fp-ts/lib/TaskEither.js' +import * as T from 'fp-ts/lib/Task.js' +import { pipe } from 'fp-ts/lib/function.js' +import { Context, SingleAddressWallet, PrivateKeysAsHex } from '@marlowe/legacy-runtime/runtimeSingleAddress' +import { log } from '@marlowe/legacy-adapter/logging' +import * as ADA from '@marlowe/legacy-adapter/ada' +import { tokenToString, TokenName } from '@marlowe/language-core-v1' +import { mkRuntime } from '@marlowe/legacy-runtime' +import { RuntimeRestAPI } from '@marlowe/legacy-runtime/restAPI' +export type ProvisionScheme = { provider : {adaAmount : bigint} , swapper : {adaAmount :bigint,tokenAmount : bigint, tokenName : TokenName} } -export const provisionAnAdaAndTokenProvider +export const provisionAnAdaAndTokenProvider = (runtimeRestAPI: RuntimeRestAPI) => - (walletContext: Context) => - (bankPrivateKey : PrivateKeysAsHex) => - (scheme : ProvisionScheme) => + (walletContext: Context) => + (bankPrivateKey : PrivateKeysAsHex) => + (scheme : ProvisionScheme) => pipe( TE.Do // Generating/Initialising Accounts , T.bind('bank',() => SingleAddressWallet.Initialise (walletContext,bankPrivateKey)) @@ -28,8 +26,8 @@ export const provisionAnAdaAndTokenProvider // Check Banks treasury , TE.bind('bankBalance',({bank}) => bank.adaBalance) , TE.chainFirst(({bankBalance,bank}) => TE.of(pipe( - log(`Bank (${bank.address})`), - () => log(` - ${ADA.format(bankBalance)}`)))) + log(`Bank (${bank.address})`), + () => log(` - ${ADA.format(bankBalance)}`)))) , TE.chainFirst(({bankBalance}) => TE.of(expect(bankBalance).toBeGreaterThan(100_000_000))) // Provisionning , TE.chainFirst(({bank,adaProvider,tokenProvider}) => @@ -37,41 +35,41 @@ export const provisionAnAdaAndTokenProvider [tokenProvider,scheme.swapper.adaAmount]])) , TE.bind('tokenValueMinted',({tokenProvider}) => tokenProvider.mintRandomTokens(scheme.swapper.tokenName,scheme.swapper.tokenAmount)) // Provisionning Checks - // Ada Provider - , TE.bind('adaProviderBalance',({adaProvider}) => adaProvider.adaBalance) + // Ada Provider + , TE.bind('adaProviderBalance',({adaProvider}) => adaProvider.adaBalance) , TE.chainFirst(({adaProvider,adaProviderBalance}) => TE.of(pipe( - log( `Ada Provider (${adaProvider.address}`), - () => log(` - ${ADA.format(adaProviderBalance)}`)))) - // Token Provider - , TE.bind('tokenProviderADABalance',({tokenProvider}) => tokenProvider.adaBalance) + log( `Ada Provider (${adaProvider.address}`), + () => log(` - ${ADA.format(adaProviderBalance)}`)))) + // Token Provider + , TE.bind('tokenProviderADABalance',({tokenProvider}) => tokenProvider.adaBalance) , TE.bind('tokenBalance' ,({tokenProvider,tokenValueMinted}) => tokenProvider.tokenBalance(tokenValueMinted.token)) , TE.chainFirst(({tokenProvider,tokenProviderADABalance,tokenValueMinted,tokenBalance}) => TE.of(pipe( - log(`Token Provider (${tokenProvider.address})`), - () => log( ` - ${ADA.format(tokenProviderADABalance)}`), - () => log( ` - ${tokenBalance} ${toString(tokenValueMinted.token)}`)))) + log(`Token Provider (${tokenProvider.address})`), + () => log( ` - ${ADA.format(tokenProviderADABalance)}`), + () => log( ` - ${tokenBalance} ${tokenToString(tokenValueMinted.token)}`)))) , TE.chainFirst(({tokenBalance}) => TE.of(expect(tokenBalance).toBe(scheme.swapper.tokenAmount))) - , TE.map (({adaProvider,tokenProvider,tokenValueMinted}) => + , TE.map (({adaProvider,tokenProvider,tokenValueMinted}) => ({ adaProvider:adaProvider , tokenProvider:tokenProvider , tokenValueMinted:tokenValueMinted , runtimeRestAPI : runtimeRestAPI - , runtime : mkRuntime(runtimeRestAPI)}))) - + , runtime : mkRuntime(runtimeRestAPI)}))) + -export const initialiseBankAndverifyProvisionning +export const initialiseBankAndverifyProvisionning = (runtimeRestAPI: RuntimeRestAPI) => - (walletContext: Context) => - (bankPrivateKey : PrivateKeysAsHex) => + (walletContext: Context) => + (bankPrivateKey : PrivateKeysAsHex) => pipe( TE.Do , T.bind('bank',() => SingleAddressWallet.Initialise (walletContext,bankPrivateKey)) , TE.fromTask // Check Banks treasury , TE.bind('bankBalance',({bank}) => bank.adaBalance) , TE.chainFirst(({bankBalance,bank}) => TE.of(pipe( - log(`Bank (${bank.address})`), - () => log(` - ${ADA.format(bankBalance)}`)))) + log(`Bank (${bank.address})`), + () => log(` - ${ADA.format(bankBalance)}`)))) , TE.chainFirst(({bankBalance}) => TE.of(expect(bankBalance).toBeGreaterThan(100_000_000))) - , TE.map (({bank}) => + , TE.map (({bank}) => ({ bank : bank , runtimeRestAPI : runtimeRestAPI - , runtime : mkRuntime(runtimeRestAPI)(bank)}))) \ No newline at end of file + , runtime : mkRuntime(runtimeRestAPI)(bank)}))) \ No newline at end of file diff --git a/packages/legacy-runtime/test/tsconfig.json b/packages/legacy-runtime/test/tsconfig.json new file mode 100644 index 00000000..d110546c --- /dev/null +++ b/packages/legacy-runtime/test/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../../tsconfig-base.json", + "compilerOptions": { + "outDir": "../test-dist", + "baseUrl": ".", + "paths": { + "@marlowe/legacy-adapter/*": ["../../legacy-adapter/src/*"], + "@marlowe/language-core-v1/*": ["../../language/core/v1/src/*"], + "@marlowe/legacy-runtime/*": ["../src/*"] + }, + "types": ["node", "jest"] + }, + "references": [ + { "path": "../../legacy-adapter/src" }, + { "path": "../../language/core/v1/src" }, + { "path": "../src" } + ] +} diff --git a/test/global.d.ts b/test/global.d.ts deleted file mode 100644 index df1c9ae6..00000000 --- a/test/global.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import '@relmify/jest-fp-ts'; - - diff --git a/test/tsconfig.json b/test/tsconfig.json deleted file mode 100644 index b7c759b2..00000000 --- a/test/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "composite": false, - "noEmit": true - }, - "include": ["./global.d.ts"], -}