[
"autonomous agent",
{
"init": "{
$nom_AA = 'Portal';
$versio = '0.1.2';
$_AUT_000 = 'C4KIJSUWVM7BGWTLXKX3K4PNRXV7OY4W';
// Principals
$adr__ = trigger.address;
$args = trigger.data;
$_unitat = trigger.output[[ asset != base ]].asset;
$qt = trigger.output[[ asset = $_unitat ]];
$dades = var[ 'dades' ] otherwise {};
$generics = $dades.generics otherwise {};
$propostes = $dades.propostes otherwise {};
$assignacions = $dades.assignacions otherwise {};
$conversions = $dades.conversions otherwise {};
$retribucions = $dades.retribucions otherwise {};
$entitats = $dades.entitats otherwise {};
$_estels = $generics._Estels;
$getons =
$generics._Getons ?
var[ $generics._Getons ][ 'getons' ] :
{};
$dades_accions =
$generics._Accions ?
var[ $generics._Accions ]:
{};
$cicle_actual = $dades_accions.basiques.cicle_actual;
$escala_actual = $dades_accions.basiques.escala_actual;
// Abreviacions
$admin = $args.admin;
$proces = $args.proces;
$ref = $args.ref;
$val = $args.val;
$idprop = $args.idprop;
$idgeto = $args.id_geto;
// Identificacions
$_actuant_es_AUT_000 = $adr__ == $_AUT_000;
$_actuant_es_AUT =
( $generics._AUT_A AND $generics._AUT_A == $adr__ )
OR ( $generics._AUT_B AND $generics._AUT_B == $adr__ )
OR ( $generics._AUT_C AND $generics._AUT_C == $adr__ )
OR ( $generics._AUT_0 AND $adr__ == $generics._AUT_0 )
OR ( $_actuant_es_AUT_000 AND ! is_valid_address( $generics._AUT_0 ) );
// Funcions auxiliars
// Retorna valor argument lliurat si el troba. Altrament, s'atura
$__arg = $arg =>
$args[ $arg ] otherwise
bounce( "Cal proporcionar el valor de: " || $arg );
$__ordinal = $rf => $dades.ordinals[ $rf ] ? $dades.ordinals[ $rf ] + 1 : 1;
// Admin
if ( $admin ) {
// Autoritzacions
if ( $args.admin_geto ) {
$geto = $getons[ $idgeto ];
// El getó ha d'existir i constar com a actiu
if ( ! $geto OR $geto.estat != 'actiu' )
{ bounce( 'Getó inexistent o inactiu' ); }
// Determina si adr__ actuant consta com autoritzada per al getó
$varsgeto = $geto.variables;
$_actuant_es_AUT_geto =
$_actuant_es_AUT AND ! $varsgeto._AUT_0
OR $adr__ == $geto.constants._AUT_A
OR ( $varsgeto._AUT_0 AND $adr__ == $varsgeto._AUT_0 )
OR ( $varsgeto._AUT_B AND $adr__ == $varsgeto._AUT_B )
OR ( $varsgeto._AUT_C AND $adr__ == $varsgeto._AUT_C );
if ( ! $_actuant_es_AUT_geto )
{ bounce( 'No autoritzada' ); }
} else {
if ( ! $_actuant_es_AUT )
{ bounce( 'No autoritzada' ); }
// Excepcionalment per als TESTS
if ( ( $__arg( 'ref' ) ) == 'multiple' AND ! $_actuant_es_AUT_000 )
{ bounce( 'No autoritzada per a esmena múltiple' ); }
}
// Validació
$validacio_requerida =
// _AUT_000 pot saltar-se procés validació mentre no existeixi _AUT_0
! $_actuant_es_AUT_000 OR ( $_actuant_es_AUT_000 AND $generics._AUT_0 )
// Processos exclosos
AND $proces != 'decisio_validacio'
AND $proces != 'generacio_getons';
if ( $validacio_requerida ) {
if ( $args.operacio AND $args.operacio == 'confirmacio' ) {
$proposta = $propostes[ $idprop ];
// La proposta ha d'existir
if ( ! $proposta )
{ bounce( "No hi ha cap proposta amb aquesta ref" ); }
// La confirmació l'ha de fer una AUT diferent a la proposant
if ( $proposta.proposant == $adr__ )
{ bounce( "El procés de confirmació l'ha d'endegar una altra AUT" ); }
// La confirmació només es pot fer quan ha transcorregut el lapse especificat
if ( $generics.Lapse > timestamp - $proposta.temps )
{ bounce( "Encara no es pot confirmar la proposta" ); }
// La proposta ha de constar com a validada
$dades_validacions = var[ $generics._Validacions ][ 'dades' ];
if ( ! $dades_validacions.validacions[ $idprop ] )
{ bounce( "La proposta encara no ha estat validada" ); }
$operacio = 'confirmacio';
} else {
$__nova_proposta = $dades_prop => {
$dades.ordinals[ $proces ] = $__ordinal( $proces );
$nova_idprop = $proces || '_' || $dades.ordinals[ $proces ];
$dades.propostes[ $nova_idprop ] = $dades_prop;
$nova_idprop
};
$__data_confirmacio = () => timestamp_to_string( timestamp + $generics.Lapse );
$operacio = 'proposta';
}
} else {
$operacio = 'drecera';
}
}
}",
"messages": {
"cases": [
{
"if": "{ $proces == 'acces_accions' }",
"init": "{
$unitat_es_geto = $getons[ $_unitat ];
if ( $_unitat != $_estels
AND ( ! $unitat_es_geto OR $unitat_es_geto.estat != 'actiu' ) )
{ bounce( 'Getó inexistent o inactiu' ); }
}",
"messages": [
{
"app": "data",
"payload": "{ $args }"
},
{
"app": "payment",
"payload": {
"asset": "{ $_unitat }",
"outputs": [
{
"address": "{ $generics._Accions }",
"amount": "{ $qt }"
}
]
}
}
]
},
{
"if": "{ $admin AND $proces == 'renovacio_adrs_portal' }",
"init": "{
$args.nou_portal =
$operacio == 'proposta' ?
false : true;
}",
"messages": [
{
"app": "data",
"payload": "{ $args }"
},
{
"app": "payment",
"payload": {
"asset": "{ $_unitat }",
"outputs": [
{
"address": "{ $generics._Accions }",
"amount": "{ $qt }"
}
]
}
},
{
"app": "data",
"payload": "{ $args }"
},
{
"app": "payment",
"payload": {
"asset": "{ $_unitat }",
"outputs": [
{
"address": "{ $generics._Getons }",
"amount": "{ $qt }"
}
]
}
},
{
"app": "data",
"payload": "{ $args }"
},
{
"app": "payment",
"payload": {
"asset": "{ $_unitat }",
"outputs": [
{
"address": "{ $generics._Validadores }",
"amount": "{ $qt }"
}
]
}
},
{
"app": "data",
"payload": "{ $args }"
},
{
"app": "payment",
"payload": {
"asset": "{ $_unitat }",
"outputs": [
{
"address": "{ $generics._Validacions }",
"amount": "{ $qt }"
}
]
}
}
]
},
{
"if": "{ $admin AND $proces == 'copia_dades_portal' }",
"messages": [
{
"app": "state",
"state": "{
$refs_dades = [
'generics', 'propostes', 'ordinals', 'assignacions',
'conversions', 'retribucions', 'entitats'
];
$dades_portal_actual = var[ $__arg( 'val' )][ 'dades' ];
$renovacions = $dades_portal_actual[ 'renovacions' ] otherwise [];
$noves_dades = {};
$__copia_dades = $ref_dades => {
$noves_dades[ $ref_dades ] =
$dades_portal_actual[ $ref_dades ]
otherwise [];
};
$copia = map( $refs_dades, 7, $__copia_dades );
if ( $operacio == 'proposta' ) {
$dades_proposta =
{
dades: $noves_dades,
proposant: $adr__,
temps: timestamp,
};
response[ 'proposta' ] = $__nova_proposta( $dades_proposta );
} else {
$__valvar = $refvar => {
$dades[ $refvar ] =
$proposta.dades[ $refvar ]
otherwise $noves_dades[ $refvar ];
};
$seleccio = map( $refs_dades, 7, $__valvar );
$dades.renovacions[] = $val;
$dades.darrer_portal = $val;
response[ 'darrer_portal' ] = $val;
response[ 'nombre renovacions' ] = array_length( $renovacions ) + 1;
if ( $idprop ) { response[ 'proposta' ] = $idprop; }
response[ 'procés' ] = $proces;
var[ 'dades' ] = $dades;
}
}"
}
]
},
{
"if": "{ $admin AND $proces == 'copia_dades' }",
"init": "{
$args.copia_dades =
$operacio == 'proposta' ? false : true;
$args.adr_aa = $generics[ '_' || $args.nom_aa ];
}",
"messages": [
{
"app": "data",
"payload": "{ $args }"
},
{
"if": "{ $operacio != 'proposta' }",
"app": "payment",
"payload": {
"asset": "{ $_unitat }",
"outputs": [
{
"address": "{ $args.adr_aa }",
"amount": "{ $qt }"
}
]
}
},
{
"app": "state",
"state": "{
if ( $operacio == 'proposta' ) {
$dades_proposta =
{
nom_aa: $args.nom_aa,
proposant: $adr__,
temps: timestamp,
};
response[ 'proposta' ] = $__nova_proposta( $dades_proposta );
}
response[ 'procés' ] = $proces;
}"
}
]
},
{
"if": "{ $admin AND $proces == 'esmena_generics' }",
"messages": [
{
"app": "state",
"state": "{
if ( ! $generics AND $ref != 'multiple' )
{ bounce( "No hi ha generics" ); }
if ( $operacio == 'drecera' ) {
if ( $ref == 'multiple' ) {
$__resp = $r => {
$valvar =
$args[ $r ] otherwise $generics[ $r ] otherwise '...';
$generics[ $r ] = $valvar;
response[ $r ] = $valvar;
};
$refs_generics = [
'_Accions', '_Getons', '_Validacions', '_Validadores',
'_FRO', '_Estels', 'Interval', 'Lapse',
'Import_Activacio', 'Import_Subscripcio', 'Import_Renovacio',
'Taxa_Conversio', 'Factor_Conversio', 'Generacio_Minima',
'Nombre_Delegades', 'Nombre_Aprovacions', 'Cicles_Diposit',
'_AUT_A', '_AUT_B', '_AUT_C'
];
$generics_AUT_0 = '';
$valora = map( $refs_generics, 21, $__resp );
} else {
$generics[ $__arg( 'ref' ) ] = $__arg( 'val' );
$nova_ref = $ref;
$nou_val = $val;
}
} else if ( $operacio == 'confirmacio' ) {
$generics[ $proposta.ref ] = $proposta.val;
$nova_ref = $proposta.ref;
$nou_val = $proposta.val;
response[ 'proposta' ] = $idprop;
} else {
$dades_proposta =
{
ref: $__arg( 'ref' ),
val: $__arg( 'val' ),
proposant: $adr__,
temps: timestamp,
};
response[ 'proposta' ] = $__nova_proposta( $dades_proposta );
$nova_ref = $ref;
$nou_val = $val;
}
if( $nova_ref ) {
response[ 'ref' ] = $nova_ref;
response[ 'nou valor' ] = $nou_val;
}
$dades.generics = $generics;
var[ 'dades' ] = $dades;
response[ 'procés' ] = $proces;
}"
}
]
},
{
"if": "{ $args.admin_geto }",
"init": "{
$args.operacio = $operacio;
$args.proposta = $proposta;
}",
"messages": [
{
"if": "{ $proces == 'nou_geto' AND $operacio != 'proposta' }",
"app": "asset",
"payload": {
"cap": "{ $args.cap otherwise 1e9 }",
"is_private": false,
"is_transferrable": true,
"auto_destroy": "{ !! $args.auto_destroy }",
"fixed_denominations": false,
"issued_by_definer_only": true,
"cosigned_by_definer": false,
"spender_attested": false
}
},
{
"if": "{ $proces == 'generacio_getons' AND $operacio != 'proposta' }",
"init": "{
if ( $_unitat != $_estels )
{ bounce( 'Cal aportar-hi estels' ); }
if ( $qt < $generics.Generacio_Minima )
{ bounce( 'Cal aportar-hi si més no '
|| $generics.Generacio_Minima || ' estels' ); }
}",
"app": "payment",
"payload": {
"asset": "{ $idgeto }",
"outputs": [
{
"address": "{ $getons.constants._FOP }",
"amount": "{ $qt * $getons.constants.factor_conversio }"
}
]
}
},
{
"app": "data",
"payload": "{ $args }"
},
{
"app": "payment",
"payload": {
"asset": "{ $_unitat }",
"outputs": [
{
"address": "{ $generics._Getons }",
"amount": "{ $qt }"
}
]
}
}
]
},
{
"if": "{ $admin AND $proces == 'assignacio' }",
"init": "{
$unitat = $proposta.unitat otherwise $args.unitat;
$qt_assignacio = $proposta.qt otherwise $args.qt;
$receptora = $proposta.receptora otherwise $args.receptora;
}",
"messages": [
{
"if": "{ $operacio != 'proposta' }",
"app": "payment",
"payload": {
"asset": "{ $unitat }",
"outputs": [
{
"address": "{ $receptora }",
"amount": "{ $qt_assignacio }"
}
]
}
},
{
"app": "state",
"state": "{
if ( $operacio == 'proposta' ) {
$dades_proposta =
{
proposant: $adr__,
temps: timestamp,
resolucio: $args.resolucio,
requeriment: $args.requeriment,
qt: $args.qt,
receptora: $args.receptora,
unitat: $args.unitat
};
response[ 'proposta' ] = $__nova_proposta( $dades_proposta );
} else {
$id_resolucio = $proposta.resolucio otherwise $args.resolucio;
$id_requeriment = $proposta.requeriment otherwise $args.requeriment;
$dades.assignacions[ $id_resolucio || '_' || $id_requeriment ] = {
proposant: $proposta.id_geto otherwise $adr__,
temps: $proposta.temps otherwise timestamp,
resolucio: $id_resolucio,
requeriment: $id_requeriment,
qt: $qt_assignacio,
receptora: $receptora,
unitat: $unitat
};
response[ 'proposta' ] = $idprop;
response[ 'qt' ] = $qt_assignacio;
response[ 'receptora' ] = $receptora;
response[ 'unitat' ] = $unitat;
var[ 'dades' ] = $dades;
}
response[ 'procés' ] = $proces;
}"
}
]
},
{
"if": "{ $proces == 'conversio' }",
"init": "{
$diposit = $dades_accions.diposits[ $__arg( 'ref' ) ];
if ( ! $diposit ) { bounce( ': Dipòsit inexistent' ); }
if ( $adr__ != $diposit.dipositant )
{ bounce( ": L'adreça receptora ha de ser la dipositant" ); }
if ( $dades.conversions[ $args.ref ] )
{ bounce( ': aquest dipòsit ja ha estat convertit' ); }
if ( $diposit.cicle_conversio > $cicle_actual )
{ bounce( ": Encara no és l'hora" ); }
$unitat =
$diposit.geto_diposit == $_estels ?
"base" :
$_estels;
}",
"messages": [
{
"app": "payment",
"payload": {
"asset": "{ $unitat }",
"outputs": [
{
"address": "{ $adr__ }",
"amount": "{ $diposit.qt_conversio }"
}
]
}
},
{
"app": "state",
"state": "{
$conversio =
{
temps: timestamp,
qt: $qt,
unitat_conversio: $unitat,
};
$dades.conversions[ $args.ref ] = $conversio;
response[ 'Conversió realitzada' ] = $args.ref;
response[ 'procés' ] = $proces;
var[ 'dades' ] = $dades;
}"
}
]
},
{
"if": "{ $proces == 'retribucio' }",
"init": "{
if ( $__arg( 'ref' ) == 'aportacio_activacio' ) {
$ref_activacio = 'activacio_' || $adr__ || '_en_' || $_estels;
$activacio = $dades_accions.activacions[ $ref_activacio ];
$import = $activacio.qt;
$escala = $activacio.escala;
} else {
$contribucio = $dades_accions.contribucions[ $args.ref ];
if ( ! $contribucio ) { bounce( ': Contribucio inexistent' ); }
if ( $adr__ != $contribucio.contribuidora )
{ bounce( ": L'adreça receptora ha de ser la contribuidora" ); }
$import = $contribucio.qt;
$escala = $contribucio.escala;
}
$ref_retribucio = $args.ref || '_' || $escala_actual;
if ( $dades.retribucions[ $ref_retribucio ] )
{ bounce( ": aquesta ja ha estat retribuïda per a l'escala actual" ); }
// Cal que s'hagi produït un salt d'escala
if ( $escala_actual == $escala ) { bounce ( $nom_AA || ": Encara no és l'hora" ); }
// Determina la qt de la retribucio
$qt_retribucio = $import * ( $escala_actual - $escala );
}",
"messages": [
{
"app": "payment",
"payload": {
"asset": "{ $_estels }",
"outputs": [
{
"address": "{ $adr__ }",
"amount": "{ $qt_retribucio }"
}
]
}
},
{
"app": "state",
"state": "{
$retribucio =
{
receptora: $adr__,
qt: $qt_retribucio,
temps: timestamp,
};
$dades.retribucions[ $ref_retribucio ] = $retribucio;
response[ 'Retribució realitzada' ] = $ref_retribucio;
response[ 'procés' ] = $proces;
var[ 'dades' ] = $dades;
}"
}
]
},
{
"if": "{ $operacio AND $operacio == 'proposta' }",
"init": "{
$args.proces = 'convocatoria_validadores';
}",
"messages": [
{
"app": "data",
"payload": "{ $args }"
},
{
"app": "payment",
"payload": {
"asset": "{ $_unitat }",
"outputs": [
{
"address": "{ $generics._Validacions }",
"amount": "{ $qt }"
}
]
}
}
]
},
{
"if": "{ $proces == 'decisio_validacio' }",
"messages": [
{
"app": "data",
"payload": "{ $args }"
},
{
"app": "payment",
"payload": {
"asset": "{ $_unitat }",
"outputs": [
{
"address": "{ $generics._Validacions }",
"amount": "{ $qt }"
}
]
}
}
]
},
{
"if": "{ $proces == 'validacio_directa_TEST' AND $_actuant_es_AUT }",
"messages": [
{
"app": "data",
"payload": "{ $args }"
},
{
"app": "payment",
"payload": {
"asset": "{ $_unitat }",
"outputs": [
{
"address": "{ $generics._Validacions }",
"amount": "{ $qt }"
}
]
}
}
]
},
{
"if": "{ $args.admin.entitats }",
"messages": [
{
"app": "state",
"state": "{
if ( $proces == 'nova_entitat' ) {
if ( $entitats[ $args.adr ] )
{ bounce( "Ja hi ha una entitat amb aquesta adreça" ); }
if ( $entitats[ $args.adr ].nom == $__arg( 'nom' ) )
{ bounce( "Ja hi ha una entitat amb aquest nom" ); }
if ( $operacio == 'proposta' ) {
$dades_proposta =
{
adr: $__arg( 'adr' ),
nom: $args.nom,
estat: $__arg( 'estat' )
};
}
response[ 'proposta' ] = $__nova_proposta( $dades_proposta );
} else {
$adr_entitat = $args.adr otherwise $proposta.adr;
$entitats[ $adr_entitat ] = {
nom: $args.nom otherwise $proposta.nom,
estat: $args.estat otherwise $proposta.estat,
};
}
if ( $proces == 'nou_estat_entitat' ) {
if ( ! $entitats[ $args.adr ] )
{ bounce( "No hi ha cap entitat amb aquesta adreça" ); }
if ( $operacio == 'proposta' ) {
$dades_proposta = { estat: $__arg( 'estat' ) };
response[ 'proposta' ] = $__nova_proposta( $dades_proposta );
} else {
$entitats[ $args.adr ].estat =
$args.estat otherwise $proposta.estat;
}
}
$dades.entitats = $entitats;
var[ 'dades' ] = $dades;
response[ 'procés' ] = $proces;
}"
}
]
}
]
}
}
]