Divergent block #11273929
ServiceProviderFactory
Contract has a transaction in block 11273929
The event that was triggered:
DeregisteredServiceProvider(indexed uint256,indexed bytes32,indexed address,string,uint256)
features:
serviceProviderContract.getServiceProviderDetails(event.params._owner)
entities effected:
DeregisteredServiceProviderEvent
- new value createdUser
- update existing or craete newDecreaseStakeEvent
- new entity created only if numberEndpoints
== 0 (dependent on contract call result)mapping code:
export function handleDeregisteredServiceProvider(event: DeregisteredServiceProvider): void {
// Update the service node to be deregistered
let id = getServiceId(event.params._serviceType.toString(), event.params._spID.toString())
let serviceNode = ServiceNode.load(id)
if (serviceNode === null) {
log.error('No associated service to deregister: service type:{}, id:{}', [
event.params._serviceType.toString(),
event.params._spID.toString()
])
return
}
serviceNode.isRegistered = false
serviceNode.save()
let serviceProviderContract = ServiceProviderFactory.bind(event.address)
let serviceProviderDetails = serviceProviderContract.getServiceProviderDetails(event.params._owner)
let user = createOrLoadUser(event.params._owner, event.block.timestamp)
let numberEndpoints = serviceProviderDetails.value3
if (numberEndpoints == BigInt.fromI32(0)){
// Since this is the last service to be deregistered, a decrease stake request is created,
// but no event is emitted, so we manually create a new decrease stake request for the user's stake amount
let lockupDuration = serviceProviderContract.getDecreaseStakeLockupDuration()
let decreaseAmount = user.stakeAmount
let id = getRequestCountId()
let decreaseStakeEvent = new DecreaseStakeEvent(id)
decreaseStakeEvent.status = 'Requested'
decreaseStakeEvent.owner = user.id
decreaseStakeEvent.expiryBlock = event.block.number.plus(lockupDuration)
decreaseStakeEvent.createdBlockNumber = event.block.number
decreaseStakeEvent.decreaseAmount = decreaseAmount
decreaseStakeEvent.save()
user.pendingDecreaseStake = decreaseStakeEvent.id
user.totalClaimableAmount = user.totalClaimableAmount.minus(decreaseAmount)
user.claimableStakeAmount = user.claimableStakeAmount.minus(decreaseAmount)
user.save()
// Update Global stake values
let audiusNetwork = AudiusNetwork.load('1')
audiusNetwork.totalTokensClaimable = audiusNetwork.totalTokensClaimable.minus(decreaseAmount)
audiusNetwork.totalTokensLocked = audiusNetwork.totalTokensLocked.plus(decreaseAmount)
audiusNetwork.save()
}
user.minAccountStake = serviceProviderDetails.value4
user.maxAccountStake = serviceProviderDetails.value5
user.save()
// Create the event
let deregisterEvent = new DeregisteredServiceProviderEvent(id)
deregisterEvent.type = event.params._serviceType.toString()
deregisterEvent.endpoint = event.params._endpoint
deregisterEvent.owner = event.params._owner.toHexString()
deregisterEvent.spId = event.params._spID
deregisterEvent.unstakeAmount = event.params._unstakeAmount
deregisterEvent.node = serviceNode.id
deregisterEvent.blockNumber = event.block.number
deregisterEvent.save()
}