Definition: [
"autonomous agent",
{
"bounce_fees": {
"base": 11000
},
"init": "{
$user = trigger.address;
$is_aa = $user == this_address;
}",
"messages": {
"cases": [
{
"if": "{!var["def_asset_hash"] }",
"init": "{
// if the creation of the asset have started,
// only the creator can interract with tha AA until the asset is defined
if (!!var["def_creator"])
if (var["def_creator"] != $user)
bounce("The asset is being created, and you are not the creator, try again later!");
$previous_underlying_asset_hash = var["previous_underlying_asset"] otherwise "first";
$received_underlying_asset_hash = trigger.data.asset;
$received_underlying_asset_amount = trigger.data.amount;
}",
"messages": [
{
"app": "state",
"state": "{
var["def_creator"] = $user;
// store in the definition, the quantity of asset
var["def_"||$received_underlying_asset_hash||"_amount"] = $received_underlying_asset_amount;
// create the next chain link
var["def_"||$previous_underlying_asset_hash] = $received_underlying_asset_hash;
}"
}
]
},
{
"if": "{!!trigger.data.define}",
"init": "{
// if the creation of the asset have started,
// only the creator can interract with tha AA until the asset is defined
if (!!var["def_creator"])
{
if (var["def_creator"] != $user)
bounce("Only the creator of the asset is allowed to define it!");
}
// an asset requires at least 2 underlying assets
if (!!var["first"])
{
$first_chain_link = var["first"];
if (!var[$first_chain_link])
bounce("an asset requires at least 2 underlying assets, please send the second underlying asset in the desired amount!");
}
else
bounce("To create a new asset, start sending the wanted amount of the first underlying asset!");
$asset_name = trigger.data.define;
$previous_underlying_asset = var["previous_underlying_asset"];
}",
"messages": [
{
"app": "asset",
"payload": {
"is_private": false,
"is_transferrable": true,
"auto_destroy": true,
"fixed_denominations": false,
"issued_by_definer_only": true,
"cosigned_by_definer": false,
"spender_attested": false
}
},
{
"app": "state",
"state": "{
response["defined"] = $asset_name ||" is defined as "||response_unit;
var["def_asset_hash"] = response_unit;
var["def_asset_name"] = trigger.data.define;
}"
}
]
},
{
"if": "{!!var["def_creator"] and var["def_creator"] == $user}",
"messages": [
{
"app": "payment",
"payload": {
"asset": "{var["def_asset_hash"]}",
"outputs": [
{
"address": "{var["def_creator"] }",
"amount": "{ 1 }"
}
]
}
},
{
"app": "state",
"state": "{
response["defined"] = $asset_name ||"Creator got one asset and do not have any role to play";
var["def_creator"] = false; // we can remove the creator
}"
}
]
},
{
"if": "{(trigger.data.asset == var["def_asset_hash"]) or $is_aa}",
"init": "{
if (!$is_aa)
{
$requester = $user;
$underlying_asset_hash = var["def_first"];
$amount = trigger.data.amount;
}
else
{
$requester = trigger.data.aa_reserved_requester;
$underlying_asset_hash = trigger.data.aa_reserved_underlying_asset_hash;
$amount = trigger.data.aa_reserved_asset_amount;
}
// use the link chain to get the next underlying asset
$next_underlying_asset_hash = var["def_"||$underlying_asset_hash];
}",
"messages": [
{
"app": "payment",
"payload": {
"asset": "{$underlying_asset_hash }",
"outputs": [
{
"address": "{$requester}",
"amount": "{$amount * var["def_"||$underlying_asset_hash]||"_amount"}"
}
]
}
},
{
"if": "{!!$next_underlying_asset_hash}",
"app": "data",
"payload": {
"aa_reserved_requester": "{$requester}",
"aa_reserved_underlying_asset_hash": "{$next_underlying_asset_hash}",
"aa_reserved_asset_amount": "{$amount}"
}
},
{
"if": "{!!$next_underlying_asset_hash}",
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{this_address}",
"amount": "{ 1 }"
}
]
}
}
]
},
{
"if": "{ // send the first unerlying asset or the one needed
(!!var[$user||"_underlying_asset"] and (trigger.data.asset == var[$user||"_underlying_asset"])) OR
( !var[$user||"_underlying_asset"] and (trigger.data.asset == var["def_first"]))
}",
"init": "{
if (!!var[$user||"_underlying_asset"])
{
$underlying_asset_hash = var[$user||"_underlying_asset"];
$etf_amount = var[$user||"_etf_amount"];
$needed_mount = $etf_amount * var["def_"||$underlying_asset_hash||"_amount"];
if (trigger.data.amount != $needed_mount)
bounce ("you should send "||$needed_mount|| " of "||$underlying_asset_hash);
}
else
{
$underlying_asset_hash = var["def_first"];
$needed_mount = var["def_"||$underlying_asset_hash||"_amount"];
//check if is a multiple of the first underlying asset amount
if ((trigger.data.amount % $needed_mount) != 0)
bounce ("you should send a multiple of "||$needed_mount|| " of "||$underlying_asset_hash);
else
$etf_amount = trigger.data.amount / $needed_mount;
}
// use the link chain to get the next underlying asset
$next_underlying_asset_hash = var["def_"||$underlying_asset_hash];
$all_underlying_asset_received = !$next_underlying_asset_hash;
}",
"messages": [
{
"if": "{$all_underlying_asset_received}",
"app": "payment",
"payload": {
"asset": "{$underlying_asset_hash }",
"outputs": [
{
"address": "{$requester}",
"amount": "{$amount * var["def_"||$underlying_asset_hash]||"_amount"}"
}
]
}
},
{
"app": "state",
"state": "{
if ($all_underlying_asset_received)
{
var[$user||"_etf_amount"] = false;
var[$user||"_underlying_asset"] = false;
response["processed"] = var["def_asset_name"]||"sent";
}
else
{
var[$user||"_etf_amount"] = $etf_amount;
var[$user||"_underlying_asset"] = $next_underlying_asset_hash;
response["in progress"] = $underlying_asset_hash ||"received and waiting for "||$next_underlying_asset_hash;
}
}"
}
]
}
]
}
}
]