[
"autonomous agent",
{
"getters": "{
//Whether the current patron is paying the Herberger tax
$isPatronStale = ()=>{
$end = var["end"];
return NOT $end OR $end < timestamp;
};
$getArtist = ()=>params.artist_address;
$getAsset = ()=>params.asset OTHERWISE "base";
$getMinPeriod = ()=>params.tax_period OTHERWISE 24*60*60;
$getGas = ()=>$isPatronStale() ? 0 : var["gas"] OTHERWISE 0;
$getPatron = ()=>$isPatronStale() ? false : var["patron"];
$getStart = ()=>$isPatronStale() ? false : var["start"];
$getEnd = ()=>$isPatronStale() ? false : var["end"];
$getIPFS = ()=>{
if ($isPatronStale())
return false;
$patron = $getPatron();
$dataFeedValue = data_feed[[oracles=$patron, feed_name=this_address || "_meta", ifnone=false]];
$ipfs = var["ipfs"];
if (NOT $ipfs) //IPFS field was not provided when the sponsorship was bought, return dataFeed
return $dataFeedValue;
$dataFeedHash = data_feed[[oracles=$patron, feed_name=this_address || "_meta", ifnone=false, what="unit"]];
$unit = $dataFeedHash ? unit[$dataFeedHash] : false;
if ($unit AND $ipfs) //There is a data feed AND ipfs field was provided when sponsorship was bought, pick the most recent one
return var["start"] > $unit.timestamp ? $ipfs : $dataFeedValue;
return $ipfs; //There was no data feed and ipfs was not provided, or ipfs was provided and there is no data feed
};
$getToS = ()=>$isPatronStale() ? false : data_feed[[oracles=$getPatron(), feed_name=this_address || "_tos", ifnone=false]];
}",
"init": "{
$ARTIST_ADDRESS = params.artist_address;
$ASSET = params.asset OTHERWISE "base";
$TAX_PERIOD = params.tax_period OTHERWISE 24*60*60; //1 day by default
$CT_CUT = 0.02;
$CT_ADDRESS = "
ZIT3YPDTLGAO7MVO2ONNDMSEYS2VELX6";
$IS_PATRON_STALE = $isPatronStale();
$LAST_GAS = var["gas"] OTHERWISE 0; //Gas is tokens/m
$LAST_PAID = var["paid"];
$CURRENT_PATRON = var["patron"];
require(is_valid_address($ARTIST_ADDRESS), "This smart contract setup failed. The artist address is invalid");
require(asset[$ASSET].exists, "That smart contract setup failed. An unknown asset was set for payouts");
response["kicked"] = $IS_PATRON_STALE;
response["who"] = trigger.data.patron OTHERWISE trigger.address;
response["amount"] = trigger.output[[asset=$ASSET]].amount;
$periods = trigger.data.periods OTHERWISE 1;
$paid = $ASSET == 'base' ? trigger.output[[asset=$ASSET]].amount - 5000 : trigger.output[[asset=$ASSET]].amount;
$gas = $paid/$TAX_PERIOD/$periods*60;
response["periods"] = trigger.data.periods;
response["gas"] = $gas;
require($gas > 0, "Gas must be a positive amount");
if (NOT $IS_PATRON_STALE)
require($gas >= $LAST_GAS * 1.05, "You have to pay at least 5% more than the current patron");
$elapsed = $IS_PATRON_STALE ? 1 : 1 - (var["end"] - timestamp) / (var["end"] - var["start"]);
$usage = $IS_PATRON_STALE ? 0 : floor($elapsed * $LAST_PAID);
$toArtist = $IS_PATRON_STALE ? $paid : $paid - ($paid - $usage);
$ct_cut = floor($toArtist * $CT_CUT);
}",
"messages": [
{
"app": "payment",
"payload": {
"asset": "{$ASSET}",
"outputs": [
{
"if": "{NOT $IS_PATRON_STALE}",
"address": "{$CURRENT_PATRON}",
"amount": "{$LAST_PAID - $usage}"
},
{
"address": "{$ARTIST_ADDRESS}",
"amount": "{$toArtist - $ct_cut}"
},
{
"address": "{$CT_ADDRESS}",
"amount": "{$ct_cut}"
}
]
}
},
{
"app": "state",
"state": "{
//Update current patron data
var["whois"] = trigger.data.whois;
var["start"] = timestamp;
var["end"] = floor(timestamp + $TAX_PERIOD * $periods);
var["patron"] = trigger.data["patron"] OTHERWISE trigger.address;
var["gas"] = $gas;
var["paid"] = $paid;
var["ipfs"] = trigger.data["ipfs"];
var["earnings"]+=$toArtist - $ct_cut;
}"
}
]
}
]