Skip to content
Open
Show file tree
Hide file tree
Changes from 35 commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
a4a0d05
Updated new entities & getters
quent043 Jun 5, 2023
d8d7db2
Added new ABI
quent043 Jun 5, 2023
e19e72a
Added new mapping for upgraded contract
quent043 Jun 5, 2023
c4dbc70
Added new handlers
quent043 Jun 5, 2023
06c06f5
Refactored mapping
quent043 Jun 5, 2023
e1e34bf
Updated ABIs & yaml file with new namings
quent043 Jun 6, 2023
0dcfb20
Fixed graph bug - removed "!" from numReviews
quent043 Jun 6, 2023
3b6f41b
Added new nullable referrer field
quent043 Jun 8, 2023
0334fa5
Added check for referrer id
quent043 Jun 8, 2023
61ec6c2
Added token mapping for proposal entities
quent043 Jun 8, 2023
50484f9
Removed rateToken from service metadata
quent043 Jun 8, 2023
3f271c7
Added new field + event mapping
quent043 Jun 12, 2023
7bc0283
Added getter + mapping
quent043 Jun 12, 2023
2f5bd78
Refactored
quent043 Jun 12, 2023
92dc5b1
Updated ABI
quent043 Jun 12, 2023
e03f973
Added referrer to Service entity
quent043 Jun 12, 2023
b049ef2
Last refacto
quent043 Jun 12, 2023
c9fbc6d
Work on adding new referral stats
quent043 Jun 13, 2023
4ece0d2
Fixed bug on user stats
quent043 Jun 13, 2023
7f92101
Finally found the last bug !
quent043 Jun 13, 2023
fec5109
Added comments
quent043 Jun 13, 2023
f404797
Added new ABIs
quent043 Jun 15, 2023
d4d8016
Updated config
quent043 Jun 15, 2023
03373e8
Split V1 & actual mappings
quent043 Jun 15, 2023
c3427a2
Updated archive ABI name to same without "V1"
quent043 Jun 15, 2023
d54df88
Deleted V1 mapper
quent043 Jun 15, 2023
d32ed1b
Reset former archive ABI
quent043 Jun 15, 2023
b455fdf
Added legacy events to new ABI
quent043 Jun 15, 2023
bba4042
Added legacy events to new mapper
quent043 Jun 15, 2023
f7f153d
Updates yaml file
quent043 Jun 16, 2023
1cdc6f2
Added missing escrow event + entity + getter + mapping + config
quent043 Jun 16, 2023
016a474
Renames token to rateToken in service entity + mapping + getters
quent043 Jun 16, 2023
f5bbf27
Added availableBalance field
quent043 Jun 16, 2023
d7d7cf1
Temp Graph with 2 upgrades
quent043 Jun 16, 2023
5f9e310
Graph update Final Version
quent043 Jun 16, 2023
a70b2cc
Reverted contract addresses & network for mainnet
quent043 Jun 26, 2023
6978318
Reverted contract addresses & network for mainnet
quent043 Jun 26, 2023
10fc8cf
Merged Main
quent043 Jul 28, 2023
de81572
Added missing evidence data
quent043 Jul 28, 2023
575e8de
Merge main
quent043 Nov 26, 2023
ff6d4af
Refactor
quent043 Nov 26, 2023
170cd94
Updated updateService event
quent043 Dec 1, 2023
842bf55
Added service.token in escrow transaction mapping
quent043 Dec 1, 2023
fbd7592
Updated Playground
quent043 Dec 1, 2023
6968876
Reverted config change
quent043 Dec 1, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 110 additions & 2 deletions abis/TalentLayerEscrow.json

Large diffs are not rendered by default.

278 changes: 252 additions & 26 deletions abis/TalentLayerService.json

Large diffs are not rendered by default.

1,154 changes: 1,154 additions & 0 deletions abis/archives/TalentLayerEscrowV1.json

Large diffs are not rendered by default.

1,341 changes: 1,341 additions & 0 deletions abis/archives/TalentLayerServiceV1.json

