2020-07-29 13:42:51 +00:00
import axios from "axios" ;
2020-08-06 19:17:38 +00:00
import * as eztz from "eztz-lib" ;
2020-07-29 13:42:51 +00:00
import {
validatorsList ,
getChainValidatorsPath ,
2020-08-06 19:17:38 +00:00
getChainValidatorsListPath ,
getChainValidatorsAssets
2020-07-29 13:42:51 +00:00
} from "../common/repo-structure" ;
import { Tezos } from "../common/blockchains" ;
import { readFileSync } from "../common/filesystem" ;
import { writeJsonFile } from "../common/json" ;
2020-08-06 19:17:38 +00:00
import { ActionInterface , CheckStepInterface } from "./interface" ;
import { ValidatorModel } from "../common/validator-models" ;
2020-07-29 13:42:51 +00:00
2020-08-06 19:17:38 +00:00
interface BakingBadBaker {
address : string ,
freeSpace : number
// serviceHealth: string // active or Dead is a working baker who was a public baker but for some reason stopped paying his delegators, Closed is a permanently closed service (we store them for historical purposes only
fee : number
minDelegation : number
openForDelegation : boolean
payoutDelay : number
payoutPeriod : number
serviceHealth : string
}
2020-07-29 13:42:51 +00:00
function getChainValidatorsList ( chain : string ) : ValidatorModel [ ] {
return JSON . parse ( readFileSync ( ` ${ ( getChainValidatorsPath ( chain ) ) } / ${ validatorsList } ` ) ) ;
}
async function gen_validators_tezos() {
2020-04-23 18:24:03 +00:00
const bakers : BakingBadBaker [ ] = await axios . get ( ` https://api.baking-bad.org/v2/bakers ` ) . then ( res = > res . data )
const bakersMap : { [ key : string ] : BakingBadBaker } = bakers . reduce ( ( acm , val ) = > {
acm [ val . address ] = val
return acm
} , { } )
const newbakers = getChainValidatorsList ( Tezos ) . reduce ( ( acm , val ) = > {
if ( ! ( val . id in bakersMap ) ) {
console . log ( val . id )
return acm
}
const bakerInfo = bakersMap [ val . id ]
val . payout . commission = Number ( ( bakerInfo . fee * 100 ) . toFixed ( 2 ) )
val . payout . payoutDelay = bakerInfo . payoutDelay
val . payout . payoutPeriod = bakerInfo . payoutPeriod
2020-05-07 00:13:12 +00:00
val . staking . minDelegation = bakerInfo . minDelegation
2020-04-23 18:24:03 +00:00
2020-04-28 02:11:38 +00:00
const freeSpace = Number ( ( bakerInfo . freeSpace ) . toFixed ( 0 ) )
2020-05-07 00:13:12 +00:00
// Disable baker if no more capacity
2020-04-28 02:11:38 +00:00
if ( freeSpace <= 0 ) {
val . status = {
"disabled" : true ,
2020-05-07 00:13:12 +00:00
"note" : ` No more capacity: ${ freeSpace } `
2020-04-28 02:11:38 +00:00
}
}
2020-04-29 20:10:13 +00:00
// Enable baker if has capacity
if ( freeSpace > 0 && val . hasOwnProperty ( "status" ) ) {
delete val . status
2020-04-23 18:24:03 +00:00
}
2020-04-29 20:10:13 +00:00
2020-05-07 00:13:12 +00:00
if ( bakerInfo . serviceHealth !== "active" ) {
2020-04-29 20:10:13 +00:00
val . status = {
"disabled" : true ,
2020-05-07 00:13:12 +00:00
"note" : ` According to Baking Bad API, baker is not active, current status ${ bakerInfo . serviceHealth } , see: https://api.baking-bad.org/v2/bakers/ ${ bakerInfo . address } ` ,
2020-04-29 20:10:13 +00:00
}
}
2020-04-23 18:24:03 +00:00
acm . push ( val )
return acm
} , [ ] )
2020-07-29 13:42:51 +00:00
writeJsonFile ( getChainValidatorsListPath ( Tezos ) , newbakers )
}
2020-08-06 19:17:38 +00:00
export class TezosAction implements ActionInterface {
getName ( ) : string { return "Tezos" ; }
2020-08-10 08:56:41 +00:00
getSanityChecks ( ) : CheckStepInterface [ ] {
2020-08-06 19:17:38 +00:00
return [
{
getName : ( ) = > { return "Tezos validator assets must have correct format" } ,
check : async ( ) = > {
var error : string = "" ;
const assets = getChainValidatorsAssets ( Tezos ) ;
assets . forEach ( addr = > {
if ( ! ( eztz . crypto . checkAddress ( addr ) ) ) {
error += ` Address ${ addr } must be valid Tezos address' \ n ` ;
}
} ) ;
return error ;
}
} ,
] ;
}
2020-08-10 08:56:41 +00:00
getConsistencyChecks = null ;
sanityFix = null ;
consistencyFix = null ;
2020-08-06 19:17:38 +00:00
async update ( ) : Promise < void > {
await gen_validators_tezos ( ) ;
}
2020-07-29 13:42:51 +00:00
}