Move.

Post

Share your knowledge.

kryptoschain.
Apr 10, 2025
Expert Q&A

How to transfer an object owned by another object?

I'm facing an issue with transferring an object A, which is owned by object B, and object B is owned by me. I'm getting an error saying the transaction was not signed by the correct sender. Does anyone know how to resolve this and properly receive object A?

  • Move CLI
  • Move
0
2
Share
Comments
.

Answers

2
deriss.
Apr 11 2025, 03:36

It sounds like you need to use the 'Transfer To Object' (TTO) process. Make sure you check the abilities of the objects involved. The parent object type (obj_b) must allow receiving objects because it requires mutable access to its UID. Also, ensure that if the child object (obj_a) does not have the store ability, it must be set up to be receivable. More details can be found in this table: https://docs.sui.io/concepts/transfers/transfer-to-object#custom-receiving-rules

0
Comments
.
24p30p.
Jul 9 2025, 07:13

If you're getting an error that says the transaction wasn't signed by the correct sender when trying to transfer object A—which is owned by object B, and object B is owned by your account—it’s because of how ownership works in Sui. When an object is owned by another object, like in your case, you can’t directly transfer it from your account. Instead, you need to include object B (its parent) in the transaction and use it to authorize actions on object A. Simply signing the transaction with your account isn’t enough, since object A isn’t directly owned by your address. To fix this, make sure you include object B as a mutable input in your Move call or transaction block, so the Sui runtime knows the action is authorized.

Here’s a basic example of how that might look in a transaction block using the Sui SDK:

const tx = new TransactionBlock();
const parentObject = tx.object('0xB'); // object B
const childObject = tx.object('0xA'); // object A
// use parentObject to perform operations involving childObject
// for example, calling a Move function to transfer object A

tx.moveCall({
  target: '0xYourPackage::your_module::transfer_child',
  arguments: [parentObject, childObject, tx.pure(recipientAddress)]
});

await wallet.signAndExecuteTransactionBlock({ transactionBlock: tx });

Just be sure your Move function properly defines both object B and object A as inputs, and that object B has permission to operate on A. You can read more about Sui object ownership and permissions in the official docs here: https://docs.sui.io/understand/ownership

0
Comments
.

Do you know the answer?

Please log in and share it.

Move is an executable bytecode language used to implement custom transactions and smart contracts.

148Posts240Answers
Sui.X.Peera.

Earn Your Share of 1000 Sui

Gain Reputation Points & Get Rewards for Helping the Sui Community Grow.

Reward CampaignJuly