Large diffs are not rendered by default.

24 changes: 14 additions & 10 deletions networks.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,24 +45,28 @@
},
"mumbai": {
"TalentLayerID": {
"address": "0x3F87289e6Ec2D05C32d8A74CCfb30773fF549306",
"startBlock": 33676850
"address": "0x87a247A1Aed184F7BC2b4F287Fc23D82E720721b",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Myst not be committed, we need to keep official addresses

"startBlock": 36843729
},
"TalentLayerReview": {
"address": "0x050F59E1871d3B7ca97e6fb9DCE64b3818b14B18",
"startBlock": 33676850
"address": "0x815035199D281be97D092710fE659445F1EB0DC9",
"startBlock": 36843729
},
"TalentLayerService": {
"address": "0x27ED516dC1df64b4c1517A64aa2Bb72a434a5A6D",
"startBlock": 33676850
"address": "0x9B7C6FB51D2EEE39b259BDe874710642120a58ED",
"startBlock": 36843729
},
"TalentLayerEscrow": {
"address": "0x4bE920eC3e8552292B2147480111063E0dc36872",
"startBlock": 33676850
"address": "0xC184101F1C1E4D71bd18F88FB7f36F53ec4F2De8",
"startBlock": 36843729
},
"TalentLayerPlatformID": {
"address": "0xEFD8dbC421380Ee04BAdB69216a0FD97F64CbFD4",
"startBlock": 33676850
"address": "0xE95a9d7d673716e40B8aa9851592672D6D697c25",
"startBlock": 36843729
},
"TalentLayerPlatformIDV1": {
"address": "0x9B7C6FB51D2EEE39b259BDe874710642120a58ED",
"startBlock": 36843729
}
},
"matic": {
Expand Down
39 changes: 32 additions & 7 deletions schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,15 @@ type Service @entity {
id: ID! # service id
createdAt: BigInt! # timestamp of block creation
updatedAt: BigInt! # timestamp of the last change
rateToken: Token! # Token entity
referralAmount: BigInt! # Referral amount
status: ServiceStatus! # service status
buyer: User # service buyer
seller: User # service seller
referrer: User # service referrer (optional)
transaction: Transaction @derivedFrom(field: "service") # transaction associated with this service
proposals: [Proposal!] @derivedFrom(field: "service") # proposals for this service
platform: Platform # Platform on which service was created
platform: Platform # Platform on which the service was created
cid: String
description: ServiceDescription
}
Expand All @@ -34,7 +37,6 @@ type ServiceDescription @entity(immutable: true) {
expectedEndDate: BigInt
keywords: [Keyword!] #keywords
keywords_raw: String #lowercase keywords in raw format
rateToken: String
rateAmount: String
video_url: String
}
Expand Down Expand Up @@ -80,28 +82,32 @@ type User @entity {
createdAt: BigInt!
updatedAt: BigInt!
platform: Platform # Platform on which user nft was minted
numReviews: BigInt! # DEPRECATED - will be remove soon, use UserStats.numReceivedReviews instead
numReviews: BigInt # DEPRECATED - will be removed soon, use UserStats.numReceivedReviews instead
address: String! # wallet address of user
rating: BigDecimal! # average rating from reviews user has received
reviews: [Review!] @derivedFrom(field: "to") # reviews of user
buyerServices: [Service!] @derivedFrom(field: "buyer") # services user is an buyer for
sellerServices: [Service!] @derivedFrom(field: "seller") # services user is an seller for
totalGains: [UserGain!] @derivedFrom(field: "user")
referralGains: [ReferralGain!] @derivedFrom(field: "user")
cid: String #cid of the description
description: UserDescription # User description (off chain data)
delegates: [String!]! # list of user delegators
userStats: UserStats # User proposal, service & reviews statistics
userStat: UserStat # User proposal, service & reviews statistics
}

type UserStats @entity {
type UserStat @entity {
id: ID! # ID of the user
user: User! # Corresponding user
numReceivedReviews: BigInt! # number of reviews user has received
numGivenReviews: BigInt! # number of reviews user has given
numCreatedServices: BigInt! # number of services user has created
numFinishedServicesAsBuyer: BigInt! # number of services user has finished as a buyer
numCreatedProposals: BigInt! # number of proposals user has created
numFinishedServicesAsSeller: BigInt! # number of services user has finished as a seller
user: User! # Corresponding user
numReferredUsers: BigInt! # number of users user has referred
numReferredUsersReviewsReceived: BigInt! # number of reviews referred users received (used for stat calculation)
averageReferredRating: BigDecimal! # average rating of referred referred services
}

type UserDescription @entity(immutable: true) {
Expand Down Expand Up @@ -133,12 +139,13 @@ type Proposal @entity {
updatedAt: BigInt! # timestamp of the last change
status: ProposalStatus! # Proposal status
seller: User # Proposal seller
rateToken: Token! # Rate token entity
rateToken: Token # Rate token entity
rateAmount: BigInt # Rate amount
cid: String # cid of the description
platform: Platform # Platform on which proposal was created
description: ProposalDescription #Proposals that the description describes.
expirationDate: BigInt
referrer: User # Optional referrer for the proposal
}

type ProposalDescription @entity(immutable: true) {
Expand Down Expand Up @@ -256,6 +263,15 @@ type FeeClaim @entity(immutable: true) {
transactionHash: String # Transaction hash of the transfer
}

type ReferralBalanceClaim @entity(immutable: true) {
id: ID! # autogenerated id
createdAt: BigInt # timestamp of block creation
user: User # user entity
token: Token # token entity
amount: BigInt! # claim amount
transactionHash: String # Transaction hash of the transfer
}

type PlatformGain @entity {
id: ID! # concatenation of platformId + token entity
platform: Platform # platform entity
Expand All @@ -271,6 +287,15 @@ type UserGain @entity {
totalGain: BigInt! # total User gain
}

type ReferralGain @entity {
id: ID! # concatenation of userId + token entity
user: User # user receiving the referral gain
token: Token # token entity
service: Service # Service which issued referral gain
totalGain: BigInt! # total User gain
availableBalance: BigInt! # Balance available to be claimed
}

type Protocol @entity {
id: ID! # autogenerated id
userMintFee: BigInt! # protocol fee for minting a TL id
Expand Down
72 changes: 53 additions & 19 deletions src/getters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,20 @@ import {
Transaction,
Evidence,
Keyword,
UserStats,
UserStat,
ReferralGain,
ReferralBalanceClaim,
} from '../generated/schema'
import { PROTOCOL_ID, ZERO, ZERO_ADDRESS, ZERO_BIGDEC, ZERO_TOKEN_ADDRESS } from './constants'
import { ERC20 } from '../generated/TalentLayerEscrow/ERC20'
import { generateIdFromTwoElements } from './mappings/utils'

export function getOrCreateService(id: BigInt): Service {
let service = Service.load(id.toString())
if (!service) {
service = new Service(id.toString())
service.rateToken = getOrCreateToken(ZERO_ADDRESS).id
service.referralAmount = ZERO
service.status = 'Opened'
service.createdAt = ZERO
service.updatedAt = ZERO
Expand All @@ -35,12 +40,14 @@ export function getOrCreateService(id: BigInt): Service {
export function getOrCreateProposal(id: string, serviceId: BigInt): Proposal {
let proposal = Proposal.load(id)
if (!proposal) {
const service = getOrCreateService(serviceId)

proposal = new Proposal(id)
proposal.status = 'Pending'
proposal.createdAt = ZERO
proposal.updatedAt = ZERO
proposal.service = getOrCreateService(serviceId).id
proposal.rateToken = getOrCreateToken(ZERO_ADDRESS).id
proposal.service = service.id
proposal.rateToken = service.rateToken
proposal.expirationDate = ZERO
proposal.save()
}
Expand Down Expand Up @@ -72,28 +79,30 @@ export function getOrCreateUser(id: BigInt): User {
user.delegates = []
user.save()


user.userStats = getOrCreateUserStats(id).id
user.userStat = getOrCreateUserStat(id).id
user.save()
}

return user
}

export function getOrCreateUserStats(id: BigInt): UserStats {
let userStats = UserStats.load(id.toString())
if (!userStats) {
userStats = new UserStats(id.toString())
userStats.user = getOrCreateUser(id).id
userStats.numReceivedReviews = ZERO
userStats.numGivenReviews = ZERO
userStats.numCreatedServices = ZERO
userStats.numFinishedServicesAsBuyer = ZERO
userStats.numCreatedProposals = ZERO
userStats.numFinishedServicesAsSeller = ZERO
userStats.save()
export function getOrCreateUserStat(id: BigInt): UserStat {
let userStat = UserStat.load(id.toString())
if (!userStat) {
userStat = new UserStat(id.toString())
userStat.user = getOrCreateUser(id).id
userStat.numReceivedReviews = ZERO
userStat.numGivenReviews = ZERO
userStat.numCreatedServices = ZERO
userStat.numFinishedServicesAsBuyer = ZERO
userStat.numCreatedProposals = ZERO
userStat.numFinishedServicesAsSeller = ZERO
userStat.numReferredUsers = ZERO
userStat.numReferredUsersReviewsReceived = ZERO
userStat.averageReferredRating = ZERO_BIGDEC
userStat.save()
}
return userStats
return userStat
}

export function getOrCreateTransaction(id: BigInt, blockTimestamp: BigInt = ZERO): Transaction {
Expand Down Expand Up @@ -297,3 +306,28 @@ export function getOrCreateKeyword(id: string): Keyword {
}
return keyword
}

export function getOrCreateReferralGain(userId: BigInt, tokenAddress: Address): ReferralGain {
const referralGainId = generateIdFromTwoElements(userId.toString(), tokenAddress.toHex())
let referralGain = ReferralGain.load(referralGainId)
if (!referralGain) {
referralGain = new ReferralGain(referralGainId)
referralGain.user = getOrCreateUser(userId).id
referralGain.token = getOrCreateToken(tokenAddress).id
referralGain.totalGain = ZERO
referralGain.availableBalance = ZERO

referralGain.save()
}
return referralGain
}

export function getOrCreateReferralClaim(referralClaimId: string): ReferralBalanceClaim {
let claim = ReferralBalanceClaim.load(referralClaimId)
if (!claim) {
claim = new ReferralBalanceClaim(referralClaimId)
claim.amount = ZERO
claim.save()
}
return claim
}
1 change: 0 additions & 1 deletion src/mappings/ipfs-data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ export function handleServiceData(content: Bytes): void {
if (keywords !== null) {
description.keywords_raw = keywords.toLowerCase()
}
description.rateToken = getValueAsString(jsonObject, 'rateToken')
description.rateAmount = getValueAsString(jsonObject, 'rateAmount')
description.video_url = getValueAsString(jsonObject, 'video_url')

Expand Down
58 changes: 49 additions & 9 deletions src/mappings/talent-layer-escrow.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { BigInt, log } from '@graphprotocol/graph-ts'
import { BigInt } from '@graphprotocol/graph-ts'
import { Service, Transaction, User } from '../../generated/schema'
import {
getOrCreateService,
Expand All @@ -13,7 +13,10 @@ import {
getOrCreateProtocol,
getOrCreateTransaction,
getOrCreateEvidence,
getOrCreateUserStats,
getOrCreateUserStat,
getOrCreateReferralGain,
getOrCreateReferralClaim,
getOrCreateUser,
} from '../getters'
import {
Payment,
Expand All @@ -24,12 +27,13 @@ import {
HasToPayFee,
Dispute,
RulingExecuted,
Evidence,
MetaEvidence,
ArbitrationFeePayment,
EvidenceSubmitted,
OriginServiceFeeRateReleased,
OriginValidatedProposalFeeRateReleased,
ReferralAmountReleased,
ReferralAmountClaimed,
} from '../../generated/TalentLayerEscrow/TalentLayerEscrow'
import { generateIdFromTwoElements, generateUniqueId } from './utils'
import { ONE, ZERO } from '../constants'
Expand Down Expand Up @@ -75,22 +79,30 @@ export function handleTransactionCreated(event: TransactionCreated): void {
service.status = 'Confirmed'
service.updatedAt = event.block.timestamp
service.seller = User.load(event.params._proposalId.toString())!.id
if (proposal.referrer != null && proposal.referrer != '0') {
service.referrer = User.load(proposal.referrer!)!.id
}
service.save()
}

export function handlePaymentCompleted(event: PaymentCompleted): void {
const service = getOrCreateService(event.params._serviceId)
service.status = 'Finished'
service.updatedAt = event.block.timestamp
if (service.referrer != null && service.referrer != '0') {
const referrerUserStat = getOrCreateUserStat(BigInt.fromString(service.referrer!))
referrerUserStat.numReferredUsers.plus(ONE)
referrerUserStat.save()
}
service.save()

const buyerUserStats = getOrCreateUserStats(BigInt.fromString(service.buyer!))
buyerUserStats.numFinishedServicesAsBuyer.plus(ONE)
buyerUserStats.save()
const buyerUserStat = getOrCreateUserStat(BigInt.fromString(service.buyer!))
buyerUserStat.numFinishedServicesAsBuyer = buyerUserStat.numFinishedServicesAsBuyer.plus(ONE)
buyerUserStat.save()

const sellerUserStats = getOrCreateUserStats(BigInt.fromString(service.seller!))
sellerUserStats.numFinishedServicesAsSeller.plus(ONE)
sellerUserStats.save()
const sellerUserStat = getOrCreateUserStat(BigInt.fromString(service.seller!))
sellerUserStat.numFinishedServicesAsSeller = sellerUserStat.numFinishedServicesAsSeller.plus(ONE)
sellerUserStat.save()
}

export function handlePayment(event: Payment): void {
Expand Down Expand Up @@ -257,3 +269,31 @@ export function handleMetaEvidence(event: MetaEvidence): void {
transaction.metaEvidenceUri = event.params._evidence
transaction.save()
}

export function handleReferralAmountReleased(event: ReferralAmountReleased): void {
const referralGain = getOrCreateReferralGain(event.params._referrerId, event.params._token)
referralGain.service = getOrCreateService(event.params._serviceId).id
referralGain.totalGain = referralGain.totalGain.plus(event.params._amount)
referralGain.availableBalance = referralGain.availableBalance.plus(event.params._amount)

referralGain.save()
}

export function handleReferralAmountClaimed(event: ReferralAmountClaimed): void {
const claimId = generateUniqueId(event.transaction.hash.toHex(), event.logIndex.toString())
const referralClaim = getOrCreateReferralClaim(claimId)

referralClaim.user = getOrCreateUser(event.params._referrerId).id
referralClaim.token = getOrCreateToken(event.params._token).id
referralClaim.amount = event.params._amount

referralClaim.transactionHash = event.transaction.hash.toHex()
referralClaim.createdAt = event.block.timestamp

referralClaim.save()

const referralGain = getOrCreateReferralGain(event.params._referrerId, event.params._token)
referralGain.availableBalance = referralGain.availableBalance.minus(event.params._amount)

referralGain.save()
}
2 changes: 1 addition & 1 deletion src/mappings/talent-layer-id.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export function handleCidUpdated(event: CidUpdated): void {

export function handleMint(event: Mint): void {
const user = getOrCreateUser(event.params.profileId)
user.userStats = event.params.profileId.toString()
user.userStat = event.params.profileId.toString()
user.address = event.params.user.toHex()
user.handle = event.params.handle
user.createdAt = event.block.timestamp
Expand Down
Loading