Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/core/src/types/objectChange.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export type IotaObjectChangeTypes =
| 'mutated'
| 'deleted'
| 'wrapped'
| 'unwrapped'
| 'created';

export type WithDisplayFields<T> = T & { display?: DisplayFieldsResponse };
Expand Down
1 change: 1 addition & 0 deletions apps/core/src/utils/transaction/getObjectChangeLabel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export const ObjectChangeLabels = {
published: 'Publish',
deleted: 'Deleted',
wrapped: 'Wrap',
unwrapped: 'Unwrap',
};

export function getObjectChangeLabel(type: IotaObjectChangeTypes) {
Expand Down
6 changes: 6 additions & 0 deletions apps/core/src/utils/transaction/getObjectChangeSummary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
IotaObjectChangeMutated,
IotaObjectChangePublished,
IotaObjectChangeTransferred,
IotaObjectChangeUnwrapped,
IotaObjectChangeWrapped,
} from '@iota/iota-sdk/client';

Expand Down Expand Up @@ -36,6 +37,10 @@ export const getObjectChangeSummary = (objectChanges: IotaObjectChangeWithDispla
(change) => change.type === 'wrapped',
) as IotaObjectChangeWrapped[];

const unwrapped = objectChanges.filter(
(change) => change.type === 'unwrapped',
) as IotaObjectChangeUnwrapped[];

const deleted = objectChanges.filter(
(change) => change.type === 'deleted',
) as IotaObjectChangeDeleted[];
Expand All @@ -46,6 +51,7 @@ export const getObjectChangeSummary = (objectChanges: IotaObjectChangeWithDispla
mutated: groupByOwner(mutated),
published: groupByOwner(published),
wrapped: groupByOwner(wrapped),
unwrapped: groupByOwner(unwrapped),
deleted: groupByOwner(deleted),
};
};
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ const EMPTY_OBJECT_SUMMARY: ObjectChangeSummary = {
mutated: {},
deleted: {},
wrapped: {},
unwrapped: {},
created: {},
};

Expand Down
5 changes: 4 additions & 1 deletion crates/iota-json-rpc-types/src/iota_transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,8 @@ impl Display for IotaTransactionBlockResponse {
mut published,
mut transferred,
mut wrapped,
) = (vec![], vec![], vec![], vec![], vec![], vec![]);
mut unwrapped,
) = (vec![], vec![], vec![], vec![], vec![], vec![], vec![]);

