diff --git a/packages/mainsail/package.json b/packages/mainsail/package.json index daed5604..a72b16cd 100644 --- a/packages/mainsail/package.json +++ b/packages/mainsail/package.json @@ -38,6 +38,7 @@ "@mainsail/crypto-key-pair-ecdsa": "0.0.1-alpha.13", "@mainsail/crypto-signature-schnorr-secp256k1": "0.0.1-alpha.13", "@mainsail/crypto-transaction": "0.0.1-alpha.13", + "@mainsail/crypto-transaction-multi-payment": "0.0.1-alpha.13", "@mainsail/crypto-transaction-transfer": "0.0.1-alpha.13", "@mainsail/crypto-validation": "0.0.1-alpha.13", "@mainsail/fees": "0.0.1-alpha.13", diff --git a/packages/mainsail/source/client.service.ts b/packages/mainsail/source/client.service.ts index 426b3870..27858c15 100644 --- a/packages/mainsail/source/client.service.ts +++ b/packages/mainsail/source/client.service.ts @@ -104,22 +104,38 @@ export class ClientService extends Services.AbstractClientService { // @TODO: For the moment only transfer transactions are sent to the // `transaction-pool` once rest of the transaction types are supported // we are likely send all of them to the same endpoint. - const isTransfer = transactions.some((t) => t.isTransfer()); - const endpointUrl = isTransfer ? "transaction-pool" : "transactions"; - const networkHostyType = isTransfer ? "tx" : "full"; + // const isTransfer = transactions.some((t) => t.isTransfer()); + // const endpointUrl = isTransfer ? "transaction-pool" : "transactions"; + // const networkHostyType = isTransfer ? "tx" : "full"; - const body = { - transactions: transactions.map((transaction) => transaction.toBroadcast()), - }; + // const body = { + // transactions: transactions.map((transaction) => transaction.toBroadcast()), + // }; try { - response = await this.#request.post( - endpointUrl, + const result = await fetch( + // @TODO: Move base url in manifest instead of hardcoded data here. + new URL("https://dwallets.mainsailhq.com/tx/api/transaction-pool"), { - body, + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + transactions: transactions.map((transaction) => transaction.toBroadcast()), + }), }, - networkHostyType, ); + + response = await result.json(); + + // response = await this.#request.post( + // endpointUrl, + // { + // body, + // }, + // networkHostyType, + // ); } catch (error) { response = (error as any).response.json(); } diff --git a/packages/mainsail/source/transaction.service.ts b/packages/mainsail/source/transaction.service.ts index 8ba069b8..1263be30 100644 --- a/packages/mainsail/source/transaction.service.ts +++ b/packages/mainsail/source/transaction.service.ts @@ -22,6 +22,7 @@ import { ServiceProvider as CoreCryptoTransactionTransfer, TransferBuilder, } from "@mainsail/crypto-transaction-transfer"; +import { MultiPaymentBuilder } from "@mainsail/crypto-transaction-multi-payment"; import { Container } from "@mainsail/container"; import { milestones } from "./crypto/networks/devnet/milestones.js"; @@ -96,10 +97,6 @@ export class TransactionService extends Services.AbstractTransactionService { * @ledgerS */ public override async transfer(input: Services.TransferInput): Promise { - if (!this.#isBooted) { - await this.#boot(); - } - return this.#createTransferFromData(input, ({ transaction, data }) => { transaction.recipientId(data.to); @@ -209,15 +206,7 @@ export class TransactionService extends Services.AbstractTransactionService { * @musig */ public override async multiPayment(input: Services.MultiPaymentInput): Promise { - return this.#createFromData("multiPayment", input, ({ transaction, data }) => { - for (const payment of data.payments) { - transaction.addPayment(payment.to, this.toSatoshi(payment.amount).toString()); - } - - if (data.memo) { - transaction.vendorField(data.memo); - } - }); + return this.#createMultipaymentFromData(input); } public override async delegateResignation( @@ -396,10 +385,69 @@ export class TransactionService extends Services.AbstractTransactionService { return this.dataTransferObjectService.signedTransaction(signedTransaction.id, signedTransaction); } + async #createMultipaymentFromData( + input: Services.TransferInput, + callback?: Function, + ): Promise { + console.log({ input }); + if (!this.#isBooted) { + await this.#boot(); + } + + applyCryptoConfiguration(this.#configCrypto); + + const mnemonic = input.signatory.signingKey(); + console.log({ mnemonic }); + + const transactionWallet = await this.clientService.wallet({ + type: "address", + value: input.signatory.address(), + }); + + // const transactionWallet = await this.clientService.wallet({ type: "address", value: address }); + let builder = this.#app + .resolve(MultiPaymentBuilder) + .fee(input.data.fee) + .nonce(transactionWallet.nonce().plus(1).toFixed(0)); + + console.log({ builder }); + + if (input.data.memo) { + builder.vendorField(input.data.memo); + } + + for (const { amount, to } of input.data.payments) { + console.log("adding payment", { amount, to }); + builder = builder.addPayment(to, amount); + } + + try { + const signed = await builder.sign(mnemonic); + console.log({ signed }); + } catch (error) { + console.log({ error }); + } + + const signedTransactionBuilder = await builder.sign(mnemonic); + + const signedTransaction = await signedTransactionBuilder.build(); + console.log({ signedTransaction }); + + return this.dataTransferObjectService.signedTransaction( + signedTransaction.id!, + signedTransaction.data, + signedTransaction.serialized.toString("hex"), + ); + } + async #createTransferFromData( input: Services.TransferInput, callback?: Function, ): Promise { + console.log("#createTransferFromData", { input }); + if (!this.#isBooted) { + await this.#boot(); + } applyCryptoConfiguration(this.#configCrypto); // @TODO: update `TransferInput` definition globally once everything diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 98494e22..a0dd97cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -437,6 +437,9 @@ importers: '@mainsail/crypto-transaction': specifier: 0.0.1-alpha.13 version: 0.0.1-alpha.13 + '@mainsail/crypto-transaction-multi-payment': + specifier: 0.0.1-alpha.13 + version: 0.0.1-alpha.13 '@mainsail/crypto-transaction-transfer': specifier: 0.0.1-alpha.13 version: 0.0.1-alpha.13 @@ -2410,6 +2413,21 @@ packages: - supports-color dev: false + /@mainsail/crypto-transaction-multi-payment@0.0.1-alpha.13: + resolution: {integrity: sha512-hL/d8ulfdQwFQic9ifsifiP2PE3nrVuIOEz5J1YlvKx3NOAm5Q8RE7Gaw9mrYL3nHiDTa4A2ewR8phLHRN+FYg==} + engines: {node: '>=20.x'} + dependencies: + '@mainsail/container': 0.0.1-alpha.13 + '@mainsail/contracts': 0.0.1-alpha.13 + '@mainsail/crypto-transaction': 0.0.1-alpha.13 + '@mainsail/kernel': 0.0.1-alpha.13 + '@mainsail/transactions': 0.0.1-alpha.13 + '@mainsail/utils': 0.0.1-alpha.13 + ajv: 8.12.0 + transitivePeerDependencies: + - supports-color + dev: false + /@mainsail/crypto-transaction-transfer@0.0.1-alpha.13: resolution: {integrity: sha512-+Wyr7wDRtreO5c+E16CCvl6RsV2YVYnHJaVX9DgiXll7hrQ5kcb/KBfLt6b6TFMbNM9QkVKDgRAI+5+PdT5JUw==} engines: {node: '>=20.x'}