Skip to content
lsl.devlsl.devLSL Dev

money

event
Event syntax
money(
  1. key id,// UUID of the paying resident.
  2. integer amount// Quantity of L$ paid to the prim.
) { … }

Triggered when a resident specified by id pays an amount of Linden dollars (L$) to the prim.

Triggered when money is paid to the prim in the amount by id.

How to use
money(key id, integer amount)
{
}

When money is paid to the prim, the money is given to the object’s owner.

If the object is owned by or deeded to a group it is divvied up amongst the group members immediately (which is why groups can’t grant PERMISSION_DEBIT). Only members of a role that has the “Accounting/Pay group liabilities and receive group dividends” attribute will receive money.

Don’t forget to turn on the pay-behavior of the prims/objects involved.

The pay buttons should be configured in most applications where money is being transfered (llSetPayPrice), it makes paying money to the object easier.

  • This event cannot be triggered by a call to llGiveMoney because llGiveMoney cannot be used by one object to pay another object.
  • Money cannot be paid to an attachment.
  • Money() does not check if it is running on the Testing Grid! If you are writing a vendor that does networking, be sure to check that it was not payed aditi grid by doing if(llSubStringIndex(llGetEnv("simulator_hostname"), ".aditi.") == -1) or by checking if llHTTPRequest’s X-SecondLife-Shard header does not equal “Testing”.
This example shows the simplest tip-jar and shows how little code is needed to receive unverified amounts of money.
default
{
money(key id, integer amount) // Some money has been received (and has been paid into the owner's account)
{
// Thank the giver for their tip
llInstantMessage(id, "Thanks for the L$" + (string) amount + " tip!");
}
}
Next level of tip jar, advising owner, keeping a running total, and with floating text to show status.
13 collapsed lines
integer Total;
string OwnerName;
default
{
on_rez( integer sparam )
{
llResetScript();
}
state_entry()
{
OwnerName = llKey2Name( llGetOwner() );
llSetText( OwnerName + "'s Tip Jar.\nAny tips gratefully received!\nL$0 Donated so far", <.2, 1, .6>, 1);
}
money(key id, integer amount)
{
Total += amount;
// Shortcut 'cheat' to avoid multiple casts when constructing a message including non-string items
string str = (string) [OwnerName, "'s Tip Jar.\nPlease tip if you are so inclined!\nL$", amount, " Was donated last!\nL$", Total, " Donated so far" ];
llSetText(str, <1,1,1>, 1);
llInstantMessage(id,"Thanks for the tip!");
llInstantMessage(llGetOwner(), llKey2Name(id) + " donated L$" + (string) amount );
}
}
An elementary vendor with money validation and refund capability
6 collapsed lines
// Give the first item in this object's inventory to anyone who pays the price
integer price = 10; // The price needed to purchase the item
default
{
state_entry()
{
// Turn off pay options so no money can be received until we are ready
llSetPayPrice(PAY_HIDE, [PAY_HIDE ,PAY_HIDE, PAY_HIDE, PAY_HIDE]);
// Request Debit Permissions from the owner so refunds can be given
llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);
}
on_rez(integer p)
{
llResetScript(); // Reset script on rezzing. Will thus register any change of owner.
}
money(key id, integer amount) // Some money has been received and has gone to this object's owner
{
if (amount < price)
{ // Customer has not paid enough
llInstantMessage(id, "That's not enough money.");
llGiveMoney(id, amount); // Refund the money they paid
return;
}
if (amount > price)
{ // Customer paid too much. Refund the excess
integer change = amount - price;
llInstantMessage(id, "You paid more than L$" + (string)price
+ " your change is L$" + (string)change );
llGiveMoney(id, change);
}
// Customer has paid at least the right amount. Give them the item.
string ItemName = llGetInventoryName(INVENTORY_OBJECT, 0);
llGiveInventory(id, ItemName);
llInstantMessage(id, "Please accept your purchase worth L$" + (string) price );
}
run_time_permissions(integer perm)
{
9 collapsed lines
// If Debit permissions are granted, set up the pay price for this single-price vendor
if(perm & PERMISSION_DEBIT)
llSetPayPrice(price, [PAY_HIDE ,PAY_HIDE, PAY_HIDE, PAY_HIDE]);
// In practice, the following line would be preferable and almost fully guards against a wrong amount being paid
// - except in the rare event that the price is changed while a transaction is in progress, or a user with a hacked viewer
// llSetPayPrice(PAY_HIDE, [price ,PAY_HIDE, PAY_HIDE, PAY_HIDE]);
}
}
Original wiki source

Some wiki templates and tables need their original context. View this article on the Second Life Wiki. Technical wording and examples are retained from the source; historical guidance may differ from current behavior.

From the Second Life Wiki

Community documentation adapted from Money, by Linden Research, Inc. and contributing residents.View contributors and history.

Built from these wiki pages, as imported:

Licensed under CC BY-SA 3.0. Last wiki edit: .Formatting and links have been adapted for this site; API metadata follows the LSL definitions.