From 26b5249e0ca4e46e1093994e92527b86d9b47eae Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Mon, 17 Mar 2025 16:34:28 +0000 Subject: [PATCH 01/14] feat: add owners to wearables --- schema.graphql | 10 +++++++ src/mappings/diamond.ts | 49 +++++++++++++++++++++++++++++++++ src/mappings/helpers.ts | 46 +++++++++++++++++++++++++++++++ src/mappings/itemTransfers.ts | 52 +++++++++++++++++++++++++++++++++++ subgraph.yaml | 29 ++++++++++++++++++- 5 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 src/mappings/helpers.ts create mode 100644 src/mappings/itemTransfers.ts diff --git a/schema.graphql b/schema.graphql index ce38040..0b33a90 100644 --- a/schema.graphql +++ b/schema.graphql @@ -349,6 +349,7 @@ type ItemType @entity { kinshipBonus: Int experienceBonus: BigInt consumed: BigInt! + owners: [ItemTypeOwnership!]! @derivedFrom(field: "itemType") # Add this line } type WearableSet @entity { @@ -631,3 +632,12 @@ type TokenCommitment @entity { usedBalance: BigInt! roleAssignments: [RoleAssignment!] @derivedFrom(field: "tokenCommitment") } + +type ItemTypeOwnership @entity { + id: ID! # Format: itemTypeId-ownerAddress + itemType: ItemType! + owner: Bytes! + balance: BigInt! + lastUpdated: BigInt! + contract: Bytes! # Track which contract processed the transfer +} diff --git a/src/mappings/diamond.ts b/src/mappings/diamond.ts index 124294e..37273d3 100644 --- a/src/mappings/diamond.ts +++ b/src/mappings/diamond.ts @@ -69,6 +69,8 @@ import { ERC1155BuyOrderAdd, ERC1155BuyOrderExecute, ERC1155BuyOrderCancel, + TransferSingle, + TransferBatch, } from "../../generated/AavegotchiDiamond/AavegotchiDiamond"; import { getOrCreateUser, @@ -126,6 +128,8 @@ import { RealmDiamond, ResyncParcel, } from "../../generated/AavegotchiDiamond/RealmDiamond"; +import { shouldSkipTransfer } from "./helpers"; +import { updateOwnership } from "./helpers"; export function handleBuyPortals(event: BuyPortals): void { let contract = AavegotchiDiamond.bind(event.address); @@ -1947,3 +1951,48 @@ export function handleERC1155BuyOrderCancel( entity.canceled = true; entity.save(); } + +export function handleTransferSingle(event: TransferSingle): void { + if (shouldSkipTransfer(event)) { + return; + } + + const from = event.params._from; + const to = event.params._to; + const id = event.params._id.toString(); + const amount = event.params._value; + const timestamp = event.block.timestamp; + const contract = event.address; + + if (from.notEqual(Address.zero())) { + updateOwnership(id, from, amount.neg(), timestamp, contract); + } + + if (to.notEqual(Address.zero())) { + updateOwnership(id, to, amount, timestamp, contract); + } +} + +export function handleTransferBatch(event: TransferBatch): void { + if (shouldSkipTransfer(event)) return; + + const from = event.params._from; + const to = event.params._to; + const ids = event.params._ids; + const amounts = event.params._values; + const timestamp = event.block.timestamp; + const contract = event.address; + + for (let i = 0; i < ids.length; i++) { + const id = ids[i].toString(); + const amount = amounts[i]; + + if (from.notEqual(Address.zero())) { + updateOwnership(id, from, amount.neg(), timestamp, contract); + } + + if (to.notEqual(Address.zero())) { + updateOwnership(id, to, amount, timestamp, contract); + } + } +} diff --git a/src/mappings/helpers.ts b/src/mappings/helpers.ts new file mode 100644 index 0000000..50a0dd4 --- /dev/null +++ b/src/mappings/helpers.ts @@ -0,0 +1,46 @@ +import { BigInt, Address, ethereum, store } from "@graphprotocol/graph-ts"; +import { ItemTypeOwnership } from "../../generated/schema"; + +const MIGRATION_BLOCK = BigInt.fromI32(35999793); +const AAVEGOTCHI_ADDRESS = Address.fromString( + "0x86935F11C86623deC8a25696E1C19a8659CbF95d" +); + +export function shouldSkipTransfer(event: ethereum.Event): boolean { + if ( + event.address == AAVEGOTCHI_ADDRESS && + event.block.number.gt(MIGRATION_BLOCK) + ) { + return true; + } + + return false; +} + +export function updateOwnership( + itemTypeId: string, + owner: Address, + amount: BigInt, + timestamp: BigInt, + contract: Address +): void { + const ownershipId = `${itemTypeId}-${owner.toHexString()}`; + let ownership = ItemTypeOwnership.load(ownershipId); + + if (!ownership) { + ownership = new ItemTypeOwnership(ownershipId); + ownership.itemType = itemTypeId; + ownership.owner = owner; + ownership.balance = BigInt.fromI32(0); + ownership.contract = contract; + } + + ownership.balance = ownership.balance.plus(amount); + ownership.lastUpdated = timestamp; + + if (ownership.balance.equals(BigInt.fromI32(0))) { + store.remove("ItemTypeOwnership", ownershipId); + } else { + ownership.save(); + } +} diff --git a/src/mappings/itemTransfers.ts b/src/mappings/itemTransfers.ts new file mode 100644 index 0000000..886e6cf --- /dev/null +++ b/src/mappings/itemTransfers.ts @@ -0,0 +1,52 @@ +import { BigInt, Address } from "@graphprotocol/graph-ts"; + +import { shouldSkipTransfer, updateOwnership } from "./helpers"; +import { + TransferBatch, + TransferSingle, +} from "../../generated/AavegotchiDiamond/AavegotchiDiamond"; + +export function handleTransferSingle(event: TransferSingle): void { + if (shouldSkipTransfer(event)) { + return; + } + + const from = event.params._from; + const to = event.params._to; + const id = event.params._id.toString(); + const amount = event.params._value; + const timestamp = event.block.timestamp; + const contract = event.address; + + if (from.notEqual(Address.zero())) { + updateOwnership(id, from, amount.neg(), timestamp, contract); + } + + if (to.notEqual(Address.zero())) { + updateOwnership(id, to, amount, timestamp, contract); + } +} + +export function handleTransferBatch(event: TransferBatch): void { + if (shouldSkipTransfer(event)) return; + + const from = event.params._from; + const to = event.params._to; + const ids = event.params._ids; + const amounts = event.params._values; + const timestamp = event.block.timestamp; + const contract = event.address; + + for (let i = 0; i < ids.length; i++) { + const id = ids[i].toString(); + const amount = amounts[i]; + + if (from.notEqual(Address.zero())) { + updateOwnership(id, from, amount.neg(), timestamp, contract); + } + + if (to.notEqual(Address.zero())) { + updateOwnership(id, to, amount, timestamp, contract); + } + } +} diff --git a/subgraph.yaml b/subgraph.yaml index 0005ed0..daf8b73 100644 --- a/subgraph.yaml +++ b/subgraph.yaml @@ -11,7 +11,7 @@ schema: dataSources: - kind: ethereum/contract name: AavegotchiDiamond - network: "geist-mainnet" + network: "matic" source: address: "0x6Acc828BbbC6874de40Ca20bfeA7Cd2a2DA8DA8c" abi: AavegotchiDiamond @@ -160,5 +160,32 @@ dataSources: handler: handleERC1155BuyOrderExecute - event: ERC1155BuyOrderCancel(indexed uint256,uint256) handler: handleERC1155BuyOrderCancel + - event: TransferSingle(indexed address,indexed address,indexed address,uint256,uint256) + handler: handleTransferSingle + - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) + handler: handleTransferBatch + + - kind: ethereum/contract + name: WearableDiamond + network: "matic" + source: + address: "0x58de9AaBCaeEC0f69883C94318810ad79Cc6a44f" + abi: WearableDiamond + startBlock: 10125000 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ./src/mappings/itemTransfers.ts + entities: + - ItemTypeOwnership + abis: + - name: WearableDiamond + file: ./abis/AavegotchiDiamond.json + eventHandlers: + - event: TransferSingle(indexed address,indexed address,indexed address,uint256,uint256) + handler: handleTransferSingle + - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) + handler: handleTransferBatch From ca2e30c1fda31304da0eba361271f70d809f7082 Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Mon, 17 Mar 2025 16:58:23 +0000 Subject: [PATCH 02/14] fix: use matic --- subgraph.yaml | 104 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 83 insertions(+), 21 deletions(-) diff --git a/subgraph.yaml b/subgraph.yaml index daf8b73..7ccd4f6 100644 --- a/subgraph.yaml +++ b/subgraph.yaml @@ -2,8 +2,9 @@ specVersion: 0.0.4 # features: # - grafting # graft: -# base: QmQ2wyvSmj7fdjtWdKYSNvcLLg9xxoheEAdkYMbiUS7Phu # Subgraph ID of base subgraph -# block: 62782000 # Block number +# base: QmP7WDBUeazfUc96uGa71ukM8ZUZHS3GunviVSrJvxSy62 # Subgraph ID of base subgraph +# block: 64948299 + # Block number description: Aavegotchi Core Matic repository: schema: @@ -13,22 +14,30 @@ dataSources: name: AavegotchiDiamond network: "matic" source: - address: "0x6Acc828BbbC6874de40Ca20bfeA7Cd2a2DA8DA8c" + address: "0x86935F11C86623deC8a25696E1C19a8659CbF95d" abi: AavegotchiDiamond - startBlock: 4273 + startBlock: 11500000 mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript - file: ./src/mappings/polter.ts + file: ./src/mappings/diamond.ts entities: - User abis: - name: AavegotchiDiamond file: ./abis/AavegotchiDiamond.json - # - name: RealmDiamond - # file: ./abis/RealmDiamond.json + - name: RealmDiamond + file: ./abis/RealmDiamond.json eventHandlers: + - event: BuyPortals(indexed address,indexed address,uint256,uint256,uint256) + handler: handleBuyPortals + - event: Xingyun(indexed address,indexed address,uint256,uint256,uint256) + handler: handleXingyun + - event: PortalOpened(indexed uint256) + handler: handlePortalOpened + - event: ClaimAavegotchi(indexed uint256) + handler: handleClaimAavegotchi - event: IncreaseStake(indexed uint256,uint256) handler: handleIncreaseStake - event: DecreaseStake(indexed uint256,uint256) @@ -160,32 +169,85 @@ dataSources: handler: handleERC1155BuyOrderExecute - event: ERC1155BuyOrderCancel(indexed uint256,uint256) handler: handleERC1155BuyOrderCancel - - event: TransferSingle(indexed address,indexed address,indexed address,uint256,uint256) - handler: handleTransferSingle - - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) - handler: handleTransferBatch - kind: ethereum/contract - name: WearableDiamond + name: RealmDiamond network: "matic" source: - address: "0x58de9AaBCaeEC0f69883C94318810ad79Cc6a44f" - abi: WearableDiamond - startBlock: 10125000 + address: "0x1D0360BaC7299C86Ec8E99d0c1C9A95FEfaF2a11" + abi: RealmDiamond + startBlock: 20667840 mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript - file: ./src/mappings/itemTransfers.ts entities: - - ItemTypeOwnership + - MintParcel + - Transfer abis: - - name: WearableDiamond - file: ./abis/AavegotchiDiamond.json + - name: RealmDiamond + file: ./abis/RealmDiamond.json + eventHandlers: + - event: MintParcel(indexed address,indexed uint256) + handler: handleMintParcel + - event: Transfer(indexed address,indexed address,indexed uint256) + handler: handleTransferParcel + - event: ResyncParcel(uint256) + handler: handleResyncParcel + - event: KinshipBurned(uint256,uint256) + handler: handleKinshipBurned + file: ./src/mappings/diamond.ts + - kind: ethereum/contract + name: FAKEGotchisCardDiamond + network: "matic" + source: + address: "0x9f6BcC63e86D44c46e85564E9383E650dc0b56D7" + abi: IERC1155 + startBlock: 34520146 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + entities: + - Card + abis: + - name: IERC721 + file: ./abis/diamond_erc721.json + - name: IERC1155 + file: ./abis/diamond_erc1155.json eventHandlers: + - event: NewSeriesStarted(indexed uint256,indexed uint256) + handler: handleNewSeriesStarted - event: TransferSingle(indexed address,indexed address,indexed address,uint256,uint256) handler: handleTransferSingle - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) handler: handleTransferBatch - - + file: ./src/mappings/fakeGotchisCard.ts + - kind: ethereum/contract + name: FAKEGotchisNFTDiamond + network: "matic" + source: + address: "0xA4E3513c98b30d4D7cc578d2C328Bd550725D1D0" + abi: IERC721 + startBlock: 34520176 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + entities: + - NFT + abis: + - name: IERC721 + file: ./abis/diamond_erc721.json + - name: IERC1155 + file: ./abis/diamond_erc1155.json + eventHandlers: + - event: Transfer(indexed address,indexed address,indexed uint256) + handler: handleTransfer + - event: MetadataActionLog(indexed uint256,(address,uint16[2],uint16,uint32,uint32,address,uint40,uint8,bool,string,string,string,string,string,string,string,string,string)) + handler: handleMetadataActionLog + - event: MetadataFlag(indexed uint256,address) + handler: handleMetadataFlag + - event: MetadataLike(indexed uint256,address) + handler: handleMetadataLike + file: ./src/mappings/fakeGotchisNFT.ts From 818c5ccb1cc30e963cc15d7b36ce654e735bdfcd Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Tue, 18 Mar 2025 16:20:03 +0000 Subject: [PATCH 03/14] fix: subgraph template --- config/matic.json | 2 ++ src/mappings/itemTransfers.ts | 2 +- subgraph.template.yaml | 26 ++++++++++++++++++++++++++ subgraph.yaml | 26 ++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/config/matic.json b/config/matic.json index e1ece0a..d93f71d 100644 --- a/config/matic.json +++ b/config/matic.json @@ -7,5 +7,7 @@ "fakeCardStartBlock": 34520146, "fakeGotchisAddress": "0xA4E3513c98b30d4D7cc578d2C328Bd550725D1D0", "fakeGotchisStartBlock": 34520176, + "wearableAddress": "0x58de9AaBCaeEC0f69883C94318810ad79Cc6a44f", + "wearableStartBlock": 35999793, "network": "matic" } diff --git a/src/mappings/itemTransfers.ts b/src/mappings/itemTransfers.ts index 886e6cf..7568da6 100644 --- a/src/mappings/itemTransfers.ts +++ b/src/mappings/itemTransfers.ts @@ -1,4 +1,4 @@ -import { BigInt, Address } from "@graphprotocol/graph-ts"; +import { Address } from "@graphprotocol/graph-ts"; import { shouldSkipTransfer, updateOwnership } from "./helpers"; import { diff --git a/subgraph.template.yaml b/subgraph.template.yaml index 342b988..9373dca 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -169,6 +169,10 @@ dataSources: handler: handleERC1155BuyOrderExecute - event: ERC1155BuyOrderCancel(indexed uint256,uint256) handler: handleERC1155BuyOrderCancel + - event: TransferSingle(indexed address,indexed address,indexed address,uint256,uint256) + handler: handleTransferSingle + - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) + handler: handleTransferBatch - kind: ethereum/contract name: RealmDiamond @@ -251,3 +255,25 @@ dataSources: - event: MetadataLike(indexed uint256,address) handler: handleMetadataLike file: ./src/mappings/fakeGotchisNFT.ts + - kind: ethereum/contract + name: WearableDiamond + network: "{{network}}" + source: + address: "{{wearableAddress}}" + abi: AavegotchiDiamond + startBlock: {{wearableStartBlock}} + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ./src/mappings/itemTransfers.ts + entities: + - ItemTypeOwnership + abis: + - name: AavegotchiDiamond + file: ./abis/AavegotchiDiamond.json + eventHandlers: + - event: TransferSingle(indexed address,indexed address,indexed address,uint256,uint256) + handler: handleTransferSingle + - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) + handler: handleTransferBatch diff --git a/subgraph.yaml b/subgraph.yaml index 7ccd4f6..257e169 100644 --- a/subgraph.yaml +++ b/subgraph.yaml @@ -169,6 +169,10 @@ dataSources: handler: handleERC1155BuyOrderExecute - event: ERC1155BuyOrderCancel(indexed uint256,uint256) handler: handleERC1155BuyOrderCancel + - event: TransferSingle(indexed address,indexed address,indexed address,uint256,uint256) + handler: handleTransferSingle + - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) + handler: handleTransferBatch - kind: ethereum/contract name: RealmDiamond @@ -251,3 +255,25 @@ dataSources: - event: MetadataLike(indexed uint256,address) handler: handleMetadataLike file: ./src/mappings/fakeGotchisNFT.ts + - kind: ethereum/contract + name: WearableDiamond + network: "matic" + source: + address: "0x58de9AaBCaeEC0f69883C94318810ad79Cc6a44f" + abi: AavegotchiDiamond + startBlock: 35999793 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ./src/mappings/itemTransfers.ts + entities: + - ItemTypeOwnership + abis: + - name: AavegotchiDiamond + file: ./abis/AavegotchiDiamond.json + eventHandlers: + - event: TransferSingle(indexed address,indexed address,indexed address,uint256,uint256) + handler: handleTransferSingle + - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) + handler: handleTransferBatch From 479d41632a6b532c93fb44a4b56d7641f6baf299 Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Mon, 24 Mar 2025 13:52:20 +0100 Subject: [PATCH 04/14] fix: remove contract from owner type --- schema.graphql | 1 - src/mappings/diamond.ts | 10 ++++------ src/mappings/helpers.ts | 31 ++++++++++++++++++++++--------- src/mappings/itemTransfers.ts | 10 ++++------ 4 files changed, 30 insertions(+), 22 deletions(-) diff --git a/schema.graphql b/schema.graphql index 0b33a90..64f0eda 100644 --- a/schema.graphql +++ b/schema.graphql @@ -639,5 +639,4 @@ type ItemTypeOwnership @entity { owner: Bytes! balance: BigInt! lastUpdated: BigInt! - contract: Bytes! # Track which contract processed the transfer } diff --git a/src/mappings/diamond.ts b/src/mappings/diamond.ts index 37273d3..2a04b6a 100644 --- a/src/mappings/diamond.ts +++ b/src/mappings/diamond.ts @@ -1962,14 +1962,13 @@ export function handleTransferSingle(event: TransferSingle): void { const id = event.params._id.toString(); const amount = event.params._value; const timestamp = event.block.timestamp; - const contract = event.address; if (from.notEqual(Address.zero())) { - updateOwnership(id, from, amount.neg(), timestamp, contract); + updateOwnership(id, from, amount.neg(), timestamp); } if (to.notEqual(Address.zero())) { - updateOwnership(id, to, amount, timestamp, contract); + updateOwnership(id, to, amount, timestamp); } } @@ -1981,18 +1980,17 @@ export function handleTransferBatch(event: TransferBatch): void { const ids = event.params._ids; const amounts = event.params._values; const timestamp = event.block.timestamp; - const contract = event.address; for (let i = 0; i < ids.length; i++) { const id = ids[i].toString(); const amount = amounts[i]; if (from.notEqual(Address.zero())) { - updateOwnership(id, from, amount.neg(), timestamp, contract); + updateOwnership(id, from, amount.neg(), timestamp); } if (to.notEqual(Address.zero())) { - updateOwnership(id, to, amount, timestamp, contract); + updateOwnership(id, to, amount, timestamp); } } } diff --git a/src/mappings/helpers.ts b/src/mappings/helpers.ts index 50a0dd4..2679fc2 100644 --- a/src/mappings/helpers.ts +++ b/src/mappings/helpers.ts @@ -6,13 +6,20 @@ const AAVEGOTCHI_ADDRESS = Address.fromString( "0x86935F11C86623deC8a25696E1C19a8659CbF95d" ); +// Address of the actual wearable token contract +export const WEARABLE_TOKEN_ADDRESS = Address.fromString( + "0x58de9AaBCaeEC0f69883C94318810ad79Cc6a44f" +); + export function shouldSkipTransfer(event: ethereum.Event): boolean { - if ( - event.address == AAVEGOTCHI_ADDRESS && - event.block.number.gt(MIGRATION_BLOCK) - ) { - return true; - } + if (!isWearableTransfer(event.address)) return true; + + // if ( + // event.address == AAVEGOTCHI_ADDRESS && + // event.block.number.gt(MIGRATION_BLOCK) + // ) { + // return true; + // } return false; } @@ -21,8 +28,7 @@ export function updateOwnership( itemTypeId: string, owner: Address, amount: BigInt, - timestamp: BigInt, - contract: Address + timestamp: BigInt ): void { const ownershipId = `${itemTypeId}-${owner.toHexString()}`; let ownership = ItemTypeOwnership.load(ownershipId); @@ -32,7 +38,6 @@ export function updateOwnership( ownership.itemType = itemTypeId; ownership.owner = owner; ownership.balance = BigInt.fromI32(0); - ownership.contract = contract; } ownership.balance = ownership.balance.plus(amount); @@ -44,3 +49,11 @@ export function updateOwnership( ownership.save(); } } + +export function isWearableTransfer(tokenAddress: Address): boolean { + // Check if the token address in the event matches the wearable token address + return ( + tokenAddress.equals(WEARABLE_TOKEN_ADDRESS) || + tokenAddress.equals(AAVEGOTCHI_ADDRESS) + ); +} diff --git a/src/mappings/itemTransfers.ts b/src/mappings/itemTransfers.ts index 7568da6..657ad89 100644 --- a/src/mappings/itemTransfers.ts +++ b/src/mappings/itemTransfers.ts @@ -16,14 +16,13 @@ export function handleTransferSingle(event: TransferSingle): void { const id = event.params._id.toString(); const amount = event.params._value; const timestamp = event.block.timestamp; - const contract = event.address; if (from.notEqual(Address.zero())) { - updateOwnership(id, from, amount.neg(), timestamp, contract); + updateOwnership(id, from, amount.neg(), timestamp); } if (to.notEqual(Address.zero())) { - updateOwnership(id, to, amount, timestamp, contract); + updateOwnership(id, to, amount, timestamp); } } @@ -35,18 +34,17 @@ export function handleTransferBatch(event: TransferBatch): void { const ids = event.params._ids; const amounts = event.params._values; const timestamp = event.block.timestamp; - const contract = event.address; for (let i = 0; i < ids.length; i++) { const id = ids[i].toString(); const amount = amounts[i]; if (from.notEqual(Address.zero())) { - updateOwnership(id, from, amount.neg(), timestamp, contract); + updateOwnership(id, from, amount.neg(), timestamp); } if (to.notEqual(Address.zero())) { - updateOwnership(id, to, amount, timestamp, contract); + updateOwnership(id, to, amount, timestamp); } } } From f93497e7ad5fc616676b205584b8cab63b537ca2 Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Tue, 22 Apr 2025 15:27:54 +0200 Subject: [PATCH 05/14] fix: remove check --- src/mappings/diamond.ts | 15 ++++++--------- src/mappings/helpers.ts | 21 --------------------- src/mappings/itemTransfers.ts | 8 +------- subgraph.template.yaml | 4 ++++ 4 files changed, 11 insertions(+), 37 deletions(-) diff --git a/src/mappings/diamond.ts b/src/mappings/diamond.ts index fde8882..7f065b4 100644 --- a/src/mappings/diamond.ts +++ b/src/mappings/diamond.ts @@ -131,7 +131,6 @@ import { RealmDiamond, ResyncParcel, } from "../../generated/AavegotchiDiamond/RealmDiamond"; -import { shouldSkipTransfer } from "./helpers"; import { updateOwnership } from "./helpers"; export function handleBuyPortals(event: BuyPortals): void { @@ -1105,7 +1104,9 @@ export function handleMintParcel(event: MintParcel): void { } // WearablesConfig -export function handleWearablesConfigCreated(event: WearablesConfigCreated): void { +export function handleWearablesConfigCreated( + event: WearablesConfigCreated +): void { createOrUpdateWearablesConfig( event.params.owner, event.params.tokenId, @@ -1114,7 +1115,9 @@ export function handleWearablesConfigCreated(event: WearablesConfigCreated): voi ); } -export function handleWearablesConfigUpdated(event: WearablesConfigUpdated): void { +export function handleWearablesConfigUpdated( + event: WearablesConfigUpdated +): void { createOrUpdateWearablesConfig( event.params.owner, event.params.tokenId, @@ -1983,10 +1986,6 @@ export function handleERC1155BuyOrderCancel( } export function handleTransferSingle(event: TransferSingle): void { - if (shouldSkipTransfer(event)) { - return; - } - const from = event.params._from; const to = event.params._to; const id = event.params._id.toString(); @@ -2003,8 +2002,6 @@ export function handleTransferSingle(event: TransferSingle): void { } export function handleTransferBatch(event: TransferBatch): void { - if (shouldSkipTransfer(event)) return; - const from = event.params._from; const to = event.params._to; const ids = event.params._ids; diff --git a/src/mappings/helpers.ts b/src/mappings/helpers.ts index 2679fc2..93c093b 100644 --- a/src/mappings/helpers.ts +++ b/src/mappings/helpers.ts @@ -11,19 +11,6 @@ export const WEARABLE_TOKEN_ADDRESS = Address.fromString( "0x58de9AaBCaeEC0f69883C94318810ad79Cc6a44f" ); -export function shouldSkipTransfer(event: ethereum.Event): boolean { - if (!isWearableTransfer(event.address)) return true; - - // if ( - // event.address == AAVEGOTCHI_ADDRESS && - // event.block.number.gt(MIGRATION_BLOCK) - // ) { - // return true; - // } - - return false; -} - export function updateOwnership( itemTypeId: string, owner: Address, @@ -49,11 +36,3 @@ export function updateOwnership( ownership.save(); } } - -export function isWearableTransfer(tokenAddress: Address): boolean { - // Check if the token address in the event matches the wearable token address - return ( - tokenAddress.equals(WEARABLE_TOKEN_ADDRESS) || - tokenAddress.equals(AAVEGOTCHI_ADDRESS) - ); -} diff --git a/src/mappings/itemTransfers.ts b/src/mappings/itemTransfers.ts index 657ad89..8eb7988 100644 --- a/src/mappings/itemTransfers.ts +++ b/src/mappings/itemTransfers.ts @@ -1,16 +1,12 @@ import { Address } from "@graphprotocol/graph-ts"; -import { shouldSkipTransfer, updateOwnership } from "./helpers"; +import { updateOwnership } from "./helpers"; import { TransferBatch, TransferSingle, } from "../../generated/AavegotchiDiamond/AavegotchiDiamond"; export function handleTransferSingle(event: TransferSingle): void { - if (shouldSkipTransfer(event)) { - return; - } - const from = event.params._from; const to = event.params._to; const id = event.params._id.toString(); @@ -27,8 +23,6 @@ export function handleTransferSingle(event: TransferSingle): void { } export function handleTransferBatch(event: TransferBatch): void { - if (shouldSkipTransfer(event)) return; - const from = event.params._from; const to = event.params._to; const ids = event.params._ids; diff --git a/subgraph.template.yaml b/subgraph.template.yaml index 000b564..1f18b25 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -171,8 +171,12 @@ dataSources: handler: handleERC1155BuyOrderCancel - event: TransferSingle(indexed address,indexed address,indexed address,uint256,uint256) handler: handleTransferSingle + filter: + blockRange: { from: 11500000, to: 35999792 } - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) handler: handleTransferBatch + filter: + blockRange: { from: 11500000, to: 35999792 } - event: WearablesConfigCreated(indexed address,indexed uint256,indexed uint16,uint16[16],uint256) handler: handleWearablesConfigCreated - event: WearablesConfigUpdated(indexed address,indexed uint256,indexed uint16,uint16[16]) From 724ef250afdea2c274467da6073fdbd69439068b Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Wed, 23 Apr 2025 16:57:45 +0200 Subject: [PATCH 06/14] fix: issue --- subgraph.template.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/subgraph.template.yaml b/subgraph.template.yaml index 1f18b25..b2e6265 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -1,9 +1,9 @@ specVersion: 0.0.4 -features: - - grafting -graft: - base: QmP7WDBUeazfUc96uGa71ukM8ZUZHS3GunviVSrJvxSy62 # Subgraph ID of base subgraph - block: 68694611 +# features: +# - grafting +# graft: +# base: QmP7WDBUeazfUc96uGa71ukM8ZUZHS3GunviVSrJvxSy62 # Subgraph ID of base subgraph +# block: 68694611 # Block number description: Aavegotchi Core Matic repository: From 8d3022fb34eb30266c479eb26f7a93ed9224609e Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Wed, 23 Apr 2025 17:03:02 +0200 Subject: [PATCH 07/14] fix: remove block filters --- subgraph.template.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/subgraph.template.yaml b/subgraph.template.yaml index b2e6265..7e1020e 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -171,12 +171,8 @@ dataSources: handler: handleERC1155BuyOrderCancel - event: TransferSingle(indexed address,indexed address,indexed address,uint256,uint256) handler: handleTransferSingle - filter: - blockRange: { from: 11500000, to: 35999792 } - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) handler: handleTransferBatch - filter: - blockRange: { from: 11500000, to: 35999792 } - event: WearablesConfigCreated(indexed address,indexed uint256,indexed uint16,uint16[16],uint256) handler: handleWearablesConfigCreated - event: WearablesConfigUpdated(indexed address,indexed uint256,indexed uint16,uint16[16]) From c024e9547b5f3f50896dfbda3433a83534f23082 Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Thu, 24 Apr 2025 13:49:58 +0200 Subject: [PATCH 08/14] fix: handle the equip events to track original owners --- schema.graphql | 7 +++ src/mappings/diamond.ts | 82 +++++++++++++++++++++++++++++------ src/mappings/itemTransfers.ts | 46 ++++++++++++++------ subgraph.template.yaml | 4 ++ subgraph.yaml | 12 ++++- 5 files changed, 122 insertions(+), 29 deletions(-) diff --git a/schema.graphql b/schema.graphql index adf9fb4..13f3562 100644 --- a/schema.graphql +++ b/schema.graphql @@ -652,3 +652,10 @@ type ItemTypeOwnership @entity { balance: BigInt! lastUpdated: BigInt! } + +type PendingEquip @entity { + id: ID! # `${txHash}-${logIdx}` (or just txHash if one equip/tx) + sender: Bytes! # original wallet + itemId: BigInt! + amount: BigInt! +} diff --git a/src/mappings/diamond.ts b/src/mappings/diamond.ts index 7f065b4..6ae4894 100644 --- a/src/mappings/diamond.ts +++ b/src/mappings/diamond.ts @@ -73,6 +73,8 @@ import { ERC1155BuyOrderCancel, TransferSingle, TransferBatch, + TransferToParent, + TransferFromParent, } from "../../generated/AavegotchiDiamond/AavegotchiDiamond"; import { getOrCreateUser, @@ -113,9 +115,13 @@ import { ZERO_ADDRESS, STATUS_AAVEGOTCHI, } from "../utils/constants"; -import { Address, BigInt, log, Bytes } from "@graphprotocol/graph-ts"; +import { Address, BigInt, log, Bytes, store } from "@graphprotocol/graph-ts"; -import { /*Parcel,*/ Parcel, TokenCommitment } from "../../generated/schema"; +import { + /*Parcel,*/ Parcel, + PendingEquip, + TokenCommitment, +} from "../../generated/schema"; // import { // RealmDiamond, // MintParcel, @@ -1985,19 +1991,36 @@ export function handleERC1155BuyOrderCancel( entity.save(); } -export function handleTransferSingle(event: TransferSingle): void { - const from = event.params._from; - const to = event.params._to; - const id = event.params._id.toString(); - const amount = event.params._value; - const timestamp = event.block.timestamp; +export function handleTransferSingle(e: TransferSingle): void { + const from = e.params._from; + const to = e.params._to; - if (from.notEqual(Address.zero())) { - updateOwnership(id, from, amount.neg(), timestamp); - } + // 1) Normal balance book-keeping + if (from.notEqual(Address.zero())) + updateOwnership( + e.params._id.toString(), + from, + e.params._value.neg(), + e.block.timestamp + ); + + if (to.notEqual(Address.zero())) + updateOwnership( + e.params._id.toString(), + to, + e.params._value, + e.block.timestamp + ); - if (to.notEqual(Address.zero())) { - updateOwnership(id, to, amount, timestamp); + // 2) If it went _into_ the diamond it MIGHT be an equip leg, + // so remember who sent it. + if (to.equals(e.address)) { + const key = `${e.transaction.hash.toHex()}-${e.logIndex.toString()}`; + let p = new PendingEquip(key); + p.sender = from; // wallet that paid the item + p.itemId = e.params._id; + p.amount = e.params._value; + p.save(); } } @@ -2021,3 +2044,36 @@ export function handleTransferBatch(event: TransferBatch): void { } } } + +export function handleTransferToParent(e: TransferToParent): void { + const itemId = e.params._tokenTypeId.toString(); // đŸ‘ˆ field names from ABI + const amt = e.params._value; + const ts = e.block.timestamp; + const pendId = `${e.transaction.hash.toHex()}-${( + e.logIndex.toI32() - 1 + ).toString()}`; + + let p = PendingEquip.load(pendId); + + if (p) { + // 1) undo diamond’s +amt + updateOwnership(itemId, e.params._toContract, amt.neg(), ts); + + // 2) give item back to original wallet + updateOwnership(itemId, Address.fromBytes(p.sender), amt, ts); + + store.remove("PendingEquip", pendId); + } else { + // diamond really owned it already + updateOwnership(itemId, e.params._toContract, amt.neg(), ts); + } +} + +export function handleTransferFromParent(e: TransferFromParent): void { + const itemId = e.params._tokenTypeId.toString(); + const amt = e.params._value; + const ts = e.block.timestamp; + + // 1) diamond temporarily regains it + updateOwnership(itemId, e.params._fromContract, amt, ts); +} diff --git a/src/mappings/itemTransfers.ts b/src/mappings/itemTransfers.ts index 8eb7988..3642732 100644 --- a/src/mappings/itemTransfers.ts +++ b/src/mappings/itemTransfers.ts @@ -5,20 +5,38 @@ import { TransferBatch, TransferSingle, } from "../../generated/AavegotchiDiamond/AavegotchiDiamond"; - -export function handleTransferSingle(event: TransferSingle): void { - const from = event.params._from; - const to = event.params._to; - const id = event.params._id.toString(); - const amount = event.params._value; - const timestamp = event.block.timestamp; - - if (from.notEqual(Address.zero())) { - updateOwnership(id, from, amount.neg(), timestamp); - } - - if (to.notEqual(Address.zero())) { - updateOwnership(id, to, amount, timestamp); +import { PendingEquip } from "../../generated/schema"; + +export function handleTransferSingle(e: TransferSingle): void { + const from = e.params._from; + const to = e.params._to; + + // 1) Normal balance book-keeping + if (from.notEqual(Address.zero())) + updateOwnership( + e.params._id.toString(), + from, + e.params._value.neg(), + e.block.timestamp + ); + + if (to.notEqual(Address.zero())) + updateOwnership( + e.params._id.toString(), + to, + e.params._value, + e.block.timestamp + ); + + // 2) If it went _into_ the diamond it MIGHT be an equip leg, + // so remember who sent it. + if (to.equals(e.address)) { + const key = `${e.transaction.hash.toHex()}-${e.logIndex.toString()}`; + let p = new PendingEquip(key); + p.sender = from; // wallet that paid the item + p.itemId = e.params._id; + p.amount = e.params._value; + p.save(); } } diff --git a/subgraph.template.yaml b/subgraph.template.yaml index 7e1020e..ebf4d0d 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -177,6 +177,10 @@ dataSources: handler: handleWearablesConfigCreated - event: WearablesConfigUpdated(indexed address,indexed uint256,indexed uint16,uint16[16]) handler: handleWearablesConfigUpdated + - event: TransferToParent(indexed address,indexed uint256,indexed uint256,uint256) + handler: handleTransferToParent + - event: TransferFromParent(indexed address,indexed uint256,indexed uint256,uint256) + handler: handleTransferFromParent - kind: ethereum/contract name: RealmDiamond diff --git a/subgraph.yaml b/subgraph.yaml index 257e169..b57133a 100644 --- a/subgraph.yaml +++ b/subgraph.yaml @@ -3,8 +3,8 @@ specVersion: 0.0.4 # - grafting # graft: # base: QmP7WDBUeazfUc96uGa71ukM8ZUZHS3GunviVSrJvxSy62 # Subgraph ID of base subgraph -# block: 64948299 - # Block number +# block: 68694611 +# Block number description: Aavegotchi Core Matic repository: schema: @@ -173,6 +173,14 @@ dataSources: handler: handleTransferSingle - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) handler: handleTransferBatch + - event: WearablesConfigCreated(indexed address,indexed uint256,indexed uint16,uint16[16],uint256) + handler: handleWearablesConfigCreated + - event: WearablesConfigUpdated(indexed address,indexed uint256,indexed uint16,uint16[16]) + handler: handleWearablesConfigUpdated + - event: TransferToParent(indexed address,indexed uint256,indexed uint256,uint256) + handler: handleTransferToParent + - event: TransferFromParent(indexed address,indexed uint256,indexed uint256,uint256) + handler: handleTransferFromParent - kind: ethereum/contract name: RealmDiamond From 7256f0a8df4737e16d2352bd185558caef90bdd8 Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Thu, 24 Apr 2025 15:08:57 +0200 Subject: [PATCH 09/14] fix: prevent ownership update when the to address is diamond --- schema.graphql | 7 ----- src/mappings/diamond.ts | 56 ++++------------------------------- src/mappings/helpers.ts | 2 +- src/mappings/itemTransfers.ts | 18 +++-------- subgraph.template.yaml | 4 --- subgraph.yaml | 4 --- 6 files changed, 10 insertions(+), 81 deletions(-) diff --git a/schema.graphql b/schema.graphql index 13f3562..adf9fb4 100644 --- a/schema.graphql +++ b/schema.graphql @@ -652,10 +652,3 @@ type ItemTypeOwnership @entity { balance: BigInt! lastUpdated: BigInt! } - -type PendingEquip @entity { - id: ID! # `${txHash}-${logIdx}` (or just txHash if one equip/tx) - sender: Bytes! # original wallet - itemId: BigInt! - amount: BigInt! -} diff --git a/src/mappings/diamond.ts b/src/mappings/diamond.ts index 6ae4894..def702b 100644 --- a/src/mappings/diamond.ts +++ b/src/mappings/diamond.ts @@ -117,11 +117,7 @@ import { } from "../utils/constants"; import { Address, BigInt, log, Bytes, store } from "@graphprotocol/graph-ts"; -import { - /*Parcel,*/ Parcel, - PendingEquip, - TokenCommitment, -} from "../../generated/schema"; +import { /*Parcel,*/ Parcel, TokenCommitment } from "../../generated/schema"; // import { // RealmDiamond, // MintParcel, @@ -137,7 +133,7 @@ import { RealmDiamond, ResyncParcel, } from "../../generated/AavegotchiDiamond/RealmDiamond"; -import { updateOwnership } from "./helpers"; +import { AAVEGOTCHI_ADDRESS, updateOwnership } from "./helpers"; export function handleBuyPortals(event: BuyPortals): void { let contract = AavegotchiDiamond.bind(event.address); @@ -1995,7 +1991,9 @@ export function handleTransferSingle(e: TransferSingle): void { const from = e.params._from; const to = e.params._to; - // 1) Normal balance book-keeping + // prevent updating balances when equipping/unequipping and delegating? + if (to.equals(AAVEGOTCHI_ADDRESS)) return; + if (from.notEqual(Address.zero())) updateOwnership( e.params._id.toString(), @@ -2011,17 +2009,6 @@ export function handleTransferSingle(e: TransferSingle): void { e.params._value, e.block.timestamp ); - - // 2) If it went _into_ the diamond it MIGHT be an equip leg, - // so remember who sent it. - if (to.equals(e.address)) { - const key = `${e.transaction.hash.toHex()}-${e.logIndex.toString()}`; - let p = new PendingEquip(key); - p.sender = from; // wallet that paid the item - p.itemId = e.params._id; - p.amount = e.params._value; - p.save(); - } } export function handleTransferBatch(event: TransferBatch): void { @@ -2044,36 +2031,3 @@ export function handleTransferBatch(event: TransferBatch): void { } } } - -export function handleTransferToParent(e: TransferToParent): void { - const itemId = e.params._tokenTypeId.toString(); // đŸ‘ˆ field names from ABI - const amt = e.params._value; - const ts = e.block.timestamp; - const pendId = `${e.transaction.hash.toHex()}-${( - e.logIndex.toI32() - 1 - ).toString()}`; - - let p = PendingEquip.load(pendId); - - if (p) { - // 1) undo diamond’s +amt - updateOwnership(itemId, e.params._toContract, amt.neg(), ts); - - // 2) give item back to original wallet - updateOwnership(itemId, Address.fromBytes(p.sender), amt, ts); - - store.remove("PendingEquip", pendId); - } else { - // diamond really owned it already - updateOwnership(itemId, e.params._toContract, amt.neg(), ts); - } -} - -export function handleTransferFromParent(e: TransferFromParent): void { - const itemId = e.params._tokenTypeId.toString(); - const amt = e.params._value; - const ts = e.block.timestamp; - - // 1) diamond temporarily regains it - updateOwnership(itemId, e.params._fromContract, amt, ts); -} diff --git a/src/mappings/helpers.ts b/src/mappings/helpers.ts index 93c093b..ce019b7 100644 --- a/src/mappings/helpers.ts +++ b/src/mappings/helpers.ts @@ -2,7 +2,7 @@ import { BigInt, Address, ethereum, store } from "@graphprotocol/graph-ts"; import { ItemTypeOwnership } from "../../generated/schema"; const MIGRATION_BLOCK = BigInt.fromI32(35999793); -const AAVEGOTCHI_ADDRESS = Address.fromString( +export const AAVEGOTCHI_ADDRESS = Address.fromString( "0x86935F11C86623deC8a25696E1C19a8659CbF95d" ); diff --git a/src/mappings/itemTransfers.ts b/src/mappings/itemTransfers.ts index 3642732..f663bcb 100644 --- a/src/mappings/itemTransfers.ts +++ b/src/mappings/itemTransfers.ts @@ -1,17 +1,18 @@ import { Address } from "@graphprotocol/graph-ts"; -import { updateOwnership } from "./helpers"; +import { AAVEGOTCHI_ADDRESS, updateOwnership } from "./helpers"; import { TransferBatch, TransferSingle, } from "../../generated/AavegotchiDiamond/AavegotchiDiamond"; -import { PendingEquip } from "../../generated/schema"; export function handleTransferSingle(e: TransferSingle): void { const from = e.params._from; const to = e.params._to; - // 1) Normal balance book-keeping + // prevent updating balances when equipping/unequipping and delegating? + if (to.equals(AAVEGOTCHI_ADDRESS)) return; + if (from.notEqual(Address.zero())) updateOwnership( e.params._id.toString(), @@ -27,17 +28,6 @@ export function handleTransferSingle(e: TransferSingle): void { e.params._value, e.block.timestamp ); - - // 2) If it went _into_ the diamond it MIGHT be an equip leg, - // so remember who sent it. - if (to.equals(e.address)) { - const key = `${e.transaction.hash.toHex()}-${e.logIndex.toString()}`; - let p = new PendingEquip(key); - p.sender = from; // wallet that paid the item - p.itemId = e.params._id; - p.amount = e.params._value; - p.save(); - } } export function handleTransferBatch(event: TransferBatch): void { diff --git a/subgraph.template.yaml b/subgraph.template.yaml index ebf4d0d..7e1020e 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -177,10 +177,6 @@ dataSources: handler: handleWearablesConfigCreated - event: WearablesConfigUpdated(indexed address,indexed uint256,indexed uint16,uint16[16]) handler: handleWearablesConfigUpdated - - event: TransferToParent(indexed address,indexed uint256,indexed uint256,uint256) - handler: handleTransferToParent - - event: TransferFromParent(indexed address,indexed uint256,indexed uint256,uint256) - handler: handleTransferFromParent - kind: ethereum/contract name: RealmDiamond diff --git a/subgraph.yaml b/subgraph.yaml index b57133a..cf76e47 100644 --- a/subgraph.yaml +++ b/subgraph.yaml @@ -177,10 +177,6 @@ dataSources: handler: handleWearablesConfigCreated - event: WearablesConfigUpdated(indexed address,indexed uint256,indexed uint16,uint16[16]) handler: handleWearablesConfigUpdated - - event: TransferToParent(indexed address,indexed uint256,indexed uint256,uint256) - handler: handleTransferToParent - - event: TransferFromParent(indexed address,indexed uint256,indexed uint256,uint256) - handler: handleTransferFromParent - kind: ethereum/contract name: RealmDiamond From 333113e7204c594750245bbb6bdc3bb4c7e88502 Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Mon, 28 Apr 2025 16:56:21 +0200 Subject: [PATCH 10/14] Revert "fix: prevent ownership update when the to address is diamond" This reverts commit 7256f0a8df4737e16d2352bd185558caef90bdd8. --- schema.graphql | 7 +++++ src/mappings/diamond.ts | 56 +++++++++++++++++++++++++++++++---- src/mappings/helpers.ts | 2 +- src/mappings/itemTransfers.ts | 18 ++++++++--- subgraph.template.yaml | 4 +++ subgraph.yaml | 4 +++ 6 files changed, 81 insertions(+), 10 deletions(-) diff --git a/schema.graphql b/schema.graphql index adf9fb4..13f3562 100644 --- a/schema.graphql +++ b/schema.graphql @@ -652,3 +652,10 @@ type ItemTypeOwnership @entity { balance: BigInt! lastUpdated: BigInt! } + +type PendingEquip @entity { + id: ID! # `${txHash}-${logIdx}` (or just txHash if one equip/tx) + sender: Bytes! # original wallet + itemId: BigInt! + amount: BigInt! +} diff --git a/src/mappings/diamond.ts b/src/mappings/diamond.ts index def702b..6ae4894 100644 --- a/src/mappings/diamond.ts +++ b/src/mappings/diamond.ts @@ -117,7 +117,11 @@ import { } from "../utils/constants"; import { Address, BigInt, log, Bytes, store } from "@graphprotocol/graph-ts"; -import { /*Parcel,*/ Parcel, TokenCommitment } from "../../generated/schema"; +import { + /*Parcel,*/ Parcel, + PendingEquip, + TokenCommitment, +} from "../../generated/schema"; // import { // RealmDiamond, // MintParcel, @@ -133,7 +137,7 @@ import { RealmDiamond, ResyncParcel, } from "../../generated/AavegotchiDiamond/RealmDiamond"; -import { AAVEGOTCHI_ADDRESS, updateOwnership } from "./helpers"; +import { updateOwnership } from "./helpers"; export function handleBuyPortals(event: BuyPortals): void { let contract = AavegotchiDiamond.bind(event.address); @@ -1991,9 +1995,7 @@ export function handleTransferSingle(e: TransferSingle): void { const from = e.params._from; const to = e.params._to; - // prevent updating balances when equipping/unequipping and delegating? - if (to.equals(AAVEGOTCHI_ADDRESS)) return; - + // 1) Normal balance book-keeping if (from.notEqual(Address.zero())) updateOwnership( e.params._id.toString(), @@ -2009,6 +2011,17 @@ export function handleTransferSingle(e: TransferSingle): void { e.params._value, e.block.timestamp ); + + // 2) If it went _into_ the diamond it MIGHT be an equip leg, + // so remember who sent it. + if (to.equals(e.address)) { + const key = `${e.transaction.hash.toHex()}-${e.logIndex.toString()}`; + let p = new PendingEquip(key); + p.sender = from; // wallet that paid the item + p.itemId = e.params._id; + p.amount = e.params._value; + p.save(); + } } export function handleTransferBatch(event: TransferBatch): void { @@ -2031,3 +2044,36 @@ export function handleTransferBatch(event: TransferBatch): void { } } } + +export function handleTransferToParent(e: TransferToParent): void { + const itemId = e.params._tokenTypeId.toString(); // đŸ‘ˆ field names from ABI + const amt = e.params._value; + const ts = e.block.timestamp; + const pendId = `${e.transaction.hash.toHex()}-${( + e.logIndex.toI32() - 1 + ).toString()}`; + + let p = PendingEquip.load(pendId); + + if (p) { + // 1) undo diamond’s +amt + updateOwnership(itemId, e.params._toContract, amt.neg(), ts); + + // 2) give item back to original wallet + updateOwnership(itemId, Address.fromBytes(p.sender), amt, ts); + + store.remove("PendingEquip", pendId); + } else { + // diamond really owned it already + updateOwnership(itemId, e.params._toContract, amt.neg(), ts); + } +} + +export function handleTransferFromParent(e: TransferFromParent): void { + const itemId = e.params._tokenTypeId.toString(); + const amt = e.params._value; + const ts = e.block.timestamp; + + // 1) diamond temporarily regains it + updateOwnership(itemId, e.params._fromContract, amt, ts); +} diff --git a/src/mappings/helpers.ts b/src/mappings/helpers.ts index ce019b7..93c093b 100644 --- a/src/mappings/helpers.ts +++ b/src/mappings/helpers.ts @@ -2,7 +2,7 @@ import { BigInt, Address, ethereum, store } from "@graphprotocol/graph-ts"; import { ItemTypeOwnership } from "../../generated/schema"; const MIGRATION_BLOCK = BigInt.fromI32(35999793); -export const AAVEGOTCHI_ADDRESS = Address.fromString( +const AAVEGOTCHI_ADDRESS = Address.fromString( "0x86935F11C86623deC8a25696E1C19a8659CbF95d" ); diff --git a/src/mappings/itemTransfers.ts b/src/mappings/itemTransfers.ts index f663bcb..3642732 100644 --- a/src/mappings/itemTransfers.ts +++ b/src/mappings/itemTransfers.ts @@ -1,18 +1,17 @@ import { Address } from "@graphprotocol/graph-ts"; -import { AAVEGOTCHI_ADDRESS, updateOwnership } from "./helpers"; +import { updateOwnership } from "./helpers"; import { TransferBatch, TransferSingle, } from "../../generated/AavegotchiDiamond/AavegotchiDiamond"; +import { PendingEquip } from "../../generated/schema"; export function handleTransferSingle(e: TransferSingle): void { const from = e.params._from; const to = e.params._to; - // prevent updating balances when equipping/unequipping and delegating? - if (to.equals(AAVEGOTCHI_ADDRESS)) return; - + // 1) Normal balance book-keeping if (from.notEqual(Address.zero())) updateOwnership( e.params._id.toString(), @@ -28,6 +27,17 @@ export function handleTransferSingle(e: TransferSingle): void { e.params._value, e.block.timestamp ); + + // 2) If it went _into_ the diamond it MIGHT be an equip leg, + // so remember who sent it. + if (to.equals(e.address)) { + const key = `${e.transaction.hash.toHex()}-${e.logIndex.toString()}`; + let p = new PendingEquip(key); + p.sender = from; // wallet that paid the item + p.itemId = e.params._id; + p.amount = e.params._value; + p.save(); + } } export function handleTransferBatch(event: TransferBatch): void { diff --git a/subgraph.template.yaml b/subgraph.template.yaml index 7e1020e..ebf4d0d 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -177,6 +177,10 @@ dataSources: handler: handleWearablesConfigCreated - event: WearablesConfigUpdated(indexed address,indexed uint256,indexed uint16,uint16[16]) handler: handleWearablesConfigUpdated + - event: TransferToParent(indexed address,indexed uint256,indexed uint256,uint256) + handler: handleTransferToParent + - event: TransferFromParent(indexed address,indexed uint256,indexed uint256,uint256) + handler: handleTransferFromParent - kind: ethereum/contract name: RealmDiamond diff --git a/subgraph.yaml b/subgraph.yaml index cf76e47..b57133a 100644 --- a/subgraph.yaml +++ b/subgraph.yaml @@ -177,6 +177,10 @@ dataSources: handler: handleWearablesConfigCreated - event: WearablesConfigUpdated(indexed address,indexed uint256,indexed uint16,uint16[16]) handler: handleWearablesConfigUpdated + - event: TransferToParent(indexed address,indexed uint256,indexed uint256,uint256) + handler: handleTransferToParent + - event: TransferFromParent(indexed address,indexed uint256,indexed uint256,uint256) + handler: handleTransferFromParent - kind: ethereum/contract name: RealmDiamond From fac84f4fe82b7f615d3e19784a1c248428b6d99a Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Mon, 28 Apr 2025 16:56:21 +0200 Subject: [PATCH 11/14] Revert "fix: handle the equip events to track original owners" This reverts commit c024e9547b5f3f50896dfbda3433a83534f23082. --- schema.graphql | 7 --- src/mappings/diamond.ts | 82 ++++++----------------------------- src/mappings/itemTransfers.ts | 46 ++++++-------------- subgraph.template.yaml | 4 -- subgraph.yaml | 12 +---- 5 files changed, 29 insertions(+), 122 deletions(-) diff --git a/schema.graphql b/schema.graphql index 13f3562..adf9fb4 100644 --- a/schema.graphql +++ b/schema.graphql @@ -652,10 +652,3 @@ type ItemTypeOwnership @entity { balance: BigInt! lastUpdated: BigInt! } - -type PendingEquip @entity { - id: ID! # `${txHash}-${logIdx}` (or just txHash if one equip/tx) - sender: Bytes! # original wallet - itemId: BigInt! - amount: BigInt! -} diff --git a/src/mappings/diamond.ts b/src/mappings/diamond.ts index 6ae4894..7f065b4 100644 --- a/src/mappings/diamond.ts +++ b/src/mappings/diamond.ts @@ -73,8 +73,6 @@ import { ERC1155BuyOrderCancel, TransferSingle, TransferBatch, - TransferToParent, - TransferFromParent, } from "../../generated/AavegotchiDiamond/AavegotchiDiamond"; import { getOrCreateUser, @@ -115,13 +113,9 @@ import { ZERO_ADDRESS, STATUS_AAVEGOTCHI, } from "../utils/constants"; -import { Address, BigInt, log, Bytes, store } from "@graphprotocol/graph-ts"; +import { Address, BigInt, log, Bytes } from "@graphprotocol/graph-ts"; -import { - /*Parcel,*/ Parcel, - PendingEquip, - TokenCommitment, -} from "../../generated/schema"; +import { /*Parcel,*/ Parcel, TokenCommitment } from "../../generated/schema"; // import { // RealmDiamond, // MintParcel, @@ -1991,36 +1985,19 @@ export function handleERC1155BuyOrderCancel( entity.save(); } -export function handleTransferSingle(e: TransferSingle): void { - const from = e.params._from; - const to = e.params._to; - - // 1) Normal balance book-keeping - if (from.notEqual(Address.zero())) - updateOwnership( - e.params._id.toString(), - from, - e.params._value.neg(), - e.block.timestamp - ); +export function handleTransferSingle(event: TransferSingle): void { + const from = event.params._from; + const to = event.params._to; + const id = event.params._id.toString(); + const amount = event.params._value; + const timestamp = event.block.timestamp; - if (to.notEqual(Address.zero())) - updateOwnership( - e.params._id.toString(), - to, - e.params._value, - e.block.timestamp - ); + if (from.notEqual(Address.zero())) { + updateOwnership(id, from, amount.neg(), timestamp); + } - // 2) If it went _into_ the diamond it MIGHT be an equip leg, - // so remember who sent it. - if (to.equals(e.address)) { - const key = `${e.transaction.hash.toHex()}-${e.logIndex.toString()}`; - let p = new PendingEquip(key); - p.sender = from; // wallet that paid the item - p.itemId = e.params._id; - p.amount = e.params._value; - p.save(); + if (to.notEqual(Address.zero())) { + updateOwnership(id, to, amount, timestamp); } } @@ -2044,36 +2021,3 @@ export function handleTransferBatch(event: TransferBatch): void { } } } - -export function handleTransferToParent(e: TransferToParent): void { - const itemId = e.params._tokenTypeId.toString(); // đŸ‘ˆ field names from ABI - const amt = e.params._value; - const ts = e.block.timestamp; - const pendId = `${e.transaction.hash.toHex()}-${( - e.logIndex.toI32() - 1 - ).toString()}`; - - let p = PendingEquip.load(pendId); - - if (p) { - // 1) undo diamond’s +amt - updateOwnership(itemId, e.params._toContract, amt.neg(), ts); - - // 2) give item back to original wallet - updateOwnership(itemId, Address.fromBytes(p.sender), amt, ts); - - store.remove("PendingEquip", pendId); - } else { - // diamond really owned it already - updateOwnership(itemId, e.params._toContract, amt.neg(), ts); - } -} - -export function handleTransferFromParent(e: TransferFromParent): void { - const itemId = e.params._tokenTypeId.toString(); - const amt = e.params._value; - const ts = e.block.timestamp; - - // 1) diamond temporarily regains it - updateOwnership(itemId, e.params._fromContract, amt, ts); -} diff --git a/src/mappings/itemTransfers.ts b/src/mappings/itemTransfers.ts index 3642732..8eb7988 100644 --- a/src/mappings/itemTransfers.ts +++ b/src/mappings/itemTransfers.ts @@ -5,38 +5,20 @@ import { TransferBatch, TransferSingle, } from "../../generated/AavegotchiDiamond/AavegotchiDiamond"; -import { PendingEquip } from "../../generated/schema"; - -export function handleTransferSingle(e: TransferSingle): void { - const from = e.params._from; - const to = e.params._to; - - // 1) Normal balance book-keeping - if (from.notEqual(Address.zero())) - updateOwnership( - e.params._id.toString(), - from, - e.params._value.neg(), - e.block.timestamp - ); - - if (to.notEqual(Address.zero())) - updateOwnership( - e.params._id.toString(), - to, - e.params._value, - e.block.timestamp - ); - - // 2) If it went _into_ the diamond it MIGHT be an equip leg, - // so remember who sent it. - if (to.equals(e.address)) { - const key = `${e.transaction.hash.toHex()}-${e.logIndex.toString()}`; - let p = new PendingEquip(key); - p.sender = from; // wallet that paid the item - p.itemId = e.params._id; - p.amount = e.params._value; - p.save(); + +export function handleTransferSingle(event: TransferSingle): void { + const from = event.params._from; + const to = event.params._to; + const id = event.params._id.toString(); + const amount = event.params._value; + const timestamp = event.block.timestamp; + + if (from.notEqual(Address.zero())) { + updateOwnership(id, from, amount.neg(), timestamp); + } + + if (to.notEqual(Address.zero())) { + updateOwnership(id, to, amount, timestamp); } } diff --git a/subgraph.template.yaml b/subgraph.template.yaml index ebf4d0d..7e1020e 100644 --- a/subgraph.template.yaml +++ b/subgraph.template.yaml @@ -177,10 +177,6 @@ dataSources: handler: handleWearablesConfigCreated - event: WearablesConfigUpdated(indexed address,indexed uint256,indexed uint16,uint16[16]) handler: handleWearablesConfigUpdated - - event: TransferToParent(indexed address,indexed uint256,indexed uint256,uint256) - handler: handleTransferToParent - - event: TransferFromParent(indexed address,indexed uint256,indexed uint256,uint256) - handler: handleTransferFromParent - kind: ethereum/contract name: RealmDiamond diff --git a/subgraph.yaml b/subgraph.yaml index b57133a..257e169 100644 --- a/subgraph.yaml +++ b/subgraph.yaml @@ -3,8 +3,8 @@ specVersion: 0.0.4 # - grafting # graft: # base: QmP7WDBUeazfUc96uGa71ukM8ZUZHS3GunviVSrJvxSy62 # Subgraph ID of base subgraph -# block: 68694611 -# Block number +# block: 64948299 + # Block number description: Aavegotchi Core Matic repository: schema: @@ -173,14 +173,6 @@ dataSources: handler: handleTransferSingle - event: TransferBatch(indexed address,indexed address,indexed address,uint256[],uint256[]) handler: handleTransferBatch - - event: WearablesConfigCreated(indexed address,indexed uint256,indexed uint16,uint16[16],uint256) - handler: handleWearablesConfigCreated - - event: WearablesConfigUpdated(indexed address,indexed uint256,indexed uint16,uint16[16]) - handler: handleWearablesConfigUpdated - - event: TransferToParent(indexed address,indexed uint256,indexed uint256,uint256) - handler: handleTransferToParent - - event: TransferFromParent(indexed address,indexed uint256,indexed uint256,uint256) - handler: handleTransferFromParent - kind: ethereum/contract name: RealmDiamond From a963d43d7653f48443ee28a645e64d1e011c13d9 Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Fri, 9 May 2025 08:48:07 +0200 Subject: [PATCH 12/14] feat: remove from check to get past owners --- src/mappings/diamond.ts | 12 ++++++------ src/mappings/itemTransfers.ts | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/mappings/diamond.ts b/src/mappings/diamond.ts index a737eb3..79b6744 100644 --- a/src/mappings/diamond.ts +++ b/src/mappings/diamond.ts @@ -1997,9 +1997,9 @@ export function handleTransferSingle(event: TransferSingle): void { const amount = event.params._value; const timestamp = event.block.timestamp; - if (from.notEqual(Address.zero())) { - updateOwnership(id, from, amount.neg(), timestamp); - } + // if (from.notEqual(Address.zero())) { + // updateOwnership(id, from, amount.neg(), timestamp); + // } if (to.notEqual(Address.zero())) { updateOwnership(id, to, amount, timestamp); @@ -2017,9 +2017,9 @@ export function handleTransferBatch(event: TransferBatch): void { const id = ids[i].toString(); const amount = amounts[i]; - if (from.notEqual(Address.zero())) { - updateOwnership(id, from, amount.neg(), timestamp); - } + // if (from.notEqual(Address.zero())) { + // updateOwnership(id, from, amount.neg(), timestamp); + // } if (to.notEqual(Address.zero())) { updateOwnership(id, to, amount, timestamp); diff --git a/src/mappings/itemTransfers.ts b/src/mappings/itemTransfers.ts index 8eb7988..62f2861 100644 --- a/src/mappings/itemTransfers.ts +++ b/src/mappings/itemTransfers.ts @@ -13,9 +13,9 @@ export function handleTransferSingle(event: TransferSingle): void { const amount = event.params._value; const timestamp = event.block.timestamp; - if (from.notEqual(Address.zero())) { - updateOwnership(id, from, amount.neg(), timestamp); - } + // if (from.notEqual(Address.zero())) { + // updateOwnership(id, from, amount.neg(), timestamp); + // } if (to.notEqual(Address.zero())) { updateOwnership(id, to, amount, timestamp); @@ -33,9 +33,9 @@ export function handleTransferBatch(event: TransferBatch): void { const id = ids[i].toString(); const amount = amounts[i]; - if (from.notEqual(Address.zero())) { - updateOwnership(id, from, amount.neg(), timestamp); - } + // if (from.notEqual(Address.zero())) { + // updateOwnership(id, from, amount.neg(), timestamp); + // } if (to.notEqual(Address.zero())) { updateOwnership(id, to, amount, timestamp); From b04c5dddf6bb70aaefc5eefc35dd4154caa48df9 Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Tue, 13 May 2025 16:06:24 +0200 Subject: [PATCH 13/14] fix: check all owner history --- schema.graphql | 2 -- src/mappings/helpers.ts | 21 ++++++--------------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/schema.graphql b/schema.graphql index adf9fb4..52dbb2a 100644 --- a/schema.graphql +++ b/schema.graphql @@ -649,6 +649,4 @@ type ItemTypeOwnership @entity { id: ID! # Format: itemTypeId-ownerAddress itemType: ItemType! owner: Bytes! - balance: BigInt! - lastUpdated: BigInt! } diff --git a/src/mappings/helpers.ts b/src/mappings/helpers.ts index 93c093b..cbb2784 100644 --- a/src/mappings/helpers.ts +++ b/src/mappings/helpers.ts @@ -11,12 +11,7 @@ export const WEARABLE_TOKEN_ADDRESS = Address.fromString( "0x58de9AaBCaeEC0f69883C94318810ad79Cc6a44f" ); -export function updateOwnership( - itemTypeId: string, - owner: Address, - amount: BigInt, - timestamp: BigInt -): void { +export function updateOwnership(itemTypeId: string, owner: Address): void { const ownershipId = `${itemTypeId}-${owner.toHexString()}`; let ownership = ItemTypeOwnership.load(ownershipId); @@ -24,15 +19,11 @@ export function updateOwnership( ownership = new ItemTypeOwnership(ownershipId); ownership.itemType = itemTypeId; ownership.owner = owner; - ownership.balance = BigInt.fromI32(0); } - ownership.balance = ownership.balance.plus(amount); - ownership.lastUpdated = timestamp; - - if (ownership.balance.equals(BigInt.fromI32(0))) { - store.remove("ItemTypeOwnership", ownershipId); - } else { - ownership.save(); - } + // if (ownership.balance.equals(BigInt.fromI32(0))) { + // store.remove("ItemTypeOwnership", ownershipId); + // } else { + ownership.save(); + // } } From 37e631f2be0ad32772479e26958c26ec379898b3 Mon Sep 17 00:00:00 2001 From: Massimiliano <94859244+BromeRST@users.noreply.github.com> Date: Tue, 13 May 2025 16:09:40 +0200 Subject: [PATCH 14/14] fix: building issue --- src/mappings/diamond.ts | 11 ++--------- src/mappings/helpers.ts | 5 ----- src/mappings/itemTransfers.ts | 9 ++------- 3 files changed, 4 insertions(+), 21 deletions(-) diff --git a/src/mappings/diamond.ts b/src/mappings/diamond.ts index 79b6744..7d79eed 100644 --- a/src/mappings/diamond.ts +++ b/src/mappings/diamond.ts @@ -1991,38 +1991,31 @@ export function handleERC1155BuyOrderCancel( } export function handleTransferSingle(event: TransferSingle): void { - const from = event.params._from; const to = event.params._to; const id = event.params._id.toString(); - const amount = event.params._value; - const timestamp = event.block.timestamp; // if (from.notEqual(Address.zero())) { // updateOwnership(id, from, amount.neg(), timestamp); // } if (to.notEqual(Address.zero())) { - updateOwnership(id, to, amount, timestamp); + updateOwnership(id, to); } } export function handleTransferBatch(event: TransferBatch): void { - const from = event.params._from; const to = event.params._to; const ids = event.params._ids; - const amounts = event.params._values; - const timestamp = event.block.timestamp; for (let i = 0; i < ids.length; i++) { const id = ids[i].toString(); - const amount = amounts[i]; // if (from.notEqual(Address.zero())) { // updateOwnership(id, from, amount.neg(), timestamp); // } if (to.notEqual(Address.zero())) { - updateOwnership(id, to, amount, timestamp); + updateOwnership(id, to); } } } diff --git a/src/mappings/helpers.ts b/src/mappings/helpers.ts index cbb2784..fdc8284 100644 --- a/src/mappings/helpers.ts +++ b/src/mappings/helpers.ts @@ -1,11 +1,6 @@ import { BigInt, Address, ethereum, store } from "@graphprotocol/graph-ts"; import { ItemTypeOwnership } from "../../generated/schema"; -const MIGRATION_BLOCK = BigInt.fromI32(35999793); -const AAVEGOTCHI_ADDRESS = Address.fromString( - "0x86935F11C86623deC8a25696E1C19a8659CbF95d" -); - // Address of the actual wearable token contract export const WEARABLE_TOKEN_ADDRESS = Address.fromString( "0x58de9AaBCaeEC0f69883C94318810ad79Cc6a44f" diff --git a/src/mappings/itemTransfers.ts b/src/mappings/itemTransfers.ts index 62f2861..2f9309e 100644 --- a/src/mappings/itemTransfers.ts +++ b/src/mappings/itemTransfers.ts @@ -10,15 +10,13 @@ export function handleTransferSingle(event: TransferSingle): void { const from = event.params._from; const to = event.params._to; const id = event.params._id.toString(); - const amount = event.params._value; - const timestamp = event.block.timestamp; // if (from.notEqual(Address.zero())) { // updateOwnership(id, from, amount.neg(), timestamp); // } if (to.notEqual(Address.zero())) { - updateOwnership(id, to, amount, timestamp); + updateOwnership(id, to); } } @@ -26,19 +24,16 @@ export function handleTransferBatch(event: TransferBatch): void { const from = event.params._from; const to = event.params._to; const ids = event.params._ids; - const amounts = event.params._values; - const timestamp = event.block.timestamp; for (let i = 0; i < ids.length; i++) { const id = ids[i].toString(); - const amount = amounts[i]; // if (from.notEqual(Address.zero())) { // updateOwnership(id, from, amount.neg(), timestamp); // } if (to.notEqual(Address.zero())) { - updateOwnership(id, to, amount, timestamp); + updateOwnership(id, to); } } }