@mysten/sui
Version:
Sui TypeScript API(Work in Progress)
118 lines (111 loc) • 3.64 kB
text/typescript
// Copyright (c) Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0
import { bcs } from '../../bcs/index.js';
import type { Experimental_SuiClientTypes } from '../types.js';
export function parseTransactionEffects({
effects,
epoch,
objectTypes,
}: {
effects: Uint8Array;
objectTypes: Record<string, string>;
epoch?: string | null;
}): Experimental_SuiClientTypes.TransactionEffects {
const parsed = bcs.TransactionEffects.parse(effects);
switch (parsed.$kind) {
case 'V1':
return parseTransactionEffectsV1({ bytes: effects, effects: parsed.V1, epoch, objectTypes });
case 'V2':
return parseTransactionEffectsV2({ bytes: effects, effects: parsed.V2, epoch, objectTypes });
default:
throw new Error(
`Unknown transaction effects version: ${(parsed as { $kind: string }).$kind}`,
);
}
}
function parseTransactionEffectsV1(_: {
bytes: Uint8Array;
effects: NonNullable<(typeof bcs.TransactionEffects.$inferType)['V1']>;
epoch?: string | null;
objectTypes: Record<string, string>;
}): Experimental_SuiClientTypes.TransactionEffects {
throw new Error('V1 effects are not supported yet');
}
function parseTransactionEffectsV2({
bytes,
effects,
epoch,
objectTypes,
}: {
bytes: Uint8Array;
effects: NonNullable<(typeof bcs.TransactionEffects.$inferType)['V2']>;
epoch?: string | null;
objectTypes: Record<string, string>;
}): Experimental_SuiClientTypes.TransactionEffects {
const changedObjects = effects.changedObjects.map(
([id, change]): Experimental_SuiClientTypes.ChangedObject => {
return {
id,
inputState: change.inputState.$kind === 'Exist' ? 'Exists' : 'DoesNotExist',
inputVersion: change.inputState.Exist?.[0][0] ?? null,
inputDigest: change.inputState.Exist?.[0][1] ?? null,
inputOwner: change.inputState.Exist?.[1] ?? null,
outputState:
change.outputState.$kind === 'NotExist' ? 'DoesNotExist' : change.outputState.$kind,
outputVersion:
change.outputState.$kind === 'PackageWrite'
? change.outputState.PackageWrite?.[0]
: change.outputState.ObjectWrite
? effects.lamportVersion
: null,
outputDigest:
change.outputState.$kind === 'PackageWrite'
? change.outputState.PackageWrite?.[1]
: (change.outputState.ObjectWrite?.[0] ?? null),
outputOwner: change.outputState.ObjectWrite ? change.outputState.ObjectWrite[1] : null,
idOperation: change.idOperation.$kind,
objectType: objectTypes[id] ?? null,
};
},
);
return {
bcs: bytes,
digest: effects.transactionDigest,
version: 2,
status:
effects.status.$kind === 'Success'
? {
success: true,
error: null,
}
: {
success: false,
// TODO: add command
error: effects.status.Failed.error.$kind,
},
epoch: epoch ?? null,
gasUsed: effects.gasUsed,
transactionDigest: effects.transactionDigest,
gasObject:
effects.gasObjectIndex === null ? null : (changedObjects[effects.gasObjectIndex] ?? null),
eventsDigest: effects.eventsDigest,
dependencies: effects.dependencies,
lamportVersion: effects.lamportVersion,
changedObjects,
unchangedSharedObjects: effects.unchangedSharedObjects.map(
([objectId, object]): Experimental_SuiClientTypes.UnchangedSharedObject => {
return {
kind: object.$kind,
objectId: objectId,
version:
object.$kind === 'ReadOnlyRoot'
? object.ReadOnlyRoot[0]
: (object[object.$kind] as string | null),
digest: object.$kind === 'ReadOnlyRoot' ? object.ReadOnlyRoot[1] : null,
objectType: objectTypes[objectId] ?? null,
};
},
),
auxiliaryDataDigest: effects.auxDataDigest,
};
}