for obj in object_changes {
match obj {
Expand All @@ -344,6 +345,7 @@ impl Display for IotaTransactionBlockResponse {
ObjectChange::Published { .. } => published.push(obj),
ObjectChange::Transferred { .. } => transferred.push(obj),
ObjectChange::Wrapped { .. } => wrapped.push(obj),
ObjectChange::Unwrapped { .. } => unwrapped.push(obj),
};
}

Expand All @@ -353,6 +355,7 @@ impl Display for IotaTransactionBlockResponse {
write_obj_changes(published, "Published", &mut builder)?;
write_obj_changes(transferred, "Transferred", &mut builder)?;
write_obj_changes(wrapped, "Wrapped", &mut builder)?;
write_obj_changes(unwrapped, "Unwrapped", &mut builder)?;

let mut table = builder.build();
table.with(TablePanel::header("Object Changes"));
Expand Down
43 changes: 43 additions & 0 deletions crates/iota-json-rpc-types/src/object_changes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,20 @@ pub enum ObjectChange {
#[serde_as(as = "AsSequenceNumber")]
version: SequenceNumber,
},
/// Unwrapped object
#[serde(rename_all = "camelCase")]
Unwrapped {
sender: IotaAddress,
owner: Owner,
#[schemars(with = "String")]
#[serde_as(as = "IotaStructTag")]
object_type: StructTag,
object_id: ObjectID,
#[schemars(with = "AsSequenceNumber")]
#[serde_as(as = "AsSequenceNumber")]
version: SequenceNumber,
digest: ObjectDigest,
},
/// New object creation
#[serde(rename_all = "camelCase")]
Created {
Expand All @@ -109,6 +123,7 @@ impl ObjectChange {
| ObjectChange::Mutated { object_id, .. }
| ObjectChange::Deleted { object_id, .. }
| ObjectChange::Wrapped { object_id, .. }
| ObjectChange::Unwrapped { object_id, .. }
| ObjectChange::Created { object_id, .. } => *object_id,
}
}
Expand All @@ -133,6 +148,12 @@ impl ObjectChange {
digest,
..
}
| ObjectChange::Unwrapped {
object_id,
version,
digest,
..
}
| ObjectChange::Created {
object_id,
version,
Expand All @@ -159,6 +180,9 @@ impl ObjectChange {
| ObjectChange::Mutated {
version, digest, ..
}
| ObjectChange::Unwrapped {
version, digest, ..
}
| ObjectChange::Created {
version, digest, ..
} => {
Expand Down Expand Up @@ -259,6 +283,25 @@ impl Display for ObjectChange {
u64::from(*version)
)
}
ObjectChange::Unwrapped {
sender,
owner,
object_type,
object_id,
version,
digest,
} => {
write!(
f,
" ┌──\n │ ObjectID: {}\n │ Sender: {} \n │ Owner: {}\n │ ObjectType: {} \n │ Version: {}\n │ Digest: {}\n └──",
object_id,
sender,
owner,
object_type,
u64::from(*version),
digest
)
}
ObjectChange::Created {
sender,
owner,
Expand Down
8 changes: 8 additions & 0 deletions crates/iota-json-rpc/src/object_changes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,14 @@ pub async fn get_object_changes<P: ObjectProvider<Error = E>, E>(
version,
digest,
}),
WriteKind::Unwrap => object_changes.push(ObjectChange::Unwrapped {
sender,
owner,
object_type,
object_id,
version,
digest,
}),
_ => {}
}
} else if let Some(p) = o.data.try_as_package() {
Expand Down
5 changes: 4 additions & 1 deletion crates/iota/src/displays/dry_run_tx_block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ impl Display for Pretty<'_, DryRunTransactionBlockResponse> {
mut published,
mut transferred,
mut wrapped,
) = (vec![], vec![], vec![], vec![], vec![], vec![]);
mut unwrapped,
) = (vec![], vec![], vec![], vec![], vec![], vec![], vec![]);
for obj in &response.object_changes {
match obj {
ObjectChange::Created { .. } => created.push(obj),
Expand All @@ -58,6 +59,7 @@ impl Display for Pretty<'_, DryRunTransactionBlockResponse> {
ObjectChange::Published { .. } => published.push(obj),
ObjectChange::Transferred { .. } => transferred.push(obj),
ObjectChange::Wrapped { .. } => wrapped.push(obj),
ObjectChange::Unwrapped { .. } => unwrapped.push(obj),
};
}

Expand All @@ -67,6 +69,7 @@ impl Display for Pretty<'_, DryRunTransactionBlockResponse> {
write_obj_changes(published, "Published", &mut builder)?;
write_obj_changes(transferred, "Transferred", &mut builder)?;
write_obj_changes(wrapped, "Wrapped", &mut builder)?;
write_obj_changes(unwrapped, "Unwrapped", &mut builder)?;

let mut table = builder.build();
table.with(TablePanel::header("Object Changes"));
Expand Down
18 changes: 17 additions & 1 deletion sdk/graphql-transport/src/mappers/transaction-block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -161,18 +161,34 @@ function mapObjectChanges(

effects?.unwrapped?.forEach((unwrapped) => {
changes.push({
type: 'wrapped',
type: 'unwrapped',
digest: unwrapped.reference.digest,
objectId: unwrapped.reference.objectId,
objectType: toShortTypeString(
transactionBlock.effects?.objectChanges?.nodes.find(
(change) => change.address === unwrapped.reference.objectId,
)?.outputState?.asMoveObject?.contents?.type.repr!,
),
owner: unwrapped.owner,
sender: transactionBlock.sender?.address!,
version: unwrapped.reference.version?.toString(),
});
});

effects?.wrapped?.forEach((wrapped) => {
changes.push({
type: 'wrapped',
objectId: wrapped.objectId,
objectType: toShortTypeString(
transactionBlock.effects?.objectChanges?.nodes.find(
(change) => change.address === wrapped.objectId,
)?.inputState?.asMoveObject?.contents?.type.repr!,
),
sender: transactionBlock.sender?.address!,
version: wrapped.version?.toString(),
});
});

return changes;
}

Expand Down
1 change: 1 addition & 0 deletions sdk/typescript/src/client/types/changes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ export type IotaObjectChangeTransferred = Extract<IotaObjectChange, { type: 'tra
export type IotaObjectChangeMutated = Extract<IotaObjectChange, { type: 'mutated' }>;
export type IotaObjectChangeDeleted = Extract<IotaObjectChange, { type: 'deleted' }>;
export type IotaObjectChangeWrapped = Extract<IotaObjectChange, { type: 'wrapped' }>;
export type IotaObjectChangeUnwrapped = Extract<IotaObjectChange, { type: 'unwrapped' }>;
export type IotaObjectChangeCreated = Extract<IotaObjectChange, { type: 'created' }>;