Shared object for NFT transaction between 2 distinct addresses

I set up two addresses, “seller” and “buyer”. Seller inits a Shared object, mints an Art object & (lists or loads it on the Shared object as a dynamic object field. Buyer transfers the appropriate balance in SUI to the Shared Object, transfers the Art Object to himself and if he so chooses burns the object. Finally, the “seller” collects the balance from the Shared object. The code is as follows:

#[allow(unused)]
module try::art;

use std::string::{Self, String};
use sui::dynamic_object_field as dof;
use sui::balance::{Self, Balance};
use sui::coin::{Self, Coin};
use sui::sui::SUI;

public struct Art has key, store {
    id: UID,
    name: String,
    price: u64,
}

public struct Shared has key, store {
    id: UID,
    purse: Balance<SUI>,
}

fun init(ctx: &mut TxContext) {
    let shared = Shared {
        id: object::new(ctx),
        purse: balance::zero(),
    };

    transfer::public_share_object(shared);
}

public entry fun mint(
    name: vector<u8>,
    price: u64,
    ctx: &mut TxContext) {
        transfer::transfer(Art {
            id: object::new(ctx),
            name: string::utf8(name),
            price,
            }, tx_context::sender(ctx));
}

public entry fun list(
    shared: &mut Shared,
    art: Art,
    ctx: &mut TxContext) {
        dof::add(&mut shared.id, true, art);
}

public fun delist(
    shared: &mut Shared): Art {
        let art = dof::remove(&mut shared.id, true);
        art
}

public entry fun transfer(
    shared: &mut Shared,
    paysui: &mut Coin<SUI>,
    ctx: &mut TxContext) {
        let art = delist(shared);

        assert!(coin::value(paysui) >= art.price, 0);
        let paysui_bal = coin::balance_mut(paysui);
        let pmt_bal = balance::split(paysui_bal, art.price);
        balance::join(&mut shared.purse, pmt_bal);

        transfer::public_transfer(art, tx_context::sender(ctx));
}

public entry fun burn(art: Art) {
    let Art { id, name:_, price: _ } = art;
    object::delete(id);
}

public entry fun collect(
    shared: &mut Shared,
    ctx: &mut TxContext) {
       let pmt_val = balance::value(&shared.purse);
       let pmt_coin = coin::take(&mut shared.purse, pmt_val, ctx);

       transfer::public_transfer(pmt_coin, tx_context::sender(ctx));
}

As of my meager understanding, for this to work I publish it twice, from both the “seller” and “buyer” addresses. I work with the sui client cli. The “seller” executes the functions mint and list succesfully with his own package_id. However, when I switch to the “buyer” addr and try to exec the transfer func with the command

sui client call --package $PACKAGE_BUYER_ID --module art --function transfer --args $SHARED_ID $PAYSUI

I get the following error

Error executing transaction '7GYWp3ofkf62x2SCyMx62iMXYseKRzbbb2FSXX6fpMFC': CommandArgumentError { arg_idx: 0, kind: TypeMismatch } in command 0

If you were kind enough to follow through, please share any insights and guidances.

I thank you in advance.

Theodoros