[
"autonomous agent",
{
"doc_url": "https://counterstake.org/bridge-export-factory.json",
"init": "{
$export_base_aa = 'RQ7V7KK3EN7T7BO33TKSXXZ6I4HQZFCB';
$governance_base_aa = 'HLNWXGGHGXWMZN27W2722MNJCHH2IVAO';
}",
"messages": {
"cases": [
{
"init": "{
if (!trigger.data.asset)
bounce("no asset");
if (!asset[trigger.data.asset].exists)
bounce("no such asset: " || trigger.data.asset);
if (!is_integer(trigger.data.asset_decimals) OR trigger.data.asset_decimals < 0 OR trigger.data.asset_decimals > 15)
bounce("bad asset_decimals" || trigger.data.asset_decimals);
if (!trigger.data.foreign_network)
bounce("no foreign network");
if (!trigger.data.foreign_asset)
bounce("no foreign asset");
// if we deploy a new factory in the future, it should check the old factory's registry too
if (var['aa_' || trigger.data.foreign_network || '_' || trigger.data.foreign_asset])
bounce('export AA already exists for this foreign network and asset');
$params = {
asset: trigger.data.asset,
asset_decimals: trigger.data.asset_decimals,
foreign_network: trigger.data.foreign_network,
foreign_asset: trigger.data.foreign_asset,
};
// ratio of the initial stake to the amount claimed
if (trigger.data.ratio){
if (typeof(trigger.data.ratio) != 'number' OR trigger.data.ratio <= 0)
bounce("bad ratio: " || trigger.data.ratio);
$params.ratio = trigger.data.ratio;
}
// challenging periods in hours
foreach(['challenging_periods', 'large_challenging_periods'], 2, $p => {
$value = trigger.data[$p];
if (exists($value)) {
$params[$p] = $governance_base_aa.$get_challenging_periods($value);
}
});
// the counterstake must be that larger than the current stake
if (trigger.data.counterstake_coef){
if (typeof(trigger.data.counterstake_coef) != 'number' OR trigger.data.counterstake_coef <= 1)
bounce("bad counterstake_coef: " || trigger.data.counterstake_coef);
$params.counterstake_coef = trigger.data.counterstake_coef;
}
// minimum amount of stake - to make sure that even small claims are properly monitored and challenged if necessary
if (trigger.data.min_stake){
if (!is_integer(trigger.data.min_stake) OR trigger.data.min_stake < 0)
bounce("bad min_stake: " || trigger.data.min_stake);
$params.min_stake = trigger.data.min_stake;
}
// the repatriated tx must be old enough before it is allowed to claim it
if (trigger.data.min_tx_age){
if (!is_integer(trigger.data.min_tx_age) OR trigger.data.min_tx_age < 0)
bounce("bad min_tx_age: " || trigger.data.min_tx_age);
$params.min_tx_age = trigger.data.min_tx_age;
}
// transfers that are deemed large and trigger a different schedule of challenging periods
if (trigger.data.large_threshold){
if (!is_integer(trigger.data.large_threshold) OR trigger.data.large_threshold <= 0)
bounce("bad large_threshold: " || trigger.data.large_threshold);
$params.large_threshold = trigger.data.large_threshold;
}
// governance AA params
foreach(['governance_challenging_period', 'freeze_period'], 2, $p => {
$value = trigger.data[$p];
if (exists($value)) {
if (!is_integer($value) OR $value <= 0)
bounce("bad " || $p);
$params[$p] = $value;
}
});
$export_aa = [
'autonomous agent',
{
base_aa: $export_base_aa,
params: $params
}
];
$export_aa_address = chash160($export_aa);
}",
"messages": [
{
"app": "payment",
"payload": {
"asset": "base",
"outputs": [
{
"address": "{ $export_aa_address }",
"amount": 4000
}
]
}
},
{
"app": "data",
"payload": {
"define": 1,
"factory": "{this_address}"
}
},
{
"app": "definition",
"payload": {
"definition": "{$export_aa}"
}
},
{
"app": "state",
"state": "{
var['export_' || $export_aa_address] = $params;
var['aa_' || trigger.data.foreign_network || '_' || trigger.data.foreign_asset] = $export_aa_address;
response['address'] = $export_aa_address;
}"
}
]
}
]
}
}
]