diff --git a/packages/runtime/client/rest/src/contract/endpoints/singleton.ts b/packages/runtime/client/rest/src/contract/endpoints/singleton.ts index f870ad2e..b5f4046d 100644 --- a/packages/runtime/client/rest/src/contract/endpoints/singleton.ts +++ b/packages/runtime/client/rest/src/contract/endpoints/singleton.ts @@ -14,12 +14,14 @@ import { ContractIdGuard, HexTransactionWitnessSet, TextEnvelope, + TextEnvelopeGuard, transactionWitnessSetTextEnvelope, } from "@marlowe.io/runtime-core"; import { ContractDetails, ContractDetailsGuard } from "../details.js"; import { ContractId } from "@marlowe.io/runtime-core"; import { unsafeEither, unsafeTaskEither } from "@marlowe.io/adapter/fp-ts"; +import { assertGuardEqual, proxy } from "@marlowe.io/adapter/io-ts"; export type GET = ( contractId: ContractId @@ -65,7 +67,20 @@ export type PUT = ( hexTransactionWitnessSet: HexTransactionWitnessSet ) => TE.TaskEither; -export const submitContractViaAxios = +export interface SubmitContractRequest { + contractId: ContractId; + txEnvelope: TextEnvelope; +} + +export const SubmitContractRequestGuard = assertGuardEqual( + proxy(), + t.type({ + contractId: ContractIdGuard, + txEnvelope: TextEnvelopeGuard, + }) +); + +export const submitContract = (axiosInstance: AxiosInstance) => (contractId: ContractId, envelope: TextEnvelope) => axiosInstance diff --git a/packages/runtime/client/rest/src/index.ts b/packages/runtime/client/rest/src/index.ts index 1f6715d4..1134604d 100644 --- a/packages/runtime/client/rest/src/index.ts +++ b/packages/runtime/client/rest/src/index.ts @@ -34,7 +34,6 @@ import { HexTransactionWitnessSet, WithdrawalId, } from "@marlowe.io/runtime-core"; -import { submitContractViaAxios } from "./contract/endpoints/singleton.js"; import { ContractDetails } from "./contract/details.js"; import { TransactionDetails } from "./contract/transaction/details.js"; import { ItemRange } from "./pagination.js"; @@ -165,10 +164,7 @@ export interface RestClient { * Submits a signed contract creation transaction * @see {@link https://docs.marlowe.iohk.io/api/submit-contract-to-chain | The backend documentation} */ - submitContract( - contractId: ContractId, - txEnvelope: TextEnvelope - ): Promise; + submitContract(request: Contract.SubmitContractRequest): Promise; /** * Gets a paginated list of {@link contract.TxHeader } for a given contract. @@ -495,7 +491,7 @@ export function mkRestClient( if (result._tag === "Left") { throw new InvalidArgumentError( result.left, - `Invalid argument to getContractSourceAdjacency(${request})` + `Invalid argument to getNextStepsForContract(${request})` ); } else { const test: typeof request = result.right; @@ -503,8 +499,20 @@ export function mkRestClient( } return Next.getNextStepsForContract(axiosInstance)(request); }, - submitContract(contractId, txEnvelope) { - return submitContractViaAxios(axiosInstance)(contractId, txEnvelope); + submitContract(request) { + if (strict) { + const result = Contract.SubmitContractRequestGuard.decode(request); + if (result._tag === "Left") { + throw new InvalidArgumentError( + result.left, + `Invalid argument to submitContract(${request})` + ); + } else { + const test: typeof request = result.right; + } + } + const { contractId, txEnvelope } = request; + return Contract.submitContract(axiosInstance)(contractId, txEnvelope); }, getTransactionsForContract(contractId, range) { return unsafeTaskEither( diff --git a/packages/runtime/lifecycle/src/generic/contracts.ts b/packages/runtime/lifecycle/src/generic/contracts.ts index 9ca7ea26..0c1fe7c7 100644 --- a/packages/runtime/lifecycle/src/generic/contracts.ts +++ b/packages/runtime/lifecycle/src/generic/contracts.ts @@ -149,10 +149,10 @@ const createContract = buildCreateContractTxResponse.tx.cborHex ); - await restClient.submitContract( + await restClient.submitContract({ contractId, - transactionWitnessSetTextEnvelope(hexTransactionWitnessSet) - ); + txEnvelope: transactionWitnessSetTextEnvelope(hexTransactionWitnessSet), + }); return [contractId, contractIdToTxId(contractId)]; };