Skip to main content

TransferPolicyTransaction

TransferPolicyTransaction is the client to build transactions that involve transfer policy management. It's used similar to KioskTransaction, and helps in crafting transactions to manage a transfer policy.

You need to instantiate it once in every Programmable Transaction Block (PTB) that you're building.

Similar to KioskTransaction, you can either create a new transfer policy, or use an existing one.

Using an existing transfer policy

If you have already retrieved a transfer policy from kioskClient.getOwnedTransferPolicies(), or kioskClient.getOwnedTransferPoliciesByType(), you can pass a TransferPolicyCap result when instantiating.

// Initialized somewhere in the app.
const kioskClient = new KioskClient({...});

// You could have more than one cap, since we can create more than one transfer policy.
const heroPolicyCaps = await kioskClient.getOwnedTransferPoliciesByType({
type: `${packageId}::hero::Hero`,
address: '0xConnectedAddress',
});

const tx = new Transaction();
// You can choose to use any of the caps you have. For this example, use the first one.
const tpTx = new TransferPolicyTransaction({ kioskClient, transaction: tx, cap: heroPolicyCaps[0] });

// A demonstration of using all the available rule add/remove functions.
// You can chain these commands.
tpTx
.addFloorPriceRule(10n)
.addLockRule()
.addRoyaltyRule(percentageToBasisPoints(10), 0)
.addPersonalKioskRule()
// .removeFloorPriceRule()
// .removeLockRule()
// .removeRoyaltyRule()
// .removePersonalKioskRule()

// Sign and execute transaction.
await signAndExecuteTransaction({tx});

Creating a new transfer policy

If you don't have an existing transfer policy, you can create a new one. You can also attach rules in the same PTB.

const publisher = '0xPackagePublisherObject';
const tx = new Transaction();

const tpTx = new TransferPolicyTransaction({ kioskClient, transaction: tx });

// This is an async call, as the SDK protects from accidentally creating
// a second transfer policy.
// You can skip this check by passing `skipCheck: true`.
await tpTx.create({
type: `${heroPackageId}::hero::Hero`,
publisher,
});

tpTx.addLockRule()
.addFloorPriceRule(1000n)
.addRoyaltyRule(percentageToBasisPoints(10), 100)
.addPersonalKioskRule()
// Transfers the `TransferPolicyCap` to the user and shares the transfer policy.
.shareAndTransferCap('address_to_transfer_cap_to');

// Sign and execute transaction.
await signAndExecuteTransaction({ tx });