Commit 0eb1aaf2 authored by Ubuntu's avatar Ubuntu

Initial commit

parents
# Graph CLI generated artifacts
build/
generated/
# Dependency directories
node_modules/
jspm_packages/
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# dotenv environment variables file
.env
# Testing
coverage
coverage.json
# Typechain
typechain
typechain-types
# Hardhat files
cache
[
{
"constant": true,
"inputs": [{ "name": "interfaceId", "type": "bytes4" }],
"name": "supportsInterface",
"outputs": [{ "name": "", "type": "bool" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "name": "from", "type": "address" },
{ "indexed": true, "name": "to", "type": "address" },
{ "indexed": true, "name": "tokenId", "type": "uint256" }
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "name": "owner", "type": "address" },
{ "indexed": true, "name": "approved", "type": "address" },
{ "indexed": true, "name": "tokenId", "type": "uint256" }
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "name": "owner", "type": "address" },
{ "indexed": true, "name": "operator", "type": "address" },
{ "indexed": false, "name": "approved", "type": "bool" }
],
"name": "ApprovalForAll",
"type": "event"
},
{
"constant": true,
"inputs": [{ "name": "owner", "type": "address" }],
"name": "balanceOf",
"outputs": [{ "name": "", "type": "uint256" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": true,
"inputs": [{ "name": "tokenId", "type": "uint256" }],
"name": "ownerOf",
"outputs": [{ "name": "", "type": "address" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{ "name": "to", "type": "address" },
{ "name": "tokenId", "type": "uint256" }
],
"name": "approve",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [{ "name": "tokenId", "type": "uint256" }],
"name": "getApproved",
"outputs": [{ "name": "", "type": "address" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{ "name": "to", "type": "address" },
{ "name": "approved", "type": "bool" }
],
"name": "setApprovalForAll",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": true,
"inputs": [
{ "name": "owner", "type": "address" },
{ "name": "operator", "type": "address" }
],
"name": "isApprovedForAll",
"outputs": [{ "name": "", "type": "bool" }],
"payable": false,
"stateMutability": "view",
"type": "function"
},
{
"constant": false,
"inputs": [
{ "name": "to", "type": "address" },
{ "name": "tokenId", "type": "uint256" }
],
"name": "transfer",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{ "name": "from", "type": "address" },
{ "name": "to", "type": "address" },
{ "name": "tokenId", "type": "uint256" }
],
"name": "transferFrom",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{ "name": "from", "type": "address" },
{ "name": "to", "type": "address" },
{ "name": "tokenId", "type": "uint256" }
],
"name": "safeTransferFrom",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
},
{
"constant": false,
"inputs": [
{ "name": "from", "type": "address" },
{ "name": "to", "type": "address" },
{ "name": "tokenId", "type": "uint256" },
{ "name": "_data", "type": "bytes" }
],
"name": "safeTransferFrom",
"outputs": [],
"payable": false,
"stateMutability": "nonpayable",
"type": "function"
}
]
version: "3"
services:
graph-node:
image: graphprotocol/graph-node
ports:
- "8000:8000"
- "8001:8001"
- "8020:8020"
- "8030:8030"
- "8040:8040"
depends_on:
- ipfs
- postgres
extra_hosts:
- host.docker.internal:host-gateway
environment:
postgres_host: postgres
postgres_user: graph-node
postgres_pass: let-me-in
postgres_db: graph-node
ipfs: "ipfs:5001"
ethereum: "mainnet:http://host.docker.internal:8545"
GRAPH_LOG: info
ipfs:
image: ipfs/kubo:v0.17.0
ports:
- "5001:5001"
volumes:
- ./data/ipfs:/data/ipfs
postgres:
image: postgres:14
ports:
- "5432:5432"
command:
[
"postgres",
"-cshared_preload_libraries=pg_stat_statements",
"-cmax_connections=200",
]
environment:
POSTGRES_USER: graph-node
POSTGRES_PASSWORD: let-me-in
POSTGRES_DB: graph-node
# FIXME: remove this env. var. which we shouldn't need. Introduced by
# <https://github.com/graphprotocol/graph-node/pull/3511>, maybe as a
# workaround for https://github.com/docker/for-mac/issues/6270?
PGDATA: "/var/lib/postgresql/data"
POSTGRES_INITDB_ARGS: "-E UTF8 --locale=C"
volumes:
- ./data/postgres:/var/lib/postgresql/data
{
"polygonmainnet": {
"Drago": {
"address": "0x9E8Ea82e76262E957D4cC24e04857A34B0D8f062",
"startBlock": 66900000
}
}
}
\ No newline at end of file
{
"name": "nft-mint-test",
"license": "UNLICENSED",
"scripts": {
"codegen": "graph codegen",
"build": "graph build",
"deploy": "graph deploy --node http://127.0.0.1:50020 polygon/nft-mint-test",
"create-local": "graph create --node http://localhost:8020/ polygon/nft-mint-test",
"remove-local": "graph remove --node http://localhost:8020/ polygon/nft-mint-test",
"deploy-local": "graph deploy --node http://localhost:8020/ --ipfs http://localhost:5001 polygon/nft-mint-test",
"test": "graph test"
},
"dependencies": {
"@graphprotocol/graph-cli": "0.78.0",
"@graphprotocol/graph-ts": "0.32.0"
},
"devDependencies": { "matchstick-as": "0.5.0" }
}
type Transfer @entity(immutable: true) {
id: Bytes!
from: Bytes! # address
to: Bytes! # address
tokenId: BigInt! # uint256
blockNumber: BigInt!
blockTimestamp: BigInt!
transactionHash: Bytes!
}
type Approval @entity(immutable: true) {
id: Bytes!
owner: Bytes! # address
approved: Bytes! # address
tokenId: BigInt! # uint256
blockNumber: BigInt!
blockTimestamp: BigInt!
transactionHash: Bytes!
}
type ApprovalForAll @entity(immutable: true) {
id: Bytes!
owner: Bytes! # address
operator: Bytes! # address
approved: Boolean! # bool
blockNumber: BigInt!
blockTimestamp: BigInt!
transactionHash: Bytes!
}
import {
Transfer as TransferEvent,
Approval as ApprovalEvent,
ApprovalForAll as ApprovalForAllEvent
} from "../generated/Drago/Drago"
import { Transfer, Approval, ApprovalForAll } from "../generated/schema"
export function handleTransfer(event: TransferEvent): void {
let entity = new Transfer(
event.transaction.hash.concatI32(event.logIndex.toI32())
)
entity.from = event.params.from
entity.to = event.params.to
entity.tokenId = event.params.tokenId
entity.blockNumber = event.block.number
entity.blockTimestamp = event.block.timestamp
entity.transactionHash = event.transaction.hash
entity.save()
}
export function handleApproval(event: ApprovalEvent): void {
let entity = new Approval(
event.transaction.hash.concatI32(event.logIndex.toI32())
)
entity.owner = event.params.owner
entity.approved = event.params.approved
entity.tokenId = event.params.tokenId
entity.blockNumber = event.block.number
entity.blockTimestamp = event.block.timestamp
entity.transactionHash = event.transaction.hash
entity.save()
}
export function handleApprovalForAll(event: ApprovalForAllEvent): void {
let entity = new ApprovalForAll(
event.transaction.hash.concatI32(event.logIndex.toI32())
)
entity.owner = event.params.owner
entity.operator = event.params.operator
entity.approved = event.params.approved
entity.blockNumber = event.block.number
entity.blockTimestamp = event.block.timestamp
entity.transactionHash = event.transaction.hash
entity.save()
}
specVersion: 1.0.0
indexerHints:
prune: auto
schema:
file: ./schema.graphql
dataSources:
- kind: ethereum
name: Drago
network: polygonmainnet
source:
address: "0x9E8Ea82e76262E957D4cC24e04857A34B0D8f062"
abi: Drago
startBlock: 66900000
mapping:
kind: ethereum/events
apiVersion: 0.0.7
language: wasm/assemblyscript
entities:
- Transfer
- Approval
- ApprovalForAll
abis:
- name: Drago
file: ./abis/Drago.json
eventHandlers:
- event: Transfer(indexed address,indexed address,indexed uint256)
handler: handleTransfer
- event: Approval(indexed address,indexed address,indexed uint256)
handler: handleApproval
- event: ApprovalForAll(indexed address,indexed address,bool)
handler: handleApprovalForAll
file: ./src/drago.ts
import { newMockEvent } from "matchstick-as"
import { ethereum, Address, BigInt } from "@graphprotocol/graph-ts"
import { Transfer, Approval, ApprovalForAll } from "../generated/Drago/Drago"
export function createTransferEvent(
from: Address,
to: Address,
tokenId: BigInt
): Transfer {
let transferEvent = changetype<Transfer>(newMockEvent())
transferEvent.parameters = new Array()
transferEvent.parameters.push(
new ethereum.EventParam("from", ethereum.Value.fromAddress(from))
)
transferEvent.parameters.push(
new ethereum.EventParam("to", ethereum.Value.fromAddress(to))
)
transferEvent.parameters.push(
new ethereum.EventParam(
"tokenId",
ethereum.Value.fromUnsignedBigInt(tokenId)
)
)
return transferEvent
}
export function createApprovalEvent(
owner: Address,
approved: Address,
tokenId: BigInt
): Approval {
let approvalEvent = changetype<Approval>(newMockEvent())
approvalEvent.parameters = new Array()
approvalEvent.parameters.push(
new ethereum.EventParam("owner", ethereum.Value.fromAddress(owner))
)
approvalEvent.parameters.push(
new ethereum.EventParam("approved", ethereum.Value.fromAddress(approved))
)
approvalEvent.parameters.push(
new ethereum.EventParam(
"tokenId",
ethereum.Value.fromUnsignedBigInt(tokenId)
)
)
return approvalEvent
}
export function createApprovalForAllEvent(
owner: Address,
operator: Address,
approved: boolean
): ApprovalForAll {
let approvalForAllEvent = changetype<ApprovalForAll>(newMockEvent())
approvalForAllEvent.parameters = new Array()
approvalForAllEvent.parameters.push(
new ethereum.EventParam("owner", ethereum.Value.fromAddress(owner))
)
approvalForAllEvent.parameters.push(
new ethereum.EventParam("operator", ethereum.Value.fromAddress(operator))
)
approvalForAllEvent.parameters.push(
new ethereum.EventParam("approved", ethereum.Value.fromBoolean(approved))
)
return approvalForAllEvent
}
import {
assert,
describe,
test,
clearStore,
beforeAll,
afterAll
} from "matchstick-as/assembly/index"
import { Address, BigInt } from "@graphprotocol/graph-ts"
import { Transfer } from "../generated/schema"
import { Transfer as TransferEvent } from "../generated/Drago/Drago"
import { handleTransfer } from "../src/drago"
import { createTransferEvent } from "./drago-utils"
// Tests structure (matchstick-as >=0.5.0)
// https://thegraph.com/docs/en/developer/matchstick/#tests-structure-0-5-0
describe("Describe entity assertions", () => {
beforeAll(() => {
let from = Address.fromString("0x0000000000000000000000000000000000000001")
let to = Address.fromString("0x0000000000000000000000000000000000000001")
let tokenId = BigInt.fromI32(234)
let newTransferEvent = createTransferEvent(from, to, tokenId)
handleTransfer(newTransferEvent)
})
afterAll(() => {
clearStore()
})
// For more test scenarios, see:
// https://thegraph.com/docs/en/developer/matchstick/#write-a-unit-test
test("Transfer created and stored", () => {
assert.entityCount("Transfer", 1)
// 0xa16081f360e3847006db660bae1c6d1b2e17ec2a is the default address used in newMockEvent() function
assert.fieldEquals(
"Transfer",
"0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
"from",
"0x0000000000000000000000000000000000000001"
)
assert.fieldEquals(
"Transfer",
"0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
"to",
"0x0000000000000000000000000000000000000001"
)
assert.fieldEquals(
"Transfer",
"0xa16081f360e3847006db660bae1c6d1b2e17ec2a-1",
"tokenId",
"234"
)
// More assert options:
// https://thegraph.com/docs/en/developer/matchstick/#asserts
})
})
{
"extends": "@graphprotocol/graph-ts/types/tsconfig.base.json",
"include": ["src", "tests"]
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment