@midnight-ntwrk/wallet-sdk-unshielded-wallet 1.0.0-beta.18 → 1.0.0-beta.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -45,7 +45,8 @@ export interface CustomizedUnshieldedWallet<TSyncUpdate = WalletSyncUpdate, TSer
45
45
  balanceUnprovenTransaction(tx: ledger.UnprovenTransaction): Promise<UnprovenTransactionBalanceResult>;
46
46
  transferTransaction(outputs: readonly TokenTransfer[], ttl: Date): Promise<ledger.UnprovenTransaction>;
47
47
  initSwap(desiredInputs: Record<ledger.RawTokenType, bigint>, desiredOutputs: readonly TokenTransfer[], ttl: Date): Promise<ledger.UnprovenTransaction>;
48
- signTransaction(transaction: ledger.UnprovenTransaction, signSegment: (data: Uint8Array) => ledger.Signature): Promise<ledger.UnprovenTransaction>;
48
+ signUnprovenTransaction(transaction: ledger.UnprovenTransaction, signSegment: (data: Uint8Array) => ledger.Signature): Promise<ledger.UnprovenTransaction>;
49
+ signUnboundTransaction(transaction: UnboundTransaction, signSegment: (data: Uint8Array) => ledger.Signature): Promise<UnboundTransaction>;
49
50
  serializeState(): Promise<TSerialized>;
50
51
  waitForSyncedState(allowedGap?: bigint): Promise<UnshieldedWalletState<TSerialized>>;
51
52
  getAddress(): Promise<UnshieldedAddress>;
@@ -110,10 +110,17 @@ export function CustomUnshieldedWallet(configuration, builder) {
110
110
  .dispatch({ [V1Tag]: (v1) => v1.initSwap(desiredInputs, desiredOutputs, ttl) })
111
111
  .pipe(Effect.runPromise);
112
112
  }
113
- signTransaction(transaction, signSegment) {
113
+ signUnprovenTransaction(transaction, signSegment) {
114
114
  return this.runtime
115
115
  .dispatch({
116
- [V1Tag]: (v1) => v1.signTransaction(transaction, signSegment),
116
+ [V1Tag]: (v1) => v1.signUnprovenTransaction(transaction, signSegment),
117
+ })
118
+ .pipe(Effect.runPromise);
119
+ }
120
+ signUnboundTransaction(transaction, signSegment) {
121
+ return this.runtime
122
+ .dispatch({
123
+ [V1Tag]: (v1) => v1.signUnboundTransaction(transaction, signSegment),
117
124
  })
118
125
  .pipe(Effect.runPromise);
119
126
  }
@@ -39,6 +39,7 @@ export declare class RunningV1Variant<TSerialized, TSyncUpdate> implements Varia
39
39
  balanceUnprovenTransaction(tx: ledger.UnprovenTransaction): Effect.Effect<UnprovenTransactionBalanceResult, WalletError>;
40
40
  transferTransaction(outputs: ReadonlyArray<TokenTransfer>, ttl: Date): Effect.Effect<ledger.UnprovenTransaction, WalletError>;
41
41
  initSwap(desiredInputs: Record<string, bigint>, desiredOutputs: ReadonlyArray<TokenTransfer>, ttl: Date): Effect.Effect<ledger.UnprovenTransaction, WalletError>;
42
- signTransaction(transaction: ledger.UnprovenTransaction, signSegment: (data: Uint8Array) => ledger.Signature): Effect.Effect<ledger.UnprovenTransaction, WalletError>;
42
+ signUnprovenTransaction(transaction: ledger.UnprovenTransaction, signSegment: (data: Uint8Array) => ledger.Signature): Effect.Effect<ledger.UnprovenTransaction, WalletError>;
43
+ signUnboundTransaction(transaction: UnboundTransaction, signSegment: (data: Uint8Array) => ledger.Signature): Effect.Effect<UnboundTransaction, WalletError>;
43
44
  serializeState(state: CoreWallet): TSerialized;
44
45
  }
@@ -92,8 +92,11 @@ export class RunningV1Variant {
92
92
  return pipe(this.#v1Context.transactingCapability.initSwap(state, desiredInputs, desiredOutputs, ttl), Effect.map(({ transaction, newState }) => [transaction, newState]));
93
93
  });
94
94
  }
95
- signTransaction(transaction, signSegment) {
96
- return this.#v1Context.transactingCapability.signTransaction(transaction, signSegment);
95
+ signUnprovenTransaction(transaction, signSegment) {
96
+ return this.#v1Context.transactingCapability.signUnprovenTransaction(transaction, signSegment);
97
+ }
98
+ signUnboundTransaction(transaction, signSegment) {
99
+ return this.#v1Context.transactingCapability.signUnboundTransaction(transaction, signSegment);
97
100
  }
98
101
  serializeState(state) {
99
102
  return this.#v1Context.serializationCapability.serialize(state);
@@ -25,7 +25,9 @@ export interface TransactingCapability<TState> {
25
25
  balanceFinalizedTransaction(wallet: CoreWallet, transaction: ledger.FinalizedTransaction): Either.Either<[FinalizedTransactionBalanceResult, CoreWallet], WalletError>;
26
26
  balanceUnboundTransaction(wallet: CoreWallet, transaction: UnboundTransaction): Either.Either<[UnboundTransactionBalanceResult, CoreWallet], WalletError>;
27
27
  balanceUnprovenTransaction(wallet: CoreWallet, transaction: ledger.UnprovenTransaction): Either.Either<[UnprovenTransactionBalanceResult, CoreWallet], WalletError>;
28
- signTransaction(transaction: ledger.UnprovenTransaction, signSegment: (data: Uint8Array) => ledger.Signature): Either.Either<ledger.UnprovenTransaction, WalletError>;
28
+ signUnprovenTransaction(transaction: ledger.UnprovenTransaction, signSegment: (data: Uint8Array) => ledger.Signature): Either.Either<ledger.UnprovenTransaction, WalletError>;
29
+ revert(wallet: CoreWallet, transaction: ledger.FinalizedTransaction | UnboundTransaction | ledger.UnprovenTransaction): Either.Either<CoreWallet, WalletError>;
30
+ signUnboundTransaction(transaction: UnboundTransaction, signSegment: (data: Uint8Array) => ledger.Signature): Either.Either<UnboundTransaction, WalletError>;
29
31
  }
30
32
  export type DefaultTransactingConfiguration = {
31
33
  networkId: NetworkId.NetworkId;
@@ -86,5 +88,13 @@ export declare class TransactingCapabilityImplementation implements TransactingC
86
88
  * @returns The initialized swap transaction and the new wallet state if successful, otherwise an error
87
89
  */
88
90
  initSwap(wallet: CoreWallet, desiredInputs: Record<ledger.RawTokenType, bigint>, desiredOutputs: ReadonlyArray<TokenTransfer>, ttl: Date): Either.Either<TransactingResult<ledger.UnprovenTransaction, CoreWallet>, WalletError>;
89
- signTransaction(transaction: ledger.UnprovenTransaction, signSegment: (data: Uint8Array) => ledger.Signature): Either.Either<ledger.UnprovenTransaction, WalletError>;
91
+ signUnprovenTransaction(transaction: ledger.UnprovenTransaction, signSegment: (data: Uint8Array) => ledger.Signature): Either.Either<ledger.UnprovenTransaction, WalletError>;
92
+ signUnboundTransaction(transaction: UnboundTransaction, signSegment: (data: Uint8Array) => ledger.Signature): Either.Either<UnboundTransaction, WalletError>;
93
+ /**
94
+ * Reverts a transaction by rolling back all inputs owned by this wallet
95
+ * @param wallet - The wallet to revert the transaction for
96
+ * @param transaction - The transaction to revert (can be FinalizedTransaction, UnboundTransaction, or UnprovenTransaction)
97
+ * @returns The updated wallet with rolled back UTXOs if successful, otherwise an error
98
+ */
99
+ revert(wallet: CoreWallet, transaction: ledger.FinalizedTransaction | UnboundTransaction | ledger.UnprovenTransaction): Either.Either<CoreWallet, WalletError>;
90
100
  }
@@ -11,7 +11,7 @@
11
11
  // See the License for the specific language governing permissions and
12
12
  // limitations under the License.
13
13
  import * as ledger from '@midnight-ntwrk/ledger-v7';
14
- import { Either, Option, pipe } from 'effect';
14
+ import { Either, Option, pipe, Array as Arr } from 'effect';
15
15
  import { CoreWallet } from './CoreWallet.js';
16
16
  import { InsufficientFundsError, OtherWalletError, SignError, TransactingError } from './WalletError.js';
17
17
  import { getBalanceRecipe, Imbalances, InsufficientFundsError as BalancingInsufficientFundsError, } from '@midnight-ntwrk/wallet-sdk-capabilities';
@@ -170,7 +170,19 @@ export class TransactingCapabilityImplementation {
170
170
  };
171
171
  });
172
172
  }
173
- signTransaction(transaction, signSegment) {
173
+ signUnprovenTransaction(transaction, signSegment) {
174
+ return this.#signTransactionInternal(transaction, signSegment);
175
+ }
176
+ signUnboundTransaction(transaction, signSegment) {
177
+ return this.#signTransactionInternal(transaction, signSegment);
178
+ }
179
+ /**
180
+ * Internal method to sign either an unproven or unbound transaction
181
+ * @param transaction - The transaction to sign
182
+ * @param signSegment - The signing function
183
+ * @returns The signed transaction if successful, otherwise an error
184
+ */
185
+ #signTransactionInternal(transaction, signSegment) {
174
186
  return Either.gen(this, function* () {
175
187
  const segments = this.txOps.getSegments(transaction);
176
188
  if (!segments.length) {
@@ -179,11 +191,20 @@ export class TransactingCapabilityImplementation {
179
191
  for (const segment of segments) {
180
192
  const signedData = yield* this.txOps.getSignatureData(transaction, segment);
181
193
  const signature = signSegment(signedData);
182
- transaction = yield* this.txOps.addSignature(transaction, signature, segment);
194
+ transaction = (yield* this.txOps.addSignature(transaction, signature, segment));
183
195
  }
184
196
  return transaction;
185
197
  });
186
198
  }
199
+ /**
200
+ * Reverts a transaction by rolling back all inputs owned by this wallet
201
+ * @param wallet - The wallet to revert the transaction for
202
+ * @param transaction - The transaction to revert (can be FinalizedTransaction, UnboundTransaction, or UnprovenTransaction)
203
+ * @returns The updated wallet with rolled back UTXOs if successful, otherwise an error
204
+ */
205
+ revert(wallet, transaction) {
206
+ return pipe(this.txOps.extractOwnInputs(transaction, wallet.publicKey.publicKey), Arr.reduce(Either.right(wallet), (walletAcc, utxo) => pipe(walletAcc, Either.flatMap((w) => CoreWallet.rollbackUtxo(w, utxo)))));
207
+ }
187
208
  /**
188
209
  * Balances a segment of a transaction
189
210
  * @param wallet - The wallet to balance the segment for
@@ -18,5 +18,6 @@ export type TransactionOps = {
18
18
  getImbalances(transaction: ledger.FinalizedTransaction | UnboundTransaction | ledger.UnprovenTransaction, segment: number): Imbalances;
19
19
  addSignaturesToOffer(offer: ledger.UnshieldedOffer<ledger.SignatureEnabled>, signature: ledger.Signature, segment: number, offerType: 'guaranteed' | 'fallible'): Either.Either<ledger.UnshieldedOffer<ledger.SignatureEnabled>, WalletError>;
20
20
  isIntentBound(intent: ledger.Intent<ledger.SignatureEnabled, ledger.Proofish, ledger.Bindingish>): boolean;
21
+ extractOwnInputs(transaction: ledger.FinalizedTransaction | UnboundTransaction | ledger.UnprovenTransaction, signatureVerifyingKey: ledger.SignatureVerifyingKey): ledger.Utxo[];
21
22
  };
22
23
  export declare const TransactionOps: TransactionOps;
@@ -75,4 +75,21 @@ export const TransactionOps = {
75
75
  isIntentBound(intent) {
76
76
  return intent.binding.instance === 'binding';
77
77
  },
78
+ extractOwnInputs(transaction, signatureVerifyingKey) {
79
+ const segments = TransactionOps.getSegments(transaction);
80
+ return pipe(segments, Arr.flatMap((segment) => {
81
+ const intent = transaction.intents?.get(segment);
82
+ if (!intent) {
83
+ return [];
84
+ }
85
+ const { guaranteedUnshieldedOffer, fallibleUnshieldedOffer } = intent;
86
+ const ownedInputsfromGuaranteedSection = guaranteedUnshieldedOffer?.inputs
87
+ ? guaranteedUnshieldedOffer.inputs.filter((input) => input.owner === signatureVerifyingKey)
88
+ : [];
89
+ const ownedInputsfromFallibleSection = fallibleUnshieldedOffer
90
+ ? fallibleUnshieldedOffer.inputs.filter((input) => input.owner === signatureVerifyingKey)
91
+ : [];
92
+ return [...ownedInputsfromGuaranteedSection, ...ownedInputsfromFallibleSection];
93
+ }));
94
+ },
78
95
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@midnight-ntwrk/wallet-sdk-unshielded-wallet",
3
- "version": "1.0.0-beta.18",
3
+ "version": "1.0.0-beta.19",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -23,13 +23,13 @@
23
23
  }
24
24
  },
25
25
  "dependencies": {
26
- "@midnight-ntwrk/ledger-v7": "7.0.0-rc.1",
26
+ "@midnight-ntwrk/ledger-v7": "7.0.0",
27
27
  "@midnight-ntwrk/wallet-sdk-abstractions": "1.0.0-beta.10",
28
- "@midnight-ntwrk/wallet-sdk-address-format": "3.0.0-beta.11",
29
- "@midnight-ntwrk/wallet-sdk-capabilities": "3.0.0-beta.11",
28
+ "@midnight-ntwrk/wallet-sdk-address-format": "3.0.0-beta.12",
29
+ "@midnight-ntwrk/wallet-sdk-capabilities": "3.0.0-beta.12",
30
30
  "@midnight-ntwrk/wallet-sdk-hd": "3.0.0-beta.8",
31
- "@midnight-ntwrk/wallet-sdk-indexer-client": "1.0.0-beta.16",
32
- "@midnight-ntwrk/wallet-sdk-utilities": "1.0.0-beta.10",
31
+ "@midnight-ntwrk/wallet-sdk-indexer-client": "1.0.0-beta.17",
32
+ "@midnight-ntwrk/wallet-sdk-utilities": "1.0.0-beta.11",
33
33
  "effect": "^3.19.14",
34
34
  "rxjs": "^7.5"
35
35
  },