diff --git a/blacklisted-modules.js b/blacklisted-modules.js index eabe18b..e7c34d0 100644 --- a/blacklisted-modules.js +++ b/blacklisted-modules.js @@ -1,7 +1,7 @@ module.exports = { gnosis: [ - "0x41ab49872ed459c840d0caecd47fcdc201c48307", // Subscriptions v1.0 + '0x41ab49872ed459c840d0caecd47fcdc201c48307', // Subscriptions v1.0 ], goerli: [], polygon: [], -}; +} diff --git a/helpers/disputable.ts b/helpers/disputable.ts index 099d111..e821941 100644 --- a/helpers/disputable.ts +++ b/helpers/disputable.ts @@ -1,6 +1,6 @@ -import { concat } from "./bytes"; -import { Agreement } from "../generated/templates/DisputeManager/Agreement"; -import { Disputable, Dispute } from "../generated/schema"; +import { concat } from './bytes' +import { Agreement } from '../types/templates/DisputeManager/Agreement' +import { Disputable, Dispute } from '../types/schema' import { crypto, Bytes, @@ -8,77 +8,77 @@ import { BigInt, log, ByteArray, -} from "@graphprotocol/graph-ts"; +} from '@graphprotocol/graph-ts' // Rinkeby agreement-1hive.open.aragonpm.eth: // const AGREEMENT_OPEN_APP_ID = '41dd0b999b443a19321f2f34fe8078d1af95a1487b49af4c2ca57fb9e3e5331e' // xDai agreement.open.aragonpm.eth: const AGREEMENT_OPEN_APP_ID = - "34c62f3aec3073826f39c2c35e9a1297d9dbf3cc77472283106f09eee9cf47bf"; + '34c62f3aec3073826f39c2c35e9a1297d9dbf3cc77472283106f09eee9cf47bf' -const AGREEMENT_APP_ID_LENGTH = AGREEMENT_OPEN_APP_ID.length; -const AGREEMENT_DISPUTE_METADATA_LENGTH = 64; // "[APP_ID][CHALLENGE_ID]" = 32 + 32 +const AGREEMENT_APP_ID_LENGTH = AGREEMENT_OPEN_APP_ID.length +const AGREEMENT_DISPUTE_METADATA_LENGTH = 64 // "[APP_ID][CHALLENGE_ID]" = 32 + 32 export function tryDecodingAgreementMetadata(dispute: Dispute): void { - let rawMetadata = dispute.rawMetadata; - if (rawMetadata.length != AGREEMENT_DISPUTE_METADATA_LENGTH) return; + let rawMetadata = dispute.rawMetadata + if (rawMetadata.length != AGREEMENT_DISPUTE_METADATA_LENGTH) return let header = Bytes.fromUint8Array( rawMetadata.subarray(0, AGREEMENT_APP_ID_LENGTH / 2) - ); - let actualAppId = header.toHexString().slice(2); - if (actualAppId != AGREEMENT_OPEN_APP_ID) return; + ) + let actualAppId = header.toHexString().slice(2) + if (actualAppId != AGREEMENT_OPEN_APP_ID) return let rawChallengeId = Bytes.fromUint8Array( rawMetadata.subarray(AGREEMENT_APP_ID_LENGTH / 2, rawMetadata.length) - ); + ) let challengeId = BigInt.fromSignedBytes( Bytes.fromUint8Array(rawChallengeId.reverse()) - ); - let agreement = Agreement.bind(Address.fromString(dispute.subject)); - let challengeData = agreement.try_getChallenge(challengeId); + ) + let agreement = Agreement.bind(Address.fromString(dispute.subject)) + let challengeData = agreement.try_getChallenge(challengeId) if ( challengeData.reverted || challengeData.value.value1.toHexString() == - "0x0000000000000000000000000000000000000000" + '0x0000000000000000000000000000000000000000' ) - return; + return - let actionId = challengeData.value.value0; - let actionData = agreement.try_getAction(actionId); - if (actionData.reverted) return; + let actionId = challengeData.value.value0 + let actionData = agreement.try_getAction(actionId) + if (actionData.reverted) return - let settingData = agreement.try_getSetting(actionData.value.value3); - if (settingData.reverted) return; + let settingData = agreement.try_getSetting(actionData.value.value3) + if (settingData.reverted) return - let organization = agreement.try_kernel(); - if (organization.reverted) return; + let organization = agreement.try_kernel() + if (organization.reverted) return let disputable = new Disputable( buildAgreementActionId(agreement._address, challengeId) - ); - disputable.dispute = dispute.id; - disputable.title = settingData.value.value2; - disputable.agreement = settingData.value.value3.toString(); - disputable.actionId = actionId; - disputable.challengeId = challengeId; - disputable.address = actionData.value.value0; - disputable.actionContext = actionData.value.value6.toString(); - disputable.rawActionContext = actionData.value.value6; - disputable.challengeContext = challengeData.value.value3.toString(); - disputable.rawChallengeContext = challengeData.value.value3; - disputable.disputableActionId = actionData.value.value1; - disputable.defendant = actionData.value.value4; - disputable.plaintiff = challengeData.value.value1; - disputable.organization = organization.value; - disputable.save(); + ) + disputable.dispute = dispute.id + disputable.title = settingData.value.value2 + disputable.agreement = settingData.value.value3.toString() + disputable.actionId = actionId + disputable.challengeId = challengeId + disputable.address = actionData.value.value0 + disputable.actionContext = actionData.value.value6.toString() + disputable.rawActionContext = actionData.value.value6 + disputable.challengeContext = challengeData.value.value3.toString() + disputable.rawChallengeContext = challengeData.value.value3 + disputable.disputableActionId = actionData.value.value1 + disputable.defendant = actionData.value.value4 + disputable.plaintiff = challengeData.value.value1 + disputable.organization = organization.value + disputable.save() } function buildAgreementActionId(agreement: Address, actionId: BigInt): string { // @ts-ignore BigInt is actually a BytesArray under the hood return crypto .keccak256((agreement as ByteArray).concat(ByteArray.fromBigInt(actionId))) - .toHexString(); + .toHexString() } diff --git a/src/AragonCourt.ts b/src/AragonCourt.ts index 186b7e0..ecd32c1 100644 --- a/src/AragonCourt.ts +++ b/src/AragonCourt.ts @@ -1,9 +1,9 @@ -import { BigInt, Bytes, Address, ethereum, log } from '@graphprotocol/graph-ts'; -import { BLACKLISTED_MODULES } from '../helpers/blacklisted-modules'; -import { updateCurrentSubscriptionPeriod } from './Subscriptions'; -import { ERC20 as ERC20Contract } from '../generated/AragonCourt/ERC20'; -import { JurorsRegistry as JurorsRegistryContract } from '../generated/templates/JurorsRegistry/JurorsRegistry'; -import { BrightIdRegister as BrightIdRegisterContract } from '../generated/AragonCourt/BrightIdRegister'; +import { BigInt, Bytes, Address, ethereum, log } from '@graphprotocol/graph-ts' +import { BLACKLISTED_MODULES } from '../helpers/blacklisted-modules' +import { updateCurrentSubscriptionPeriod } from './Subscriptions' +import { ERC20 as ERC20Contract } from '../types/AragonCourt/ERC20' +import { JurorsRegistry as JurorsRegistryContract } from '../types/templates/JurorsRegistry/JurorsRegistry' +import { BrightIdRegister as BrightIdRegisterContract } from '../types/AragonCourt/BrightIdRegister' import { ERC20, CourtModule, @@ -11,7 +11,7 @@ import { CourtTerm, BrightIdRegisterModule, JurorsRegistryModule, -} from '../generated/schema'; +} from '../types/schema' import { BrightIdRegister, DisputeManager, @@ -19,7 +19,7 @@ import { Treasury, Voting, Subscriptions, -} from '../generated/templates'; +} from '../types/templates' import { AragonCourt, Heartbeat, @@ -28,244 +28,244 @@ import { ConfigGovernorChanged, FeesUpdaterChanged, ModulesGovernorChanged, -} from '../generated/AragonCourt/AragonCourt'; +} from '../types/AragonCourt/AragonCourt' -let DISPUTE_MANAGER_TYPE = 'DisputeManager'; -let JURORS_REGISTRY_TYPE = 'JurorsRegistry'; -let VOTING_TYPE = 'Voting'; -let TREASURY_TYPE = 'Treasury'; -let SUBSCRIPTIONS_TYPE = 'Subscriptions'; -let BRIGHTID_REGISTER_TYPE = 'BrightIdRegister'; +let DISPUTE_MANAGER_TYPE = 'DisputeManager' +let JURORS_REGISTRY_TYPE = 'JurorsRegistry' +let VOTING_TYPE = 'Voting' +let TREASURY_TYPE = 'Treasury' +let SUBSCRIPTIONS_TYPE = 'Subscriptions' +let BRIGHTID_REGISTER_TYPE = 'BrightIdRegister' let DISPUTE_MANAGER_ID = - '0x14a6c70f0f6d449c014c7bbc9e68e31e79e8474fb03b7194df83109a2d888ae6'; + '0x14a6c70f0f6d449c014c7bbc9e68e31e79e8474fb03b7194df83109a2d888ae6' let JURORS_REGISTRY_ID = - '0x3b21d36b36308c830e6c4053fb40a3b6d79dde78947fbf6b0accd30720ab5370'; + '0x3b21d36b36308c830e6c4053fb40a3b6d79dde78947fbf6b0accd30720ab5370' let VOTING_ID = - '0x7cbb12e82a6d63ff16fe43977f43e3e2b247ecd4e62c0e340da8800a48c67346'; + '0x7cbb12e82a6d63ff16fe43977f43e3e2b247ecd4e62c0e340da8800a48c67346' let TREASURY_ID = - '0x06aa03964db1f7257357ef09714a5f0ca3633723df419e97015e0c7a3e83edb7'; + '0x06aa03964db1f7257357ef09714a5f0ca3633723df419e97015e0c7a3e83edb7' let SUBSCRIPTIONS_ID = - '0x2bfa3327fe52344390da94c32a346eeb1b65a8b583e4335a419b9471e88c1365'; + '0x2bfa3327fe52344390da94c32a346eeb1b65a8b583e4335a419b9471e88c1365' let BRIGHTID_REGISTER_ID = - '0xc8d8a5444a51ecc23e5091f18c4162834512a4bc5cae72c637db45c8c37b3329'; + '0xc8d8a5444a51ecc23e5091f18c4162834512a4bc5cae72c637db45c8c37b3329' export function handleHeartbeat(event: Heartbeat): void { - let config = loadOrCreateConfig(event.address, event); - config.currentTerm = event.params.currentTermId; - - let court = AragonCourt.bind(event.address); - config.fundsGovernor = court.getFundsGovernor(); - config.configGovernor = court.getConfigGovernor(); - config.modulesGovernor = court.getModulesGovernor(); - config.save(); - - let previousTerm = loadOrCreateTerm(event.params.previousTermId, event); - let previousTermResult = court.getTerm(event.params.previousTermId); - previousTerm.court = event.address.toHexString(); - previousTerm.startTime = previousTermResult.value0; - previousTerm.randomnessBN = previousTermResult.value1; - previousTerm.randomness = previousTermResult.value2; - previousTerm.save(); - - let currentTerm = loadOrCreateTerm(event.params.currentTermId, event); - let currentTermResult = court.getTerm(event.params.currentTermId); - currentTerm.court = event.address.toHexString(); - currentTerm.startTime = currentTermResult.value0; - currentTerm.randomnessBN = currentTermResult.value1; - currentTerm.randomness = currentTermResult.value2; - currentTerm.save(); - - let subscriptions = court.getSubscriptions(); + let config = loadOrCreateConfig(event.address, event) + config.currentTerm = event.params.currentTermId + + let court = AragonCourt.bind(event.address) + config.fundsGovernor = court.getFundsGovernor() + config.configGovernor = court.getConfigGovernor() + config.modulesGovernor = court.getModulesGovernor() + config.save() + + let previousTerm = loadOrCreateTerm(event.params.previousTermId, event) + let previousTermResult = court.getTerm(event.params.previousTermId) + previousTerm.court = event.address.toHexString() + previousTerm.startTime = previousTermResult.value0 + previousTerm.randomnessBN = previousTermResult.value1 + previousTerm.randomness = previousTermResult.value2 + previousTerm.save() + + let currentTerm = loadOrCreateTerm(event.params.currentTermId, event) + let currentTermResult = court.getTerm(event.params.currentTermId) + currentTerm.court = event.address.toHexString() + currentTerm.startTime = currentTermResult.value0 + currentTerm.randomnessBN = currentTermResult.value1 + currentTerm.randomness = currentTermResult.value2 + currentTerm.save() + + let subscriptions = court.getSubscriptions() if (!isModuleBlacklisted(subscriptions)) { - updateCurrentSubscriptionPeriod(subscriptions, event.block.timestamp); + updateCurrentSubscriptionPeriod(subscriptions, event.block.timestamp) } } export function handleFundsGovernorChanged(event: FundsGovernorChanged): void { - let config = loadOrCreateConfig(event.address, event); - config.fundsGovernor = event.params.currentGovernor; - config.save(); + let config = loadOrCreateConfig(event.address, event) + config.fundsGovernor = event.params.currentGovernor + config.save() } export function handleConfigGovernorChanged( event: ConfigGovernorChanged ): void { - let config = loadOrCreateConfig(event.address, event); - config.configGovernor = event.params.currentGovernor; - config.save(); + let config = loadOrCreateConfig(event.address, event) + config.configGovernor = event.params.currentGovernor + config.save() } export function handleFeesUpdaterChanged(event: FeesUpdaterChanged): void { - let config = loadOrCreateConfig(event.address, event); - config.feesUpdater = event.params.currentFeesUpdater; - config.save(); + let config = loadOrCreateConfig(event.address, event) + config.feesUpdater = event.params.currentFeesUpdater + config.save() } export function handleModulesGovernorChanged( event: ModulesGovernorChanged ): void { - let config = loadOrCreateConfig(event.address, event); - config.modulesGovernor = event.params.currentGovernor; - config.save(); + let config = loadOrCreateConfig(event.address, event) + config.modulesGovernor = event.params.currentGovernor + config.save() } export function handleModuleSet(event: ModuleSet): void { - let newModuleAddress: Address = event.params.addr; + let newModuleAddress: Address = event.params.addr if (isModuleBlacklisted(newModuleAddress)) { log.warning('Ignoring blacklisted module {}', [ newModuleAddress.toHexString(), - ]); - return; + ]) + return } // avoid duplicated modules - let config = CourtConfig.load(event.address.toHexString())!; + let config = CourtConfig.load(event.address.toHexString())! if (isModuleAlreadySet(config.moduleAddresses, newModuleAddress)) { log.warning('Ignoring already set module {}', [ newModuleAddress.toHexString(), - ]); - return; + ]) + return } - let module = new CourtModule(event.params.id.toHexString()); - module.court = event.address.toHexString(); - module.address = newModuleAddress; + let module = new CourtModule(event.params.id.toHexString()) + module.court = event.address.toHexString() + module.address = newModuleAddress - let id = event.params.id.toHexString(); + let id = event.params.id.toHexString() if (id == JURORS_REGISTRY_ID) { - JurorsRegistry.create(newModuleAddress); - module.type = JURORS_REGISTRY_TYPE; + JurorsRegistry.create(newModuleAddress) + module.type = JURORS_REGISTRY_TYPE - let jurorsRegistry = JurorsRegistryContract.bind(newModuleAddress); - let anjAddress = jurorsRegistry.token(); + let jurorsRegistry = JurorsRegistryContract.bind(newModuleAddress) + let anjAddress = jurorsRegistry.token() - let anjContract = ERC20Contract.bind(anjAddress); - let anj = new ERC20(anjAddress.toHexString()); - anj.name = anjContract.name(); - anj.symbol = anjContract.symbol(); - anj.decimals = anjContract.decimals(); - anj.save(); + let anjContract = ERC20Contract.bind(anjAddress) + let anj = new ERC20(anjAddress.toHexString()) + anj.name = anjContract.name() + anj.symbol = anjContract.symbol() + anj.decimals = anjContract.decimals() + anj.save() - config.anjToken = anjAddress.toHexString(); - config.save(); + config.anjToken = anjAddress.toHexString() + config.save() let registryModule = new JurorsRegistryModule( newModuleAddress.toHexString() - ); - registryModule.court = event.address.toHexString(); - registryModule.totalStaked = BigInt.fromI32(0); - registryModule.totalActive = BigInt.fromI32(0); - registryModule.totalDeactivation = BigInt.fromI32(0); - registryModule.save(); + ) + registryModule.court = event.address.toHexString() + registryModule.totalStaked = BigInt.fromI32(0) + registryModule.totalActive = BigInt.fromI32(0) + registryModule.totalDeactivation = BigInt.fromI32(0) + registryModule.save() } else if (id == DISPUTE_MANAGER_ID) { - DisputeManager.create(newModuleAddress); - module.type = DISPUTE_MANAGER_TYPE; + DisputeManager.create(newModuleAddress) + module.type = DISPUTE_MANAGER_TYPE } else if (id == VOTING_ID) { - Voting.create(newModuleAddress); - module.type = VOTING_TYPE; + Voting.create(newModuleAddress) + module.type = VOTING_TYPE } else if (id == TREASURY_ID) { - Treasury.create(newModuleAddress); - module.type = TREASURY_TYPE; + Treasury.create(newModuleAddress) + module.type = TREASURY_TYPE } else if (id == SUBSCRIPTIONS_ID) { - Subscriptions.create(newModuleAddress); - module.type = SUBSCRIPTIONS_TYPE; + Subscriptions.create(newModuleAddress) + module.type = SUBSCRIPTIONS_TYPE } else if (id == BRIGHTID_REGISTER_ID) { - BrightIdRegister.create(newModuleAddress); - module.type = BRIGHTID_REGISTER_TYPE; + BrightIdRegister.create(newModuleAddress) + module.type = BRIGHTID_REGISTER_TYPE - let brightIdRegister = BrightIdRegisterContract.bind(newModuleAddress); + let brightIdRegister = BrightIdRegisterContract.bind(newModuleAddress) let brightIdRegisterModule = new BrightIdRegisterModule( newModuleAddress.toHexString() - ); - brightIdRegisterModule.court = event.address.toHexString(); + ) + brightIdRegisterModule.court = event.address.toHexString() brightIdRegisterModule.verifiers = brightIdRegister .getBrightIdVerifiers() - .map((address) => address); - brightIdRegisterModule.registrationPeriod = brightIdRegister.registrationPeriod(); - brightIdRegisterModule.verificationTimestampVariance = brightIdRegister.verificationTimestampVariance(); - brightIdRegisterModule.save(); + .map(address => address) + brightIdRegisterModule.registrationPeriod = brightIdRegister.registrationPeriod() + brightIdRegisterModule.verificationTimestampVariance = brightIdRegister.verificationTimestampVariance() + brightIdRegisterModule.save() } else { - module.type = 'Unknown'; + module.type = 'Unknown' } - let moduleAddresses = config.moduleAddresses; - moduleAddresses.push(newModuleAddress.toHexString()); - config.moduleAddresses = moduleAddresses; - config.save(); + let moduleAddresses = config.moduleAddresses + moduleAddresses.push(newModuleAddress.toHexString()) + config.moduleAddresses = moduleAddresses + config.save() - module.save(); + module.save() } function isModuleBlacklisted(module: Address): boolean { - return BLACKLISTED_MODULES.includes(module.toHexString()); + return BLACKLISTED_MODULES.includes(module.toHexString()) } function isModuleAlreadySet(modules: string[], newModule: Address): boolean { - return modules.includes(newModule.toHexString()); + return modules.includes(newModule.toHexString()) } function loadOrCreateConfig( courtAddress: Address, event: ethereum.Event ): CourtConfig { - let id = courtAddress.toHexString(); - let config = CourtConfig.load(id); - let court = AragonCourt.bind(event.address); + let id = courtAddress.toHexString() + let config = CourtConfig.load(id) + let court = AragonCourt.bind(event.address) if (config === null) { - config = new CourtConfig(id); - config.currentTerm = BigInt.fromI32(0); - config.termDuration = court.getTermDuration(); - config.moduleAddresses = []; + config = new CourtConfig(id) + config.currentTerm = BigInt.fromI32(0) + config.termDuration = court.getTermDuration() + config.moduleAddresses = [] } - let currentTermId = court.getCurrentTermId(); - let result = court.getConfig(currentTermId); - - let feeTokenAddress = result.value0; - let feeTokenContract = ERC20Contract.bind(feeTokenAddress); - let feeToken = new ERC20(feeTokenAddress.toHexString()); - feeToken.name = feeTokenContract.name(); - feeToken.symbol = feeTokenContract.symbol(); - feeToken.decimals = feeTokenContract.decimals(); - feeToken.save(); - - config.feeToken = feeTokenAddress.toHexString(); - config.jurorFee = result.value1[0]; - config.draftFee = result.value1[1]; - config.settleFee = result.value1[2]; - config.maxRulingOptions = result.value2; - config.evidenceTerms = result.value3[0]; - config.commitTerms = result.value3[1]; - config.revealTerms = result.value3[2]; - config.appealTerms = result.value3[3]; - config.appealConfirmationTerms = result.value3[4]; - config.firstRoundJurorsNumber = result.value3[5]; - config.appealStepFactor = result.value3[6]; - config.maxRegularAppealRounds = result.value3[7]; - config.finalRoundLockTerms = result.value3[8]; - config.penaltyPct = result.value4[0]; - config.finalRoundReduction = result.value4[1]; - config.appealCollateralFactor = result.value5[0]; - config.appealConfirmCollateralFactor = result.value5[1]; - config.minActiveBalance = result.value6[0]; - config.minMaxPctTotalSupply = result.value6[1]; - config.maxMaxPctTotalSupply = result.value6[2]; - - return config; + let currentTermId = court.getCurrentTermId() + let result = court.getConfig(currentTermId) + + let feeTokenAddress = result.value0 + let feeTokenContract = ERC20Contract.bind(feeTokenAddress) + let feeToken = new ERC20(feeTokenAddress.toHexString()) + feeToken.name = feeTokenContract.name() + feeToken.symbol = feeTokenContract.symbol() + feeToken.decimals = feeTokenContract.decimals() + feeToken.save() + + config.feeToken = feeTokenAddress.toHexString() + config.jurorFee = result.value1[0] + config.draftFee = result.value1[1] + config.settleFee = result.value1[2] + config.maxRulingOptions = result.value2 + config.evidenceTerms = result.value3[0] + config.commitTerms = result.value3[1] + config.revealTerms = result.value3[2] + config.appealTerms = result.value3[3] + config.appealConfirmationTerms = result.value3[4] + config.firstRoundJurorsNumber = result.value3[5] + config.appealStepFactor = result.value3[6] + config.maxRegularAppealRounds = result.value3[7] + config.finalRoundLockTerms = result.value3[8] + config.penaltyPct = result.value4[0] + config.finalRoundReduction = result.value4[1] + config.appealCollateralFactor = result.value5[0] + config.appealConfirmCollateralFactor = result.value5[1] + config.minActiveBalance = result.value6[0] + config.minMaxPctTotalSupply = result.value6[1] + config.maxMaxPctTotalSupply = result.value6[2] + + return config } function loadOrCreateTerm(id: BigInt, event: ethereum.Event): CourtTerm { - let term = CourtTerm.load(id.toString()); + let term = CourtTerm.load(id.toString()) if (term === null) { - term = new CourtTerm(id.toString()); - term.createdAt = event.block.timestamp; + term = new CourtTerm(id.toString()) + term.createdAt = event.block.timestamp } - return term; + return term } diff --git a/src/Arbitrable.ts b/src/Arbitrable.ts index cbc433f..809b01b 100644 --- a/src/Arbitrable.ts +++ b/src/Arbitrable.ts @@ -1,6 +1,6 @@ -import { Evidence } from '../generated/schema'; -import { ethereum, Bytes, BigInt, Address } from '@graphprotocol/graph-ts'; -import { EvidenceSubmitted } from '../generated/templates/DisputeManager/Arbitrable'; +import { Evidence } from '../types/schema' +import { ethereum, Bytes, BigInt, Address } from '@graphprotocol/graph-ts' +import { EvidenceSubmitted } from '../types/templates/DisputeManager/Arbitrable' export function handleEvidenceSubmittedWithArbitrator( event: EvidenceSubmitted @@ -13,7 +13,7 @@ export function handleEvidenceSubmittedWithArbitrator( event.params.disputeId, event.params.evidence, event.params.submitter - ); + ) } function handleEvidenceSubmitted( @@ -22,12 +22,12 @@ function handleEvidenceSubmitted( data: Bytes, submitter: Address ): void { - let id = event.transaction.hash.toHexString() + event.logIndex.toHexString(); - let evidence = new Evidence(id); - evidence.arbitrable = event.address.toHexString(); - evidence.dispute = disputeId.toString(); - evidence.data = data; - evidence.submitter = submitter; - evidence.createdAt = event.block.timestamp; - evidence.save(); + let id = event.transaction.hash.toHexString() + event.logIndex.toHexString() + let evidence = new Evidence(id) + evidence.arbitrable = event.address.toHexString() + evidence.dispute = disputeId.toString() + evidence.data = data + evidence.submitter = submitter + evidence.createdAt = event.block.timestamp + evidence.save() } diff --git a/src/BrightIdRegister.ts b/src/BrightIdRegister.ts index 8fbc724..f4b75f0 100644 --- a/src/BrightIdRegister.ts +++ b/src/BrightIdRegister.ts @@ -1,43 +1,43 @@ -import { Address, BigInt, ethereum } from '@graphprotocol/graph-ts'; -import { Juror } from '../generated/schema'; -import { BrightIdRegister as BrightIdRegisterContract } from '../generated/AragonCourt/BrightIdRegister'; -import { Register } from '../generated/templates/BrightIdRegister/BrightIdRegister'; +import { Address, BigInt, ethereum } from '@graphprotocol/graph-ts' +import { Juror } from '../types/schema' +import { BrightIdRegister as BrightIdRegisterContract } from '../types/AragonCourt/BrightIdRegister' +import { Register } from '../types/templates/BrightIdRegister/BrightIdRegister' export function handleUserRegistered(event: Register): void { - updateJuror(event.params.sender, event); + updateJuror(event.params.sender, event) } function loadOrCreateJuror( jurorAddress: Address, event: ethereum.Event ): Juror { - let id = jurorAddress.toHexString(); - let juror = Juror.load(id); + let id = jurorAddress.toHexString() + let juror = Juror.load(id) if (juror === null) { - juror = new Juror(id); - juror.createdAt = event.block.timestamp; - juror.withdrawalsLockTermId = BigInt.fromI32(0); - juror.activeBalance = BigInt.fromI32(0); - juror.availableBalance = BigInt.fromI32(0); - juror.lockedBalance = BigInt.fromI32(0); - juror.deactivationBalance = BigInt.fromI32(0); - juror.treeId = BigInt.fromI32(0); + juror = new Juror(id) + juror.createdAt = event.block.timestamp + juror.withdrawalsLockTermId = BigInt.fromI32(0) + juror.activeBalance = BigInt.fromI32(0) + juror.availableBalance = BigInt.fromI32(0) + juror.lockedBalance = BigInt.fromI32(0) + juror.deactivationBalance = BigInt.fromI32(0) + juror.treeId = BigInt.fromI32(0) } - return juror; + return juror } function updateJuror(jurorAddress: Address, event: ethereum.Event): Juror { - let juror = loadOrCreateJuror(jurorAddress, event); + let juror = loadOrCreateJuror(jurorAddress, event) - let brightIdRegister = BrightIdRegisterContract.bind(event.address); - let userRegistration = brightIdRegister.userRegistrations(jurorAddress); - juror.uniqueUserId = userRegistration.value0; - juror.registerTime = userRegistration.value1; - juror.addressVoided = userRegistration.value2; + let brightIdRegister = BrightIdRegisterContract.bind(event.address) + let userRegistration = brightIdRegister.userRegistrations(jurorAddress) + juror.uniqueUserId = userRegistration.value0 + juror.registerTime = userRegistration.value1 + juror.addressVoided = userRegistration.value2 - juror.save(); + juror.save() - return juror; + return juror } diff --git a/src/JurorsRegistry.ts b/src/JurorsRegistry.ts index eb37f39..7eae312 100644 --- a/src/JurorsRegistry.ts +++ b/src/JurorsRegistry.ts @@ -1,6 +1,6 @@ -import { buildId } from '../helpers/id'; -import { Juror, ANJMovement, JurorsRegistryModule } from '../generated/schema'; -import { ethereum, Address, BigInt } from '@graphprotocol/graph-ts'; +import { buildId } from '../helpers/id' +import { Juror, ANJMovement, JurorsRegistryModule } from '../types/schema' +import { ethereum, Address, BigInt } from '@graphprotocol/graph-ts' import { Staked, Unstaked, @@ -14,186 +14,186 @@ import { JurorTokensCollected, JurorSlashed, JurorsRegistry, -} from '../generated/templates/JurorsRegistry/JurorsRegistry'; +} from '../types/templates/JurorsRegistry/JurorsRegistry' -let STAKE = 'Stake'; -let UNSTAKE = 'Unstake'; -let ACTIVATION = 'Activation'; -let DEACTIVATION = 'Deactivation'; -let LOCK = 'Lock'; -let UNLOCK = 'Unlock'; -let REWARD = 'Reward'; -let SLASH = 'Slash'; +let STAKE = 'Stake' +let UNSTAKE = 'Unstake' +let ACTIVATION = 'Activation' +let DEACTIVATION = 'Deactivation' +let LOCK = 'Lock' +let UNLOCK = 'Unlock' +let REWARD = 'Reward' +let SLASH = 'Slash' export function handleStaked(event: Staked): void { - updateJuror(event.params.user, event); + updateJuror(event.params.user, event) createANJMovementForEvent( event.params.user, STAKE, event.params.amount, event - ); - increaseTotalStaked(event.address, event.params.amount); + ) + increaseTotalStaked(event.address, event.params.amount) } export function handleUnstaked(event: Unstaked): void { - updateJuror(event.params.user, event); + updateJuror(event.params.user, event) createANJMovementForEvent( event.params.user, UNSTAKE, event.params.amount, event - ); - decreaseTotalStaked(event.address, event.params.amount); + ) + decreaseTotalStaked(event.address, event.params.amount) } export function handleJurorActivated(event: JurorActivated): void { - updateJuror(event.params.juror, event); + updateJuror(event.params.juror, event) createANJMovementForTerm( event.params.juror, ACTIVATION, event.params.amount, event.params.fromTermId, event - ); - increaseTotalActive(event.address, event.params.amount); + ) + increaseTotalActive(event.address, event.params.amount) } export function handleJurorDeactivationRequested( event: JurorDeactivationRequested ): void { - updateJuror(event.params.juror, event); + updateJuror(event.params.juror, event) createANJMovementForTerm( event.params.juror, DEACTIVATION, event.params.amount, event.params.availableTermId, event - ); - increaseTotalDeactivation(event.address, event.params.amount); + ) + increaseTotalDeactivation(event.address, event.params.amount) } export function handleJurorDeactivationUpdated( event: JurorDeactivationUpdated ): void { - let juror = loadOrCreateJuror(event.params.juror, event)!; - let previousDeactivationAmount = juror.deactivationBalance; + let juror = loadOrCreateJuror(event.params.juror, event)! + let previousDeactivationAmount = juror.deactivationBalance - updateJuror(event.params.juror, event); + updateJuror(event.params.juror, event) createANJMovementForTerm( event.params.juror, DEACTIVATION, event.params.amount, event.params.availableTermId, event - ); + ) - let currentDeactivationAmount = event.params.amount; + let currentDeactivationAmount = event.params.amount if (currentDeactivationAmount.gt(previousDeactivationAmount)) { increaseTotalDeactivation( event.address, currentDeactivationAmount.minus(previousDeactivationAmount) - ); + ) } else { decreaseTotalDeactivation( event.address, previousDeactivationAmount.minus(currentDeactivationAmount) - ); + ) } } export function handleJurorDeactivationProcessed( event: JurorDeactivationProcessed ): void { - updateJuror(event.params.juror, event); - decreaseTotalActive(event.address, event.params.amount); - decreaseTotalDeactivation(event.address, event.params.amount); + updateJuror(event.params.juror, event) + decreaseTotalActive(event.address, event.params.amount) + decreaseTotalDeactivation(event.address, event.params.amount) } export function handleJurorBalanceLocked(event: JurorBalanceLocked): void { - updateJuror(event.params.juror, event); + updateJuror(event.params.juror, event) createANJMovementForEvent( event.params.juror, LOCK, event.params.amount, event - ); + ) } export function handleJurorBalanceUnlocked(event: JurorBalanceUnlocked): void { - updateJuror(event.params.juror, event); + updateJuror(event.params.juror, event) createANJMovementForEvent( event.params.juror, UNLOCK, event.params.amount, event - ); + ) } export function handleJurorTokensAssigned(event: JurorTokensAssigned): void { - updateJuror(event.params.juror, event); + updateJuror(event.params.juror, event) createANJMovementForEvent( event.params.juror, REWARD, event.params.amount, event - ); - increaseTotalStaked(event.address, event.params.amount); + ) + increaseTotalStaked(event.address, event.params.amount) } export function handleJurorTokensCollected(event: JurorTokensCollected): void { - updateJuror(event.params.juror, event); + updateJuror(event.params.juror, event) createANJMovementForTerm( event.params.juror, SLASH, event.params.amount, event.params.effectiveTermId, event - ); - decreaseTotalActive(event.address, event.params.amount); + ) + decreaseTotalActive(event.address, event.params.amount) } export function handleJurorSlashed(event: JurorSlashed): void { - updateJuror(event.params.juror, event); + updateJuror(event.params.juror, event) createANJMovementForTerm( event.params.juror, SLASH, event.params.amount, event.params.effectiveTermId, event - ); - decreaseTotalActive(event.address, event.params.amount); + ) + decreaseTotalActive(event.address, event.params.amount) } function loadOrCreateJuror( jurorAddress: Address, event: ethereum.Event ): Juror | null { - let id = jurorAddress.toHexString(); - let juror = Juror.load(id); + let id = jurorAddress.toHexString() + let juror = Juror.load(id) if (juror === null) { - juror = new Juror(id); - juror.createdAt = event.block.timestamp; + juror = new Juror(id) + juror.createdAt = event.block.timestamp } // The juror may have appeared in the system but may not have activated tokens yet, meaning he doesn't have a tree ID yet - let registry = JurorsRegistry.bind(event.address); - juror.treeId = registry.getJurorId(jurorAddress); + let registry = JurorsRegistry.bind(event.address) + juror.treeId = registry.getJurorId(jurorAddress) - return juror; + return juror } function updateJuror(jurorAddress: Address, event: ethereum.Event): void { - let juror = loadOrCreateJuror(jurorAddress, event)!; - let registry = JurorsRegistry.bind(event.address); - let balances = registry.balanceOf(jurorAddress); - juror.withdrawalsLockTermId = registry.getWithdrawalsLockTermId(jurorAddress); - juror.activeBalance = balances.value0; - juror.availableBalance = balances.value1; - juror.lockedBalance = balances.value2; - juror.deactivationBalance = balances.value3; - juror.save(); + let juror = loadOrCreateJuror(jurorAddress, event)! + let registry = JurorsRegistry.bind(event.address) + let balances = registry.balanceOf(jurorAddress) + juror.withdrawalsLockTermId = registry.getWithdrawalsLockTermId(jurorAddress) + juror.activeBalance = balances.value0 + juror.availableBalance = balances.value1 + juror.lockedBalance = balances.value2 + juror.deactivationBalance = balances.value3 + juror.save() } function createANJMovementForEvent( @@ -202,8 +202,8 @@ function createANJMovementForEvent( amount: BigInt, event: ethereum.Event ): void { - let id = buildId(event); - createANJMovement(id, juror, type, amount, event.block.timestamp); + let id = buildId(event) + createANJMovement(id, juror, type, amount, event.block.timestamp) } function createANJMovementForTerm( @@ -213,8 +213,8 @@ function createANJMovementForTerm( termId: BigInt, event: ethereum.Event ): void { - let id = buildId(event); - createANJMovement(id, juror, type, amount, event.block.timestamp, termId); + let id = buildId(event) + createANJMovement(id, juror, type, amount, event.block.timestamp, termId) } function createANJMovement( @@ -225,69 +225,57 @@ function createANJMovement( createdAt: BigInt, termId: BigInt | null = null ): void { - let movement = new ANJMovement(id); - movement.juror = juror.toHexString(); - movement.amount = amount; - movement.type = type; - movement.effectiveTermId = termId; - movement.createdAt = createdAt; - movement.save(); + let movement = new ANJMovement(id) + movement.juror = juror.toHexString() + movement.amount = amount + movement.type = type + movement.effectiveTermId = termId + movement.createdAt = createdAt + movement.save() } function increaseTotalStaked(registryAddress: Address, amount: BigInt): void { - let jurorsRegistry = JurorsRegistryModule.load( - registryAddress.toHexString() - )!; - jurorsRegistry.totalStaked = jurorsRegistry.totalStaked.plus(amount); - jurorsRegistry.save(); + let jurorsRegistry = JurorsRegistryModule.load(registryAddress.toHexString())! + jurorsRegistry.totalStaked = jurorsRegistry.totalStaked.plus(amount) + jurorsRegistry.save() } function decreaseTotalStaked(registryAddress: Address, amount: BigInt): void { - let jurorsRegistry = JurorsRegistryModule.load( - registryAddress.toHexString() - )!; - jurorsRegistry.totalStaked = jurorsRegistry.totalStaked.minus(amount); - jurorsRegistry.save(); + let jurorsRegistry = JurorsRegistryModule.load(registryAddress.toHexString())! + jurorsRegistry.totalStaked = jurorsRegistry.totalStaked.minus(amount) + jurorsRegistry.save() } function increaseTotalActive(registryAddress: Address, amount: BigInt): void { - let jurorsRegistry = JurorsRegistryModule.load( - registryAddress.toHexString() - )!; - jurorsRegistry.totalActive = jurorsRegistry.totalActive.plus(amount); - jurorsRegistry.save(); + let jurorsRegistry = JurorsRegistryModule.load(registryAddress.toHexString())! + jurorsRegistry.totalActive = jurorsRegistry.totalActive.plus(amount) + jurorsRegistry.save() } function decreaseTotalActive(registryAddress: Address, amount: BigInt): void { - let jurorsRegistry = JurorsRegistryModule.load( - registryAddress.toHexString() - )!; - jurorsRegistry.totalActive = jurorsRegistry.totalActive.minus(amount); - jurorsRegistry.save(); + let jurorsRegistry = JurorsRegistryModule.load(registryAddress.toHexString())! + jurorsRegistry.totalActive = jurorsRegistry.totalActive.minus(amount) + jurorsRegistry.save() } function increaseTotalDeactivation( registryAddress: Address, amount: BigInt ): void { - let jurorsRegistry = JurorsRegistryModule.load( - registryAddress.toHexString() - )!; + let jurorsRegistry = JurorsRegistryModule.load(registryAddress.toHexString())! jurorsRegistry.totalDeactivation = jurorsRegistry.totalDeactivation.plus( amount - ); - jurorsRegistry.save(); + ) + jurorsRegistry.save() } function decreaseTotalDeactivation( registryAddress: Address, amount: BigInt ): void { - let jurorsRegistry = JurorsRegistryModule.load( - registryAddress.toHexString() - )!; + let jurorsRegistry = JurorsRegistryModule.load(registryAddress.toHexString())! jurorsRegistry.totalDeactivation = jurorsRegistry.totalDeactivation.minus( amount - ); - jurorsRegistry.save(); + ) + jurorsRegistry.save() } diff --git a/src/Subscriptions.ts b/src/Subscriptions.ts index 4fc64b7..08a9a04 100644 --- a/src/Subscriptions.ts +++ b/src/Subscriptions.ts @@ -1,18 +1,18 @@ -import { Address, BigInt, Bytes, log } from '@graphprotocol/graph-ts'; -import { createFeeMovement } from './Treasury'; +import { Address, BigInt, Bytes, log } from '@graphprotocol/graph-ts' +import { createFeeMovement } from './Treasury' import { JurorSubscriptionFee, SubscriptionModule, SubscriptionPeriod, -} from '../generated/schema'; +} from '../types/schema' import { FeesClaimed, FeeTokenChanged, PeriodPercentageYieldChanged, Subscriptions, -} from '../generated/templates/Subscriptions/Subscriptions'; +} from '../types/templates/Subscriptions/Subscriptions' -let SUBSCRIPTIONS = 'Subscriptions'; +let SUBSCRIPTIONS = 'Subscriptions' export function handleJurorFeesClaimed(event: FeesClaimed): void { createFeeMovement( @@ -20,57 +20,57 @@ export function handleJurorFeesClaimed(event: FeesClaimed): void { event.params.juror, event.params.jurorShare, event - ); + ) createJurorSubscriptionFee( event.params.juror, event.params.periodId, event.params.jurorShare - ); + ) } export function handleFeeTokenChanged(event: FeeTokenChanged): void { - let subscriptions = SubscriptionModule.load(event.address.toHexString())!; - subscriptions.feeToken = event.params.currentFeeToken; - subscriptions.save(); + let subscriptions = SubscriptionModule.load(event.address.toHexString())! + subscriptions.feeToken = event.params.currentFeeToken + subscriptions.save() } export function handlePeriodPercentageYieldChanged( event: PeriodPercentageYieldChanged ): void { - let subscriptions = SubscriptionModule.load(event.address.toHexString())!; - subscriptions.periodPercentageYield = event.params.currenetYield; - subscriptions.save(); + let subscriptions = SubscriptionModule.load(event.address.toHexString())! + subscriptions.periodPercentageYield = event.params.currenetYield + subscriptions.save() } export function updateCurrentSubscriptionPeriod( module: Address, timestamp: BigInt ): void { - let subscriptions = Subscriptions.bind(module); - let periodId = subscriptions.getCurrentPeriodId(); + let subscriptions = Subscriptions.bind(module) + let periodId = subscriptions.getCurrentPeriodId() - let subscriptionsModule = loadOrCreateModule(module); - subscriptionsModule.currentPeriod = periodId; - subscriptionsModule.save(); + let subscriptionsModule = loadOrCreateModule(module) + subscriptionsModule.currentPeriod = periodId + subscriptionsModule.save() let previousPeriodId = periodId.equals(BigInt.fromI32(0)) ? periodId - : periodId.minus(BigInt.fromI32(1)); + : periodId.minus(BigInt.fromI32(1)) let period = loadOrCreateSubscriptionPeriod( previousPeriodId, module, timestamp - ); - let previousPeriod = subscriptions.try_getPeriod(previousPeriodId); + ) + let previousPeriod = subscriptions.try_getPeriod(previousPeriodId) if (previousPeriod.reverted) { - return; + return } - period.balanceCheckpoint = previousPeriod.value.value0; - period.feeToken = previousPeriod.value.value1; - period.totalActiveBalance = previousPeriod.value.value2; - period.donatedFees = previousPeriod.value.value3; - period.save(); + period.balanceCheckpoint = previousPeriod.value.value0 + period.feeToken = previousPeriod.value.value1 + period.totalActiveBalance = previousPeriod.value.value2 + period.donatedFees = previousPeriod.value.value3 + period.save() } function loadOrCreateSubscriptionPeriod( @@ -78,21 +78,21 @@ function loadOrCreateSubscriptionPeriod( instance: Address, timestamp: BigInt ): SubscriptionPeriod { - let id = periodId.toString(); - let period = SubscriptionPeriod.load(id); + let id = periodId.toString() + let period = SubscriptionPeriod.load(id) if (period === null) { - period = new SubscriptionPeriod(id); - period.feeToken = Bytes.fromHexString('0x'); - period.donatedFees = BigInt.fromI32(0); - period.balanceCheckpoint = BigInt.fromI32(0); - period.totalActiveBalance = BigInt.fromI32(0); - period.instance = instance.toHexString(); - period.createdAt = timestamp; + period = new SubscriptionPeriod(id) + period.feeToken = Bytes.fromHexString('0x') + period.donatedFees = BigInt.fromI32(0) + period.balanceCheckpoint = BigInt.fromI32(0) + period.totalActiveBalance = BigInt.fromI32(0) + period.instance = instance.toHexString() + period.createdAt = timestamp } - period.save(); - return period; + period.save() + return period } function createJurorSubscriptionFee( @@ -100,39 +100,39 @@ function createJurorSubscriptionFee( periodId: BigInt, jurorShare: BigInt ): void { - let feeId = buildJurorSubscriptionFeeId(juror, periodId); - let fee = new JurorSubscriptionFee(feeId); - fee.juror = juror.toHexString(); - fee.period = periodId.toString(); - fee.amount = jurorShare; - fee.save(); + let feeId = buildJurorSubscriptionFeeId(juror, periodId) + let fee = new JurorSubscriptionFee(feeId) + fee.juror = juror.toHexString() + fee.period = periodId.toString() + fee.amount = jurorShare + fee.save() } function loadOrCreateModule(address: Address): SubscriptionModule { - let subscriptionModule = SubscriptionModule.load(address.toHexString()); + let subscriptionModule = SubscriptionModule.load(address.toHexString()) if (subscriptionModule === null) { - subscriptionModule = new SubscriptionModule(address.toHexString()); - let subscriptions = Subscriptions.bind(address); - subscriptionModule.court = subscriptions.getController().toHexString(); - subscriptionModule.currentPeriod = BigInt.fromI32(0); - subscriptionModule.feeToken = subscriptions.currentFeeToken(); - subscriptionModule.periodDuration = subscriptions.periodDuration(); - let periodPercentageYieldPotentialResult = subscriptions.try_periodPercentageYield(); + subscriptionModule = new SubscriptionModule(address.toHexString()) + let subscriptions = Subscriptions.bind(address) + subscriptionModule.court = subscriptions.getController().toHexString() + subscriptionModule.currentPeriod = BigInt.fromI32(0) + subscriptionModule.feeToken = subscriptions.currentFeeToken() + subscriptionModule.periodDuration = subscriptions.periodDuration() + let periodPercentageYieldPotentialResult = subscriptions.try_periodPercentageYield() if (!periodPercentageYieldPotentialResult.reverted) { subscriptionModule.periodPercentageYield = - periodPercentageYieldPotentialResult.value; + periodPercentageYieldPotentialResult.value } else { - subscriptionModule.periodPercentageYield = BigInt.fromI32(0); + subscriptionModule.periodPercentageYield = BigInt.fromI32(0) log.warning('Could not get periodPercentageYield from subscription {}', [ address.toHexString(), - ]); + ]) } } - return subscriptionModule; + return subscriptionModule } function buildJurorSubscriptionFeeId(juror: Address, periodId: BigInt): string { - return juror.toHexString().concat(periodId.toString()); + return juror.toHexString().concat(periodId.toString()) } diff --git a/src/Treasury.ts b/src/Treasury.ts index 7fee466..02a612a 100644 --- a/src/Treasury.ts +++ b/src/Treasury.ts @@ -1,22 +1,22 @@ -import { concat } from "../helpers/bytes"; -import { buildId } from "../helpers/id"; -import { FeeMovement, TreasuryBalance } from "../generated/schema"; +import { concat } from '../helpers/bytes' +import { buildId } from '../helpers/id' +import { FeeMovement, TreasuryBalance } from '../types/schema' import { Assign, Withdraw, Treasury, -} from "../generated/templates/Treasury/Treasury"; -import { crypto, BigInt, Address, ethereum } from "@graphprotocol/graph-ts"; +} from '../types/templates/Treasury/Treasury' +import { crypto, BigInt, Address, ethereum } from '@graphprotocol/graph-ts' -let WITHDRAW = "Withdraw"; +let WITHDRAW = 'Withdraw' export function handleAssign(event: Assign): void { - updateTreasuryBalance(event.params.to, event.params.token, event); + updateTreasuryBalance(event.params.to, event.params.token, event) } export function handleWithdraw(event: Withdraw): void { - createFeeMovement(WITHDRAW, event.params.from, event.params.amount, event); - updateTreasuryBalance(event.params.from, event.params.token, event); + createFeeMovement(WITHDRAW, event.params.from, event.params.amount, event) + updateTreasuryBalance(event.params.from, event.params.token, event) } export function createFeeMovement( @@ -26,13 +26,13 @@ export function createFeeMovement( event: ethereum.Event, id: string | null = null ): void { - let feeId = id === null ? buildId(event) : id; - let movement = new FeeMovement(feeId); - movement.type = type; - movement.owner = owner; - movement.amount = amount; - movement.createdAt = event.block.timestamp; - movement.save(); + let feeId = id === null ? buildId(event) : id + let movement = new FeeMovement(feeId) + movement.type = type + movement.owner = owner + movement.amount = amount + movement.createdAt = event.block.timestamp + movement.save() } function updateTreasuryBalance( @@ -40,28 +40,28 @@ function updateTreasuryBalance( token: Address, event: ethereum.Event ): void { - let treasuryBalance = loadOrCreateTreasuryBalance(owner, token); - let treasury = Treasury.bind(event.address); - treasuryBalance.amount = treasury.balanceOf(token, owner); - treasuryBalance.save(); + let treasuryBalance = loadOrCreateTreasuryBalance(owner, token) + let treasury = Treasury.bind(event.address) + treasuryBalance.amount = treasury.balanceOf(token, owner) + treasuryBalance.save() } function loadOrCreateTreasuryBalance( owner: Address, token: Address ): TreasuryBalance { - let id = buildTreasuryBalanceId(owner, token); - let treasuryBalance = TreasuryBalance.load(id); + let id = buildTreasuryBalanceId(owner, token) + let treasuryBalance = TreasuryBalance.load(id) if (treasuryBalance === null) { - treasuryBalance = new TreasuryBalance(id); - treasuryBalance.token = token.toHexString(); - treasuryBalance.owner = owner; + treasuryBalance = new TreasuryBalance(id) + treasuryBalance.token = token.toHexString() + treasuryBalance.owner = owner } - return treasuryBalance; + return treasuryBalance } function buildTreasuryBalanceId(owner: Address, token: Address): string { - return crypto.keccak256(owner.concat(token)).toHexString(); + return crypto.keccak256(owner.concat(token)).toHexString() }