From cbe421a2e7f0de6ba6e6c1aba4973f08c5bffc6a Mon Sep 17 00:00:00 2001 From: xxamxx Date: Fri, 19 Jan 2024 17:11:33 +0800 Subject: [PATCH 01/11] =?UTF-8?q?feat:=20=E2=9C=A8=20add=20LockedTokenVaul?= =?UTF-8?q?tFactory=20and=20LockedTokenVault=20contract=20mappings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abis/LockedTokenVault.json | 446 ++++++++++++++++++++++++++++ abis/LockedTokenVaultFactory.json | 188 ++++++++++++ bin/index-cmd.js | 2 + src/mappings/dpoint/factory.ts | 6 + src/mappings/dpoint/index.ts | 56 ++++ subgraphs/dpoint/dpoint.graphql | 36 +++ subgraphs/dpoint/dpoint_scroll.yaml | 49 +++ 7 files changed, 783 insertions(+) create mode 100644 abis/LockedTokenVault.json create mode 100644 abis/LockedTokenVaultFactory.json create mode 100644 src/mappings/dpoint/factory.ts create mode 100644 src/mappings/dpoint/index.ts create mode 100644 subgraphs/dpoint/dpoint.graphql create mode 100644 subgraphs/dpoint/dpoint_scroll.yaml diff --git a/abis/LockedTokenVault.json b/abis/LockedTokenVault.json new file mode 100644 index 0000000..6284d72 --- /dev/null +++ b/abis/LockedTokenVault.json @@ -0,0 +1,446 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "holder", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "origin", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimed", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Claim", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferPrepared", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "_CLIFF_RATE_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_DISTRIBUTE_FINISHED_", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_NEW_OWNER_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_OWNER_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_RELEASE_DURATION_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_START_RELEASE_TIME_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_TOKEN_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_UNDISTRIBUTED_AMOUNT_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claim", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "other", + "type": "address" + } + ], + "name": "claimFor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "claimOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "finishDistribute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "holder", + "type": "address" + } + ], + "name": "getClaimableBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "holder", + "type": "address" + } + ], + "name": "getClaimedBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "holder", + "type": "address" + } + ], + "name": "getOriginBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "holder", + "type": "address" + } + ], + "name": "getRemainingBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "getRemainingRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "holderList", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amountList", + "type": "uint256[]" + } + ], + "name": "grant", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_startReleaseTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_releaseDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_cliffRate", + "type": "uint256" + } + ], + "name": "init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "initOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isReleaseStart", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "holder", + "type": "address" + } + ], + "name": "recall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "transferLockedToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/abis/LockedTokenVaultFactory.json b/abis/LockedTokenVaultFactory.json new file mode 100644 index 0000000..5fbb32a --- /dev/null +++ b/abis/LockedTokenVaultFactory.json @@ -0,0 +1,188 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "cloneFactory", + "type": "address" + }, + { + "internalType": "address", + "name": "vaultTemplate", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "name": "CreateVault", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferPrepared", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "_CLONE_FACTORY_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_NEW_OWNER_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_OWNER_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_VAULT_TEMPLATE_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_startReleaseTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_releaseDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_cliffRate", + "type": "uint256" + } + ], + "name": "createVault", + "outputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "template", + "type": "address" + } + ], + "name": "setTemplate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/bin/index-cmd.js b/bin/index-cmd.js index 8e08440..f1ea1e5 100644 --- a/bin/index-cmd.js +++ b/bin/index-cmd.js @@ -383,6 +383,8 @@ function getDefaultConfig() { "graph codegen subgraphs/merkle-airdrop/merkle_goerli.yaml --output-dir ./src/types/merkle/ && graph deploy --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020 dodoex/merkle_airdrop_goerli subgraphs/merkle-airdrop/merkle_goerli.yaml", "deploy:studio:merkle_airdrop_base_mainnet": "graph codegen subgraphs/merkle-airdrop/merkle_base_mainnet.yaml --output-dir ./src/types/merkle/ && graph deploy --studio --node https://api.studio.thegraph.com/deploy/ dodoex_merkle_airdrop_base subgraphs/merkle-airdrop/merkle_base_mainnet.yaml", + "deploy:studio:dpoint_scroll": + "graph codegen subgraphs/dpoint/dpoint_scroll.yaml --output-dir ./src/types/dpoint/ && graph deploy --studio --node https://api.studio.thegraph.com/deploy/ dodoex_dpoint_scroll subgraphs/dpoint/dpoint_scroll.yaml", }; return config2; } diff --git a/src/mappings/dpoint/factory.ts b/src/mappings/dpoint/factory.ts new file mode 100644 index 0000000..ec0c8d5 --- /dev/null +++ b/src/mappings/dpoint/factory.ts @@ -0,0 +1,6 @@ +import { CreateVault as CreateVaultEvent } from "../../types/dpoint/LockedTokenVaultFactory/LockedTokenVaultFactory"; +import { LockedTokenVault as LockedTokenVaultTemplate } from "../../types/dpoint/templates"; + +export function handleCreateVault(event: CreateVaultEvent): void { + LockedTokenVaultTemplate.create(event.params.vault); +} \ No newline at end of file diff --git a/src/mappings/dpoint/index.ts b/src/mappings/dpoint/index.ts new file mode 100644 index 0000000..9572a0c --- /dev/null +++ b/src/mappings/dpoint/index.ts @@ -0,0 +1,56 @@ +import { Address, BigInt, ethereum, log } from "@graphprotocol/graph-ts"; +import { ERC20 } from "../../types/dpoint/LockedTokenVaultFactory/ERC20"; +import { Claimed, Token } from "../../types/dpoint/schema"; +import { LockedTokenVault } from "../../types/dpoint/templates"; +import { Claim as ClaimEvent } from "../../types/dpoint/templates/LockedTokenVault/LockedTokenVault"; + +export function handleClaim(event: ClaimEvent): void { + let entity = new Claimed( + event.transaction.hash.toHexString().concat(event.logIndex.toString()) + ); + entity.hash = event.transaction.hash.toHexString(); + entity.logIndex = event.logIndex.toI32(); + entity.blockNumber = event.block.number; + entity.timestamp = event.block.timestamp; + entity.account = event.params.holder; + entity.amount = event.params.amount; + entity.originAmount = event.params.origin; + entity.claimedAmount = event.params.claimed; + entity.address = event.address; + + let lockedTokenVault = LockedTokenVault.bind(event.address); + let tokenAddress = lockedTokenVault.try__TOKEN_(); + if (tokenAddress.reverted) { + log.info("lockedTokenVault.try__TOKEN_ reverted: {}", [entity.id]); + } + let token = createToken(tokenAddress.value, event); + entity.token = token.id; + + entity.remainingRatio = lockedTokenVault.getRemainingRatio(); + + entity.updatedAt = event.block.timestamp; + entity.save(); +} + +function createToken(address: Address, event: ethereum.Event): Token { + let token = Token.load(address.toHexString()); + if (token == null) { + token = new Token(address.toHexString()); + let erc20 = ERC20.bind(address); + token.name = erc20.name(); + token.symbol = erc20.symbol(); + token.decimals = BigInt.fromI32(erc20.decimals()); + let totalSupplyResult = erc20.try_totalSupply(); + if (totalSupplyResult.reverted) { + log.error("ERC20.try_totalSupply reverted. address: {}", [ + address.toHexString(), + ]); + token.totalSupply = BigInt.fromI32(0); + } else { + token.totalSupply = totalSupplyResult.value; + } + token.updatedAt = event.block.timestamp; + token.save(); + } + return token as Token; +} \ No newline at end of file diff --git a/subgraphs/dpoint/dpoint.graphql b/subgraphs/dpoint/dpoint.graphql new file mode 100644 index 0000000..e635035 --- /dev/null +++ b/subgraphs/dpoint/dpoint.graphql @@ -0,0 +1,36 @@ +type Claimed @entity { + " { Transaction hash }-{ Log index } " + id: ID! + " Transaction hash of the transaction that emitted this event " + hash: String! + " Event log index. For transactions that don't emit event, create arbitrary index starting from 0 " + logIndex: Int! + " Block number of this event " + blockNumber: BigInt! + " Timestamp of this event " + timestamp: BigInt! + account: Bytes! + amount: BigInt! + claimedAmount: BigInt! + originAmount: BigInt! + remainingRatio: BigInt! + address: Bytes! + token: Token! + "updatedAt" + updatedAt: BigInt! +} + +type Token @entity { + "token address" + id: ID! + "token symbol" + symbol: String! + "token name" + name: String! + "token decimals" + decimals: BigInt! + "total supply" + totalSupply: BigInt! + "updatedAt" + updatedAt: BigInt! +} diff --git a/subgraphs/dpoint/dpoint_scroll.yaml b/subgraphs/dpoint/dpoint_scroll.yaml new file mode 100644 index 0000000..871967c --- /dev/null +++ b/subgraphs/dpoint/dpoint_scroll.yaml @@ -0,0 +1,49 @@ +specVersion: 0.0.4 +description: Dodoex.io +repository: https://github.com/DODOEX/dodoex_v2_subgraph +schema: + file: ./dpoint.graphql +dataSources: + - kind: ethereum/contract + name: LockedTokenVaultFactory + network: scroll + source: + address: '0x7A6a6bCeA8bfA93893aCC3df6D2A81ECb0E8dC1d' + abi: LockedTokenVaultFactory + startBlock: 10381816 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dpoint/factory.ts + entities: [] + abis: + - name: LockedTokenVaultFactory + file: ../../abis/LockedTokenVaultFactory.json + - name: LockedTokenVault + file: ../../abis/LockedTokenVault.json + eventHandlers: + - event: CreateVault(address) + handler: handleCreateVault +templates: + - kind: ethereum/contract + name: LockedTokenVault + network: scroll + source: + abi: LockedTokenVault + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dpoint/index.ts + entities: + - ERC20 + - Claimed + abis: + - name: LockedTokenVault + file: ../../abis/LockedTokenVault.json + - name: ERC20 + file: ../../abis/ERC20.json + eventHandlers: + - event: Claim(indexed address,uint256,uint256,uint256) + handler: handleClaim From 6170fafd82f8777c97d18c879d297ec28606d184 Mon Sep 17 00:00:00 2001 From: xxamxx Date: Fri, 19 Jan 2024 17:11:33 +0800 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20=E2=9C=A8=20add=20LockedTokenVaul?= =?UTF-8?q?tFactory=20and=20LockedTokenVault=20contract=20mappings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- abis/LockedTokenVault.json | 446 ++++++++++++++++++++++++++++ abis/LockedTokenVaultFactory.json | 188 ++++++++++++ bin/index-cmd.js | 2 + build/subgraph.yaml | 58 ++-- src/mappings/dpoint/factory.ts | 6 + src/mappings/dpoint/index.ts | 59 ++++ subgraphs/dpoint/dpoint.graphql | 36 +++ subgraphs/dpoint/dpoint_goerli.yaml | 49 +++ subgraphs/dpoint/dpoint_scroll.yaml | 49 +++ 9 files changed, 869 insertions(+), 24 deletions(-) create mode 100644 abis/LockedTokenVault.json create mode 100644 abis/LockedTokenVaultFactory.json create mode 100644 src/mappings/dpoint/factory.ts create mode 100644 src/mappings/dpoint/index.ts create mode 100644 subgraphs/dpoint/dpoint.graphql create mode 100644 subgraphs/dpoint/dpoint_goerli.yaml create mode 100644 subgraphs/dpoint/dpoint_scroll.yaml diff --git a/abis/LockedTokenVault.json b/abis/LockedTokenVault.json new file mode 100644 index 0000000..6284d72 --- /dev/null +++ b/abis/LockedTokenVault.json @@ -0,0 +1,446 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "holder", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "origin", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "claimed", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Claim", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferPrepared", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "_CLIFF_RATE_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_DISTRIBUTE_FINISHED_", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_NEW_OWNER_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_OWNER_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_RELEASE_DURATION_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_START_RELEASE_TIME_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_TOKEN_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_UNDISTRIBUTED_AMOUNT_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claim", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "other", + "type": "address" + } + ], + "name": "claimFor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "claimOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "deposit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "finishDistribute", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "holder", + "type": "address" + } + ], + "name": "getClaimableBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "holder", + "type": "address" + } + ], + "name": "getClaimedBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "holder", + "type": "address" + } + ], + "name": "getOriginBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "holder", + "type": "address" + } + ], + "name": "getRemainingBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "getRemainingRatio", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "holderList", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "amountList", + "type": "uint256[]" + } + ], + "name": "grant", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_startReleaseTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_releaseDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_cliffRate", + "type": "uint256" + } + ], + "name": "init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "initOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isReleaseStart", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "holder", + "type": "address" + } + ], + "name": "recall", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "transferLockedToken", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/abis/LockedTokenVaultFactory.json b/abis/LockedTokenVaultFactory.json new file mode 100644 index 0000000..5fbb32a --- /dev/null +++ b/abis/LockedTokenVaultFactory.json @@ -0,0 +1,188 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "cloneFactory", + "type": "address" + }, + { + "internalType": "address", + "name": "vaultTemplate", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "name": "CreateVault", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferPrepared", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "_CLONE_FACTORY_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_NEW_OWNER_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_OWNER_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_VAULT_TEMPLATE_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "claimOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_startReleaseTime", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_releaseDuration", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_cliffRate", + "type": "uint256" + } + ], + "name": "createVault", + "outputs": [ + { + "internalType": "address", + "name": "vault", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "template", + "type": "address" + } + ], + "name": "setTemplate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/bin/index-cmd.js b/bin/index-cmd.js index 8e08440..f1ea1e5 100644 --- a/bin/index-cmd.js +++ b/bin/index-cmd.js @@ -383,6 +383,8 @@ function getDefaultConfig() { "graph codegen subgraphs/merkle-airdrop/merkle_goerli.yaml --output-dir ./src/types/merkle/ && graph deploy --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020 dodoex/merkle_airdrop_goerli subgraphs/merkle-airdrop/merkle_goerli.yaml", "deploy:studio:merkle_airdrop_base_mainnet": "graph codegen subgraphs/merkle-airdrop/merkle_base_mainnet.yaml --output-dir ./src/types/merkle/ && graph deploy --studio --node https://api.studio.thegraph.com/deploy/ dodoex_merkle_airdrop_base subgraphs/merkle-airdrop/merkle_base_mainnet.yaml", + "deploy:studio:dpoint_scroll": + "graph codegen subgraphs/dpoint/dpoint_scroll.yaml --output-dir ./src/types/dpoint/ && graph deploy --studio --node https://api.studio.thegraph.com/deploy/ dodoex_dpoint_scroll subgraphs/dpoint/dpoint_scroll.yaml", }; return config2; } diff --git a/build/subgraph.yaml b/build/subgraph.yaml index f9cacf3..a781926 100644 --- a/build/subgraph.yaml +++ b/build/subgraph.yaml @@ -1,39 +1,49 @@ -specVersion: 0.0.6 +specVersion: 0.0.4 description: Dodoex.io repository: https://github.com/DODOEX/dodoex_v2_subgraph schema: - file: token.graphql + file: dpoint.graphql dataSources: - kind: ethereum/contract - name: ERC20V3Factory - network: tokb + name: LockedTokenVaultFactory + network: goerli source: - address: "0x4A81Aa47722E1cF27A8726F247E68a766bE58d8e" - abi: ERC20V3Factory - startBlock: 299037 + address: "0x7A6a6bCeA8bfA93893aCC3df6D2A81ECb0E8dC1d" + abi: LockedTokenVaultFactory + startBlock: 10381816 mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript - file: ERC20V3Factory/ERC20V3Factory.wasm + file: LockedTokenVaultFactory/LockedTokenVaultFactory.wasm + entities: [] + abis: + - name: LockedTokenVaultFactory + file: ../abis/LockedTokenVaultFactory.json + - name: LockedTokenVault + file: ../abis/LockedTokenVault.json + eventHandlers: + - event: CreateVault(address) + handler: handleCreateVault +templates: + - kind: ethereum/contract + name: LockedTokenVault + network: goerli + source: + abi: LockedTokenVault + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/LockedTokenVault/LockedTokenVault.wasm entities: - - User - - Token - - UserTokenBlance - - TransferHistories + - ERC20 + - Claimed abis: - - name: ERC20Factory - file: ../abis/ERC20Factory.json - - name: ERC20V2Factory - file: ../abis/ERC20V2Factory.json - - name: ERC20V3Factory - file: ../abis/ERC20V3Factory.json + - name: LockedTokenVault + file: ../abis/LockedTokenVault.json - name: ERC20 file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json eventHandlers: - - event: NewERC20(address,address,uint256) - handler: handleNewERC20 + - event: Claim(indexed address,uint256,uint256,uint256) + handler: handleClaim diff --git a/src/mappings/dpoint/factory.ts b/src/mappings/dpoint/factory.ts new file mode 100644 index 0000000..ec0c8d5 --- /dev/null +++ b/src/mappings/dpoint/factory.ts @@ -0,0 +1,6 @@ +import { CreateVault as CreateVaultEvent } from "../../types/dpoint/LockedTokenVaultFactory/LockedTokenVaultFactory"; +import { LockedTokenVault as LockedTokenVaultTemplate } from "../../types/dpoint/templates"; + +export function handleCreateVault(event: CreateVaultEvent): void { + LockedTokenVaultTemplate.create(event.params.vault); +} \ No newline at end of file diff --git a/src/mappings/dpoint/index.ts b/src/mappings/dpoint/index.ts new file mode 100644 index 0000000..9922940 --- /dev/null +++ b/src/mappings/dpoint/index.ts @@ -0,0 +1,59 @@ +import { Address, BigInt, ethereum, log } from "@graphprotocol/graph-ts"; +import { ERC20 } from "../../types/dpoint/LockedTokenVaultFactory/ERC20"; +import { Claimed, Token } from "../../types/dpoint/schema"; +import { Claim as ClaimEvent, LockedTokenVault } from "../../types/dpoint/templates/LockedTokenVault/LockedTokenVault"; + +export function handleClaim(event: ClaimEvent): void { + let entity = new Claimed( + event.transaction.hash.toHexString().concat(event.logIndex.toString()) + ); + entity.hash = event.transaction.hash.toHexString(); + entity.logIndex = event.logIndex.toI32(); + entity.blockNumber = event.block.number; + entity.timestamp = event.block.timestamp; + entity.account = event.params.holder; + entity.amount = event.params.amount; + entity.originAmount = event.params.origin; + entity.claimedAmount = event.params.claimed; + entity.address = event.address; + + let lockedTokenVault = LockedTokenVault.bind(event.address); + let tokenAddress = lockedTokenVault.try__TOKEN_(); + if (tokenAddress.reverted) { + log.info("lockedTokenVault.try__TOKEN_ reverted: {}", [entity.id]); + } + let token = createToken(tokenAddress.value, event); + entity.token = token.id; + + let remainingRatio = lockedTokenVault.try_getRemainingRatio(event.block.timestamp); + if (remainingRatio.reverted) { + log.info("lockedTokenVault.try_getRemainingRatio reverted: {}", [entity.id]); + } + entity.remainingRatio = remainingRatio.value; + + entity.updatedAt = event.block.timestamp; + entity.save(); +} + +function createToken(address: Address, event: ethereum.Event): Token { + let token = Token.load(address.toHexString()); + if (token == null) { + token = new Token(address.toHexString()); + let erc20 = ERC20.bind(address); + token.name = erc20.name(); + token.symbol = erc20.symbol(); + token.decimals = BigInt.fromI32(erc20.decimals()); + let totalSupplyResult = erc20.try_totalSupply(); + if (totalSupplyResult.reverted) { + log.error("ERC20.try_totalSupply reverted. address: {}", [ + address.toHexString(), + ]); + token.totalSupply = BigInt.fromI32(0); + } else { + token.totalSupply = totalSupplyResult.value; + } + token.updatedAt = event.block.timestamp; + token.save(); + } + return token as Token; +} \ No newline at end of file diff --git a/subgraphs/dpoint/dpoint.graphql b/subgraphs/dpoint/dpoint.graphql new file mode 100644 index 0000000..e635035 --- /dev/null +++ b/subgraphs/dpoint/dpoint.graphql @@ -0,0 +1,36 @@ +type Claimed @entity { + " { Transaction hash }-{ Log index } " + id: ID! + " Transaction hash of the transaction that emitted this event " + hash: String! + " Event log index. For transactions that don't emit event, create arbitrary index starting from 0 " + logIndex: Int! + " Block number of this event " + blockNumber: BigInt! + " Timestamp of this event " + timestamp: BigInt! + account: Bytes! + amount: BigInt! + claimedAmount: BigInt! + originAmount: BigInt! + remainingRatio: BigInt! + address: Bytes! + token: Token! + "updatedAt" + updatedAt: BigInt! +} + +type Token @entity { + "token address" + id: ID! + "token symbol" + symbol: String! + "token name" + name: String! + "token decimals" + decimals: BigInt! + "total supply" + totalSupply: BigInt! + "updatedAt" + updatedAt: BigInt! +} diff --git a/subgraphs/dpoint/dpoint_goerli.yaml b/subgraphs/dpoint/dpoint_goerli.yaml new file mode 100644 index 0000000..6187f28 --- /dev/null +++ b/subgraphs/dpoint/dpoint_goerli.yaml @@ -0,0 +1,49 @@ +specVersion: 0.0.4 +description: Dodoex.io +repository: https://github.com/DODOEX/dodoex_v2_subgraph +schema: + file: ./dpoint.graphql +dataSources: + - kind: ethereum/contract + name: LockedTokenVaultFactory + network: goerli + source: + address: '0x7A6a6bCeA8bfA93893aCC3df6D2A81ECb0E8dC1d' + abi: LockedTokenVaultFactory + startBlock: 10381816 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dpoint/factory.ts + entities: [] + abis: + - name: LockedTokenVaultFactory + file: ../../abis/LockedTokenVaultFactory.json + - name: LockedTokenVault + file: ../../abis/LockedTokenVault.json + eventHandlers: + - event: CreateVault(address) + handler: handleCreateVault +templates: + - kind: ethereum/contract + name: LockedTokenVault + network: goerli + source: + abi: LockedTokenVault + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dpoint/index.ts + entities: + - ERC20 + - Claimed + abis: + - name: LockedTokenVault + file: ../../abis/LockedTokenVault.json + - name: ERC20 + file: ../../abis/ERC20.json + eventHandlers: + - event: Claim(indexed address,uint256,uint256,uint256) + handler: handleClaim diff --git a/subgraphs/dpoint/dpoint_scroll.yaml b/subgraphs/dpoint/dpoint_scroll.yaml new file mode 100644 index 0000000..871967c --- /dev/null +++ b/subgraphs/dpoint/dpoint_scroll.yaml @@ -0,0 +1,49 @@ +specVersion: 0.0.4 +description: Dodoex.io +repository: https://github.com/DODOEX/dodoex_v2_subgraph +schema: + file: ./dpoint.graphql +dataSources: + - kind: ethereum/contract + name: LockedTokenVaultFactory + network: scroll + source: + address: '0x7A6a6bCeA8bfA93893aCC3df6D2A81ECb0E8dC1d' + abi: LockedTokenVaultFactory + startBlock: 10381816 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dpoint/factory.ts + entities: [] + abis: + - name: LockedTokenVaultFactory + file: ../../abis/LockedTokenVaultFactory.json + - name: LockedTokenVault + file: ../../abis/LockedTokenVault.json + eventHandlers: + - event: CreateVault(address) + handler: handleCreateVault +templates: + - kind: ethereum/contract + name: LockedTokenVault + network: scroll + source: + abi: LockedTokenVault + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dpoint/index.ts + entities: + - ERC20 + - Claimed + abis: + - name: LockedTokenVault + file: ../../abis/LockedTokenVault.json + - name: ERC20 + file: ../../abis/ERC20.json + eventHandlers: + - event: Claim(indexed address,uint256,uint256,uint256) + handler: handleClaim From 9ca70be55227b9c5b4bbfcaad3c4592cb507c5b0 Mon Sep 17 00:00:00 2001 From: pengyongjun Date: Mon, 22 Jan 2024 19:16:44 +0800 Subject: [PATCH 03/11] fix: update dodoex cfx,goerli polygon --- abis/CrowdPoolingFactoryV2.json | 2 +- build/DODOMine/DODOMine.wasm | Bin 43162 -> 43131 bytes build/DODOZoo/DODOZoo.wasm | Bin 117719 -> 117882 bytes build/DVMFactory/DVMFactory.wasm | Bin 73728 -> 73943 bytes build/subgraph.yaml | 6 +- build/templates/CP/CP.wasm | Bin 67095 -> 67308 bytes build/templates/DODOLpToken/DODOLpToken.wasm | Bin 42864 -> 42953 bytes build/templates/DVM/DVM.wasm | Bin 92210 -> 92422 bytes src/mappings/constant-goerli.ts | 43 ++++---- src/mappings/constant.ts | 28 ++--- src/mappings/dodoex/classicPoolFromV1.ts | 1 + src/mappings/dodoex/helpers.ts | 4 +- subgraphs/dodoex/dodoex_cfx.yaml | 39 +++++++ subgraphs/dodoex/dodoex_goerli.yaml | 103 ++++++++++++++++--- subgraphs/dodoex/dodoex_polygon-graft.yaml | 39 +------ subgraphs/dodoex/dodoex_polygon.yaml | 39 +------ 16 files changed, 181 insertions(+), 123 deletions(-) diff --git a/abis/CrowdPoolingFactoryV2.json b/abis/CrowdPoolingFactoryV2.json index fcea79f..edbc816 100644 --- a/abis/CrowdPoolingFactoryV2.json +++ b/abis/CrowdPoolingFactoryV2.json @@ -640,4 +640,4 @@ "stateMutability": "nonpayable", "type": "function" } -] +] \ No newline at end of file diff --git a/build/DODOMine/DODOMine.wasm b/build/DODOMine/DODOMine.wasm index 2cfac9e6bc568f2b359a291f596923bfa919d7a8..4909793464a3e2da6f3fc96b27fabc5549c93cc4 100644 GIT binary patch delta 4762 zcmaJ_3v63g89w*c>8^V_a`UR&Ja3+kle%#dI}d1+oORunHhpbXx3){0H|^H3Ztcd9 zrn#^V1!Rec(@EB3p#akwfh8gZPy}YUZMvncw|XxK%v}STP$VK|Bm_Ztg6}`q&SMgd zb?!O;oO_km-c$b*S0~@iQleA0vM%K)A5DGTaZ0r%OZlYubjxq8#ihbh+q?g~mNOd)yf37}dOS-Xbe@(HP zEE7-FgmVIoPxw@3+W4pJ3|G(bfT(jeC;@TQ>B94Zv)wki13NA|>vH4HY~5VH%hqMG zT9s8W9v7cGmmK4l8K2z7Z!(@`Fs7T#wNAUF2gF9#9@}^W_8xPUX2m;rvO~P&+H5=D z0oH3S(>B(L#hb3f4<$QcF2}}N5C`MR6Xk59qU$`~X)3j&u8Zj+MXF}JD6 zDBL{ardZQ4(2m>n{2nS7pR6<$qrzl{UDrQcrz$UH`H{-O`Vw^U>H6C2NtfzZ{aoYa zhQX7S;*ENL<9Jnzs+n0lj(MY*W!hR)!^|?)S1<}GUd_jxsMUBC9!Xk7#o?_%b>1bC zTbuopF2v4kNP|MkdLWA{x(z;&IO6)Z6;~Dls?haD>PUQs-EGIq8)PQ5!>Q{vvY48w z>_sF=G^~ujp>VfEhC(i8cM!0Icw>@ye_S~4&FEF9vLq6=Ktn*^ZTAsRJP3HQpQEMrz0*C~llga~o7-99?{%ev z7voSRXoRqk7#WKLck$J@qi)>EN~2`{I`lFyk!jA~wT<82Dq@YbNTSeNEee}D)%ok< zythD!if5Yoa25Q^TR}o!l`<(heNJ`$ra0*U9x#W*vv3;DcZDCG=5*9hpv zaGq1h<2h;O1~A7;>j#&%=tFodNGO`-Y!=6^pMip1`(Z z#uu{n9NM-4V=szxh;_4_xV0>4z|hy*AnCdXehgjN%J_t#7pwyd_+^G>4N_5X1wrF9 z<8y|7j7%QF@F0Q#){oIHa~$!@sh>51(GT%3k{rfw0Ojx@)dBFVggvql&3HCJX9T}~ z=(IqWM{=a2*_^eGsDM6L_MwWMnST(XjG-1NTJ>!LkG8d7TQig? zxJJgqxzf>e?pjCGi&h!%Ff<2cXl-!QhP~9sA@Ha_q|*vZl>d-SqTP=L<=77MRD&To z^H832G?BN~Q4=(VVS=FGgFy=2i_wNBWj6v_lpR%tcpi*4{05-ih&2uJLDUGecwk4q zY zO$Q>_BkWNi=>RZh$rd*0c_iD2(F6VoNbkpwryz&tQHQv(tHd65NK4ZWk=*65$3Q_g z=McsNCH|B}jc(Q*WQoAHQ(D>yiyW8*cEg*kW^G!2 zAgW~bg1SS^Cuq=b2wMHjPbaPss?-V|+F~_p%UVZ+(i8!fz(=Q)9FS>h12v8CKzO6p z4`O)0p@#J%3<8B$HqHug1kEaxeu9O%f6alSFvuvK8G`AEbUBRemT>|gp`afDcw_*S z5do2|9YO>_lJL?f1K=sk(P+^Z6QV=g4l90wSaaG`3s^p^>1fdb8<61;P_2OIz*1%e zS2_bj&}oE2+*ON3GNYw0IHLQFszRHZZA-czbYK)~y)80a~tMXGfrLc}LMKhsh*GK*31>RzuS;;VC62@t~TMi-EC(!`BSYps9 zMw+gbLw}Z?L;p!m7_clXxx|fqC0eLXI+_rl?K`ZcEMipb-QSawsMnPc0;<=)gZLQx zmgwxO7Pt2IYpJa=hEdUWpvDt+OJdrs7uG;4A0t_S2mZ!3S#vxO=|OEfthvRVBemj} z2eP%$HtQ6NcMc3`fd(lKiuQwEEe7I6YSeQF&)8!gDVg(#A9m*p_2CjFFl9dcs$vg$ zb+y=r7vj{LkKAk1BHOKsi4PtN1%$s=N&%`%bj1++EIT1Ws zR+mbvk6vA+-dDb&9)f^gP7~r!M|<6Y8EbP8^D;nt)&ew=)|nMg9xJI_BntU1VO~CA zbT#w9HAq5~-A|7N?BTa8KhvV?@l&~>w?VxKub9tLS5J$MUWa)9@gw%oEJOhc$lE(w z9=;9==BF_)m%)uJiNBq)yxrU24BW7^f|!?Iqi4|XQ@{fclN7qsqWO5eb1|*Ev|9H$ zi3{ikZd$rQ@yhX5dyFVq%WKEW?WweERD5>4-5!ZShB#+M2I`>zviT6t0CDbVCM{Bhb=B(sQNv8H~D#K@S! xe3H*3tj&vF7lvo+Uu2|IA(WXf63lr4sVCWRl74IZco$n$X~jdH6ankmD43GRnasaZ_|}3lbNETcx(0@nsDRsnuoP!QZ{U-eU4PurHoRFSMW(YS~F9QZLA90g7{|5xM{>G{!!C-F6=<=%#1Q9 zB}<2eE1DTGQ8@DYajneDf`m#n%}oaozrpTjF`2SzVb`=u*-TYe_8}9R(y7;KZz)}q zy3JI=%9Ii%X@{=pCR;uCbwK0tO$LEkmx<5Z#EHGn_*bTt(b3Je6qu2Q(d`eQA+FRH z7KUdH-R~wPbd!*As^*dji!bW4)kHx{;=lDp=w*@1q0ETguGY+jTe8xrWbQTwl+TEt zxGEu?ag~2-c4Suwp`PS5Kgvyj`AvU=Vq==#>hu9%sq>UJB#|?4MUZNAp}HD z#bg+h7G6JT)c++*VlGB*L2qR+WLYE5`yIoZwc@tB3Pt34DnxEWn`z{h@OiS71#!ON zFb09j=ES$WCCa22XmntIwejICBTn?N0EgpTEo=cvE{MN1)=9?$ z>z$U0Uwc~b=lEr>;dqOb+B$x{s2~7>mc!J4nS>*~>u$%Z8=Bqr3)0pM)3|m&7jG$@v_Pl|f`&CWZ#`w6Z z)lYricE#iyVgsxNtATCBYG%E_J*)}5K2QzV32y{OTD|xX?ghVBY7YS$z-nau(Adg& zAWcS?NYknn#!w-H{G42a>^WA;o`roaIOo|#Htb_hvSD@sJCDGyfbnRWwuuarvD(=o zwi~aMAsMx4=_EG0t>UvT&l51MZtpv zjWdid`D|Jb`8-4_NRJBM3e1Is`%yZz#3dWi#D)L|!D#@$3DQAm_CwDrn=%B-gEo-f zAZ+?TxlmQQ3=~b@7>8Qc0&AZaCPQ#Z?goH+;HDWan*gcHO)@<7md>V$x#jMKZZE8c zVBrFWzRzXIK=Tw!vlA7Ku-flnD9>|hsF_EREQCHD(_6U0vL*9);F=Vq@S|-U- zvAV!N1?j{1@Cf8Mv}l&t(@|*kXG>4x+2VXhjx`7hvgvFw)=}6RF{o&^mP4NCcy~!p zyWo+tPPPw&o+I-b&)L`x4{Hzy+xPmKFja=e=$4HdEoe(0nnZn|aVN}+=F@4pWxJcD zoSI3;=7FRIdUTD*f@We67Su)Bd2EZ!WNCdIA4aVi4!lrq#>sd9`>@==hTw<>jBemo z`DuhsKU|Zv1?luBDB?DPYs?6bHed!io-a0G|8dk8ZNB87>F#AvWbplf4x< zg`zp2nQoHRP?8j~4bfJPt06pq*w zfUXmXd%>qG)dbjpk;#{VX7e`&!Xe5|P$+tN=m6->P=9*ik6xyJNz-K=fM*(Dib#5N z-+UyXOGJ+vDhd|JX$ut?Z%B9(iUbQIH(#*!hU|C{&kI)K4OuocMhmrk8pF+453|D< zz7Ay2j|b`;o~P&GywDilb$ViRXO`r-5Ew(`7-#3Gg>Z|_vWj?a-$2PxT{EwfI!r!Xz#kHMk+KVM8wsuU#J1Q@%15| z+vmxNfGB_j0B`m(0J0mc64&?bwMD8V6|K^~PEmIVWv@4fuHgW>K8UZB3#inQsPy#y zJT(Ra&X$CK{}!v?DJA1h@y`B2H3SNtXT>M`537M{NlXaWfv)sr5CO!j(OyOhjJ+uI z$121x5A>>mTIpdz!oN~6dd%ZF%Xw1)guSbt1*|9EQ#>J220Sb{UAxa^GMZH{WpdcYsjOS3e3oS z>ZgxvGOLkoMo+}A9zA3WZP%18h_-7FQRW`;*^y$=awOO4Z2{q#Zy^n|8AsKIYAVHn{mH(kVc3h2uftG4NN(HK2C@eZ z4esa+)2vlUioPIlvH{SfJps5nLp2P)xI+oaELl()G}$NMp7^LP3TTuEzWCxufe0MU z)q+kSiRjTZYb?QA`r)zWoxy8Hz-ho$w+>wT1b-edgHDpZrC14V7%}`p zi;)6`dPzKgtk@a2Zn&8MTvZ=grye4OGc;M(j-99t-Y|@(0kf!>2eG>FL+B7L(i3Ru zSrnGgiHfeC!ZQC&BfvP|YGd4VwSy!HphV&C@muHKH{#5TlHGm<&r2ulZ0@ecuHn?43kH2q;@ zmqoOtI5T%3h zw*c3?!8k+$#JwwC>(9>*%>SSG1{gA(Me#v@waAUe0&icO5XpMjS~JA7$gV* zO0RP(i2t*d3|EjjAfy{fz*qvl`}vA(0{QrRiur8slY`2u1v^>h3umTU26yiIA8Dx| A>;M1& diff --git a/build/DODOZoo/DODOZoo.wasm b/build/DODOZoo/DODOZoo.wasm index 4fb9f687d1bc0158325fb927a28eb2cc8062d1dd..7bdbdaa5c9b4efd7a5d75fd064d94403596accf1 100644 GIT binary patch delta 24105 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 delta 24196 zcmch933yb+^6&Iyoeaw)5SFZyeI*-^u)|?r1q3%l44W$oZdb3DX9n3u4KUC^M+_Li zB|x|if)Kq?gMvhf5EU@q8#Q|I8a3#kh*5*QUv-}|nHcoG|9ju};OpsAUDegqRn^ti zeGdFm67-=6a!(I3yG!=Z2pZIlZQH*#;(fEfD^{!9zaV-yOT|-llS%vDq@~+TCac|) zYWBA?&3ykIsb*8WX^j5}&GnT@tKOd<`;S2XvKT!5m^9ez=Q(HMcaKe!_4(1!{K3>o z0WNT<>Bk7FVpcXz8kZ|Z8b2V!Ir1~OpCv*|q!`sXU#^syB7Eb+nLpt1TkE^Ix7k4r(X~Kn%&>h87}=)h!)?rMds!CI27r&i}A!d{xk z$+WV^Ai0*Rc^>17`^{#Jytd!Xq3a1B2v&{j_kEEMOP3;ugAA1he(A4T?8}^w+X&e9nNWktO;h(8DZy)IF(sxVG?`0keyqVsp)vg*i$|&?3ztSb%KmWDOv|YPJ6Bzt5&@>y>5iOSatVE4v%AJGL<`kThStjZYp> z7}dDVS5~5^ep)w88Dzb2Tv^%wv9N#bxVoN!#;{^m261~<%=l-XgE+LZD)1neSlM$- zD}Aorf|VUs2kC3fgZ0g9sqmvkD4SUVva4>YK;K}E$iy% zF_Chn9b`u20+-H;fy>Dqt9usd{dWa>`=?s1p9h)QBUlPFEIGMQxb_BXp_8n+>jJ3^iS$iEgtFx%y7=$ zk2SkoJmwvjIznrL>b%C()l-%DcKWt(FMsw76giGJ>HOnl#a3H*kk83;0|W?QN` zmDph6#tchlJJBz`J1tRHFLHaxShpRcCHV8gZLxgIux^M8Pru(c1b(g1F5d8dirM4j z0UsnozRV9&gI!8IjoZgY@zuk7>oF);+6IA@Y-7=NyCsO98=l#Hx3bg*n^vH95zV!m zXFZW*Mm2qI4DT|=ZqV$sX#;c`#~w+8ifEQ-0p_|rWVm3Rc^wbcdh=&Tgz+I-IIkUn zJyVUIs}nri)z`8eozt^d$@OmwIp@R`ZrwSH@gSYk;bvOv3mu*F3yWlI)ynqzIOm)G zh!E@%H1d>@(WI8KBa;xr7mZA|NLPSS$MH!c?ff4jQ-Y+K6BzHhIEn|1^3H!nj^De+s^=K)at4L_?#r(z!KBTM;oT=;1BmuRxtZ5CUBRy58Eoa;^1LP2D5 zT#)8C>I?g8bp^7+l=wi+y^9u95HB2$<=D83zdoga?cqO7i3{EXgjV*siN{`*6<9%l zn|sEmBG3EVRcQ(D85{#`*Te;DjUW5M0d_EU^TQJoxN}0Nj0;^RCYY=Dp(%-1qr5&L zkcUo;c;d{@J6^{C`afLP+VhVRBrsyOL1!9M39=pV{@Y0sS?d z@=p~Xs1(m*uFCE#)n1k^d06=IJEQ#rwMH^PYJ6F;&RI7=iVyhzN&gn9f0zCLS^eof zl?F-s#=J=RDLi^g@2;^}JkU37tFK~J@*P)ab$=bn;bEkISUgAs=?RFlSC0%hN*gcF zm=O{1mVBBxBO}TU3FAx&EY9pV!fr+vtdp^H4$;bv^7S)DB0QX$F@aU_n3<*7uQ9C= zMdm24Q-ZY+xuD&)!0u0uZV%F`-#{AkrlM$klYcdH1lz^auSvx3)N5iadzjr~OOmb^ z;g6-Zhi|-w4o63?p`|nTOe`9)HbSqB!;a>-E}m9}YIVGb)_8vHwdwrUGrjqf*N&$p z0YX|5ldtQGZ4~tI*PYj8V;P`RgumuEB*%kXjw477QDk0wl-GTj(h0)@9VEr!!>^CF zRQfr(SSIQL3#ID~<1pxTH%#;mkaaaGK(_eF-RsmldVp-e zgA9;$?=Y?QosI$W7e9UX@*Jbkr>9m2&1(1Z9OE&w5@`1tH7hX)2?f#v#;a$=Amgdw z>t-b(i+E|)AglWvFm~)MIIm*IH)3it?{(uK7y|orl)hPg+in|{X#&EW55ceP2om9J zS|cp8x(7dbV;8nhf9kYhc8LFRa=$LKdqW*Q4Bl)@;gAB#5s)|eqzZ2S@a!1lu=Lt& z?{2$4P~UBF%-xF(ESXQ&63un*Qr`q!{9}RoUW)^7TYl+2DV_VFo1%MM`4GkT+!XKs z9*O(jO?d%zIGfe+;5j$-exG#ibH1?+Rsy^EzB#=j^)a{jd&e{;B=Lqyn^bnJ=e#QO zl1Xi<&frxeL6AvtzL`;C;;#*nM^nh6j*UK=*xKcanmFjI#b5cN!d~XOgPau_oAwed z5IX_1Wh4>KP<~fouMHq@aBXY`I}KuNET^&ErZTLKK9uJ!ThjwxRq`qQD|OeY#(?1~0`fMPtTl&=9P-@iHz zP~S-(!1aO808;bPGDgn%X}i-%M*-X)D*=u$5}^O7PmNWJ2eoQH#j5?ZqX2I)U4X_0 ze%<`c7zk{(Mcabn{c%Py)5hno4U^_IlXo$V;+NwY4e zn^bB9*|OsU=(HtIC9cnqJRluHje8n@|Dr6r zKf2(0DL`XZoRsTyKQC3WEC7205@E#;JbCr;UZL`m1*b6D&FM6@hcf6Gz2h#Uqs*XH zN3-hKg*wvGdW_+i=jKap=@p^(`cWAHyF1RBae>5@@3>{8%%s=fY7ZchPw`H-jtsz& z$I-}V+?r+_Y&QAfa)2%Z{WMP_ciozd&E(Ln@qu!t2(ZU{SqyoU1I9iy+a!(WcQhE)hh~qYDeKXG zEO$GaO3>tn{*DCl`mi~whWZ_i>q~M{V>5l97cL%$+^Br<-4=2v?0!F*`I3hsgLUX< zK5|KQ1g)YtGqkukUS`16I`#=ae$QWfC+kqLpB6<9C=ab>EH%0b)(qNWe&aobijyBW zEoskbvmeiV*vm=ya`O8r?#TP%&H*hDjcd{k%W%q~kS0CtualUyV9;oU^67l=gBZ+Y*n4K1tx}3#b zBkrW^){&0WOkU1Vta#`z4H)~H2S=pWh1-f*Jmqb;L1p$}s*o>)+txGhb(8CBnGU@E zU_`(-^68TYd&6)o4=y%L^*CSrP?Q0z<@})|z5mE=PxB>zjWEns=Kp7AE936J&Qpx8 zV7A>n<6$qOJ-&=OSZxo#^Wh<|TKU7It}_o`kKgRS(XTSyUYPDA888T{gC(qd@qJnU z)pVDaPX8a84)H7dk?~%O!B+4X*e&kV6)jfX{CkUiUZh2Ou4pl|u1BD~Io8OsYHf0> zqEL^_u5B+jvaH9$ym%uE!%@K}@2m>-5*Q3{gz(8b-{u2XXBeyb-#m9&H(s>5m(k$i z3zm(9llgGm)RAM|b|RRi??CI?Qe6yrEXZueMTNYI@btF%$KkwzTZzU9JO6B)nQ8sCa2Ycc`fi|ujHp5Ae65Gv z)3B9q=M9f01=4MzJ%sK8I^mL0LZ-d(X1;wwlz$K!__XC?aB;bLdA1_O+2Pt=e8gmb z{^jyGAS^4g@msbcj?Y>Vg{KEsq)Ipozb9AFooCsK_|Ad0@m6~fVto*edvZm*;tdpE zv@#4tMJuUW`N}@{h4PH#v^1DsT=}o?bGWXs-G*%k_v`p04c|!VceJkLGaao!7a%?t zo0md)ts~uVlpP)EtM~hw^@WZEj-5o1rjPi1TS5=B78v>Z5z`+g?8QAhChW14Py6O@ zjUKhdzr|y-V#l8S9)U}~;KGC2;lIZY|9!_DzNUws#Cgtv(n#W_;02G?z-^C(BZ?+J zHd-C1a@e=>M(Jn7pK}z7hh!=JjJ4*0xb%4P;wjX>X zkfw5MB+VI%_&__&wb{~GWGDDbkH=o&=(n~jZ z!%x`9{;W@~0S|I=bw4AQ|GDGj&W7viZ6q}q>XowNq5+c|rH^0S%^P44fn0v_-2}pw zkvf}gGqCjsf=Bz70Il&NUsfE!e&VIYnSm#c~JVs@lkD7IV z#Dnrjq=XHRnkm(%7rf_<7p}WwbcL1u%3oPKoBhIju1hGArw2XLRDlhOpb$o{Y-DER z{)K6Hh26~?!{tHwx+L6pe77zIzdc^IKfWe(nPjXLeuSus#t-hU^W==Dm!szcZXK+R!=p62)6) zdxTG4Z@1`xg8_>5YrM?()+ZA!P`QI%UHbFwPYxSX*Uc7Vg?i9waeF;&Vp_7&172!S ze$Y;f!1k7*9%=P&{1Q*+S8WON<+h|f{Z^)>{4qCRBXn+!#4TINZq^)^C`UHpb(x)C zvoRZ~;mVD}m<*_fr+pghT^NX$SMapu%G2s2m8Y#VJPi-Z(^kUMR(ABXe@5z_=335g z-jp-7osY?VRQEA&_DnvM-oeG%DKA6!F!20jQ;#6!Pysx~h4*_O^Qg^9!SWpdoR{CT zIo6EZu{$=CBW>86ifMngInj*mb(5yzh`iS3QU0Ik5XC_VboYbNp`e~cUzNM|rygk3I)Z}Y5bNK|%- zPkb^p_%cxj+P3lOPuk5c2QPhcl&=f?&Y@~ef96oY{*N5$l%Yi{{BsjZq$D1h;k3z8-ztguSu}gTF zn`m~dCV-)~5zF8(;HaCiHHn27?ZySjO9fXF~4z?-9$bcJHab%qaL0w0J>eWPG z?BCnsy=wJxpj^yg@O4K9n4*sedzJbqi#M`#MPOJPS>fEW7_xR*CVuypWu~^0BX`p3 zTIqVJvwxAj^A&HGe&%d@PMS`P5dNpctL%K%_UyC+inZgwpHshL=P$NVBg+3N?_+iz zvLmZ6-p2hY88=kX83&rU&X{2%zjMb>OnTQ2n);a?nQAtj^{IEk)Vo}9>bs(O#?EYm zTFw2BsSif;5!S#HB+IuwQ3Q z>En<4z8TG*c!oUo#50*#HNWC_HBWsu6Km(1XEU%qmOVQH*f-F!ihqaS)jaAs!cKUO zun#;}5Kjr~@9wr3C0#f_`9Z&KgxD9J59hY$y9ESG=-1~m0%e>u^UKdA@@dZp;oN-v z^Mj+nDa4zm89Z=Lq4UU~Xx;FQ3@ce4MtEJPtRje{iw-BQM`Igo4k1 zc2U^rv^xd4V!z#Vb2DdmzJ86UzO;El#l2+~zH4`EzcqTaYsP~-Y&5Px*jv*v>@7Dw zqHsOITX#q3&i%&{tut;5{mHrg5s(`Bggt3ioXjvIT)g6hcF%F|+)MdWd!~oV?c2Cu zj)U9pzqH4X;mpnUrsK_0=H4{+BEJ^D2e?E2?%tb?ku!Ci0A!$ zyE`QWZ`9xiNt)*zf8X5?w^n;!rCY0FJ=TEAg@ZYcjfHWUj9}MuPd8D=iy!V#|L{9t`p(>tWei4uSc*S z_~QLH;`g3vx-z3_$uVLNqyqHi?kkrekrZUnOC-p;momYn>ZLe{{mDxMp{Up1NXK_d zqYkE`WzoS@3(eFF+3@Mt!C0Koac--Y$gd7Q3-Wb`NNq14y5H;$=h>B!R86iN`#Y0$ zgUNPQN|QbRa(d@|`jl)>;^4$R|A;cS;g=f7I2RlxCB@GsQ7{6q}LH<}^ zWW)&G3bZn07iGw9eAYh(d5!tnKggJ!t4OMXDl+CGJn!e5tH_u~@Vt|MTb0Fsec8g3 zUX250+^g-(`OvFv=A3)D&75-&|2K2SyiVpE^?C-xU;KJJemfYk^Y4rpUj1K;sCX(P zDrpQk+8Z$#=WDW3XFmO)@)BQbe)UEw1s6$Su|3R}9E$R@Xl_3E&Gg`ns-uN_-iSqG zBVYF>*|q->(%{WU9AwbXjzso!)4iMBWbbSbv%SNt52^Reb-dfr447#6(TTVyEqbd5 zFFP6`pL+2Rj`q^q%x@WO{ogX$7U*q#qv}>OTX*@99wH^(W~tmf4zE~N^Am4H(YqJA zG=IaQ1??Gg!2=}ma>=m z_8RZa{1?2sCcU%kWvK#uv#H^Ay$||(pfk{;xn`UdZ~RHWc%b-jAChLm=)Z%(h^DzNSZn=0;bdPc`?V z4>IVj-2%0*WE>yZ2_usbm?u7J@Og)EoUc2cf-is$9Zxi`GHT?4NDw77 z8hn!TM zli7gBw?`TENN3G_`pFoqm?bAuq3I`2&c^e_li5XBAMyigF!HgOE!=8-E%5)tXRe|0 zJJ1sY<>M`Ww(++9(029z>>JjHK1hPTwta9l zzCSwuK|#(YvsR5lU-7s$n|;1NGTG{x`~brW;B@kdJm_-M(m<3~$- zPtiw9-=0z*Ek$+;p!d{1-z^2ucT3lwrtg*>JFUK3iZjcvmSX)ti|>%^{sEf&aw#4u zOz5?-yyuxd_-rYX-+X4Q`fMo{6u3{ceW*TMvZJGm-}<5YbSb{)AAh%$j_=Cs-j9|d zAe_VZyQK*5m0vE=mwoQ~IQp`WD*4G$Ji^`w_4rqg9 zWr1n2EJX`3U?0<8z@QJBmYD80-EO)I zW)&*OX$r+SMHt%9JLzm7y7!k|^CY_kcc2oCILLCD|_&iucIvu z3To=Xr+gh5QQT8XP|~yg#QT}@M0GNoRFn?~QY6k^?MVhg0rQ{^nlgDdJ@tp4$u7B4 zvjq}QY9kBv17;xTXvI(uGXFyKAcfJd){Jjd$f>Q&U_uB*1l*}?w~dFmIF2QZa<-g=tXv00M7Hlj}~oF0az}; zUuq_K$%zNxnT8^hll$h&*^rPlPK#pE8$xJQ_LVP zG#*W$ZxPTm95vGbv~mbdo=2-EA9WtQBT^1j6WM+sSW#+%hN2)t2B76Z`k4!U6ohCI z<${hTNCqU|rHK{b=@!#uLeP4l_=Oo&L`hexic;aCt}`ZyCU{qUR9mu^d%jwq&0I|?%w_1p+83nPV)UH;SPirnThgLXU4fmWY99j{l zW*4VsH_e9Gp^0V}*EYLqL_{ja>_7nyPQK>b!lBLal0$2};$REK3=-4~652R8LQN(r zI)^GyNEy<&x z#=+DLYC$n%0ELucfd?|AC>c_8J#>Q%Xd)R>+Bj6BHx)w$P)HfrdB~8eWJuNZ&>b?Q zDH+n*I5@hSOjHaR6h#f+cHUmp3;;%KP1E&29MTns^fnHraLfY5-~bAAs!4C#1!+0a zPNMoYr(45lL$e`BI#5PnJ1nz;b%tV{VX*FPGA#jLDn#!OPXUS4(6!$e23KTCppw4^ zptO$!%6ak+g~7#H5-8zo0kkT>$uIs;Xlc%tn3imQ^M#v(8*(Jn#NWD57+jkxfqI_x zV_|Sro&;+6W&jm^B~ZzK15nye0_FUcix{ZC1WNb`0Idpe^8B9)i<c&Y^}^gx8d0WUuGJ_x5zqySEfSM0kou@8F!TX+MXEw9vFw{c z0d=$#v=2E5PdvQks^EqJ65Yh_Y{B#fN}!&90HA7+1Zw!;pE13`5~$=m0hA7rKsmSm zg6R#FKncGOK&t|r{9nI7kHaLUWf&j*EA%*ALQQ#){LOdvxG>b49m z9>SyOGL#-wGL)nCkse#Yioir-aWiD)Ejs}4HFL^H#n zClt2jgm}r!FzQJKH;EWOHn*s@4j}B-fLiLzjcM8w;KwMGAumB`M46TZ9irqU!-gof z6zC7dlY-#?9+*I9<*2&%64}z zP!&o}I#h*X%Ydp-JSc^kaCMXseGoEG>{*EZ=uGOXN9|RgD+@M2(bd;VG*F-OlXmKR z+rnmsG^0&Mi%&#K2+jFZ1vd#-2>heAQGxZMH3TA8eFhLB*P@mdw`D^_6o+2Zv*!wJ z)Lxh)i&p$Om_Xzb)LxP6fTW^}T&2_0ppInlrtT=YqQT0#hcxTBme0j6R-CCz|E>6y zi-b-r&Qhy`^_ZYuAbhJy{N2W4t;OF0Tm)D9)+7#Rv3T)|jSaN4QtND* z;*d}_rCY;y087ya^*Tn%aEkZ(u_SRgl-+7+^(c-`ksHQRMpm2$2ze{1#(BGzY7AJ9 zIs)5*bW~3P9`MICK-JYaL$wkirr{J@!XQJ{_W&VTjc5pC3oR8tC~T#e*p2lMX(n(f zHj*F2W8K)2kmd^t-Eu+rb!U03;!u8fwwZ-gwV15tD1WdybS9j2@wYTMn4DUZIMdp~X>9)K;hRvqhH z&f0D(=$x_$w;aHiqFq{PITNK}ELjYXWT8b3)Ji;2do%tU!A);>u0VSn1fdf(v{?$6 z=*v-i-7?dJ?Y&CJ)KCu+oz4z7VX;v=X4r&!FtyVfxmL>cfJvN;WPPj^E0t)KE2U_u zB0Gw84QbX}TULtkQ7nH{#VR#)C2H>gX)v(fUXMDA42;~APVw^3h*3zlh#(WTS|tug zv6!OL)rwI$YHtUJPlqaZiGd^c35iI<^M2cYrabt1+iMnU515^Jx;#N3(>m;>Q3& z!6m45pK(XC-r`66gfB={g0Li%NiDtpq|kr;Ay8lD%zWUmWXZ z)hf_H4p`|DyW&`GD1nfy7$5OdbIE$~O&sC{f#_bpUZlk%EE2dB+%||Q@$4SU27n|e z7suk+O%|?*Te#?xz!EGQ0fJTeMsY&|SP=-~rj0@*AOY9}5Chh45-gE*8>53QsJ%AO zaAR~WZvV96&5F1LwHK@69XzUnuo$Rvv$!DM5 zIM+NW@KHc+D1qQmx&`%Q%zKOYCW(!)5V#cLY!L&K*<#C6080TrCH5t=4VJ9{A#BN3 zF*yZ0gbvnh6@N)#X%ZX);;o`Qg=O^K24aj*OZ9B%4)s)$alAMg&w2{KRF-df8aQ;R zd|Hf5Wqm>kM3>?+)X;uOnQ){cOcMwy=XT*qg>AM2gcLQ~MOGS%mLRY#+r`W@mSNeU zh%0vpXBx{kz?L1N8ra;Os&6Ig-Xu&Iin`HVh*)>OTt`cwV4bdMr-(|2cRYh`vmwwk zVthJuNnk04d`9d}XB+aKQ%p-xd$$S4)!>XjzS~3<5n^67&xz_REVI=aY;@@JXj=*u zpuUeJS|mCTf_erGV_n3!No=yETy?4}7m=}SoYh~>LPO(u439jxCaJejbI z4mx*>h&}*!gBS{`+$~1;fr1Ex`dW625mQ*WSks4fDcXa!D0l&Cugl(#xU)nC6~dxN z4QlVsKOg?M5bC-gaS4&FS?AD#+8cNln;w)I3-HAiN{ABF-aB?L4-t_CL+T{;6=Fmd z%)D2PTC!I>lEorZ2!x0=sJ$XC@dj4HLbFYKNwYVF{T*N_d=7QHU4LdayDjep#kd8v z*Ib3yNo%z;SE*YOmb=Bb+3;^2tal504tzofo%_V(9F}C+2V&ClKJjo4w5)?I`^4XK zu*_f7u`h}jhO%hEa#@to*7BlA&SiZq`*o82VqPw$Pav6TzbMOPk=X|nSdLnSM#!sD zsp;6n7sCz+|Ft?*{Q>cHE+i%pGC5xoQF&nbk^*a960`DH!9W6`QRhLQP4RYw1i;c6 zeB1BD-a_r<1_#AEd6>Trwj2}}^H|dKLwYaNUI)lAWntIBg(`Xzo_eG9uDnHXu(1$) zA$BNoB}}1Nr)xPR7WKsxDpj}gO0lgkd|3zUD}|>oocH6tEW~JYzD#YgmX}qJ%9lm2 zek?9q2b)lP6?YfLQse4*Xz?rPG#d;26|ravOAxP5W5I&=W0@90l)?-qwAY|pMV)YO9F{;07uz36t?mW(SHCdkRY%vZ-@s5u&JSM0viQ8QBD5&rZ_!- zrC5#toQw!^L<9_E!!rm3Rq;_(m!S6Me7Tf~R1l^VlQ}9D4`jubw*VGHhPQI_ z+i-SsHv%Ds^8;p0p)JU6GKtG0aq88o&?Kjc+PkXfnHIq%=Oby=8gzUUYVZ7R!&<%% zZ#uPB9qT;hgS|yMG~S(-qLp};qxNz5yTDsNPG(gR3Fcgb+Pm}6Tiit`cS8gU7&=YM zDe;dH(AsG=nex-((-AD!0Gm#W-WuZY86A5@Ox0L+D1l3%Ce(M*%om7h=`3>dC>AEF zG&aQYA@CKze<;{Uwma`5fDoqywbyq%cXsrhDk22mnvcZCBiZ7xe=0ULsJF{Q=oWPd z%^u0ZHjltYe`G4Vp>OlQ6#Ev`UiQ=O>d3ydK@pZWi0sjb#5!2tAZ`ShLLl_&{Mbk9 z^zKT=*HW~S?aMzFLnk28)r@8%EuWwb(=7Q!XyXv%v@vYSpik8pHK@J9*cW#crkM!A zum$yXq{C?$=a-_}1hD!N#L#Nxmn8H;OA|oITi&EB^w9*iB=0N5uO78m=$!jI3f)SC zrI_s36l(1vdlKs<1`J{|LQ1~@rWkC$5w=NexuscgtZWvglUQ^pfwN&f)Kkf_P2o280>N1LtC^*IEgi2}!>7*^DWe+=^G`%JL6kYXFw0 zD!&y=C$s2W9c)7F%^c{wYs87Eh!?ngD*jG&EBQ{mGnvKq(ZL$jUjHHAn~9>Ix0`jE zmhVK5DNwpcaVYmtYMdZJ%)j14`^t5e^T0xlmFH*HQn#aL~?$guE}D4m9bdW#yjq(uZzXQg>R zt8r^kd&jje?Kp0;PT2CZI5V9kh5n**MSTr<&{fKVMqQ2c_gBTULV22>s zU7{@@T--i`MOgH<`b(mC26l$~qTV}G95QkZhcR`*@jnRVIJ4W5=j$@RrS7Vf~7w^nw zxw!;FsZFS_7rSox>ub3;s`%E#iej)+6$QY(VeQrywRM%c&-Ur$i$NB0PY-!_(U#`V)cwAhT51=CZ7i zno`hrff`E1__=IYSlLzuyQ!XL(yF(LlDYV#+ObX4&1F5p%C@O?w_aCm6D@PuM04@e zV)Q&Vu7AVRBq0Q9HXd5=!2XI*T80S&BmWS^GiYECxvET5&tnl$E4KfRpaKn&SM7Fj zaUPp$erAUlH=o59)$Y&{XN`vo#>0x8I%*>x@Gqj(a2Tb6V7mfIr7NCMqaQ#m2RULq zoWesp%UqxagB9xAwc2M@=L@KPF&*g=WGMTGrAfNn2W4=thg62n?GFRpE-L2$!AzRhHrv@h)Cla4R%I z;0RU>8Wy!kfUt;FBZf_?1c`gSMsK_>w_uc_s8w_I|2y+eV~gMSJm1$o(=%s3?|IKT z^UgqZ!1VqRlkcidO5phe*L2EBR#v`!U|HXglIY6RLYW7~_rIyL;Tc1h1Cr(m81@n; zn5r}>Q5a8P*#Yaa3!p^1aisxBTA9;^ePq_rHAwCFLmqA4q|P-~v$N=b`ZK+s)R!13|p?KJ|& zCCz`ly#_*W!Ja|Inr>Ml%T)-)lWWa($jG4fA#5o@tRo2&;> zs6`9gg}@4Zwa%Pnt!02sw&q~}lPs1^35rrB-wT=+=w?lHNNnGvIjqT6n}dBSRhm`H zuqHcXO;3qDCeZD&ge046u{sb`00LR^ZabYAoG!P};lbI8Cy!nkoTWqra1Erw!Yo=* zn4?7WTg8*l6eW@mF$cX;*wfz9h^)OPX@}&tO-6ub%Vs0C&;Ytv=ukYl)VC;0j?jpr zZ2X;5l%se~P)*TLtDYG>^3Vx{G>G0PvS0nqNo*LWB8(e7H=&b~7ChNL&775=5{$Hj z1|TIlwgjZbrf89TrAi0%>#$y(su3aV{-Jn0hcW5OEbcctYtKtY&SgO>{FI zC@nJ#MN6k82j0ditR}dqen)TEcWCO6M{nAs$O)(kt4RxmB)F>5WYjg#z?(oVaGlJq zb&?T_PWW9czPAuEE{?_XHkFpG&hov>E;FnNB781*J-6*w`*E4W?D-I?Ia-rM%gTFF zdikWpz(>6PCFPUnyWZ!hMr+kgk`aZ7bF}7(Qvyvw#`ghaI;O}j120C(LLcZUv!h6D zvQ~}61^y|5t^SbgLuaQ|hmBzM-C}`A*jUX+v}Ne6Rj!XEo5HKXn#zzM*S|!*T>r!* zV3Ng>r~$E9Ea7-k|L@`ZBLC-L%MolO(mq%Z@A4-}BAC!8dbBN{w2zi0LjM*5u1`7I z@xD+0pQF9&(y37WAFfgDfzI^Npp5bNpEau9i5tBSs?TCPG+$c&4|O)mKk_=qW{iar zC?nnU%dp;6qV~0&NxC4HS&qf>aFQb5i`l?hs5?xK1bwyXFX8IWQw9=U9eQP3g)Q<7AE0Mn|r2m>~0+PIi4RxB_52jn?eoy1vlK7$wWD$X8qgH(ZgWgua040Bfip z7cqPJ3=w9T$a6&+rHtrZ(!!(IWU8{6c*G`7NYrEtdeF!eW)KhBM4QQ)Z?WTvp|#NT z5k)DeGQ*yp6J%&4RgSUIs4=-_JqMtSqRcUwydKw>0W{>w-eTO0=^6M^-`ovW?K1JC z)LdWE)+=-9=*UrR%9=VC4y3`dO1A|nw`b#GrXzbjbZd3{Zvnz>*X z9lu}{Y!Ekk!3Hkiv3TLqg8kgwRm)8q*!o24ooD1>lWODv{bk`{^Z!!@g-Z4J6d04O_`atv#uO+m46^C6v0V#%Kk5_s zb5U=Y_WJSZZW$rsg!KcMxOlR=ex%B=izEX8%6Y~ym3mY?XFartJ~ z&-%(VnI?}z#r#ZL$K@-bpXoGsEe6lTJhLk%Bol>XjHZk)P4RF?h(~Zt-_`e1=*^dx5$#x}Sv`xW?o2FGwz@y3Ys|1G0rUxDP6)tG& z)j5fgYHrt4R~L?Gxlh)756IRu=%i^ae8%J*Uj(W*0Tq$8DkFFu$L$~JNl}*bTS5Dlrhw(SsDp?Ap6`G; zeAUs-D=xQ}x82pQ{Vnl`BpyWpZ%ZZ1z~St;{^6R^X8_AbIAQg4-a)6!dPoyDz%*52GN!L>%F z5fBalvQmoyJ+->BTuZ&C>zgro`h0#lJv1Fp=JoXN>4SK9S#Na=#NgEn2_2TFSo4%T zYZjifzfGaQdc6}{d-4=2C8PghxDiu`WGzaUHsVh`jVT0Q-dlHZbKNpywZnBz_jT!e zkgKbHLeT=}Br2Khpo$xksBmVQ5;;c|GjHUs+dfk-j(29}CIr4>p;YSo#~QQm8*Xz) zmQ0__#G^Qmrp)4&yM7kV)ZcbseM^&P>7B;_<)UNXF))X|YcGki3D45Y2DZ3tN@kDh z*1i}#kI=od^|1+Ym;$^_+9lSS?-v>*n_3R(un}XhqgRE9$DXIzTJVoTu-8-MpmJiGX~OQ6kMn&uFV}J0-G`E9v2d!$90L8$2&-P+%S%d-3PYl5|J$(C7!@j2^UL* zo)k8oghU}dJUxld|EYHp$D>%gB~tO91{%aZojp3u0$K)D&9s>?AfoidZMjOwgH&e% zuigqP#huSccz^ME$bS1(T)4O2epP3q>S^!%40`YO?7k7v1?V#0Rs@4f4`v%xFV5-P zvQ3O`f4x+dYIlR zm@PYXrt8@@X6RW2giANOOJ}y=9KjD7_}c|0E}iKWnm@NO+gEtVOD`|ZG4qszCc3l7 z;#9hNNjEjLTWEXsQ2LUBzJWb$ep~h+8G8k@+DEgO6eu2_k=T%rd`r@@tM} zhrYZ52aiiWr=UYFEKE~)wCNQ0y_G!k@b$w9B;on@Y)xpF?Zmz%U4jReHA@v%^g;K z(uVF#rRVRc;b*b-XFI)dXD7;8k(LnoMk4zPyZkLvF>!m`=}7QgWST7@qC>m#osKG@ z?^uQ($A7<5pR17Jxf;52Ge1!mFBe19gc4Ia3{jkA4lEZ#R506@n5TxmU!J2sNCmUQ zgLE|wxl5m;wiOO}71>r?a+*o)g5-$m6i1r={QAm=noQhamO_JPDXZ7&2uA7Z75XSW zzT#%yz$tfU(1^QJ#BE6%Wm_91gWkP6CBcJPn|XKd1M**%nX9}f>s{?3yY z0@K3XEOMHpHFvXgW$8}1#!3^UoAK!b9N4MpZt2CGZn);b&Qjp#Qp-2u`oXeBE|aB=K^P!VtEU&xUrxYWAVd4pNHS!hWq(|92RSEQig(Gf^V_O zx}&D#xFg*U%ML@>Wsq8kQ0GZiCHjgMz_lH2!1(HoF-1+5D3i&ozuS% zqMEm-zOnwEVq-&QED|JaY*WwQHg>csNqq6%V_##Cz`oY>q8<;;N{aTBs!!IDaha@jA$kmnu+~eTB`ww7RChIS34KHT9+4HM6Sx{X`D?b<81e&~PMR zfu11VXpth$;5=aSfb%bJDDNNFCs$)J(kQByi)kn%E`#g>q%c+Y(~#QHPt{OebqGY* zB^NI51UK12sI!~-FfkW@xdF@Ymko0nusd!7cEB9IE5%~_>yGOCcXY&U&01`Y%SY_{ z{3;k^5^p*87jHM0<^tVusUC*la4t&qoXkOBb1=)&bVqe*9UT?x*0?R&^1}tj8RI2z z>2oD=Z898G29uoRG6?W`S&>CKo!kg>QAluvQmaX)=hkGJz3DpEkWL@1$t(y9tU3L+ z={HWg9;I=;G#yj05@BZO@^u-MTbpb41H%Ar%%GcUOUyBW)nwB8+9I<*Q}8nBwc4Wc z7%-Gxjm=`_(o%3?$hmDgwZ0t{9q$K~t=ed?vnV4bWZZTk3V?3#1I&Pko&M&$(d>5U zSiOUqoHtryz<7aK#-o7#Slh>1C@q)nMBQXrbkbV8qCqRq$$TTk7J%eXEuzY`nC3K{{TIf#sQY@%)kVeZiMv((w{LG!Grf^ z`f6>e-I=Qk*5z6(EXb{V8+JqUf)1gET*_OQo)i{XGhMsRW_IT3G1cYKigkm{L0}MU z$|LW(e&(3KY6j99>(Yz819jsK1ApsgF8T$C*kYu)fIfEJYW5D&lhZJW#;l)Yb`G}4 zZajPkQ@(F79b5lDW^bWbRUr-8kW(BMSaYEzH4E;0;_~#yAN-8&BcRWUf+`Zh6w%k4 z2hgui_b>-RfzzfUYTPi->Mz#$jm4HCUPT_2Y|fTHgIiS4W@p=DHQj+N-5 zHKo){CHObx1N|R)L{@|47A4IDd*ugS*x1FC6ur{e;?s{!H3vspus!*5G)!X=Y+dGaW&`qSp;(%`r-M4;|}2CSqs=j9VOtnlh9?xCvlgix(Ga%}Kh0prig zJEgx$OE5w!aTL^?r-X$%!1xqcikZBGi^6Mg8vx_>$4h^}GnAhK7A?pE$Y|3k8tZYW zF-9wp;2>3cF7FWx3gc0R$W$x6=(#}+o(6{GG@YhCTQ{1cZ?rL=+j>)S@C-1-)dV<` zS2T@Y+1ZE6w~bZ(A;D@4(W-5;tGsUtv;nZg5ta{JLyRX4A6JU;Fe%4s_+iH<+Y;a$ z{d{2j$m7!#KkLLHt{fPjEcqBT6tWm|?zi9xi>wFi!!hxJm44XPLk%)#1fqS5lD8Kp zJKqM1?eH=Lx#4Y^y1i^@lu_un0>+QyHk5XyWWylklbq&$2Qv4-2jC+1F&|@k5}9|T ztL}HfLQ3l2rQ#hkROfrbTHSlJX@^7gGYVgg@6pj6WonF32-m#7;i=igg>Fb@61p3e*!cOlZD|7^x!A-{LZQL!n0kd z&$Icdv40D;`%^$9s~&I;Z{Bp8vNMzZ_UtIt`59O+Soawnd$vpsG79fapOL&PO^q4c zn$KzGzCJW^SBmQYTqrbtPPgtVOpY07%@>j-hfQZtkNv&Kx2vn_2Z?PpenBU9Ig+D{ zBF0w08(6YJA4k2tV9002tR_j#;#f zCryyKoS1X;{BD~XGtinZ=@X#dFNO7nFUhheUyU*f;npu{)E>7wCQVF zxi@uSj8RywIp1yx%i2=l234(-8vx_UwhjAz zvcoKhpqnosoyDsA8=+VK4HfLmQ-h3x+w={}CSP@aE6}=cY5l%IYS2KNzNM4bL2m|(AAaWYn?VeeVS35L z+Oh6nmKzk^31B=Z?j)u!MkmFn;kmgf-v0tcIvM~s>b<*G@7>IolW6*(1=ogu0UxVw z28@?fVC3&h%K5ACR|gmmlHW}=FLT^*@hf$CzSa_~mMyXq8&ECNw&x#I!z+Qahm};? z;82~b1X{O>{@9SM`VF*k6*(IQs8L2MurI5~-!L-Se;-g}GR)8q8~0I{7xt>|2Y`-1 zf*+t0FQ6b8odNCxl<;DO>VFU@95y~kx4f94Mj3^0>w~oN#ZuM#kPvQoh+ckiB0cv~ zPwM~D05x1Al$vX3(o5N@b2U)JQMa1@`qGHxFr#VM4~8&ZvxZK-gt@Xtpbcy2!b=%y z*g%^Z?L~!tv+ArB5_PqN7dq8%ppCV($e*T08Aaf&wY1(pO$|DMx{*02UGT5FDf+O` zZ3T>P&Fl%k-x~K?Ay^L>Z@gJ}TfGUNEBLrI3j>m6kcFnT^#04Gsm^sku^_JjgAB3W zrgfBcc!b045^TQ#!v>5oY+E)PT;7!cg5tN)MoX47710O$wyuMHz*5D`5N~ z!5?>~@gd2%3EUCb)J^no0E3QEUh^h878sf0epKlC8O}iYJStPSwZo|5NQ&yN0}bo0 zucOqQp08%f3#SQ zG76>E%~W;t>SX`pLMhA;O3jbc2S@W%r&}o1xyf>Dm>Oghu{F8r+GCTGy<3D*kRivj zh4vmRR-I1(<#?W;v&TlLVMd|U`~(#ppPKA{QYeKPLaF&l+IYMy+wBqLdcb&pbLuod za}ZLahrT*)Q=Y+X-@W|UL%+znCu_uPAVMf{6R=V%Rb;>ZOlfL!ImvXx(n={yN%% zQ7p4@H(mMqh-Bv;q3mS{rG`CJ`+7!lm{E2CXnY*G@OqX-bMF<}^?T{;>*JE6jHaP| zd_ud1&j|Ne&#R7?_xlH6WS*%)dR-YJ0Jfju>@7dJjB+x zkKR3nDl^d5ee^4wx%Y#+7!A0e1_u|a&I3TbsPF@{CHUkJ|3O0+Fg{&8xBPy(L=C~# zgH(BXfa-n@dKIwx96fn@&d??;hdjY3&=OL+cu3 zOAoW4N(?nz_&1OS(BNxKNB zawz=6%XGd129~h{uou(+fs5h221GWa;B`=XBw*M-7@)y#UavTh(7kUustz78$icRo zaNA9^?IwmBb6WuL`^Zt?Hu&Nn;8EZ*p!=9%%iDJ2$4!U53^Sq46kwHh@VHP81GeXA z7Y&B7{*!IG#?AT7vT5m@B@5*HikC_$_bxv0#9MQ( F{a?V<8P5O! delta 12873 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 C{O6Pa diff --git a/build/subgraph.yaml b/build/subgraph.yaml index f9cacf3..dbd84c2 100644 --- a/build/subgraph.yaml +++ b/build/subgraph.yaml @@ -6,11 +6,11 @@ schema: dataSources: - kind: ethereum/contract name: ERC20V3Factory - network: tokb + network: cfx source: - address: "0x4A81Aa47722E1cF27A8726F247E68a766bE58d8e" + address: "0x585adbB35d0eE28B0d2AdC7213284D37bab7EA4B" abi: ERC20V3Factory - startBlock: 299037 + startBlock: 70692290 mapping: kind: ethereum/events apiVersion: 0.0.6 diff --git a/build/templates/CP/CP.wasm b/build/templates/CP/CP.wasm index dcac0be608e5d451b7b749b5ce3a4c6d8382e8e6..5734777d33e55da668cc48d2343365bb22e43d42 100644 GIT binary patch delta 12209 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 diff --git a/build/templates/DODOLpToken/DODOLpToken.wasm b/build/templates/DODOLpToken/DODOLpToken.wasm index 4ed42928114054144c99f1129147ba1c979bdc67..a277cfbd4a824f5b688e4f4605edd4badfa51dba 100644 GIT binary patch delta 5006 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 U`P96anlFF4wD;4o^}U_^e|$Azi2wiq delta 5057 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 diff --git a/build/templates/DVM/DVM.wasm b/build/templates/DVM/DVM.wasm index a1ea1b94bcf5ad31b6b750cbdd10d420757d7b7e..82115fc3d87ded30940a33bc2c9d6029f055ab84 100644 GIT binary patch delta 19117 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 delta 19055 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 diff --git a/src/mappings/constant-goerli.ts b/src/mappings/constant-goerli.ts index 38b379e..9cd9cf7 100644 --- a/src/mappings/constant-goerli.ts +++ b/src/mappings/constant-goerli.ts @@ -6,41 +6,44 @@ export const TYPE_DSP_POOL = "DSP"; export const TYPE_CLASSICAL_POOL = "CLASSICAL"; export const SOURCE_SMART_ROUTE = "SMART_ROUTE"; export const SOURCE_POOL_SWAP = "DODO_POOL"; -export const DODOZooID = "dodoex-v2-rinkeby"; +export const DODOZooID = "dodoex-v2-goerli"; export const CHAIN_BASE_COIN_SYMBOL = "ETH"; export const CHAIN_BASE_COIN_NAME = "ethereum"; export const DIP3_TIMESTAMP = 1624442400; -export const SMART_ROUTE_ADDRESSES: string[]= ["0xba001e96af87bf9d8d0bda667067a9921fe6d294"]; +export const SMART_ROUTE_ADDRESSES: string[] = [ + "0xba001e96af87bf9d8d0bda667067a9921fe6d294", +]; export const DVM_FACTORY_ADDRESS = "0x17dddefa0c82e0c850a4adac2afe3f1fe977a242"; export const DPP_FACTORY_ADDRESS = "0x510b49803e356c750f3a93ba5508c0ffd9f71bdd"; -export const CLASSIC_FACTORY_ADDRESS = "0x168442fec1e1e782c8770185dbb8328b91dc45c0"; -export const CROWDPOOLING_FACTORY_V2: string[]=["0x79e15fc9b4154d90424b588533ab277d30d573f4"]; +export const CLASSIC_FACTORY_ADDRESS = + "0x168442fec1e1e782c8770185dbb8328b91dc45c0"; +export const CROWDPOOLING_FACTORY_V2: string[] = [ + "0x79e15fc9b4154d90424b588533ab277d30d573f4", +]; export const DVM_FACTORY_DEPLOY_BLOCK = 8732843; export const DPP_FACTORY_DEPLOY_BLOCK = 8732843; -export const ADDRESS_ZERO = '0x0000000000000000000000000000000000000000' -export const BASE_COIN = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'; +export const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; +export const BASE_COIN = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; - -export const TRANSACTION_TYPE_SWAP = "SWAP" -export const TRANSACTION_TYPE_LP_ADD = "LP_ADD" -export const TRANSACTION_TYPE_LP_REMOVE = "LP_REMOVE" -export const TRANSACTION_TYPE_CP_BID = "CP_BID" -export const TRANSACTION_TYPE_CP_CANCEL = "CP_CANCEL" -export const TRANSACTION_TYPE_CP_CLAIM = "CP_CLAIM" +export const TRANSACTION_TYPE_SWAP = "SWAP"; +export const TRANSACTION_TYPE_LP_ADD = "LP_ADD"; +export const TRANSACTION_TYPE_LP_REMOVE = "LP_REMOVE"; +export const TRANSACTION_TYPE_CP_BID = "CP_BID"; +export const TRANSACTION_TYPE_CP_CANCEL = "CP_CANCEL"; +export const TRANSACTION_TYPE_CP_CLAIM = "CP_CLAIM"; /** * usd pricing */ -export const WRAPPED_BASE_COIN = '0xb26c0d8be2960c70641a95a9195be1f59ac83ac0'; +export const WRAPPED_BASE_COIN = "0xb26c0d8be2960c70641a95a9195be1f59ac83ac0"; //pricing supported stable coins -export const STABLE_ONE_ADDRESS = '0x0adcbae18580120667f7ff6c6451a426b13c67b7';//usdt -export const STABLE_TWO_ADDRESS = '0xab0733588776b8881f7712f6abca98f510e6b63d';//usdc +export const STABLE_ONE_ADDRESS = "0x0adcbae18580120667f7ff6c6451a426b13c67b7"; //usdt +export const STABLE_TWO_ADDRESS = "0xab0733588776b8881f7712f6abca98f510e6b63d"; //usdc //stable coins pairs -export const STABLE_COIN_PAIR_ONE = '0xe8c1b7e0505c97c59ff2f12ebf91a8eaa59d4c73';//[USDT_USDC_PAIR] +export const STABLE_COIN_PAIR_ONE = + "0xe8c1b7e0505c97c59ff2f12ebf91a8eaa59d4c73"; //[USDT_USDC_PAIR] //base currency pair -export const BASE_COIN_PAIR = '0x75f5d66a7bbb9330a9067c0833ec9b3198b71666';//[WETH_USDC_PAIR] - - +export const BASE_COIN_PAIR = "0x75f5d66a7bbb9330a9067c0833ec9b3198b71666"; //[WETH_USDC_PAIR] diff --git a/src/mappings/constant.ts b/src/mappings/constant.ts index 6a70abf..f1497ba 100644 --- a/src/mappings/constant.ts +++ b/src/mappings/constant.ts @@ -6,24 +6,24 @@ export const TYPE_DSP_POOL = "DSP"; export const TYPE_CLASSICAL_POOL = "CLASSICAL"; export const SOURCE_SMART_ROUTE = "SMART_ROUTE"; export const SOURCE_POOL_SWAP = "DODO_POOL"; -export const DODOZooID = "dodoex-v2-okb-x1-test"; -export const CHAIN_BASE_COIN_SYMBOL = "ETH"; -export const CHAIN_BASE_COIN_NAME = "ethereum"; +export const DODOZooID = "dodoex-v2-cfx"; +export const CHAIN_BASE_COIN_SYMBOL = "CFX"; +export const CHAIN_BASE_COIN_NAME = "conflux"; export const DIP3_TIMESTAMP = 1624442400; export const SMART_ROUTE_ADDRESSES: string[] = [ - "0x5b622A373b485CB9BA283ECd6CE6689a8b8FdC05", + "0xbce44767af0a53A108b3B7ba4F740E03D228Ec0A", ]; -export const DVM_FACTORY_ADDRESS = "0xFaFC924BF0F70BdF4a722231622f559b94e53902"; -export const DPP_FACTORY_ADDRESS = "0xb546Add98c71D97Bb65De60B91021617AcD1262C"; +export const DVM_FACTORY_ADDRESS = "0xc77392396be1fb5143f1f66a3ae67dd03fbaba27"; +export const DPP_FACTORY_ADDRESS = "0xaC9a7053bC23D22ecC50F82cc9143d16bbC0E621"; export const CLASSIC_FACTORY_ADDRESS = - "0x8dD0Fea5FA2f7df535F87f312641Cc15d8B151BA"; + "0x168442fec1e1e782c8770185dbb8328b91dc45c0"; export const CROWDPOOLING_FACTORY_V2: string[] = [ - "0x8dD0Fea5FA2f7df535F87f312641Cc15d8B151BA", + "0x79e15fc9b4154d90424b588533ab277d30d573f4", ]; -export const DVM_FACTORY_DEPLOY_BLOCK = 300062; -export const DPP_FACTORY_DEPLOY_BLOCK = 300062; +export const DVM_FACTORY_DEPLOY_BLOCK = 70692327; +export const DPP_FACTORY_DEPLOY_BLOCK = 70692370; export const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; export const BASE_COIN = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; @@ -40,10 +40,10 @@ export const TRANSACTION_TYPE_CP_CLAIM = "CP_CLAIM"; */ export const WRAPPED_BASE_COIN = "0xb26c0d8be2960c70641a95a9195be1f59ac83ac0"; //pricing supported stable coins -export const STABLE_ONE_ADDRESS = "0x0adcbae18580120667f7ff6c6451a426b13c67b7"; //usdt -export const STABLE_TWO_ADDRESS = "0xab0733588776b8881f7712f6abca98f510e6b63d"; //usdc +export const STABLE_ONE_ADDRESS = "0xfe97e85d13abd9c1c33384e796f10b73905637ce"; //usdt +export const STABLE_TWO_ADDRESS = "0x6963efed0ab40f6c3d7bda44a05dcf1437c44372"; //usdc //stable coins pairs export const STABLE_COIN_PAIR_ONE = - "0xe8c1b7e0505c97c59ff2f12ebf91a8eaa59d4c73"; //[USDT_USDC_PAIR] + "0xa5dcd75c853dad730bef4ece3d20f0be7e297a6a"; //[USDT_USDC_PAIR] //base currency pair -export const BASE_COIN_PAIR = "0x75f5d66a7bbb9330a9067c0833ec9b3198b71666"; //[WETH_USDC_PAIR] +export const BASE_COIN_PAIR = "0x0736b3384531cda2f545f5449e84c6c6bcd6f01b"; //[WETH_USDC_PAIR] diff --git a/src/mappings/dodoex/classicPoolFromV1.ts b/src/mappings/dodoex/classicPoolFromV1.ts index 93b9f8d..0ae664c 100644 --- a/src/mappings/dodoex/classicPoolFromV1.ts +++ b/src/mappings/dodoex/classicPoolFromV1.ts @@ -19,6 +19,7 @@ import { MaintainerEarnings, } from "../../types/dodoex/schema"; import { insertAllPairs4V1Aurora } from "./classicalPoolAurora"; + import { DODO as DODOTemplate, DODOLpToken as DODOLpTokenTemplate, diff --git a/src/mappings/dodoex/helpers.ts b/src/mappings/dodoex/helpers.ts index 43ad0fd..ddd98d8 100644 --- a/src/mappings/dodoex/helpers.ts +++ b/src/mappings/dodoex/helpers.ts @@ -243,7 +243,9 @@ export function fetchTokenTotalSupply(tokenAddress: Address): BigInt { export function fetchTokenDecimals(tokenAddress: Address): BigInt { // hardcode overrides if ( - tokenAddress.toHexString() == "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9" + tokenAddress.toHexString() == + "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9" || + tokenAddress.toHexString() == "0x623b3357095ea5e41920dec8b873cc95839f861d" ) { return BigInt.fromI32(18); } diff --git a/subgraphs/dodoex/dodoex_cfx.yaml b/subgraphs/dodoex/dodoex_cfx.yaml index d6a5a87..17364d8 100644 --- a/subgraphs/dodoex/dodoex_cfx.yaml +++ b/subgraphs/dodoex/dodoex_cfx.yaml @@ -404,6 +404,45 @@ templates: handler: handleDODOSwap - event: LpFeeRateChange(uint256) handler: handleLpFeeRateChange + - kind: ethereum/contract + name: DPPOracleAdmin + network: cfx + source: + abi: DPPOracleAdmin + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/pool.ts + entities: + - Pair + - Token + abis: + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DPPOracleAdmin + file: ../../abis/DPPOracleAdmin.json + - name: DODO + file: ../../abis/DODO.json + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: DPPFactory + file: ../../abis/DPPFactory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + - name: DODOZoo + file: ../../abis/DODOZoo.json + eventHandlers: + - event: OwnershipTransferred(indexed address,indexed address) + handler: handleDPPOwnershipTransferred - kind: ethereum/contract name: DSP network: cfx diff --git a/subgraphs/dodoex/dodoex_goerli.yaml b/subgraphs/dodoex/dodoex_goerli.yaml index 2d2cb2e..f7ddbe4 100644 --- a/subgraphs/dodoex/dodoex_goerli.yaml +++ b/subgraphs/dodoex/dodoex_goerli.yaml @@ -1,4 +1,4 @@ -specVersion: 0.0.2 +specVersion: 0.0.4 description: Dodoex.io repository: https://github.com/DODOEX/dodoex_v2_subgraph schema: @@ -13,7 +13,7 @@ dataSources: startBlock: 7462578 mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/smartRoute.ts entities: @@ -40,7 +40,7 @@ dataSources: startBlock: 7462578 mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/smartRoute.ts entities: @@ -67,7 +67,7 @@ dataSources: startBlock: 8103480 mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/smartRoute.ts entities: @@ -96,7 +96,7 @@ dataSources: startBlock: 7462578 mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/poolFactory.ts entities: @@ -129,7 +129,7 @@ dataSources: startBlock: 7462578 mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/poolFactory.ts entities: @@ -162,7 +162,7 @@ dataSources: startBlock: 7462578 mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/poolFactory.ts entities: @@ -195,7 +195,7 @@ dataSources: startBlock: 7462578 mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/poolFactory.ts entities: @@ -225,6 +225,39 @@ dataSources: handler: handleNewCP - event: RemoveCP(address) handler: handleRemoveCP + - kind: ethereum/contract + name: DODOZoo + network: goerli + source: + address: '0xb7aa0fc639adb1de63d7ad5d665a3196a361b887' + abi: DODOZoo + startBlock: 10287301 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/classicPoolFromV1.ts + entities: + - Pair + - Token + abis: + - name: DODOZoo + file: ../../abis/DODOZoo.json + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DODO + file: ../../abis/DODO.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: DODOBirth(address,address,address) + handler: handleDODOBirth templates: - kind: ethereum/contract name: DVM @@ -233,7 +266,7 @@ templates: abi: DVM mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/pool.ts entities: @@ -269,7 +302,7 @@ templates: abi: DPP mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/pool.ts entities: @@ -306,7 +339,7 @@ templates: abi: DSP mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/pool.ts entities: @@ -346,7 +379,7 @@ templates: abi: CP mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/crowdPooling.ts entities: @@ -385,7 +418,7 @@ templates: abi: CPV2 mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/crowdPooling.ts entities: @@ -424,7 +457,7 @@ templates: abi: DODO mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/classicPoolFromV1.ts entities: @@ -464,6 +497,45 @@ templates: handler: handleChargeMaintainerFee - event: UpdateMaintainerFeeRate(uint256,uint256) handler: handleUpdateMaintainerFeeRate + - kind: ethereum/contract + name: DPPOracleAdmin + network: goerli + source: + abi: DPPOracleAdmin + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/pool.ts + entities: + - Pair + - Token + abis: + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DPPOracleAdmin + file: ../../abis/DPPOracleAdmin.json + - name: DODO + file: ../../abis/DODO.json + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: DPPFactory + file: ../../abis/DPPFactory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + - name: DODOZoo + file: ../../abis/DODOZoo.json + eventHandlers: + - event: OwnershipTransferred(indexed address,indexed address) + handler: handleDPPOwnershipTransferred - kind: ethereum/contract name: DODOLpToken network: goerli @@ -471,7 +543,7 @@ templates: abi: DODOLpToken mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/lpToken.ts entities: @@ -483,4 +555,3 @@ templates: eventHandlers: - event: Transfer(indexed address,indexed address,uint256) handler: handleTransfer - diff --git a/subgraphs/dodoex/dodoex_polygon-graft.yaml b/subgraphs/dodoex/dodoex_polygon-graft.yaml index 10fba71..582b233 100644 --- a/subgraphs/dodoex/dodoex_polygon-graft.yaml +++ b/subgraphs/dodoex/dodoex_polygon-graft.yaml @@ -1,10 +1,10 @@ specVersion: 0.0.4 description: Dodoex.io -# graft: -# base: QmPvW1FD1MJq2a7gQaReekEXsXdtFQaUXoGfJBuBJDgAma -# block: 36808703 -# features: -# - grafting +graft: + base: QmT7MxDBSnDDfmQMmDmkbiR8rREVoQFqqzjwKKC2vw9kSG + block: 50610312 +features: + - grafting repository: https://github.com/DODOEX/dodoex_v2_subgraph schema: file: ./dodoex.graphql @@ -67,35 +67,6 @@ dataSources: eventHandlers: - event: OrderHistory(address,address,address,uint256,uint256) handler: handleOrderHistory - - kind: ethereum/contract - name: DODOFeeRouteProxyWidgit - network: matic - source: - address: '0xA103206E7f19d1C1c0e31eFC4DFc7b299630F100' - abi: DODOFeeRouteProxy - startBlock: 36808703 - mapping: - kind: ethereum/events - apiVersion: 0.0.4 - language: wasm/assemblyscript - file: ../../src/mappings/dodoex/smartRoute.ts - entities: - - Pair - - Token - abis: - - name: DODOFeeRouteProxy - file: ../../abis/DODOFeeRouteProxy.json - - name: DODOV2Proxy02 - file: ../../abis/DODOV2Proxy02.json - - name: ERC20 - file: ../../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../../abis/ERC20NameBytes.json - eventHandlers: - - event: OrderHistory(address,address,address,uint256,uint256) - handler: handleOrderHistory - kind: ethereum/contract name: DODORouteProxy network: matic diff --git a/subgraphs/dodoex/dodoex_polygon.yaml b/subgraphs/dodoex/dodoex_polygon.yaml index 10fba71..582b233 100644 --- a/subgraphs/dodoex/dodoex_polygon.yaml +++ b/subgraphs/dodoex/dodoex_polygon.yaml @@ -1,10 +1,10 @@ specVersion: 0.0.4 description: Dodoex.io -# graft: -# base: QmPvW1FD1MJq2a7gQaReekEXsXdtFQaUXoGfJBuBJDgAma -# block: 36808703 -# features: -# - grafting +graft: + base: QmT7MxDBSnDDfmQMmDmkbiR8rREVoQFqqzjwKKC2vw9kSG + block: 50610312 +features: + - grafting repository: https://github.com/DODOEX/dodoex_v2_subgraph schema: file: ./dodoex.graphql @@ -67,35 +67,6 @@ dataSources: eventHandlers: - event: OrderHistory(address,address,address,uint256,uint256) handler: handleOrderHistory - - kind: ethereum/contract - name: DODOFeeRouteProxyWidgit - network: matic - source: - address: '0xA103206E7f19d1C1c0e31eFC4DFc7b299630F100' - abi: DODOFeeRouteProxy - startBlock: 36808703 - mapping: - kind: ethereum/events - apiVersion: 0.0.4 - language: wasm/assemblyscript - file: ../../src/mappings/dodoex/smartRoute.ts - entities: - - Pair - - Token - abis: - - name: DODOFeeRouteProxy - file: ../../abis/DODOFeeRouteProxy.json - - name: DODOV2Proxy02 - file: ../../abis/DODOV2Proxy02.json - - name: ERC20 - file: ../../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../../abis/ERC20NameBytes.json - eventHandlers: - - event: OrderHistory(address,address,address,uint256,uint256) - handler: handleOrderHistory - kind: ethereum/contract name: DODORouteProxy network: matic From 7bc1f64988daa0a1a7b7430efc0d3c28a99e10dd Mon Sep 17 00:00:00 2001 From: pengyongjun Date: Tue, 30 Jan 2024 16:43:02 +0800 Subject: [PATCH 04/11] fix: dpoint error --- build/subgraph.yaml | 8 ++++---- subgraphs/dpoint/dpoint_goerli.yaml | 2 ++ subgraphs/dpoint/dpoint_scroll.yaml | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/build/subgraph.yaml b/build/subgraph.yaml index a781926..493de22 100644 --- a/build/subgraph.yaml +++ b/build/subgraph.yaml @@ -6,11 +6,11 @@ schema: dataSources: - kind: ethereum/contract name: LockedTokenVaultFactory - network: goerli + network: scroll source: - address: "0x7A6a6bCeA8bfA93893aCC3df6D2A81ECb0E8dC1d" + address: "0xEAf81DeAf1477C6DE6981D7902A287988E65e439" abi: LockedTokenVaultFactory - startBlock: 10381816 + startBlock: 2765712 mapping: kind: ethereum/events apiVersion: 0.0.6 @@ -28,7 +28,7 @@ dataSources: templates: - kind: ethereum/contract name: LockedTokenVault - network: goerli + network: scroll source: abi: LockedTokenVault mapping: diff --git a/subgraphs/dpoint/dpoint_goerli.yaml b/subgraphs/dpoint/dpoint_goerli.yaml index 6187f28..d91459b 100644 --- a/subgraphs/dpoint/dpoint_goerli.yaml +++ b/subgraphs/dpoint/dpoint_goerli.yaml @@ -22,6 +22,8 @@ dataSources: file: ../../abis/LockedTokenVaultFactory.json - name: LockedTokenVault file: ../../abis/LockedTokenVault.json + - name: ERC20 + file: ../../abis/ERC20.json eventHandlers: - event: CreateVault(address) handler: handleCreateVault diff --git a/subgraphs/dpoint/dpoint_scroll.yaml b/subgraphs/dpoint/dpoint_scroll.yaml index 871967c..3400ff6 100644 --- a/subgraphs/dpoint/dpoint_scroll.yaml +++ b/subgraphs/dpoint/dpoint_scroll.yaml @@ -8,9 +8,9 @@ dataSources: name: LockedTokenVaultFactory network: scroll source: - address: '0x7A6a6bCeA8bfA93893aCC3df6D2A81ECb0E8dC1d' + address: '0xEAf81DeAf1477C6DE6981D7902A287988E65e439' abi: LockedTokenVaultFactory - startBlock: 10381816 + startBlock: 2765712 mapping: kind: ethereum/events apiVersion: 0.0.6 From 0f8c0e0d896d734522739ae048babf29f46afbc6 Mon Sep 17 00:00:00 2001 From: pyj Date: Thu, 11 Jul 2024 10:51:30 +0800 Subject: [PATCH 05/11] feat: support dodochain-testnet, bitlayer, zircuit-testnet --- bin/config.js | 3 + bin/index-cmd.js | 20 +- build/DVMFactory/DVMFactory.wasm | Bin 73943 -> 73844 bytes build/subgraph.yaml | 96 ++- build/templates/CP/CP.wasm | Bin 67308 -> 67213 bytes build/templates/DODOLpToken/DODOLpToken.wasm | Bin 42953 -> 42858 bytes build/templates/DVM/DVM.wasm | Bin 92422 -> 92326 bytes src/mappings/constant-bitlayer.ts | 49 ++ src/mappings/constant-dodochain-testnet.ts | 49 ++ src/mappings/constant-zircuit-testnet.ts | 49 ++ src/mappings/constant.ts | 30 +- src/mappings/token/helpers.ts | 6 +- subgraphs/dodoex/dodoex_bitlayer.yaml | 662 ++++++++++++++++++ .../dodoex/dodoex_dodochain-testnet.yaml | 662 ++++++++++++++++++ subgraphs/dodoex/dodoex_zircuit-testnet.yaml | 662 ++++++++++++++++++ subgraphs/mine/mine_bitlayer.yaml | 94 +++ subgraphs/mine/mine_dodochain-testnet.yaml | 94 +++ subgraphs/mine/mine_zircuit-testnet.yaml | 94 +++ subgraphs/token/token_bitlayer.yaml | 39 ++ subgraphs/token/token_dodochain-testnet.yaml | 39 ++ subgraphs/token/token_zircuit-testnet.yaml | 39 ++ 21 files changed, 2633 insertions(+), 54 deletions(-) create mode 100644 src/mappings/constant-bitlayer.ts create mode 100644 src/mappings/constant-dodochain-testnet.ts create mode 100644 src/mappings/constant-zircuit-testnet.ts create mode 100644 subgraphs/dodoex/dodoex_bitlayer.yaml create mode 100644 subgraphs/dodoex/dodoex_dodochain-testnet.yaml create mode 100644 subgraphs/dodoex/dodoex_zircuit-testnet.yaml create mode 100644 subgraphs/mine/mine_bitlayer.yaml create mode 100644 subgraphs/mine/mine_dodochain-testnet.yaml create mode 100644 subgraphs/mine/mine_zircuit-testnet.yaml create mode 100644 subgraphs/token/token_bitlayer.yaml create mode 100644 subgraphs/token/token_dodochain-testnet.yaml create mode 100644 subgraphs/token/token_zircuit-testnet.yaml diff --git a/bin/config.js b/bin/config.js index 5176b49..660e2c4 100644 --- a/bin/config.js +++ b/bin/config.js @@ -27,6 +27,9 @@ const chains = [ "manta", "mantle", "tokb", + "dodochain-testnet", + "bitlayer", + "zircuit-testnet", ]; const supportAlphaChains = ["arbitrum", "polygon", "mainnet"]; const supportStudioChains = ["arbitrum", "polygon", "mainnet"]; diff --git a/bin/index-cmd.js b/bin/index-cmd.js index f1ea1e5..55ae79a 100644 --- a/bin/index-cmd.js +++ b/bin/index-cmd.js @@ -39,7 +39,7 @@ function createConfig() { } function createDeployDodoexConfig() { const getCodegenCmd = (name) => { - return `graph codegen subgraphs/dodoex/dodoex_${name}.yaml --output-dir ./src/types/dodoex/ `; + return `./node_modules/.bin/graph codegen subgraphs/dodoex/dodoex_${name}.yaml --output-dir ./src/types/dodoex/ `; }; const deployDodoex = {}; for (const chain of chains) { @@ -47,52 +47,52 @@ function createDeployDodoexConfig() { chain )} && ${getCodegenCmd( chain - )} && graph deploy --ipfs ${theGraphIpfsUrl} --node ${theGraphNodeUrl} dodoex/dodoex-v2-${chain} subgraphs/dodoex/dodoex_${chain}.yaml`; + )} && ./node_modules/.bin/graph deploy --ipfs ${theGraphIpfsUrl} --node ${theGraphNodeUrl} dodoex/dodoex-v2-${chain} subgraphs/dodoex/dodoex_${chain}.yaml`; deployDodoex[`deploy:local:dodoex_${chain}`] = `${getCpCmd( chain )} && ${getCodegenCmd( chain - )} && graph deploy --ipfs ${localIpfsUrl} --node ${localNodeUrl} dodoex/dodoex-v2-${chain} subgraphs/dodoex/dodoex_${chain}.yaml`; + )} && ./node_modules/.bin/graph deploy --ipfs ${localIpfsUrl} --node ${localNodeUrl} dodoex/dodoex-v2-${chain} subgraphs/dodoex/dodoex_${chain}.yaml`; } for (const chain of supportAlphaChains) { deployDodoex[`deploy:dodoex_${chain}_alpha`] = `${getCpCmd( chain )} && ${getCodegenCmd( chain - )} && graph deploy --ipfs ${theGraphIpfsUrl} --node ${theGraphNodeUrl} dodoex/dodoex-v2-${chain}-alpha subgraphs/dodoex/dodoex_${chain}-graft.yaml`; + )} && ./node_modules/.bin/graph deploy --ipfs ${theGraphIpfsUrl} --node ${theGraphNodeUrl} dodoex/dodoex-v2-${chain}-alpha subgraphs/dodoex/dodoex_${chain}-graft.yaml`; } for (const chain of supportStudioChains) { deployDodoex[`deploy:studio:dodoex_${chain}`] = `${getCpCmd( chain )} && ${getCodegenCmd( chain - )} && graph deploy --node ${studioNodeUrl} dodoex_v2_${chain} subgraphs/dodoex/dodoex_${chain}.yaml`; + )} && ./node_modules/.bin/graph deploy --node ${studioNodeUrl} dodoex_v2_${chain} subgraphs/dodoex/dodoex_${chain}.yaml`; } deployDodoex["deploy:dodoex_okchain"] = `${getCpCmd( "okchain" )} && ${getCodegenCmd( "okchain" - )} && graph deploy --ipfs https://ipfs.kkt.one --node https://graph.kkt.one/node/ dodoex/dodoex-v2-okchain subgraphs/dodoex/dodoex_okchain.yaml --access-token `; + )} && ./node_modules/.bin/graph deploy --ipfs https://ipfs.kkt.one --node https://graph.kkt.one/node/ dodoex/dodoex-v2-okchain subgraphs/dodoex/dodoex_okchain.yaml --access-token `; return deployDodoex; } function createDeployConfig(key, subgraphName, path, typePath) { const getCodegenCmd = (name) => { - return `graph codegen ${path}_${name}.yaml --output-dir ./src/types/${typePath || + return `./node_modules/.bin/graph codegen ${path}_${name}.yaml --output-dir ./src/types/${typePath || key}/ `; }; const deployConfig = {}; for (const chain of chains) { deployConfig[`deploy:${key}_${chain}`] = `${getCodegenCmd( chain - )} && graph deploy --ipfs ${theGraphIpfsUrl} --node ${theGraphNodeUrl} dodoex/${subgraphName}-${chain} ${path}_${chain}.yaml`; + )} && ./node_modules/.bin/graph deploy --ipfs ${theGraphIpfsUrl} --node ${theGraphNodeUrl} dodoex/${subgraphName}-${chain} ${path}_${chain}.yaml`; deployConfig[`deploy:local:${key}_${chain}`] = `${getCodegenCmd( chain - )} && graph deploy --ipfs ${localIpfsUrl} --node ${localNodeUrl} dodoex/${subgraphName}-${chain} ${path}_${chain}.yaml`; + )} && ./node_modules/.bin/graph deploy --ipfs ${localIpfsUrl} --node ${localNodeUrl} dodoex/${subgraphName}-${chain} ${path}_${chain}.yaml`; } for (const chain of supportStudioChains) { deployConfig[`deploy:studio:${key}_${chain}`] = `${getCodegenCmd( chain - )} && graph deploy --node ${studioNodeUrl} ${subgraphName}-${chain} ${path}_${chain}.yaml`; + )} && ./node_modules/.bin/graph deploy --node ${studioNodeUrl} ${subgraphName}-${chain} ${path}_${chain}.yaml`; } return deployConfig; } diff --git a/build/DVMFactory/DVMFactory.wasm b/build/DVMFactory/DVMFactory.wasm index 1227c2a9cf98c640cab10fbe66c403dbfaf68bd2..c1099ec63c402bc092c60356e7ff83bdcd28e599 100644 GIT binary patch delta 12968 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 u)9Q^6V)23f)i?l@3+2DIEPLm!DgPVW*x~d5 delta 13162 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 diff --git a/build/subgraph.yaml b/build/subgraph.yaml index 493de22..c007eaa 100644 --- a/build/subgraph.yaml +++ b/build/subgraph.yaml @@ -1,49 +1,93 @@ -specVersion: 0.0.4 +specVersion: 0.0.5 description: Dodoex.io repository: https://github.com/DODOEX/dodoex_v2_subgraph schema: - file: dpoint.graphql + file: mine.graphql dataSources: - kind: ethereum/contract - name: LockedTokenVaultFactory - network: scroll + name: DODOMineV3ProxyV2 + network: bitlayer source: - address: "0xEAf81DeAf1477C6DE6981D7902A287988E65e439" - abi: LockedTokenVaultFactory - startBlock: 2765712 + address: "0x8A89153f246EA1501dec23db0Ba001F239aE1067" + abi: DODOMineV3ProxyV2 + startBlock: 2019532 mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript - file: LockedTokenVaultFactory/LockedTokenVaultFactory.wasm - entities: [] + file: DODOMineV3ProxyV2/DODOMineV3ProxyV2.wasm + entities: + - MinePool abis: - - name: LockedTokenVaultFactory - file: ../abis/LockedTokenVaultFactory.json - - name: LockedTokenVault - file: ../abis/LockedTokenVault.json + - name: DODOMineV3Proxy + file: ../abis/DODOMineV3Proxy.json + - name: DODOMineV3ProxyV2 + file: ../abis/DODOMineV3ProxyV2.json + - name: ERC20MineV3 + file: ../abis/ERC20MineV3.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json eventHandlers: - - event: CreateVault(address) - handler: handleCreateVault -templates: + - event: CreateMineV3(address,address,uint256) + handler: handleV2CreateMineV3 - kind: ethereum/contract - name: LockedTokenVault - network: scroll + name: DODOMineV3Registry + network: bitlayer source: - abi: LockedTokenVault + address: "0x62e2EC354E15ddA6A1E43586c86e745A59b4B81e" + abi: DODOMineV3Registry + startBlock: 2019532 mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript - file: templates/LockedTokenVault/LockedTokenVault.wasm + file: DODOMineV3Registry/DODOMineV3Registry.wasm entities: - - ERC20 - - Claimed + - MinePool abis: - - name: LockedTokenVault - file: ../abis/LockedTokenVault.json + - name: DODOMineV3Proxy + file: ../abis/DODOMineV3Proxy.json + - name: DODOMineV3Registry + file: ../abis/DODOMineV3Registry.json + - name: ERC20MineV3 + file: ../abis/ERC20MineV3.json - name: ERC20 file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: NewMineV3(address,address,bool) + handler: handleNewMineV3 +templates: + - kind: ethereum/contract + name: ERC20MineV3 + network: bitlayer + source: + abi: ERC20MineV3 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/ERC20MineV3/ERC20MineV3.wasm + entities: + - MinePool + abis: + - name: ERC20MineV3 + file: ../abis/ERC20MineV3.json eventHandlers: - - event: Claim(indexed address,uint256,uint256,uint256) - handler: handleClaim + - event: Deposit(indexed address,uint256) + handler: handleDeposit + - event: Withdraw(indexed address,uint256) + handler: handleWithdraw + - event: NewRewardToken(indexed uint256,address) + handler: handleNewRewardToken + - event: UpdateEndBlock(indexed uint256,uint256) + handler: handleUpdateEndBlock + - event: UpdateReward(indexed uint256,uint256) + handler: handleUpdateReward diff --git a/build/templates/CP/CP.wasm b/build/templates/CP/CP.wasm index 5734777d33e55da668cc48d2343365bb22e43d42..3271ffb47792c27aaa38dcd681de09a3f2b13858 100644 GIT binary patch delta 11869 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 EU)2rVmH+?% delta 11780 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 diff --git a/build/templates/DVM/DVM.wasm b/build/templates/DVM/DVM.wasm index 82115fc3d87ded30940a33bc2c9d6029f055ab84..2fc1e69706961fc0506e7020f2bfe08212d3231a 100644 GIT binary patch delta 19113 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 Ol)GP^(_MV#n*Rf)ute4X delta 19136 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 Date: Wed, 24 Jul 2024 11:45:56 +0800 Subject: [PATCH 06/11] feat: support arbitrum-sepolia chain; update scroll,bsc; optimize handleBuyShares,handleSellShares --- bin/config.js | 3 +- build/DODOMine/DODOMine.wasm | Bin 43131 -> 43491 bytes build/DODOZoo/DODOZoo.wasm | Bin 117882 -> 118225 bytes build/DVMFactory/DVMFactory.wasm | Bin 73844 -> 73952 bytes build/subgraph.yaml | 1075 ++++++++++++++++- build/templates/CP/CP.wasm | Bin 67213 -> 67638 bytes build/templates/DODOLpToken/DODOLpToken.wasm | Bin 42858 -> 42962 bytes build/templates/DVM/DVM.wasm | Bin 92326 -> 93159 bytes package.json | 2 +- src/mappings/constant-arb-sep.ts | 49 + src/mappings/constant.ts | 66 +- src/mappings/dodoex/helpers.ts | 63 +- src/mappings/dodoex/pool.ts | 57 +- subgraphs/dodoex/dodoex_arb-sep.yaml | 680 +++++++++++ subgraphs/dodoex/dodoex_bsc.yaml | 51 +- .../dodoex/dodoex_dodochain-testnet.yaml | 18 + subgraphs/dodoex/dodoex_scroll.yaml | 81 ++ subgraphs/mine/mine_arb-sep.yaml | 94 ++ subgraphs/mine/mine_dodochain-testnet.yaml | 2 +- subgraphs/token/token_arb-sep.yaml | 39 + 20 files changed, 2134 insertions(+), 146 deletions(-) create mode 100644 src/mappings/constant-arb-sep.ts create mode 100644 subgraphs/dodoex/dodoex_arb-sep.yaml create mode 100644 subgraphs/mine/mine_arb-sep.yaml create mode 100644 subgraphs/token/token_arb-sep.yaml diff --git a/bin/config.js b/bin/config.js index 660e2c4..4830a54 100644 --- a/bin/config.js +++ b/bin/config.js @@ -30,9 +30,10 @@ const chains = [ "dodochain-testnet", "bitlayer", "zircuit-testnet", + "arb-sep", ]; const supportAlphaChains = ["arbitrum", "polygon", "mainnet"]; -const supportStudioChains = ["arbitrum", "polygon", "mainnet"]; +const supportStudioChains = ["arbitrum", "polygon", "mainnet", "arb-sep"]; module.exports = { studioNodeUrl, theGraphNodeUrl, diff --git a/build/DODOMine/DODOMine.wasm b/build/DODOMine/DODOMine.wasm index 4909793464a3e2da6f3fc96b27fabc5549c93cc4..ab947b847f5ca2449ac6cc19fa30a85b4a992c08 100644 GIT binary patch delta 5385 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 diff --git a/build/DODOZoo/DODOZoo.wasm b/build/DODOZoo/DODOZoo.wasm index 7bdbdaa5c9b4efd7a5d75fd064d94403596accf1..cda425223eda68a967a33b9e29b95eedfefeaa25 100644 GIT binary patch delta 25824 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 T*#q;xU|QlmyIz~m60i9`j50mn diff --git a/build/DVMFactory/DVMFactory.wasm b/build/DVMFactory/DVMFactory.wasm index c1099ec63c402bc092c60356e7ff83bdcd28e599..9ede6f4734d07db1bd8a7b50f614579ffacf7851 100644 GIT binary patch delta 12784 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 WkPYZCq{9bKbn2dHPQ3H`8UG6u4doC3 delta 12604 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 bTTF>77p_=p`meH;O4_~4o9=yg(bWG1CeX~3 diff --git a/build/subgraph.yaml b/build/subgraph.yaml index c007eaa..23982d4 100644 --- a/build/subgraph.yaml +++ b/build/subgraph.yaml @@ -1,30 +1,38 @@ -specVersion: 0.0.5 +specVersion: 0.0.4 description: Dodoex.io +graft: + base: QmU2D6A3QDtTwrzC6NgK2ngZEskS1bzEwo599bUdjhzPVz + block: 39336465 +features: + - grafting repository: https://github.com/DODOEX/dodoex_v2_subgraph schema: - file: mine.graphql + file: dodoex.graphql dataSources: - kind: ethereum/contract - name: DODOMineV3ProxyV2 - network: bitlayer + name: DODONFTRegistry + network: bsc source: - address: "0x8A89153f246EA1501dec23db0Ba001F239aE1067" - abi: DODOMineV3ProxyV2 - startBlock: 2019532 + address: "0x2c0dd764a0be8a7e747cb0765e268d576edce31a" + abi: DODONFTRegistry + startBlock: 9092832 mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript - file: DODOMineV3ProxyV2/DODOMineV3ProxyV2.wasm + file: DODONFTRegistry/DODONFTRegistry.wasm entities: - - MinePool + - Pair + - Token abis: - - name: DODOMineV3Proxy - file: ../abis/DODOMineV3Proxy.json - - name: DODOMineV3ProxyV2 - file: ../abis/DODOMineV3ProxyV2.json - - name: ERC20MineV3 - file: ../abis/ERC20MineV3.json + - name: DODOZoo + file: ../abis/DODOZoo.json + - name: DODO + file: ../abis/DODO.json + - name: DVM + file: ../abis/DVM.json + - name: DODONFTRegistry + file: ../abis/DODONFTRegistry.json - name: ERC20 file: ../abis/ERC20.json - name: ERC20SymbolBytes @@ -32,29 +40,28 @@ dataSources: - name: ERC20NameBytes file: ../abis/ERC20NameBytes.json eventHandlers: - - event: CreateMineV3(address,address,uint256) - handler: handleV2CreateMineV3 + - event: NewRegistry(address,address,address) + handler: handleNewRegistry + - event: RemoveRegistry(address) + handler: handleRemoveRegistry - kind: ethereum/contract - name: DODOMineV3Registry - network: bitlayer + name: DODORouteProxy + network: bsc source: - address: "0x62e2EC354E15ddA6A1E43586c86e745A59b4B81e" - abi: DODOMineV3Registry - startBlock: 2019532 + address: "0x6b3d817814eabc984d51896b1015c0b89e9737ca" + abi: DODORouteProxy + startBlock: 7967129 mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript - file: DODOMineV3Registry/DODOMineV3Registry.wasm + file: DODORouteProxy/DODORouteProxy.wasm entities: - - MinePool + - Pair + - Token abis: - - name: DODOMineV3Proxy - file: ../abis/DODOMineV3Proxy.json - - name: DODOMineV3Registry - file: ../abis/DODOMineV3Registry.json - - name: ERC20MineV3 - file: ../abis/ERC20MineV3.json + - name: DODORouteProxy + file: ../abis/DODORouteProxy.json - name: ERC20 file: ../abis/ERC20.json - name: ERC20SymbolBytes @@ -62,32 +69,1006 @@ dataSources: - name: ERC20NameBytes file: ../abis/ERC20NameBytes.json eventHandlers: - - event: NewMineV3(address,address,bool) - handler: handleNewMineV3 + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory + - kind: ethereum/contract + name: DODOMine + network: bsc + source: + address: "0x01f9bfac04e6184e90bd7eafd51999ce430cc750" + abi: DODOMine + startBlock: 5007474 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODOMine/DODOMine.wasm + entities: + - User + - StakeHistory + abis: + - name: DODOMine + file: ../abis/DODOMine.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: Deposit(indexed address,indexed uint256,uint256) + handler: handleDeposit + - event: Withdraw(indexed address,indexed uint256,uint256) + handler: handleWithdraw + - event: Claim(indexed address,uint256) + handler: handleClaim + - kind: ethereum/contract + name: DODOIncentive + network: bsc + source: + address: "0x80930cb1849f7d42531506ff45e66724338a821b" + abi: DODOIncentive + startBlock: 4208077 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODOIncentive/DODOIncentive.wasm + entities: + - Pair + - Token + abis: + - name: DODO + file: ../abis/DODO.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: DODOIncentive + file: ../abis/DODOIncentive.json + eventHandlers: + - event: Incentive(address,uint256) + handler: handleIncentive + - kind: ethereum/contract + name: DODOV2Proxy01 + network: bsc + source: + address: "0xb57dd5c265dbb13ca014f2332069e90cd0e22e65" + abi: DODOV2Proxy01 + startBlock: 4208152 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODORouteProxy/DODORouteProxy.wasm + entities: + - Pair + - Token + abis: + - name: DODOV2Proxy01 + file: ../abis/DODOV2Proxy01.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory + - kind: ethereum/contract + name: DODOV2Proxy02_2012_02_17 + network: bsc + source: + address: "0xd56281ef996b6b29874c77d2e1464216e8043127" + abi: DODOV2Proxy02 + startBlock: 4675013 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODORouteProxy/DODORouteProxy.wasm + entities: + - Pair + - Token + abis: + - name: DODOV2Proxy02 + file: ../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory + - kind: ethereum/contract + name: DODOV2Proxy02 + network: bsc + source: + address: "0x8f8dd7db1bda5ed3da8c9daf3bfa471c12d58486" + abi: DODOV2Proxy02 + startBlock: 4926661 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODORouteProxy/DODORouteProxy.wasm + entities: + - Pair + - Token + abis: + - name: DODOV2Proxy02 + file: ../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory + - kind: ethereum/contract + name: DODOFeeRouteProxy + network: bsc + source: + address: "0x0656fd85364d03b103ceeda192fb2d3906a6ac15" + abi: DODOFeeRouteProxy + startBlock: 23887578 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODORouteProxy/DODORouteProxy.wasm + entities: + - Pair + - Token + abis: + - name: DODOFeeRouteProxy + file: ../abis/DODOFeeRouteProxy.json + - name: DODOV2Proxy02 + file: ../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory + - kind: ethereum/contract + name: DODOFeeRouteProxy-widgit + network: bsc + source: + address: "0xa8b034301bb5dd3610db585def3e7c0d52f2319f" + abi: DODOFeeRouteProxy + startBlock: 23887578 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODORouteProxy/DODORouteProxy.wasm + entities: + - Pair + - Token + abis: + - name: DODOFeeRouteProxy + file: ../abis/DODOFeeRouteProxy.json + - name: DODOV2Proxy02 + file: ../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory + - kind: ethereum/contract + name: DODOFeeRouteProxy-widgit-24-6-5 + network: bsc + source: + address: "0xb95ed7e958e196688984951f41ac2888f4b10ab9" + abi: DODOFeeRouteProxy + startBlock: 39336465 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODORouteProxy/DODORouteProxy.wasm + entities: + - Pair + - Token + abis: + - name: DODOFeeRouteProxy + file: ../abis/DODOFeeRouteProxy.json + - name: DODOV2Proxy02 + file: ../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory + - kind: ethereum/contract + name: DVMFactory_2020_02_21 + network: bsc + source: + address: "0xf50bdc9e90b7a1c138cb7935071b85c417c4cb8e" + abi: DVMFactory + startBlock: 5674967 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODONFTRegistry/DODONFTRegistry.wasm + entities: + - Pair + - Token + abis: + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: DVM + file: ../abis/DVM.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + eventHandlers: + - event: NewDVM(address,address,address,address) + handler: handleNewDVM + - kind: ethereum/contract + name: DVMFactory_2020_02_16 + network: bsc + source: + address: "0x790b4a80fb1094589a3c0efc8740aa9b0c1733fb" + abi: DVMFactory + startBlock: 5730780 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODONFTRegistry/DODONFTRegistry.wasm + entities: + - Pair + - Token + abis: + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: DVM + file: ../abis/DVM.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + eventHandlers: + - event: NewDVM(address,address,address,address) + handler: handleNewDVM + - kind: ethereum/contract + name: DPPFactory_2021_01_22 + network: bsc + source: + address: "0x7737fd30535c69545deeea54ab8dd590ccaebd3c" + abi: DPPFactory + startBlock: 4208108 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODONFTRegistry/DODONFTRegistry.wasm + entities: + - Pair + - Token + abis: + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: DPP + file: ../abis/DPP.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + eventHandlers: + - event: NewDPP(address,address,address,address) + handler: handleNewDPP + - kind: ethereum/contract + name: DPPFactory_2021_02_17 + network: bsc + source: + address: "0x9b64c81ba54ea51e1f6b7fefb3cff8aa6f1e2a09" + abi: DPPFactory + startBlock: 4323290 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODONFTRegistry/DODONFTRegistry.wasm + entities: + - Pair + - Token + abis: + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: DPP + file: ../abis/DPP.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + eventHandlers: + - event: NewDPP(address,address,address,address) + handler: handleNewDPP + - kind: ethereum/contract + name: DPPFactory + network: bsc + source: + address: "0xafe0a75dffb395eaabd0a7e1bbbd0b11f8609eef" + abi: DPPFactory + startBlock: 4926619 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODONFTRegistry/DODONFTRegistry.wasm + entities: + - Pair + - Token + abis: + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: DPP + file: ../abis/DPP.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + eventHandlers: + - event: NewDPP(address,address,address,address) + handler: handleNewDPP + - event: RemoveDPP(address) + handler: handleRemoveDPP + - kind: ethereum/contract + name: DPPFactory_21_10_13 + network: bsc + source: + address: "0xd9cac3d964327e47399aebd8e1e6dcc4c251daae" + abi: DPPFactory + startBlock: 11677242 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODONFTRegistry/DODONFTRegistry.wasm + entities: + - Pair + - Token + abis: + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: DPP + file: ../abis/DPP.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + eventHandlers: + - event: NewDPP(address,address,address,address) + handler: handleNewDPP + - event: RemoveDPP(address) + handler: handleRemoveDPP + - kind: ethereum/contract + name: DSPFactory + network: bsc + source: + address: "0x0fb9815938ad069bf90e14fe6c596c514bede767" + abi: DSPFactory + startBlock: 6695425 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODONFTRegistry/DODONFTRegistry.wasm + entities: + - Pair + - Token + abis: + - name: DSPFactory + file: ../abis/DSPFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: DSP + file: ../abis/DSP.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + eventHandlers: + - event: NewDSP(address,address,address,address) + handler: handleNewDSP + - event: RemoveDSP(address) + handler: handleRemoveDSP + - kind: ethereum/contract + name: CrowdPoolingFactory_20200721 + network: bsc + source: + address: "0x9ae501385bc7996a2a4a1fbb00c8d3820611bcb5" + abi: CrowdPoolingFactory + startBlock: 4208124 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODONFTRegistry/DODONFTRegistry.wasm + entities: + - Pair + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: CrowdPoolingFactory + file: ../abis/CrowdPoolingFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: CP + file: ../abis/CP.json + eventHandlers: + - event: NewCP(address,address,address,address) + handler: handleNewCP + - kind: ethereum/contract + name: CrowdPoolingFactory + network: bsc + source: + address: "0x778df5b12170e8af8df94356bfc864e57ce185dc" + abi: CrowdPoolingFactory + startBlock: 4926634 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODONFTRegistry/DODONFTRegistry.wasm + entities: + - Pair + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: CrowdPoolingFactory + file: ../abis/CrowdPoolingFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: CP + file: ../abis/CP.json + eventHandlers: + - event: NewCP(address,address,address,address) + handler: handleNewCP + - kind: ethereum/contract + name: CrowdPoolingFactoryV2 + network: bsc + source: + address: "0x9c9ef6820a1aa0e25770ccde4e974f81cb28debc" + abi: CrowdPoolingFactory + startBlock: 13920938 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODONFTRegistry/DODONFTRegistry.wasm + entities: + - Pair + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: CrowdPoolingFactory + file: ../abis/CrowdPoolingFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: CP + file: ../abis/CP.json + - name: CPV2 + file: ../abis/CPV2.json + eventHandlers: + - event: NewCP(address,address,address,address) + handler: handleNewCP + - kind: ethereum/contract + name: CrowdPoolingFactoryV3 + network: bsc + source: + address: "0x224fece8104771478a3a4ce6d92ab1538d3659ee" + abi: CrowdPoolingFactory + startBlock: 19507160 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODONFTRegistry/DODONFTRegistry.wasm + entities: + - Pair + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: CrowdPoolingFactory + file: ../abis/CrowdPoolingFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: CP + file: ../abis/CP.json + - name: CPV2 + file: ../abis/CPV2.json + eventHandlers: + - event: NewCP(address,address,address,address) + handler: handleNewCP + - kind: ethereum/contract + name: UpCrowdPoolingFactory + network: bsc + source: + address: "0x4f57f6929e58ae564f6ab090fe0aeecb39b0f270" + abi: UpCrowdPoolingFactory + startBlock: 5699943 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODONFTRegistry/DODONFTRegistry.wasm + entities: + - Pair + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: CrowdPoolingFactory + file: ../abis/CrowdPoolingFactory.json + - name: UpCrowdPoolingFactory + file: ../abis/UpCrowdPoolingFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: CP + file: ../abis/CP.json + eventHandlers: + - event: NewCP(address,address,address,address) + handler: handleNewCP + - kind: ethereum/contract + name: DODOZoo + network: bsc + source: + address: "0xca459456a45e300aa7ef447dbb60f87cccb42828" + abi: DODOZoo + startBlock: 726278 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODOZoo/DODOZoo.wasm + entities: + - Pair + - Token + abis: + - name: DODOZoo + file: ../abis/DODOZoo.json + - name: DODO + file: ../abis/DODO.json + - name: DVM + file: ../abis/DVM.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: DODOBirth(address,address,address) + handler: handleDODOBirth templates: - kind: ethereum/contract - name: ERC20MineV3 - network: bitlayer + name: DVM + network: bsc source: - abi: ERC20MineV3 + abi: DVM mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript - file: templates/ERC20MineV3/ERC20MineV3.wasm + file: templates/DVM/DVM.wasm entities: - - MinePool + - Pair + - Token + - DODOSwap abis: - - name: ERC20MineV3 - file: ../abis/ERC20MineV3.json + - name: DVM + file: ../abis/DVM.json + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + - name: DODOZoo + file: ../abis/DODOZoo.json + - name: DPP + file: ../abis/DPP.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json eventHandlers: - - event: Deposit(indexed address,uint256) + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: BuyShares(address,uint256,uint256) + handler: handleBuyShares + - event: SellShares(address,address,uint256,uint256) + handler: handleSellShares + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer + - kind: ethereum/contract + name: DPP + network: bsc + source: + abi: DPP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/DVM/DVM.wasm + entities: + - Pair + - Token + abis: + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + - name: DODOZoo + file: ../abis/DODOZoo.json + eventHandlers: + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: LpFeeRateChange(uint256) + handler: handleLpFeeRateChange + - kind: ethereum/contract + name: DPPOracleAdmin + network: bsc + source: + abi: DPPOracleAdmin + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/DVM/DVM.wasm + entities: + - Pair + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: DPPOracleAdmin + file: ../abis/DPPOracleAdmin.json + - name: DODO + file: ../abis/DODO.json + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + - name: DODOZoo + file: ../abis/DODOZoo.json + eventHandlers: + - event: OwnershipTransferred(indexed address,indexed address) + handler: handleDPPOwnershipTransferred + - kind: ethereum/contract + name: DSP + network: bsc + source: + abi: DSP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/DVM/DVM.wasm + entities: + - Pair + - Token + - DODOSwap + abis: + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: DSPFactory + file: ../abis/DSPFactory.json + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: DSP + file: ../abis/DSP.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + - name: DODOZoo + file: ../abis/DODOZoo.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: BuyShares(address,uint256,uint256) + handler: handleBuyShares + - event: SellShares(address,address,uint256,uint256) + handler: handleSellShares + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer + - kind: ethereum/contract + name: CP + network: bsc + source: + abi: CP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/CP/CP.wasm + entities: + - CrowdPooling + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: CP + file: ../abis/CP.json + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DODOZoo + file: ../abis/DODOZoo.json + eventHandlers: + - event: Bid(address,uint256,uint256) + handler: handleBid + - event: Cancel(address,uint256) + handler: handleCancel + - event: Settle() + handler: handleSettle + - event: Claim(address,uint256,uint256) + handler: handleClaim + - kind: ethereum/contract + name: DODO + network: bsc + source: + abi: DODO + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODOZoo/DODOZoo.wasm + entities: + - Pair + - Token + abis: + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: DODO + file: ../abis/DODO.json + - name: DODOZoo + file: ../abis/DODOZoo.json + - name: DVM + file: ../abis/DVM.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: Deposit(indexed address,indexed address,bool,uint256,uint256) handler: handleDeposit - - event: Withdraw(indexed address,uint256) + - event: Withdraw(indexed address,indexed address,bool,uint256,uint256) handler: handleWithdraw - - event: NewRewardToken(indexed uint256,address) - handler: handleNewRewardToken - - event: UpdateEndBlock(indexed uint256,uint256) - handler: handleUpdateEndBlock - - event: UpdateReward(indexed uint256,uint256) - handler: handleUpdateReward + - event: SellBaseToken(indexed address,uint256,uint256) + handler: handleSellBaseToken + - event: BuyBaseToken(indexed address,uint256,uint256) + handler: handleBuyBaseToken + - event: UpdateLiquidityProviderFeeRate(uint256,uint256) + handler: handleUpdateLiquidityProviderFeeRate + - event: ClaimAssets(indexed address,uint256,uint256) + handler: handleClaimAssets + - event: ChargeMaintainerFee(indexed address,bool,uint256) + handler: handleChargeMaintainerFee + - event: UpdateMaintainerFeeRate(uint256,uint256) + handler: handleUpdateMaintainerFeeRate + - kind: ethereum/contract + name: ERC20 + network: bsc + source: + abi: ERC20 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/ERC20/ERC20.wasm + entities: + - Pair + - Token + abis: + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: DODO + file: ../abis/DODO.json + - name: DODOZoo + file: ../abis/DODOZoo.json + - name: DVM + file: ../abis/DVM.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer + - kind: ethereum/contract + name: DODOLpToken + network: bsc + source: + abi: DODOLpToken + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/ERC20/ERC20.wasm + entities: + - Pair + - Token + abis: + - name: DODOLpToken + file: ../abis/DODOLpToken.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer + - kind: ethereum/contract + name: CPV2 + network: bsc + source: + abi: CPV2 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/CP/CP.wasm + entities: + - CrowdPooling + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: CP + file: ../abis/CP.json + - name: CPV2 + file: ../abis/CPV2.json + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DODOZoo + file: ../abis/DODOZoo.json + eventHandlers: + - event: Bid(address,uint256,uint256) + handler: handleBid + - event: Cancel(address,uint256) + handler: handleCancel + - event: Settle() + handler: handleSettle diff --git a/build/templates/CP/CP.wasm b/build/templates/CP/CP.wasm index 3271ffb47792c27aaa38dcd681de09a3f2b13858..4a744240bc8f529317e520e3a4fbd4b7bff44e43 100644 GIT binary patch delta 12306 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 I_Oq-17jSqnk^lez diff --git a/build/templates/DODOLpToken/DODOLpToken.wasm b/build/templates/DODOLpToken/DODOLpToken.wasm index ab9e23521db3d0600c44f9f0725236d2f3b9c8ac..23ee168cb96bd62bbbdcaace8d5471e132017939 100644 GIT binary patch delta 4859 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 delta 4654 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 JvW81Q-QTJcPl84b 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 delta 24014 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 Q{Qv*_v1jLvVB3fPKU*&7n*aa+ diff --git a/package.json b/package.json index 42dd86b..71eae1f 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "index": "bin/index.js" }, "dependencies": { - "@graphprotocol/graph-cli": "0.53.0", + "@graphprotocol/graph-cli": "0.78.0", "@graphprotocol/graph-ts": "0.29.3", "source-map-support": "^0.5.21" }, diff --git a/src/mappings/constant-arb-sep.ts b/src/mappings/constant-arb-sep.ts new file mode 100644 index 0000000..51573e9 --- /dev/null +++ b/src/mappings/constant-arb-sep.ts @@ -0,0 +1,49 @@ +//kovan +export const TYPE_VIRTUAL_POOL = "VIRTUAL"; +export const TYPE_DVM_POOL = "DVM"; +export const TYPE_DPP_POOL = "DPP"; +export const TYPE_DSP_POOL = "DSP"; +export const TYPE_CLASSICAL_POOL = "CLASSICAL"; +export const SOURCE_SMART_ROUTE = "SMART_ROUTE"; +export const SOURCE_POOL_SWAP = "DODO_POOL"; +export const DODOZooID = "dodoex-v2-arb-sep"; +export const CHAIN_BASE_COIN_SYMBOL = "ETH"; +export const CHAIN_BASE_COIN_NAME = "ethereum"; +export const DIP3_TIMESTAMP = 1624442400; + +export const SMART_ROUTE_ADDRESSES: string[] = [ + "0x9c2006A5179ee13A90fE4894e75464a3D91Beb70", +]; +export const DVM_FACTORY_ADDRESS = "0xDF44F395F85D298C7fAD8Bfc71De5dFF9a129d36"; +export const DPP_FACTORY_ADDRESS = "0xed44c4073Dc5e5572670aDAC25EB5B46bAdc178F"; +export const CLASSIC_FACTORY_ADDRESS = + "0x82d5730AB72a5e0ec6E85107418ECe79f4455dBa"; +export const CROWDPOOLING_FACTORY_V2: string[] = [ + "0x82d5730AB72a5e0ec6E85107418ECe79f4455dBa", +]; + +export const DVM_FACTORY_DEPLOY_BLOCK = 58; +export const DPP_FACTORY_DEPLOY_BLOCK = 58; + +export const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; +export const BASE_COIN = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; + +export const TRANSACTION_TYPE_SWAP = "SWAP"; +export const TRANSACTION_TYPE_LP_ADD = "LP_ADD"; +export const TRANSACTION_TYPE_LP_REMOVE = "LP_REMOVE"; +export const TRANSACTION_TYPE_CP_BID = "CP_BID"; +export const TRANSACTION_TYPE_CP_CANCEL = "CP_CANCEL"; +export const TRANSACTION_TYPE_CP_CLAIM = "CP_CLAIM"; + +/** + * usd pricing + */ +export const WRAPPED_BASE_COIN = "0x3a64Ec3606FF7310E8fAd6FcC008e39705fB496d"; +//pricing supported stable coins +export const STABLE_ONE_ADDRESS = "0xb95ed7e958e196688984951f41ac2888f4b10ab9"; //usdt +export const STABLE_TWO_ADDRESS = "0x46afe01d758a46d64c7d8e0791314d5db3e2e683"; //usdc +//stable coins pairs +export const STABLE_COIN_PAIR_ONE = + "0xe8c1b7e0505c97c59ff2f12ebf91a8eaa59d4c73"; //[USDT_USDC_PAIR] +//base currency pair +export const BASE_COIN_PAIR = "0x75f5d66a7bbb9330a9067c0833ec9b3198b71666"; //[WETH_USDC_PAIR] diff --git a/src/mappings/constant.ts b/src/mappings/constant.ts index ba94a88..b01908f 100644 --- a/src/mappings/constant.ts +++ b/src/mappings/constant.ts @@ -1,4 +1,4 @@ -//kovan +//bsc export const TYPE_VIRTUAL_POOL = "VIRTUAL"; export const TYPE_DVM_POOL = "DVM"; export const TYPE_DPP_POOL = "DPP"; @@ -6,44 +6,44 @@ export const TYPE_DSP_POOL = "DSP"; export const TYPE_CLASSICAL_POOL = "CLASSICAL"; export const SOURCE_SMART_ROUTE = "SMART_ROUTE"; export const SOURCE_POOL_SWAP = "DODO_POOL"; -export const DODOZooID = "dodoex-v2-bitlayer"; -export const CHAIN_BASE_COIN_SYMBOL = "ETH"; -export const CHAIN_BASE_COIN_NAME = "ethereum"; +export const DODOV2Proxy01="0xb57dd5c265dbb13ca014f2332069e90cd0e22e65"; +export const DODOV2Proxy02_2021_02_17="0xd56281ef996b6b29874c77d2e1464216e8043127"; +export const DODOV2Proxy02="0xd56281ef996b6b29874c77d2e1464216e8043127"; export const DIP3_TIMESTAMP = 1624442400; -export const SMART_ROUTE_ADDRESSES: string[] = [ - "0x3b0c6c0CE667844e742Ce0Ca533EaA2b6f422AA8", -]; -export const DVM_FACTORY_ADDRESS = "0x7Ad992fcebd899ddbEF7f031dCF96f382b81ECea"; -export const DPP_FACTORY_ADDRESS = "0x4c3c61cba411C9B60DC371b031262c730D3Da6a3"; -export const CLASSIC_FACTORY_ADDRESS = - "0xB3d4823e02A9AB9A9A0Cc1636E776c360B67bED1"; -export const CROWDPOOLING_FACTORY_V2: string[] = [ - "0xB3d4823e02A9AB9A9A0Cc1636E776c360B67bED1", -]; - -export const DVM_FACTORY_DEPLOY_BLOCK = 58; -export const DPP_FACTORY_DEPLOY_BLOCK = 58; - -export const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; -export const BASE_COIN = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; - -export const TRANSACTION_TYPE_SWAP = "SWAP"; -export const TRANSACTION_TYPE_LP_ADD = "LP_ADD"; -export const TRANSACTION_TYPE_LP_REMOVE = "LP_REMOVE"; -export const TRANSACTION_TYPE_CP_BID = "CP_BID"; -export const TRANSACTION_TYPE_CP_CANCEL = "CP_CANCEL"; -export const TRANSACTION_TYPE_CP_CLAIM = "CP_CLAIM"; +export const DODOZooID = "dodoex-v2-bsc"; +export const CHAIN_BASE_COIN_SYMBOL = "BNB"; +export const CHAIN_BASE_COIN_NAME = "Bnb"; + +export const SMART_ROUTE_ADDRESSES: string[]= ["0xb57dd5c265dbb13ca014f2332069e90cd0e22e65","0xd56281ef996b6b29874c77d2e1464216e8043127","0x8f8dd7db1bda5ed3da8c9daf3bfa471c12d58486","0xbe9a66e49503e84ae59a4d0545365AABedf33b40"]; +export const DVM_FACTORY_ADDRESS = "0xf50bdc9e90b7a1c138cb7935071b85c417c4cb8e"; +export const DPP_FACTORY_ADDRESS = "0x7737fd30535c69545deeea54ab8dd590ccaebd3c"; +export const CLASSIC_FACTORY_ADDRESS = "0xca459456a45e300aa7ef447dbb60f87cccb42828";//dodo zoo +export const CROWDPOOLING_FACTORY_V2: string[]=["0x9c9ef6820a1aa0e25770ccde4e974f81cb28debc"]; + +export const ADDRESS_ZERO = '0x0000000000000000000000000000000000000000' +export const BASE_COIN = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'; + + +export const TRANSACTION_TYPE_SWAP = "SWAP" +export const TRANSACTION_TYPE_LP_ADD = "LP_ADD" +export const TRANSACTION_TYPE_LP_REMOVE = "LP_REMOVE" +export const TRANSACTION_TYPE_CP_BID = "CP_BID" +export const TRANSACTION_TYPE_CP_CANCEL = "CP_CANCEL" +export const TRANSACTION_TYPE_CP_CLAIM = "CP_CLAIM" /** * usd pricing */ -export const WRAPPED_BASE_COIN = "0x3a64Ec3606FF7310E8fAd6FcC008e39705fB496d"; +export const WRAPPED_BASE_COIN = '0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c'; //pricing supported stable coins -export const STABLE_ONE_ADDRESS = "0xb95ed7e958e196688984951f41ac2888f4b10ab9"; //usdt -export const STABLE_TWO_ADDRESS = "0x46afe01d758a46d64c7d8e0791314d5db3e2e683"; //usdc +export const STABLE_ONE_ADDRESS = '0x55d398326f99059ff775485246999027b3197955';//usdt +export const STABLE_TWO_ADDRESS = '0xe9e7cea3dedca5984780bafc599bd69add087d56';//busd //stable coins pairs -export const STABLE_COIN_PAIR_ONE = - "0xe8c1b7e0505c97c59ff2f12ebf91a8eaa59d4c73"; //[USDT_USDC_PAIR] +export const STABLE_COIN_PAIR_ONE = '0xbe60d4c4250438344bec816ec2dec99925deb4c7';//[USDT_BUSD_PAIR] //base currency pair -export const BASE_COIN_PAIR = "0x75f5d66a7bbb9330a9067c0833ec9b3198b71666"; //[WETH_USDC_PAIR] +export const BASE_COIN_PAIR = '0x327134de48fcdd75320f4c32498d1980470249ae';//[WBNB_BUSD_PAIR] + + + + diff --git a/src/mappings/dodoex/helpers.ts b/src/mappings/dodoex/helpers.ts index ddd98d8..78479ee 100644 --- a/src/mappings/dodoex/helpers.ts +++ b/src/mappings/dodoex/helpers.ts @@ -529,7 +529,11 @@ export function updateVirtualPairVolume( return pair as Pair; } -export function createLpToken(address: Address, pair: Pair): LpToken { +export function createLpToken( + address: Address, + pair: Pair, + isUpdateTotalSupply: boolean = true +): LpToken { let lpToken = LpToken.load(address.toHexString()); if (lpToken == null) { @@ -546,12 +550,14 @@ export function createLpToken(address: Address, pair: Pair): LpToken { //for V1 classical hardcode pools if (lpToken.symbol == "unknown") { lpToken.symbol = fetchTokenSymbol(address); - lpToken.totalSupply = fetchTokenTotalSupply(address); lpToken.name = fetchTokenName(address); lpToken.decimals = fetchTokenDecimals(address); lpToken.save(); } + if (isUpdateTotalSupply || lpToken.symbol == "unknown") { + lpToken.totalSupply = fetchTokenTotalSupply(address); + } return lpToken as LpToken; } @@ -598,8 +604,9 @@ export function getPMMState( let pool = DVM.bind(poolAddress); let pmmState = pool.try_getPMMState(); if (pmmState.reverted == false) { - return pmmState.value as DVM__getPMMStateResultStateStruct; + log.warning("getPMMState reverted: {}", [poolAddress.toHexString()]); } + return pmmState.value as DVM__getPMMStateResultStateStruct; } return null; } @@ -620,14 +627,8 @@ export function updatePairTraderCount( pair: Pair, event: ethereum.Event ): void { - let fromPairID = from - .toHexString() - .concat("-") - .concat(pair.id); - let toPairID = to - .toHexString() - .concat("-") - .concat(pair.id); + let fromPairID = from.toHexString().concat("-").concat(pair.id); + let toPairID = to.toHexString().concat("-").concat(pair.id); let fromTraderPair = PairTrader.load(fromPairID); if (fromTraderPair == null) { @@ -696,12 +697,10 @@ export function updateStatistics( volumeUSD: BigDecimal ): void { let pairHourData = updatePairHourData(event, pair); - pairHourData.untrackedBaseVolume = pairHourData.untrackedBaseVolume.plus( - untrackedBaseVolume - ); - pairHourData.untrackedQuoteVolume = pairHourData.untrackedBaseVolume.plus( - untrackedQuoteVolume - ); + pairHourData.untrackedBaseVolume = + pairHourData.untrackedBaseVolume.plus(untrackedBaseVolume); + pairHourData.untrackedQuoteVolume = + pairHourData.untrackedBaseVolume.plus(untrackedQuoteVolume); pairHourData.volumeBase = pairHourData.volumeBase.plus(baseVolume); pairHourData.volumeQuote = pairHourData.volumeQuote.plus(quoteVolume); pairHourData.feeBase = pairHourData.feeBase.plus(feeBase); @@ -710,12 +709,10 @@ export function updateStatistics( pairHourData.updatedAt = event.block.timestamp; let pairDayData = updatePairDayData(event, pair); - pairDayData.untrackedBaseVolume = pairDayData.untrackedBaseVolume.plus( - untrackedBaseVolume - ); - pairDayData.untrackedQuoteVolume = pairDayData.untrackedBaseVolume.plus( - untrackedQuoteVolume - ); + pairDayData.untrackedBaseVolume = + pairDayData.untrackedBaseVolume.plus(untrackedBaseVolume); + pairDayData.untrackedQuoteVolume = + pairDayData.untrackedBaseVolume.plus(untrackedQuoteVolume); pairDayData.volumeBase = pairDayData.volumeBase.plus(baseVolume); pairDayData.volumeQuote = pairDayData.volumeQuote.plus(quoteVolume); pairDayData.feeBase = pairDayData.feeBase.plus(feeBase); @@ -724,9 +721,8 @@ export function updateStatistics( pairDayData.updatedAt = event.block.timestamp; let baseDayData = updateTokenDayData(baseToken, event); - baseDayData.untrackedVolume = baseDayData.untrackedVolume.plus( - untrackedBaseVolume - ); + baseDayData.untrackedVolume = + baseDayData.untrackedVolume.plus(untrackedBaseVolume); baseDayData.volume = baseDayData.volume.plus(baseVolume); baseDayData.fee = baseDayData.fee.plus(feeBase); baseDayData.txns = baseDayData.txns.plus(ONE_BI); @@ -734,9 +730,8 @@ export function updateStatistics( baseDayData.updatedAt = event.block.timestamp; let quoteDayData = updateTokenDayData(quoteToken, event); - quoteDayData.untrackedVolume = baseDayData.untrackedVolume.plus( - untrackedQuoteVolume - ); + quoteDayData.untrackedVolume = + baseDayData.untrackedVolume.plus(untrackedQuoteVolume); quoteDayData.volume = quoteDayData.volume.plus(quoteVolume); quoteDayData.fee = quoteDayData.fee.plus(feeQuote); quoteDayData.txns = quoteDayData.txns.plus(ONE_BI); @@ -744,10 +739,7 @@ export function updateStatistics( quoteDayData.updatedAt = event.block.timestamp; let fromTraderPair = PairTrader.load( - event.transaction.from - .toHexString() - .concat("-") - .concat(pair.id) + event.transaction.from.toHexString().concat("-").concat(pair.id) ); pairHourData.traders = pairHourData.traders.plus(ONE_BI); baseDayData.traders = baseDayData.traders.plus(ONE_BI); @@ -759,10 +751,7 @@ export function updateStatistics( } let toTraderPair = PairTrader.load( - to - .toHexString() - .concat("-") - .concat(pair.id) + to.toHexString().concat("-").concat(pair.id) ); pairHourData.traders = pairHourData.traders.plus(ONE_BI); baseDayData.traders = baseDayData.traders.plus(ONE_BI); diff --git a/src/mappings/dodoex/pool.ts b/src/mappings/dodoex/pool.ts index 336bcaf..69dc2ac 100644 --- a/src/mappings/dodoex/pool.ts +++ b/src/mappings/dodoex/pool.ts @@ -24,6 +24,7 @@ import { updateUserDayDataAndDodoDayData, updateTokenTraderCount, createPairDetail, + exponentToBigDecimal, } from "./helpers"; import { DODOSwap, @@ -157,15 +158,13 @@ export function handleDODOSwap(event: DODOSwap): void { pair.untrackedQuoteVolume = pair.untrackedQuoteVolume.plus(quoteVolume); untrackedBaseVolume = baseVolume; untrackedQuoteVolume = quoteVolume; - fromToken.untrackedVolume = fromToken.untrackedVolume.plus( - dealedFromAmount - ); + fromToken.untrackedVolume = + fromToken.untrackedVolume.plus(dealedFromAmount); toToken.untrackedVolume = fromToken.untrackedVolume.plus(dealedToAmount); } pair.untrackedBaseVolume = pair.untrackedBaseVolume.plus(untrackedBaseVolume); - pair.untrackedQuoteVolume = pair.untrackedQuoteVolume.plus( - untrackedQuoteVolume - ); + pair.untrackedQuoteVolume = + pair.untrackedQuoteVolume.plus(untrackedQuoteVolume); pair.save(); //3、user info update @@ -304,17 +303,19 @@ export function handleBuyShares(event: BuyShares): void { } createPairDetail(pair, pmmState, event.block.timestamp); - let baseAmountChange = convertTokenToDecimal( - pmmState.B, - baseToken.decimals - ).minus(pair.baseReserve); - let quoteAmountChange = convertTokenToDecimal( - pmmState.Q, - quoteToken.decimals - ).minus(pair.quoteReserve); - let lpToken = createLpToken(event.address, pair as Pair); + let baseAmountChange = event.params.increaseShares + .toBigDecimal() + .div(lpToken.totalSupply.toBigDecimal()) + .times(pmmState.B.toBigDecimal()) + .div(exponentToBigDecimal(lpToken.decimals)); + let quoteAmountChange = event.params.increaseShares + .toBigDecimal() + .div(lpToken.totalSupply.toBigDecimal()) + .times(pmmState.Q.toBigDecimal()) + .div(exponentToBigDecimal(lpToken.decimals)); + let dealedSharesAmount = convertTokenToDecimal( event.params.increaseShares, lpToken.decimals @@ -352,7 +353,6 @@ export function handleBuyShares(event: BuyShares): void { baseToken.txCount = baseToken.txCount.plus(ONE_BI); quoteToken.txCount = quoteToken.txCount.plus(ONE_BI); - lpToken.totalSupply = lpToken.totalSupply.plus(event.params.increaseShares); //增加shares发生时的快照 let liquidityHistoryID = event.transaction.hash @@ -434,9 +434,19 @@ export function handleSellShares(event: SellShares): void { return; } createPairDetail(pair, pmmState, event.block.timestamp); - let lpToken = createLpToken(event.address, pair as Pair); + let baseAmountChange = event.params.decreaseShares + .toBigDecimal() + .div(lpToken.totalSupply.toBigDecimal()) + .times(pmmState.B.toBigDecimal()) + .div(exponentToBigDecimal(lpToken.decimals)); + let quoteAmountChange = event.params.decreaseShares + .toBigDecimal() + .div(lpToken.totalSupply.toBigDecimal()) + .times(pmmState.Q.toBigDecimal()) + .div(exponentToBigDecimal(lpToken.decimals)); + let dealedSharesAmount = convertTokenToDecimal( event.params.decreaseShares, lpToken.decimals @@ -477,7 +487,6 @@ export function handleSellShares(event: SellShares): void { baseToken.txCount = baseToken.txCount.plus(ONE_BI); quoteToken.txCount = quoteToken.txCount.plus(ONE_BI); - lpToken.totalSupply = lpToken.totalSupply.minus(event.params.decreaseShares); //增加shares发生时的快照 let liquidityHistoryID = event.transaction.hash .toHexString() @@ -502,6 +511,8 @@ export function handleSellShares(event: SellShares): void { lpToken.totalSupply, lpToken.decimals ); + liquidityHistory.baseAmountChange = baseAmountChange; + liquidityHistory.quoteAmountChange = quoteAmountChange; } //更新时间戳 @@ -598,9 +609,8 @@ export function handleTransfer(event: Transfer): void { position.lastTxTime = event.block.timestamp; position.liquidityTokenInMining = ZERO_BD; } - position.liquidityTokenBalance = position.liquidityTokenBalance.plus( - dealedAmount - ); + position.liquidityTokenBalance = + position.liquidityTokenBalance.plus(dealedAmount); position.updatedAt = event.block.timestamp; position.save(); } @@ -619,9 +629,8 @@ export function handleTransfer(event: Transfer): void { position.lastTxTime = ZERO_BI; position.liquidityTokenInMining = ZERO_BD; } - position.liquidityTokenBalance = position.liquidityTokenBalance.minus( - dealedAmount - ); + position.liquidityTokenBalance = + position.liquidityTokenBalance.minus(dealedAmount); position.updatedAt = event.block.timestamp; position.save(); } diff --git a/subgraphs/dodoex/dodoex_arb-sep.yaml b/subgraphs/dodoex/dodoex_arb-sep.yaml new file mode 100644 index 0000000..b02c5f2 --- /dev/null +++ b/subgraphs/dodoex/dodoex_arb-sep.yaml @@ -0,0 +1,680 @@ +specVersion: 0.0.4 +description: Dodoex.io +repository: https://github.com/DODOEX/dodoex_v2_subgraph +schema: + file: ./dodoex.graphql +dataSources: + - kind: ethereum/contract + name: DODOV2Proxy02 + network: arbitrum-sepolia + source: + address: '0x9c2006A5179ee13A90fE4894e75464a3D91Beb70' + abi: DODOV2Proxy02 + startBlock: 64710120 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/smartRoute.ts + entities: + - Pair + - Token + abis: + - name: DODOV2Proxy02 + file: ../../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory + - kind: ethereum/contract + name: DODOFeeRouteProxy + network: arbitrum-sepolia + source: + address: '0x7Bb76aDd60518CdcCC2888d3A37aC97BAf195F4E' + abi: DODOFeeRouteProxy + startBlock: 64710120 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/smartRoute.ts + entities: + - Pair + - Token + abis: + - name: DODOFeeRouteProxy + file: ../../abis/DODOFeeRouteProxy.json + - name: DODOV2Proxy02 + file: ../../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory + - kind: ethereum/contract + name: DODOFeeRouteProxy-widgit + network: arbitrum-sepolia + source: + address: '0x420A2fA0f4c4A1E209574454f399A4aB9b4ee5a0' + abi: DODOFeeRouteProxy + startBlock: 64710120 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/smartRoute.ts + entities: + - Pair + - Token + abis: + - name: DODOFeeRouteProxy + file: ../../abis/DODOFeeRouteProxy.json + - name: DODOV2Proxy02 + file: ../../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory + - kind: ethereum/contract + name: DVMFactory + network: arbitrum-sepolia + source: + address: '0xDF44F395F85D298C7fAD8Bfc71De5dFF9a129d36' + abi: DVMFactory + startBlock: 64710120 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/poolFactory.ts + entities: + - Pair + - Token + abis: + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: DVM + file: ../../abis/DVM.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + eventHandlers: + - event: NewDVM(address,address,address,address) + handler: handleNewDVM + - event: RemoveDVM(address) + handler: handleRemoveDVM + - kind: ethereum/contract + name: DPPFactory + network: arbitrum-sepolia + source: + address: "0xed44c4073Dc5e5572670aDAC25EB5B46bAdc178F" + abi: DPPFactory + startBlock: 64710120 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/poolFactory.ts + entities: + - Pair + - Token + abis: + - name: DPPFactory + file: ../../abis/DPPFactory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: DPP + file: ../../abis/DPP.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + eventHandlers: + - event: NewDPP(address,address,address,address) + handler: handleNewDPP + - kind: ethereum/contract + name: DSPFactory + network: arbitrum-sepolia + source: + address: '0x809fe4a7051304b08d6C8651d2d7f50668ab65DE' + abi: DSPFactory + startBlock: 64710120 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/poolFactory.ts + entities: + - Pair + - Token + abis: + - name: DSPFactory + file: ../../abis/DSPFactory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: DSP + file: ../../abis/DSP.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + eventHandlers: + - event: NewDSP(address,address,address,address) + handler: handleNewDSP + - event: RemoveDSP(address) + handler: handleRemoveDSP + - kind: ethereum/contract + name: CrowdPoolingFactory + network: arbitrum-sepolia + source: + address: '0x82d5730AB72a5e0ec6E85107418ECe79f4455dBa' + abi: CrowdPoolingFactory + startBlock: 64710120 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/poolFactory.ts + entities: + - Pair + - Token + abis: + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DODO + file: ../../abis/DODO.json + - name: CrowdPoolingFactory + file: ../../abis/CrowdPoolingFactory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: CP + file: ../../abis/CP.json + eventHandlers: + - event: NewCP(address,address,address,address) + handler: handleNewCP + # - kind: ethereum/contract + # name: CrowdPoolingFactoryV2 + # network: arbitrum-sepolia + # source: + # address: '0x9a8c0e8b27fff5d00402733ca67432b6d64faff4' + # abi: CrowdPoolingFactory + # startBlock: 4407201 + # mapping: + # kind: ethereum/events + # apiVersion: 0.0.6 + # language: wasm/assemblyscript + # file: ../../src/mappings/dodoex/poolFactory.ts + # entities: + # - Pair + # - Token + # abis: + # - name: DVM + # file: ../../abis/DVM.json + # - name: DPP + # file: ../../abis/DPP.json + # - name: CrowdPoolingFactory + # file: ../../abis/CrowdPoolingFactory.json + # - name: ERC20 + # file: ../../abis/ERC20.json + # - name: ERC20SymbolBytes + # file: ../../abis/ERC20SymbolBytes.json + # - name: ERC20NameBytes + # file: ../../abis/ERC20NameBytes.json + # - name: CP + # file: ../../abis/CP.json + # - name: CPV2 + # file: ../../abis/CPV2.json + # eventHandlers: + # - event: NewCP(address,address,address,address) + # handler: handleNewCP + # - kind: ethereum/contract + # name: UpCrowdPoolingFactory + # network: arbitrum-sepolia + # source: + # address: '0xE92787F457F541a9D5Ae17C1dbdBffA8D3BA3C25' + # abi: UpCrowdPoolingFactory + # startBlock: 226005 + # mapping: + # kind: ethereum/events + # apiVersion: 0.0.6 + # language: wasm/assemblyscript + # file: ../../src/mappings/dodoex/poolFactory.ts + # entities: + # - Pair + # - Token + # abis: + # - name: DVM + # file: ../../abis/DVM.json + # - name: DPP + # file: ../../abis/DPP.json + # - name: CrowdPoolingFactory + # file: ../../abis/CrowdPoolingFactory.json + # - name: UpCrowdPoolingFactory + # file: ../../abis/UpCrowdPoolingFactory.json + # - name: ERC20 + # file: ../../abis/ERC20.json + # - name: ERC20SymbolBytes + # file: ../../abis/ERC20SymbolBytes.json + # - name: ERC20NameBytes + # file: ../../abis/ERC20NameBytes.json + # - name: CP + # file: ../../abis/CP.json + # eventHandlers: + # - event: NewCP(address,address,address,address) + # handler: handleNewCP + # - kind: ethereum/contract + # name: DODOZoo + # network: arbitrum-sepolia + # source: + # address: '0xBcC3401E16C25EaF4d3FeD632ce3288503883B1f' + # abi: DODOZoo + # startBlock: 226006 + # mapping: + # kind: ethereum/events + # apiVersion: 0.0.6 + # language: wasm/assemblyscript + # file: ../../src/mappings/dodoex/classicPoolFromV1.ts + # entities: + # - Pair + # - Token + # abis: + # - name: DODOZoo + # file: ../../abis/DODOZoo.json + # - name: DVM + # file: ../../abis/DVM.json + # - name: DPP + # file: ../../abis/DPP.json + # - name: DODO + # file: ../../abis/DODO.json + # - name: ERC20 + # file: ../../abis/ERC20.json + # - name: ERC20SymbolBytes + # file: ../../abis/ERC20SymbolBytes.json + # - name: ERC20NameBytes + # file: ../../abis/ERC20NameBytes.json + # eventHandlers: + # - event: DODOBirth(address,address,address) + # handler: handleDODOBirth + # - kind: ethereum/contract + # name: DODOMine + # network: arbitrum-sepolia + # source: + # address: '0xe3c10989ddc5df5b1b9c0e6229c2e4e0862fde3e' + # abi: DODOMine + # startBlock: 226006 + # mapping: + # kind: ethereum/events + # apiVersion: 0.0.6 + # language: wasm/assemblyscript + # file: ../../src/mappings/dodoex/mine.ts + # entities: + # - User + # - StakeHistory + # abis: + # - name: DODOMine + # file: ../../abis/DODOMine.json + # - name: ERC20 + # file: ../../abis/ERC20.json + # - name: ERC20SymbolBytes + # file: ../../abis/ERC20SymbolBytes.json + # - name: ERC20NameBytes + # file: ../../abis/ERC20NameBytes.json + # eventHandlers: + # - event: Deposit(indexed address,indexed uint256,uint256) + # handler: handleDeposit + # - event: Withdraw(indexed address,indexed uint256,uint256) + # handler: handleWithdraw + # - event: Claim(indexed address,uint256) + # handler: handleClaim +templates: + - kind: ethereum/contract + name: DVM + network: arbitrum-sepolia + source: + abi: DVM + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/pool.ts + entities: + - Pair + - Token + - DODOSwap + abis: + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DODO + file: ../../abis/DODO.json + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: DPPFactory + file: ../../abis/DPPFactory.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + - name: DODOZoo + file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: BuyShares(address,uint256,uint256) + handler: handleBuyShares + - event: SellShares(address,address,uint256,uint256) + handler: handleSellShares + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer + - kind: ethereum/contract + name: DPP + network: arbitrum-sepolia + source: + abi: DPP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/pool.ts + entities: + - Pair + - Token + abis: + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DODO + file: ../../abis/DODO.json + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: DPPFactory + file: ../../abis/DPPFactory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + - name: DODOZoo + file: ../../abis/DODOZoo.json + eventHandlers: + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: LpFeeRateChange(uint256) + handler: handleLpFeeRateChange + - kind: ethereum/contract + name: DPPOracleAdmin + network: arbitrum-sepolia + source: + abi: DPPOracleAdmin + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/pool.ts + entities: + - Pair + - Token + abis: + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DPPOracleAdmin + file: ../../abis/DPPOracleAdmin.json + - name: DODO + file: ../../abis/DODO.json + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: DPPFactory + file: ../../abis/DPPFactory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + - name: DODOZoo + file: ../../abis/DODOZoo.json + eventHandlers: + - event: OwnershipTransferred(indexed address,indexed address) + handler: handleDPPOwnershipTransferred + - kind: ethereum/contract + name: DSP + network: arbitrum-sepolia + source: + abi: DSP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/pool.ts + entities: + - Pair + - Token + - DODOSwap + abis: + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: DPPFactory + file: ../../abis/DPPFactory.json + - name: DSPFactory + file: ../../abis/DSPFactory.json + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DSP + file: ../../abis/DSP.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + - name: DODOZoo + file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: BuyShares(address,uint256,uint256) + handler: handleBuyShares + - event: SellShares(address,address,uint256,uint256) + handler: handleSellShares + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer + - kind: ethereum/contract + name: CP + network: arbitrum-sepolia + source: + abi: CP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/crowdPooling.ts + entities: + - CrowdPooling + - Token + abis: + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DODO + file: ../../abis/DODO.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: CP + file: ../../abis/CP.json + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: DODOZoo + file: ../../abis/DODOZoo.json + eventHandlers: + - event: Bid(address,uint256,uint256) + handler: handleBid + - event: Cancel(address,uint256) + handler: handleCancel + - event: Settle() + handler: handleSettle + - event: Claim(address,uint256,uint256) + handler: handleClaim + - kind: ethereum/contract + name: DODO + network: arbitrum-sepolia + source: + abi: DODO + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/classicPoolFromV1.ts + entities: + - Pair + - Token + abis: + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DODO + file: ../../abis/DODO.json + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: DPPFactory + file: ../../abis/DPPFactory.json + - name: DODOZoo + file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: Deposit(indexed address,indexed address,bool,uint256,uint256) + handler: handleDeposit + - event: Withdraw(indexed address,indexed address,bool,uint256,uint256) + handler: handleWithdraw + - event: SellBaseToken(indexed address,uint256,uint256) + handler: handleSellBaseToken + - event: BuyBaseToken(indexed address,uint256,uint256) + handler: handleBuyBaseToken + - event: UpdateLiquidityProviderFeeRate(uint256,uint256) + handler: handleUpdateLiquidityProviderFeeRate + - event: ClaimAssets(indexed address,uint256,uint256) + handler: handleClaimAssets + - event: ChargeMaintainerFee(indexed address,bool,uint256) + handler: handleChargeMaintainerFee + - event: UpdateMaintainerFeeRate(uint256,uint256) + handler: handleUpdateMaintainerFeeRate + - kind: ethereum/contract + name: DODOLpToken + network: arbitrum-sepolia + source: + abi: DODOLpToken + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/lpToken.ts + entities: + - Pair + - Token + abis: + - name: DODOLpToken + file: ../../abis/DODOLpToken.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer + - kind: ethereum/contract + name: CPV2 + network: arbitrum-sepolia + source: + abi: CPV2 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/crowdPooling.ts + entities: + - CrowdPooling + - Token + abis: + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: CP + file: ../../abis/CP.json + - name: CPV2 + file: ../../abis/CPV2.json + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: DODOZoo + file: ../../abis/DODOZoo.json + eventHandlers: + - event: Bid(address,uint256,uint256) + handler: handleBid + - event: Cancel(address,uint256) + handler: handleCancel + - event: Settle() + handler: handleSettle diff --git a/subgraphs/dodoex/dodoex_bsc.yaml b/subgraphs/dodoex/dodoex_bsc.yaml index 951d9dc..4623ebe 100644 --- a/subgraphs/dodoex/dodoex_bsc.yaml +++ b/subgraphs/dodoex/dodoex_bsc.yaml @@ -1,8 +1,8 @@ specVersion: 0.0.4 description: Dodoex.io graft: - base: QmNjntYEcbLPzyvjhMCB3AruMbzWcU8UxrJAGcYvS3Aagf - block: 12241838 + base: QmU2D6A3QDtTwrzC6NgK2ngZEskS1bzEwo599bUdjhzPVz + block: 39336465 features: - grafting repository: https://github.com/DODOEX/dodoex_v2_subgraph @@ -270,6 +270,35 @@ dataSources: eventHandlers: - event: OrderHistory(address,address,address,uint256,uint256) handler: handleOrderHistory + - kind: ethereum/contract + name: DODOFeeRouteProxy-widgit-24-6-5 + network: bsc + source: + address: '0xb95ed7e958e196688984951f41ac2888f4b10ab9' + abi: DODOFeeRouteProxy + startBlock: 39336465 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/smartRoute.ts + entities: + - Pair + - Token + abis: + - name: DODOFeeRouteProxy + file: ../../abis/DODOFeeRouteProxy.json + - name: DODOV2Proxy02 + file: ../../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory - kind: ethereum/contract name: DVMFactory_2020_02_21 network: bsc @@ -723,6 +752,12 @@ templates: file: ../../abis/DODOZoo.json - name: DPP file: ../../abis/DPP.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: DODOSwap(address,address,uint256,uint256,address,address) handler: handleDODOSwap @@ -839,6 +874,12 @@ templates: file: ../../abis/FeeRateModel.json - name: DODOZoo file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: DODOSwap(address,address,uint256,uint256,address,address) handler: handleDODOSwap @@ -983,6 +1024,12 @@ templates: abis: - name: DODOLpToken file: ../../abis/DODOLpToken.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: Transfer(indexed address,indexed address,uint256) handler: handleTransfer diff --git a/subgraphs/dodoex/dodoex_dodochain-testnet.yaml b/subgraphs/dodoex/dodoex_dodochain-testnet.yaml index f0642ab..13c6689 100644 --- a/subgraphs/dodoex/dodoex_dodochain-testnet.yaml +++ b/subgraphs/dodoex/dodoex_dodochain-testnet.yaml @@ -385,6 +385,12 @@ templates: file: ../../abis/FeeRateModel.json - name: DODOZoo file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: DODOSwap(address,address,uint256,uint256,address,address) handler: handleDODOSwap @@ -503,6 +509,12 @@ templates: file: ../../abis/FeeRateModel.json - name: DODOZoo file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: DODOSwap(address,address,uint256,uint256,address,address) handler: handleDODOSwap @@ -618,6 +630,12 @@ templates: abis: - name: DODOLpToken file: ../../abis/DODOLpToken.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: Transfer(indexed address,indexed address,uint256) handler: handleTransfer diff --git a/subgraphs/dodoex/dodoex_scroll.yaml b/subgraphs/dodoex/dodoex_scroll.yaml index 8490dcc..6376277 100644 --- a/subgraphs/dodoex/dodoex_scroll.yaml +++ b/subgraphs/dodoex/dodoex_scroll.yaml @@ -1,5 +1,10 @@ specVersion: 0.0.4 description: Dodoex.io +graft: + base: QmXPLzbv59tXMDeAkJDZcpj2fZGCoGtHVDBV2Fz9KWuwci + block: 6285646 +features: + - grafting repository: https://github.com/DODOEX/dodoex_v2_subgraph schema: file: ./dodoex.graphql @@ -60,6 +65,35 @@ dataSources: eventHandlers: - event: OrderHistory(address,address,address,uint256,uint256) handler: handleOrderHistory + - kind: ethereum/contract + name: DODOFeeRouteProxy-24-6-5 + network: scroll + source: + address: '0x89ba4039841587b0a4cffdf17aee30cacf006f4d' + abi: DODOFeeRouteProxy + startBlock: 6285646 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/smartRoute.ts + entities: + - Pair + - Token + abis: + - name: DODOFeeRouteProxy + file: ../../abis/DODOFeeRouteProxy.json + - name: DODOV2Proxy02 + file: ../../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory - kind: ethereum/contract name: DODOFeeRouteProxy-widgit network: scroll @@ -89,6 +123,35 @@ dataSources: eventHandlers: - event: OrderHistory(address,address,address,uint256,uint256) handler: handleOrderHistory + - kind: ethereum/contract + name: DODOFeeRouteProxy-widgit-24-6-5 + network: scroll + source: + address: '0x3a64ec3606ff7310e8fad6fcc008e39705fb496d' + abi: DODOFeeRouteProxy + startBlock: 6285733 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/smartRoute.ts + entities: + - Pair + - Token + abis: + - name: DODOFeeRouteProxy + file: ../../abis/DODOFeeRouteProxy.json + - name: DODOV2Proxy02 + file: ../../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory - kind: ethereum/contract name: DVMFactory network: scroll @@ -385,6 +448,12 @@ templates: file: ../../abis/FeeRateModel.json - name: DODOZoo file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: DODOSwap(address,address,uint256,uint256,address,address) handler: handleDODOSwap @@ -503,6 +572,12 @@ templates: file: ../../abis/FeeRateModel.json - name: DODOZoo file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: DODOSwap(address,address,uint256,uint256,address,address) handler: handleDODOSwap @@ -618,6 +693,12 @@ templates: abis: - name: DODOLpToken file: ../../abis/DODOLpToken.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: Transfer(indexed address,indexed address,uint256) handler: handleTransfer diff --git a/subgraphs/mine/mine_arb-sep.yaml b/subgraphs/mine/mine_arb-sep.yaml new file mode 100644 index 0000000..cfd1a57 --- /dev/null +++ b/subgraphs/mine/mine_arb-sep.yaml @@ -0,0 +1,94 @@ +specVersion: 0.0.5 +description: Dodoex.io +repository: https://github.com/DODOEX/dodoex_v2_subgraph +schema: + file: ./mine.graphql +dataSources: + - kind: ethereum/contract + name: DODOMineV3ProxyV2 + network: arbitrum-sepolia + source: + address: '0x7E820457780Ac99B9A042Cd5f875b274855A1eE9' + abi: DODOMineV3ProxyV2 + startBlock: 64710120 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/mine/mineProxy.ts + entities: + - MinePool + abis: + - name: DODOMineV3Proxy + file: ../../abis/DODOMineV3Proxy.json + - name: DODOMineV3ProxyV2 + file: ../../abis/DODOMineV3ProxyV2.json + - name: ERC20MineV3 + file: ../../abis/ERC20MineV3.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: CreateMineV3(address,address,uint256) + handler: handleV2CreateMineV3 + - kind: ethereum/contract + name: DODOMineV3Registry + network: arbitrum-sepolia + source: + address: '0x1C69376Bfb89340D36f83857A76fC11A73FC444D' + abi: DODOMineV3Registry + startBlock: 64710120 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/mine/registry.ts + entities: + - MinePool + abis: + - name: DODOMineV3Proxy + file: ../../abis/DODOMineV3Proxy.json + - name: DODOMineV3Registry + file: ../../abis/DODOMineV3Registry.json + - name: ERC20MineV3 + file: ../../abis/ERC20MineV3.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: NewMineV3(address,address,bool) + handler: handleNewMineV3 +templates: + - kind: ethereum/contract + name: ERC20MineV3 + network: arbitrum-sepolia + source: + abi: ERC20MineV3 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/mine/mine.ts + entities: + - MinePool + abis: + - name: ERC20MineV3 + file: ../../abis/ERC20MineV3.json + eventHandlers: + - event: Deposit(indexed address,uint256) + handler: handleDeposit + - event: Withdraw(indexed address,uint256) + handler: handleWithdraw + - event: NewRewardToken(indexed uint256,address) + handler: handleNewRewardToken + - event: UpdateEndBlock(indexed uint256,uint256) + handler: handleUpdateEndBlock + - event: UpdateReward(indexed uint256,uint256) + handler: handleUpdateReward + diff --git a/subgraphs/mine/mine_dodochain-testnet.yaml b/subgraphs/mine/mine_dodochain-testnet.yaml index 8205818..d6b3fc3 100644 --- a/subgraphs/mine/mine_dodochain-testnet.yaml +++ b/subgraphs/mine/mine_dodochain-testnet.yaml @@ -8,7 +8,7 @@ dataSources: name: DODOMineV3ProxyV2 network: dodochain-testnet2 source: - address: '0x341ECDe9ae78d91e810cEad1D270AA0F7E0B0D1a' + address: '0x391f8D754E4BaC453d059BA7D2137C4905bF48d4' abi: DODOMineV3ProxyV2 startBlock: 58 mapping: diff --git a/subgraphs/token/token_arb-sep.yaml b/subgraphs/token/token_arb-sep.yaml new file mode 100644 index 0000000..b66dc48 --- /dev/null +++ b/subgraphs/token/token_arb-sep.yaml @@ -0,0 +1,39 @@ +specVersion: 0.0.6 +description: Dodoex.io +repository: https://github.com/DODOEX/dodoex_v2_subgraph +schema: + file: ./token.graphql +dataSources: + - kind: ethereum/contract + name: ERC20V3Factory + network: arbitrum-sepolia + source: + address: '0xf51705E360f706f46b83029A6f42Cb7b491a24dd' + abi: ERC20V3Factory + startBlock: 64710120 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/token/factoryv2.ts + entities: + - User + - Token + - UserTokenBlance + - TransferHistories + abis: + - name: ERC20Factory + file: ../../abis/ERC20Factory.json + - name: ERC20V2Factory + file: ../../abis/ERC20V2Factory.json + - name: ERC20V3Factory + file: ../../abis/ERC20V3Factory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: NewERC20(address,address,uint256) + handler: handleNewERC20 From a6f1a0a808f2875eb79a1545a0ead45cdf868b0f Mon Sep 17 00:00:00 2001 From: pyj Date: Wed, 24 Jul 2024 15:00:01 +0800 Subject: [PATCH 07/11] fix: handleSellShares divide zero error --- build/templates/DVM/DVM.wasm | Bin 93159 -> 92905 bytes src/mappings/dodoex/pool.ts | 34 ++++++++++++++-------------------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/build/templates/DVM/DVM.wasm b/build/templates/DVM/DVM.wasm index c3ac60f4499af3850636837984b61e92465113be..3e63ad8e3efc75a713fe17911ced09c51abf3554 100644 GIT binary patch delta 6348 zcmcIpd303Qd7tmiJk2iM0Re-S(VLNkBtRQNY!Z?l61#*}7K3atl150@pwTkI0wW}Y z*~BLJfX5<)SnaqWQ95nxrmexJ=d_JOZAeZ}k~#^v$8An+9~*jna!wl8>3827jYNE$ zw14!UnR~zOe(UeuH}mVCivRJ?;`m}ge-RX1Cd>=92x|Gzdua73NtiXdFLvhuf`knmC}BPPd5h98l$e;+tJhF>(*UEFiLPeQqbMR5@%fWEigAUGzI*AUsF(b8(W=j_8ORtpp(H0>6W38poA_u56;Go z3z8};K^TxA8Q7AQh7w7~md055r&})%CNsgUO9r=~FOdX^B;Y*sQ<5*p2a9z12% zQG)>cgaLW{XF5_YWunKRc~R;XWrLiHS9|B1AOB28E)pBR?3F^@i(^5*k~wi;u`Bf2 zk}U#M{&~S5tf`O;Yy&G#*0U-ZR*ACCO0F7MwI@o7N;a@^R*-B^zn8hq$%e1dEb{Pu z9m%i3e=KxC4gR|Dt&BC2iPbQdVL*yvwcK#nswj{DJ9o*%syT-(!>r|r_;1TIGHN0k z#&6Uh4ryE|T9IOvL{?`d6Lpf2)rk_BmrU{G_LKuiaHWY05jhHri&HVCI34P6NpYRC zj*`xG^jt?Dc1mQmq?3s6aIw(G#VZU@7RoFu1n`AkT=^}47K~lpN}K-G=>qJ)+iU+4 zTCslJ-^|%Tm4z4GI$lhwl646HrJbVJu@}RU(+Z2$#~D{MiKwlihV?}Nr8ruiT3*4T z+Ghebpn2? z$_nagE}gJkeqv)T-c!K*vW^#127a_(emsl0tYHrRuBzC$lT385LNX%72d2sfrpg9z zZ}n8!M0`};1Z%OhW*&56pysdFmdS%RL>?x6`Q3)E$0<(4N&Oy09?0YOb@IJKAkUSj zGo8*FX4ha(?S4vtt8PjHTy^;ZWxQ_F0HvXNqlEW2rG*nftw@w4^Vsnz>G;1S;mqc# zf&K9$Oy4q9HqmaC1o^=uJ{7>$;(;yup@))@hMCX({j6|82vO98$d3`Idsd@mYY9Dg&(^;r>G744)X*38)4|c@vB`s5H_$%CJ2ps`y$q^2=V+(WHjj?m=7 zkw&xlGQp3!BP=?~OK4)d@W+jF#l4bMWn?<~cvnTtaLNi&7h@AOA}y zS(sj%RvKGX6Q0q$+vLVVp9S{ODamHdqQLmhjc0vD(1<_rZL@bucGg32y+kg)gas{! zp$z}7C7&?qw=MOANt<@81~y2rVf~ds5C&i$rS6r`oz@xw2G6v2(X*txoj*&?wePSK zu+We?>2XC56g2zmiQD2&HkJ@Ik*&mGe-p@|FZ}I5jO`t%voyvbV28o#fpmdG8&`!+ z55C!2R2ftv^@ScsKE00 zH5FP)a7)1dC(lfeoHu+GyvO6;aNb;L@Ou+*`VFW4ZD%eVz|T9^M;`!>o`*r< z=-3c;btQ`Qd>Fopa#sqT?6L{30!lqeIC{b)98{N~kGehrdaV4g=Q<4G+d(&;2pZv4 z{CvI(<4#%N7}3(X?6rEA!0OP{J0Ff?ey@*oF83~>G5)eQ0iX0*!Aq-uFrJ?;#8Ub2 zpGKYdue*L?EOZ;_d7g$3arS&YOQfd+%csd�uRa9~B*2;c*ZYQZ+4-BQiXz5c-yi ztEu_cU~%6p=UTdSFv%!NMmI5fFBS)j^xz5L?9CTSYKM6K53Ia?%)Q>fg$o>Spj zYFI?O*6^-XZBG&7E=*cdUEqXgt*z3I{+ir`t6_OoEdo>Ed%L z%H8Qtp%urdJN-`ltluGSR#B0ga_zH-TO>2_GWVs3TM06@g*NT`DNvKi2b}il^4L=y z5#7{3Dh1mIZBQEO8|)Hj;6L79uZMd4@JIqP$@kLf3^xJJ^XjRtgHAkl$R@r(b)bGY z=(L&SCz^sTEAW{4Lv>sU7U@P%Wmj0JK0O`rv1j=S;x zF)k(3>Z@bX#J3;kEg&CnrO!8xe;Gy*L4}w!d~(7>C_=DX{NSXd;*5j|r%W2U;Mt($V4B$Y2@SglrwDLDBd2B>;0*r!QUbn@MRX;KKFjZi zS!Z1vR(N0nHYl+0Gk28=DU{t|AdCQ6;5a}XKyX9E3RdYh5tVR=sA8D9fv9HeI6KEg ztxDHGw~aO~EE=(z`OZr4^+OySSrL622y;}((z7#wV;4&B<8#>p0=h3avEYgs3(xlx z4E^_r6MuYuW_Sfktb>CROn?$~$Tr-dB;eXnEAUksRw#*hk#_Yss+7Z7{6rZN&H3CMGL>N z;lEsZZeUILbxpm#KA|h@8~Q2tR|~y5i5@-+5&oa)f8wJX{kjC*W{^#froWuUB7X@nd=!+?8*;fC5m25EvuFZ@6!?F#=(dd8Y zS`xj1zjv(|iZJ?mF@?9`x(8NZ*Y((CtERkx@Hg&AiN0@;XH0zsp~!@({5SFL^#n5Y zi|e`c8GR#d&N|+Ik*0>o40@>Pwpy)MjDpB70(Wn42r}U-H@*k=G4E#15?(EX{NOF# zo!*HTK?D}>5hwB~GAf&DQpfnP(F{J+Vfo?N_!l>;c>&+P8Hes$o1;c~+m_>pH$6CZ zD?0l!sCM;#U{^n3SO2VC{N=4qD$|DBe$7xN-n*Rxm+|TCcVR0gz3#$>Arr2AeNo8y z`q5U~(D%X6;oa$jFV?;O<{bvDc37r3957!=NCvCe+_tN5vGOnn;*`N0Fe`Ul5GyR7 zr&OmxvSo)axGcE4(^piZoKAv##WDlz(@N?0o8+cIM^CW3w<#FtE?yU5Mw^4(yE(r^ zQQS^QQnpWrS;}}eSd<4zutktF_{oX(wvJ|BUv^8Nd#5+JLV1t_@k)*hOm;f2s-mJc z$bU`BP+c%_7uuT3in(Hn@|6>8$|DJ4gq0=gskTjCf3Gh&7+9OPV3m^VhCEoUoQ|iX z2U5VIZ);wooOVO5GVF#7~uNa7q-nyMA)rUS2RIE1mw{o(iQpgY1mE!EUbc z_4vAX`8MRKPAR`42!cxGooSHCv&e+1qKLA^lGPO0*-1Z~Rp+bHu{;F7w1HFiqI5M&MB{&!Jj)Gc?QZ&H<~? zn5l{VmNw87$)Q=vOe1cyYSpET$Ad}P&MCgITSPG^r_#VCwB%|1cr+8NF_gTrKy#qX zySvOA^zKj|rokGaHA{IV9p0k70BnFypYLD)oeT$}u{(e3fVStZbvNA6dn0^q#6|LvHS70*Y1pR)HwfM(#AX<5l z3A6PFKn*cPVOe0+zY5{_I36e^Sug_*Do+n%Z`H{XK_3c_#si%(cPp zwvHW#;dzb-#mWz|fiVInqGfBWq9dSm&7|>qoB&eP?x3&dC@7K>qzFE(7luF!LCT>a zJEr93zydg~yq`lS59Yvh{RvnS@!SO`IVW2<1sc|LW`N1aM|GHjnZVL$OSsccLji9! zn(kak(4Qeg6FZ0UUM`sQNMOu+QTcr?MCs2GKC1$c766N$0<`BSHxrClV<$Dwc_^Bs zL^pbSd|{wcC=U~&5?nY>s7Sx^mquu@N`D>|=Mt1@r0?cIs{S%8)OO^jLk(vH@**mZ zD2ne2)t2H*wMG6M7=^WyO3JN;FdMEacNfy(W4vyQ;2KX=no^lhfnJ9~u0BT@%!ir! z8|2W3%V4R!t+^r4(!d`yH>p23$vp8N!7atT2xi9JhMD{PZH?L8!R(%3Z)0}k4};g< KtX>4?^Zy6i4vF0W delta 6320 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 diff --git a/src/mappings/dodoex/pool.ts b/src/mappings/dodoex/pool.ts index 69dc2ac..eeb7308 100644 --- a/src/mappings/dodoex/pool.ts +++ b/src/mappings/dodoex/pool.ts @@ -305,16 +305,14 @@ export function handleBuyShares(event: BuyShares): void { let lpToken = createLpToken(event.address, pair as Pair); - let baseAmountChange = event.params.increaseShares - .toBigDecimal() - .div(lpToken.totalSupply.toBigDecimal()) - .times(pmmState.B.toBigDecimal()) - .div(exponentToBigDecimal(lpToken.decimals)); - let quoteAmountChange = event.params.increaseShares - .toBigDecimal() - .div(lpToken.totalSupply.toBigDecimal()) - .times(pmmState.Q.toBigDecimal()) - .div(exponentToBigDecimal(lpToken.decimals)); + let baseAmountChange = convertTokenToDecimal( + pmmState.B, + baseToken.decimals + ).minus(pair.baseReserve); + let quoteAmountChange = convertTokenToDecimal( + pmmState.Q, + quoteToken.decimals + ).minus(pair.quoteReserve); let dealedSharesAmount = convertTokenToDecimal( event.params.increaseShares, @@ -436,16 +434,12 @@ export function handleSellShares(event: SellShares): void { createPairDetail(pair, pmmState, event.block.timestamp); let lpToken = createLpToken(event.address, pair as Pair); - let baseAmountChange = event.params.decreaseShares - .toBigDecimal() - .div(lpToken.totalSupply.toBigDecimal()) - .times(pmmState.B.toBigDecimal()) - .div(exponentToBigDecimal(lpToken.decimals)); - let quoteAmountChange = event.params.decreaseShares - .toBigDecimal() - .div(lpToken.totalSupply.toBigDecimal()) - .times(pmmState.Q.toBigDecimal()) - .div(exponentToBigDecimal(lpToken.decimals)); + let baseAmountChange = pair.baseReserve.minus( + convertTokenToDecimal(pmmState.B, baseToken.decimals) + ); + let quoteAmountChange = pair.quoteReserve.minus( + convertTokenToDecimal(pmmState.Q, quoteToken.decimals) + ); let dealedSharesAmount = convertTokenToDecimal( event.params.decreaseShares, From efc9771c07506100f3aec56e733874ab75d160a8 Mon Sep 17 00:00:00 2001 From: pyj Date: Wed, 21 Aug 2024 13:23:02 +0800 Subject: [PATCH 08/11] feat: support zircuit,okb --- abis/GSP.json | 1383 ++++++++++++++++++ abis/GSPFactory.json | 464 ++++++ bin/config.js | 11 +- build/DODOZoo/DODOZoo.wasm | Bin 118225 -> 117758 bytes build/DVMFactory/DVMFactory.wasm | Bin 73952 -> 73879 bytes build/subgraph.yaml | 1075 +------------- build/templates/CP/CP.wasm | Bin 67638 -> 67248 bytes build/templates/DODOLpToken/DODOLpToken.wasm | Bin 42962 -> 42893 bytes build/templates/DVM/DVM.wasm | Bin 92905 -> 92507 bytes src/mappings/constant-arb-sep.ts | 1 + src/mappings/constant-arbitrum.ts | 40 +- src/mappings/constant-aurora.ts | 40 +- src/mappings/constant-avax.ts | 40 +- src/mappings/constant-base-mainnet.ts | 1 + src/mappings/constant-basegor.ts | 1 + src/mappings/constant-bitlayer.ts | 1 + src/mappings/constant-boba.ts | 40 +- src/mappings/constant-bsc.ts | 58 +- src/mappings/constant-cfx.ts | 1 + src/mappings/constant-cronos.ts | 40 +- src/mappings/constant-dodochain-testnet.ts | 1 + src/mappings/constant-goerli.ts | 1 + src/mappings/constant-heco.ts | 49 +- src/mappings/constant-kcc.ts | 42 +- src/mappings/constant-kovan.ts | 38 +- src/mappings/constant-linea.ts | 1 + src/mappings/constant-mainnet.ts | 44 +- src/mappings/constant-manta.ts | 1 + src/mappings/constant-mantle.ts | 1 + src/mappings/constant-moonriver.ts | 46 +- src/mappings/constant-okb.ts | 50 + src/mappings/constant-okchain.ts | 46 +- src/mappings/constant-optimism.ts | 40 +- src/mappings/constant-polygon.ts | 46 +- src/mappings/constant-rinkeby.ts | 42 +- src/mappings/constant-scroll-alpha.ts | 1 + src/mappings/constant-scroll-sepolia.ts | 1 + src/mappings/constant-scroll.ts | 1 + src/mappings/constant-sepolia.ts | 50 + src/mappings/constant-tokb.ts | 1 + src/mappings/constant-zircuit-testnet.ts | 3 +- src/mappings/constant-zircuit.ts | 50 + src/mappings/constant.ts | 67 +- src/mappings/dodoex/poolFactory.ts | 93 ++ subgraphs/dodoex/dodoex_aurora.yaml | 55 +- subgraphs/dodoex/dodoex_okb.yaml | 680 +++++++++ subgraphs/dodoex/dodoex_sepolia.yaml | 763 ++++++++++ subgraphs/dodoex/dodoex_tokb.yaml | 18 + subgraphs/dodoex/dodoex_zircuit.yaml | 680 +++++++++ subgraphs/mine/mine_aurora.yaml | 8 +- subgraphs/mine/mine_mainnet.yaml | 4 + subgraphs/mine/mine_okb.yaml | 94 ++ subgraphs/mine/mine_sepolia.yaml | 94 ++ subgraphs/mine/mine_zircuit.yaml | 94 ++ subgraphs/token/token_aurora.yaml | 10 +- subgraphs/token/token_okb.yaml | 39 + subgraphs/token/token_sepolia.yaml | 39 + subgraphs/token/token_zircuit.yaml | 39 + 58 files changed, 5147 insertions(+), 1381 deletions(-) create mode 100644 abis/GSP.json create mode 100644 abis/GSPFactory.json create mode 100644 src/mappings/constant-okb.ts create mode 100644 src/mappings/constant-sepolia.ts create mode 100644 src/mappings/constant-zircuit.ts create mode 100644 subgraphs/dodoex/dodoex_okb.yaml create mode 100644 subgraphs/dodoex/dodoex_sepolia.yaml create mode 100644 subgraphs/dodoex/dodoex_zircuit.yaml create mode 100644 subgraphs/mine/mine_okb.yaml create mode 100644 subgraphs/mine/mine_sepolia.yaml create mode 100644 subgraphs/mine/mine_zircuit.yaml create mode 100644 subgraphs/token/token_okb.yaml create mode 100644 subgraphs/token/token_sepolia.yaml create mode 100644 subgraphs/token/token_zircuit.yaml diff --git a/abis/GSP.json b/abis/GSP.json new file mode 100644 index 0000000..e6cc627 --- /dev/null +++ b/abis/GSP.json @@ -0,0 +1,1383 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Burn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "increaseShares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalShares", + "type": "uint256" + } + ], + "name": "BuyShares", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "newOracle", + "type": "address" + } + ], + "name": "ChangeOracle", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "borrower", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "assetTo", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "baseAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "quoteAmount", + "type": "uint256" + } + ], + "name": "DODOFlashLoan", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "fromToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "toToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "fromAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "toAmount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "trader", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "receiver", + "type": "address" + } + ], + "name": "DODOSwap", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Mint", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newMtFee", + "type": "uint256" + } + ], + "name": "MtFeeRateChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "enum PMMPricing.RState", + "name": "newRState", + "type": "uint8" + } + ], + "name": "RChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "payer", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "decreaseShares", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalShares", + "type": "uint256" + } + ], + "name": "SellShares", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "WithdrawMtFee", + "type": "event" + }, + { + "inputs": [], + "name": "DOMAIN_SEPARATOR", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PERMIT_TYPEHASH", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_ADMIN_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_BASE_PRICE_CUMULATIVE_LAST_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_BASE_RESERVE_", + "outputs": [ + { + "internalType": "uint112", + "name": "", + "type": "uint112" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_BASE_TARGET_", + "outputs": [ + { + "internalType": "uint112", + "name": "", + "type": "uint112" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_BASE_TOKEN_", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_BLOCK_TIMESTAMP_LAST_", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_IS_OPEN_TWAP_", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_I_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_K_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_LP_FEE_RATE_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_MAINTAINER_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_MT_FEE_BASE_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_MT_FEE_QUOTE_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_MT_FEE_RATE_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_MT_FEE_RATE_MODEL_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_O_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_PRICE_LIMIT_", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_QUOTE_RESERVE_", + "outputs": [ + { + "internalType": "uint112", + "name": "", + "type": "uint112" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_QUOTE_TARGET_", + "outputs": [ + { + "internalType": "uint112", + "name": "", + "type": "uint112" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_QUOTE_TOKEN_", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_RState_", + "outputs": [ + { + "internalType": "uint32", + "name": "", + "type": "uint32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_addr", + "type": "address" + } + ], + "name": "addressToShortString", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "mtFeeRate", + "type": "uint256" + } + ], + "name": "adjustMtFeeRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "buildDomainSeparator", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "buyShares", + "outputs": [ + { + "internalType": "uint256", + "name": "shares", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "baseInput", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "quoteInput", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "changeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOracle", + "type": "address" + } + ], + "name": "changeOracle", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "correctRState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "baseAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "quoteAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "assetTo", + "type": "address" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "flashLoan", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getBaseInput", + "outputs": [ + { + "internalType": "uint256", + "name": "input", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMidPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "midPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMtFeeTotal", + "outputs": [ + { + "internalType": "uint256", + "name": "mtFeeBase", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "mtFeeQuote", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPMMState", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "i", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "K", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "B", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Q", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "B0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Q0", + "type": "uint256" + }, + { + "internalType": "enum PMMPricing.RState", + "name": "R", + "type": "uint8" + } + ], + "internalType": "struct PMMPricing.PMMState", + "name": "state", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getPMMStateForCall", + "outputs": [ + { + "internalType": "uint256", + "name": "i", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "K", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "B", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Q", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "B0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "Q0", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "R", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getQuoteInput", + "outputs": [ + { + "internalType": "uint256", + "name": "input", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getUserFeeRate", + "outputs": [ + { + "internalType": "uint256", + "name": "lpFeeRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "mtFeeRate", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getVaultReserve", + "outputs": [ + { + "internalType": "uint256", + "name": "baseReserve", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "quoteReserve", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "maintainer", + "type": "address" + }, + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "baseTokenAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "quoteTokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "lpFeeRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "mtFeeRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "k", + "type": "uint256" + }, + { + "internalType": "address", + "name": "o", + "type": "address" + }, + { + "internalType": "bool", + "name": "isOpenTWAP", + "type": "bool" + } + ], + "name": "init", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nonces", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + }, + { + "internalType": "uint8", + "name": "v", + "type": "uint8" + }, + { + "internalType": "bytes32", + "name": "r", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "s", + "type": "bytes32" + } + ], + "name": "permit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "trader", + "type": "address" + }, + { + "internalType": "uint256", + "name": "payBaseAmount", + "type": "uint256" + } + ], + "name": "querySellBase", + "outputs": [ + { + "internalType": "uint256", + "name": "receiveQuoteAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "mtFee", + "type": "uint256" + }, + { + "internalType": "enum PMMPricing.RState", + "name": "newRState", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "newBaseTarget", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "trader", + "type": "address" + }, + { + "internalType": "uint256", + "name": "payQuoteAmount", + "type": "uint256" + } + ], + "name": "querySellQuote", + "outputs": [ + { + "internalType": "uint256", + "name": "receiveBaseAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "mtFee", + "type": "uint256" + }, + { + "internalType": "enum PMMPricing.RState", + "name": "newRState", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "newQuoteTarget", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "sellBase", + "outputs": [ + { + "internalType": "uint256", + "name": "receiveQuoteAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "sellQuote", + "outputs": [ + { + "internalType": "uint256", + "name": "receiveBaseAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "shareAmount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "baseMinAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "quoteMinAmount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "sellShares", + "outputs": [ + { + "internalType": "uint256", + "name": "baseAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "quoteAmount", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "sync", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "withdrawMtFeeTotal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/abis/GSPFactory.json b/abis/GSPFactory.json new file mode 100644 index 0000000..867f06d --- /dev/null +++ b/abis/GSPFactory.json @@ -0,0 +1,464 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "cloneFactory", + "type": "address" + }, + { + "internalType": "address", + "name": "GSPTemplate", + "type": "address" + }, + { + "internalType": "address", + "name": "defaultMaintainer", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "baseToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "quoteToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "GSP", + "type": "address" + } + ], + "name": "NewGSP", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferPrepared", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "GSP", + "type": "address" + } + ], + "name": "RemoveGSP", + "type": "event" + }, + { + "inputs": [], + "name": "_CLONE_FACTORY_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_DEFAULT_MAINTAINER_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_GSP_TEMPLATE_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_NEW_OWNER_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "_OWNER_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "_REGISTRY_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "_USER_REGISTRY_", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "internalType": "address", + "name": "baseToken", + "type": "address" + }, + { + "internalType": "address", + "name": "quoteToken", + "type": "address" + }, + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "addPoolByAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "claimOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "baseToken", + "type": "address" + }, + { + "internalType": "address", + "name": "quoteToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "lpFeeRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "mtFeeRate", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "i", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "k", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isOpenTWAP", + "type": "bool" + } + ], + "name": "createDODOGasSavingPool", + "outputs": [ + { + "internalType": "address", + "name": "newGasSavingPool", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "baseToken", + "type": "address" + }, + { + "internalType": "address", + "name": "quoteToken", + "type": "address" + } + ], + "name": "getDODOPool", + "outputs": [ + { + "internalType": "address[]", + "name": "machines", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "token0", + "type": "address" + }, + { + "internalType": "address", + "name": "token1", + "type": "address" + } + ], + "name": "getDODOPoolBidirection", + "outputs": [ + { + "internalType": "address[]", + "name": "baseToken0Machines", + "type": "address[]" + }, + { + "internalType": "address[]", + "name": "baseToken1Machines", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "user", + "type": "address" + } + ], + "name": "getDODOPoolByUser", + "outputs": [ + { + "internalType": "address[]", + "name": "machines", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "initOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "creator", + "type": "address" + }, + { + "internalType": "address", + "name": "baseToken", + "type": "address" + }, + { + "internalType": "address", + "name": "quoteToken", + "type": "address" + }, + { + "internalType": "address", + "name": "pool", + "type": "address" + } + ], + "name": "removePoolByAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newMaintainer", + "type": "address" + } + ], + "name": "updateDefaultMaintainer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newGSPTemplate", + "type": "address" + } + ], + "name": "updateGSPTemplate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] \ No newline at end of file diff --git a/bin/config.js b/bin/config.js index 4830a54..1443966 100644 --- a/bin/config.js +++ b/bin/config.js @@ -31,9 +31,18 @@ const chains = [ "bitlayer", "zircuit-testnet", "arb-sep", + "zircuit", + "sepolia", + "okb", ]; const supportAlphaChains = ["arbitrum", "polygon", "mainnet"]; -const supportStudioChains = ["arbitrum", "polygon", "mainnet", "arb-sep"]; +const supportStudioChains = [ + "arbitrum", + "polygon", + "mainnet", + "arb-sep", + "sepolia", +]; module.exports = { studioNodeUrl, theGraphNodeUrl, diff --git a/build/DODOZoo/DODOZoo.wasm b/build/DODOZoo/DODOZoo.wasm index cda425223eda68a967a33b9e29b95eedfefeaa25..922a962e0840ce39bca29df49bc581895b787057 100644 GIT binary patch delta 25094 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 diff --git a/build/DVMFactory/DVMFactory.wasm b/build/DVMFactory/DVMFactory.wasm index 9ede6f4734d07db1bd8a7b50f614579ffacf7851..0ad34e4614c4ee81d19cabc016914e86f34ed649 100644 GIT binary patch delta 12485 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 diff --git a/build/subgraph.yaml b/build/subgraph.yaml index 23982d4..3d15413 100644 --- a/build/subgraph.yaml +++ b/build/subgraph.yaml @@ -1,38 +1,30 @@ -specVersion: 0.0.4 +specVersion: 0.0.5 description: Dodoex.io -graft: - base: QmU2D6A3QDtTwrzC6NgK2ngZEskS1bzEwo599bUdjhzPVz - block: 39336465 -features: - - grafting repository: https://github.com/DODOEX/dodoex_v2_subgraph schema: - file: dodoex.graphql + file: mine.graphql dataSources: - kind: ethereum/contract - name: DODONFTRegistry - network: bsc + name: DODOMineV3ProxyV2 + network: okb source: - address: "0x2c0dd764a0be8a7e747cb0765e268d576edce31a" - abi: DODONFTRegistry - startBlock: 9092832 + address: "0x62e2EC354E15ddA6A1E43586c86e745A59b4B81e" + abi: DODOMineV3ProxyV2 + startBlock: 4090720 mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript - file: DODONFTRegistry/DODONFTRegistry.wasm + file: DODOMineV3ProxyV2/DODOMineV3ProxyV2.wasm entities: - - Pair - - Token + - MinePool abis: - - name: DODOZoo - file: ../abis/DODOZoo.json - - name: DODO - file: ../abis/DODO.json - - name: DVM - file: ../abis/DVM.json - - name: DODONFTRegistry - file: ../abis/DODONFTRegistry.json + - name: DODOMineV3Proxy + file: ../abis/DODOMineV3Proxy.json + - name: DODOMineV3ProxyV2 + file: ../abis/DODOMineV3ProxyV2.json + - name: ERC20MineV3 + file: ../abis/ERC20MineV3.json - name: ERC20 file: ../abis/ERC20.json - name: ERC20SymbolBytes @@ -40,28 +32,29 @@ dataSources: - name: ERC20NameBytes file: ../abis/ERC20NameBytes.json eventHandlers: - - event: NewRegistry(address,address,address) - handler: handleNewRegistry - - event: RemoveRegistry(address) - handler: handleRemoveRegistry + - event: CreateMineV3(address,address,uint256) + handler: handleV2CreateMineV3 - kind: ethereum/contract - name: DODORouteProxy - network: bsc + name: DODOMineV3Registry + network: okb source: - address: "0x6b3d817814eabc984d51896b1015c0b89e9737ca" - abi: DODORouteProxy - startBlock: 7967129 + address: "0xec627fef2AbC5632C01BA9435caAa78871E2e305" + abi: DODOMineV3Registry + startBlock: 4090720 mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript - file: DODORouteProxy/DODORouteProxy.wasm + file: DODOMineV3Registry/DODOMineV3Registry.wasm entities: - - Pair - - Token + - MinePool abis: - - name: DODORouteProxy - file: ../abis/DODORouteProxy.json + - name: DODOMineV3Proxy + file: ../abis/DODOMineV3Proxy.json + - name: DODOMineV3Registry + file: ../abis/DODOMineV3Registry.json + - name: ERC20MineV3 + file: ../abis/ERC20MineV3.json - name: ERC20 file: ../abis/ERC20.json - name: ERC20SymbolBytes @@ -69,1006 +62,32 @@ dataSources: - name: ERC20NameBytes file: ../abis/ERC20NameBytes.json eventHandlers: - - event: OrderHistory(address,address,address,uint256,uint256) - handler: handleOrderHistory - - kind: ethereum/contract - name: DODOMine - network: bsc - source: - address: "0x01f9bfac04e6184e90bd7eafd51999ce430cc750" - abi: DODOMine - startBlock: 5007474 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODOMine/DODOMine.wasm - entities: - - User - - StakeHistory - abis: - - name: DODOMine - file: ../abis/DODOMine.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - eventHandlers: - - event: Deposit(indexed address,indexed uint256,uint256) - handler: handleDeposit - - event: Withdraw(indexed address,indexed uint256,uint256) - handler: handleWithdraw - - event: Claim(indexed address,uint256) - handler: handleClaim - - kind: ethereum/contract - name: DODOIncentive - network: bsc - source: - address: "0x80930cb1849f7d42531506ff45e66724338a821b" - abi: DODOIncentive - startBlock: 4208077 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODOIncentive/DODOIncentive.wasm - entities: - - Pair - - Token - abis: - - name: DODO - file: ../abis/DODO.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: DODOIncentive - file: ../abis/DODOIncentive.json - eventHandlers: - - event: Incentive(address,uint256) - handler: handleIncentive - - kind: ethereum/contract - name: DODOV2Proxy01 - network: bsc - source: - address: "0xb57dd5c265dbb13ca014f2332069e90cd0e22e65" - abi: DODOV2Proxy01 - startBlock: 4208152 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODORouteProxy/DODORouteProxy.wasm - entities: - - Pair - - Token - abis: - - name: DODOV2Proxy01 - file: ../abis/DODOV2Proxy01.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - eventHandlers: - - event: OrderHistory(address,address,address,uint256,uint256) - handler: handleOrderHistory - - kind: ethereum/contract - name: DODOV2Proxy02_2012_02_17 - network: bsc - source: - address: "0xd56281ef996b6b29874c77d2e1464216e8043127" - abi: DODOV2Proxy02 - startBlock: 4675013 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODORouteProxy/DODORouteProxy.wasm - entities: - - Pair - - Token - abis: - - name: DODOV2Proxy02 - file: ../abis/DODOV2Proxy02.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - eventHandlers: - - event: OrderHistory(address,address,address,uint256,uint256) - handler: handleOrderHistory - - kind: ethereum/contract - name: DODOV2Proxy02 - network: bsc - source: - address: "0x8f8dd7db1bda5ed3da8c9daf3bfa471c12d58486" - abi: DODOV2Proxy02 - startBlock: 4926661 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODORouteProxy/DODORouteProxy.wasm - entities: - - Pair - - Token - abis: - - name: DODOV2Proxy02 - file: ../abis/DODOV2Proxy02.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - eventHandlers: - - event: OrderHistory(address,address,address,uint256,uint256) - handler: handleOrderHistory - - kind: ethereum/contract - name: DODOFeeRouteProxy - network: bsc - source: - address: "0x0656fd85364d03b103ceeda192fb2d3906a6ac15" - abi: DODOFeeRouteProxy - startBlock: 23887578 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODORouteProxy/DODORouteProxy.wasm - entities: - - Pair - - Token - abis: - - name: DODOFeeRouteProxy - file: ../abis/DODOFeeRouteProxy.json - - name: DODOV2Proxy02 - file: ../abis/DODOV2Proxy02.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - eventHandlers: - - event: OrderHistory(address,address,address,uint256,uint256) - handler: handleOrderHistory - - kind: ethereum/contract - name: DODOFeeRouteProxy-widgit - network: bsc - source: - address: "0xa8b034301bb5dd3610db585def3e7c0d52f2319f" - abi: DODOFeeRouteProxy - startBlock: 23887578 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODORouteProxy/DODORouteProxy.wasm - entities: - - Pair - - Token - abis: - - name: DODOFeeRouteProxy - file: ../abis/DODOFeeRouteProxy.json - - name: DODOV2Proxy02 - file: ../abis/DODOV2Proxy02.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - eventHandlers: - - event: OrderHistory(address,address,address,uint256,uint256) - handler: handleOrderHistory - - kind: ethereum/contract - name: DODOFeeRouteProxy-widgit-24-6-5 - network: bsc - source: - address: "0xb95ed7e958e196688984951f41ac2888f4b10ab9" - abi: DODOFeeRouteProxy - startBlock: 39336465 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODORouteProxy/DODORouteProxy.wasm - entities: - - Pair - - Token - abis: - - name: DODOFeeRouteProxy - file: ../abis/DODOFeeRouteProxy.json - - name: DODOV2Proxy02 - file: ../abis/DODOV2Proxy02.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - eventHandlers: - - event: OrderHistory(address,address,address,uint256,uint256) - handler: handleOrderHistory - - kind: ethereum/contract - name: DVMFactory_2020_02_21 - network: bsc - source: - address: "0xf50bdc9e90b7a1c138cb7935071b85c417c4cb8e" - abi: DVMFactory - startBlock: 5674967 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODONFTRegistry/DODONFTRegistry.wasm - entities: - - Pair - - Token - abis: - - name: DVMFactory - file: ../abis/DVMFactory.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: DVM - file: ../abis/DVM.json - - name: FeeRateModel - file: ../abis/FeeRateModel.json - eventHandlers: - - event: NewDVM(address,address,address,address) - handler: handleNewDVM - - kind: ethereum/contract - name: DVMFactory_2020_02_16 - network: bsc - source: - address: "0x790b4a80fb1094589a3c0efc8740aa9b0c1733fb" - abi: DVMFactory - startBlock: 5730780 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODONFTRegistry/DODONFTRegistry.wasm - entities: - - Pair - - Token - abis: - - name: DVMFactory - file: ../abis/DVMFactory.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: DVM - file: ../abis/DVM.json - - name: FeeRateModel - file: ../abis/FeeRateModel.json - eventHandlers: - - event: NewDVM(address,address,address,address) - handler: handleNewDVM - - kind: ethereum/contract - name: DPPFactory_2021_01_22 - network: bsc - source: - address: "0x7737fd30535c69545deeea54ab8dd590ccaebd3c" - abi: DPPFactory - startBlock: 4208108 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODONFTRegistry/DODONFTRegistry.wasm - entities: - - Pair - - Token - abis: - - name: DPPFactory - file: ../abis/DPPFactory.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: DPP - file: ../abis/DPP.json - - name: FeeRateModel - file: ../abis/FeeRateModel.json - eventHandlers: - - event: NewDPP(address,address,address,address) - handler: handleNewDPP - - kind: ethereum/contract - name: DPPFactory_2021_02_17 - network: bsc - source: - address: "0x9b64c81ba54ea51e1f6b7fefb3cff8aa6f1e2a09" - abi: DPPFactory - startBlock: 4323290 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODONFTRegistry/DODONFTRegistry.wasm - entities: - - Pair - - Token - abis: - - name: DPPFactory - file: ../abis/DPPFactory.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: DPP - file: ../abis/DPP.json - - name: FeeRateModel - file: ../abis/FeeRateModel.json - eventHandlers: - - event: NewDPP(address,address,address,address) - handler: handleNewDPP - - kind: ethereum/contract - name: DPPFactory - network: bsc - source: - address: "0xafe0a75dffb395eaabd0a7e1bbbd0b11f8609eef" - abi: DPPFactory - startBlock: 4926619 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODONFTRegistry/DODONFTRegistry.wasm - entities: - - Pair - - Token - abis: - - name: DPPFactory - file: ../abis/DPPFactory.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: DPP - file: ../abis/DPP.json - - name: FeeRateModel - file: ../abis/FeeRateModel.json - eventHandlers: - - event: NewDPP(address,address,address,address) - handler: handleNewDPP - - event: RemoveDPP(address) - handler: handleRemoveDPP - - kind: ethereum/contract - name: DPPFactory_21_10_13 - network: bsc - source: - address: "0xd9cac3d964327e47399aebd8e1e6dcc4c251daae" - abi: DPPFactory - startBlock: 11677242 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODONFTRegistry/DODONFTRegistry.wasm - entities: - - Pair - - Token - abis: - - name: DPPFactory - file: ../abis/DPPFactory.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: DPP - file: ../abis/DPP.json - - name: FeeRateModel - file: ../abis/FeeRateModel.json - eventHandlers: - - event: NewDPP(address,address,address,address) - handler: handleNewDPP - - event: RemoveDPP(address) - handler: handleRemoveDPP - - kind: ethereum/contract - name: DSPFactory - network: bsc - source: - address: "0x0fb9815938ad069bf90e14fe6c596c514bede767" - abi: DSPFactory - startBlock: 6695425 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODONFTRegistry/DODONFTRegistry.wasm - entities: - - Pair - - Token - abis: - - name: DSPFactory - file: ../abis/DSPFactory.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: DSP - file: ../abis/DSP.json - - name: FeeRateModel - file: ../abis/FeeRateModel.json - eventHandlers: - - event: NewDSP(address,address,address,address) - handler: handleNewDSP - - event: RemoveDSP(address) - handler: handleRemoveDSP - - kind: ethereum/contract - name: CrowdPoolingFactory_20200721 - network: bsc - source: - address: "0x9ae501385bc7996a2a4a1fbb00c8d3820611bcb5" - abi: CrowdPoolingFactory - startBlock: 4208124 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODONFTRegistry/DODONFTRegistry.wasm - entities: - - Pair - - Token - abis: - - name: DVM - file: ../abis/DVM.json - - name: DPP - file: ../abis/DPP.json - - name: CrowdPoolingFactory - file: ../abis/CrowdPoolingFactory.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: CP - file: ../abis/CP.json - eventHandlers: - - event: NewCP(address,address,address,address) - handler: handleNewCP - - kind: ethereum/contract - name: CrowdPoolingFactory - network: bsc - source: - address: "0x778df5b12170e8af8df94356bfc864e57ce185dc" - abi: CrowdPoolingFactory - startBlock: 4926634 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODONFTRegistry/DODONFTRegistry.wasm - entities: - - Pair - - Token - abis: - - name: DVM - file: ../abis/DVM.json - - name: DPP - file: ../abis/DPP.json - - name: CrowdPoolingFactory - file: ../abis/CrowdPoolingFactory.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: CP - file: ../abis/CP.json - eventHandlers: - - event: NewCP(address,address,address,address) - handler: handleNewCP - - kind: ethereum/contract - name: CrowdPoolingFactoryV2 - network: bsc - source: - address: "0x9c9ef6820a1aa0e25770ccde4e974f81cb28debc" - abi: CrowdPoolingFactory - startBlock: 13920938 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODONFTRegistry/DODONFTRegistry.wasm - entities: - - Pair - - Token - abis: - - name: DVM - file: ../abis/DVM.json - - name: DPP - file: ../abis/DPP.json - - name: CrowdPoolingFactory - file: ../abis/CrowdPoolingFactory.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: CP - file: ../abis/CP.json - - name: CPV2 - file: ../abis/CPV2.json - eventHandlers: - - event: NewCP(address,address,address,address) - handler: handleNewCP - - kind: ethereum/contract - name: CrowdPoolingFactoryV3 - network: bsc - source: - address: "0x224fece8104771478a3a4ce6d92ab1538d3659ee" - abi: CrowdPoolingFactory - startBlock: 19507160 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODONFTRegistry/DODONFTRegistry.wasm - entities: - - Pair - - Token - abis: - - name: DVM - file: ../abis/DVM.json - - name: DPP - file: ../abis/DPP.json - - name: CrowdPoolingFactory - file: ../abis/CrowdPoolingFactory.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: CP - file: ../abis/CP.json - - name: CPV2 - file: ../abis/CPV2.json - eventHandlers: - - event: NewCP(address,address,address,address) - handler: handleNewCP - - kind: ethereum/contract - name: UpCrowdPoolingFactory - network: bsc - source: - address: "0x4f57f6929e58ae564f6ab090fe0aeecb39b0f270" - abi: UpCrowdPoolingFactory - startBlock: 5699943 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODONFTRegistry/DODONFTRegistry.wasm - entities: - - Pair - - Token - abis: - - name: DVM - file: ../abis/DVM.json - - name: DPP - file: ../abis/DPP.json - - name: CrowdPoolingFactory - file: ../abis/CrowdPoolingFactory.json - - name: UpCrowdPoolingFactory - file: ../abis/UpCrowdPoolingFactory.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: CP - file: ../abis/CP.json - eventHandlers: - - event: NewCP(address,address,address,address) - handler: handleNewCP - - kind: ethereum/contract - name: DODOZoo - network: bsc - source: - address: "0xca459456a45e300aa7ef447dbb60f87cccb42828" - abi: DODOZoo - startBlock: 726278 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODOZoo/DODOZoo.wasm - entities: - - Pair - - Token - abis: - - name: DODOZoo - file: ../abis/DODOZoo.json - - name: DODO - file: ../abis/DODO.json - - name: DVM - file: ../abis/DVM.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - eventHandlers: - - event: DODOBirth(address,address,address) - handler: handleDODOBirth + - event: NewMineV3(address,address,bool) + handler: handleNewMineV3 templates: - kind: ethereum/contract - name: DVM - network: bsc + name: ERC20MineV3 + network: okb source: - abi: DVM + abi: ERC20MineV3 mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript - file: templates/DVM/DVM.wasm + file: templates/ERC20MineV3/ERC20MineV3.wasm entities: - - Pair - - Token - - DODOSwap + - MinePool abis: - - name: DVM - file: ../abis/DVM.json - - name: DVMFactory - file: ../abis/DVMFactory.json - - name: DPPFactory - file: ../abis/DPPFactory.json - - name: FeeRateModel - file: ../abis/FeeRateModel.json - - name: DODOZoo - file: ../abis/DODOZoo.json - - name: DPP - file: ../abis/DPP.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json + - name: ERC20MineV3 + file: ../abis/ERC20MineV3.json eventHandlers: - - event: DODOSwap(address,address,uint256,uint256,address,address) - handler: handleDODOSwap - - event: BuyShares(address,uint256,uint256) - handler: handleBuyShares - - event: SellShares(address,address,uint256,uint256) - handler: handleSellShares - - event: Transfer(indexed address,indexed address,uint256) - handler: handleTransfer - - kind: ethereum/contract - name: DPP - network: bsc - source: - abi: DPP - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: templates/DVM/DVM.wasm - entities: - - Pair - - Token - abis: - - name: DVMFactory - file: ../abis/DVMFactory.json - - name: DPPFactory - file: ../abis/DPPFactory.json - - name: DVM - file: ../abis/DVM.json - - name: DPP - file: ../abis/DPP.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: FeeRateModel - file: ../abis/FeeRateModel.json - - name: DODOZoo - file: ../abis/DODOZoo.json - eventHandlers: - - event: DODOSwap(address,address,uint256,uint256,address,address) - handler: handleDODOSwap - - event: LpFeeRateChange(uint256) - handler: handleLpFeeRateChange - - kind: ethereum/contract - name: DPPOracleAdmin - network: bsc - source: - abi: DPPOracleAdmin - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: templates/DVM/DVM.wasm - entities: - - Pair - - Token - abis: - - name: DVM - file: ../abis/DVM.json - - name: DPP - file: ../abis/DPP.json - - name: DPPOracleAdmin - file: ../abis/DPPOracleAdmin.json - - name: DODO - file: ../abis/DODO.json - - name: DVMFactory - file: ../abis/DVMFactory.json - - name: DPPFactory - file: ../abis/DPPFactory.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: FeeRateModel - file: ../abis/FeeRateModel.json - - name: DODOZoo - file: ../abis/DODOZoo.json - eventHandlers: - - event: OwnershipTransferred(indexed address,indexed address) - handler: handleDPPOwnershipTransferred - - kind: ethereum/contract - name: DSP - network: bsc - source: - abi: DSP - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: templates/DVM/DVM.wasm - entities: - - Pair - - Token - - DODOSwap - abis: - - name: DVMFactory - file: ../abis/DVMFactory.json - - name: DPPFactory - file: ../abis/DPPFactory.json - - name: DSPFactory - file: ../abis/DSPFactory.json - - name: DVM - file: ../abis/DVM.json - - name: DPP - file: ../abis/DPP.json - - name: DSP - file: ../abis/DSP.json - - name: FeeRateModel - file: ../abis/FeeRateModel.json - - name: DODOZoo - file: ../abis/DODOZoo.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - eventHandlers: - - event: DODOSwap(address,address,uint256,uint256,address,address) - handler: handleDODOSwap - - event: BuyShares(address,uint256,uint256) - handler: handleBuyShares - - event: SellShares(address,address,uint256,uint256) - handler: handleSellShares - - event: Transfer(indexed address,indexed address,uint256) - handler: handleTransfer - - kind: ethereum/contract - name: CP - network: bsc - source: - abi: CP - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: templates/CP/CP.wasm - entities: - - CrowdPooling - - Token - abis: - - name: DVM - file: ../abis/DVM.json - - name: DPP - file: ../abis/DPP.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: CP - file: ../abis/CP.json - - name: DVMFactory - file: ../abis/DVMFactory.json - - name: DODOZoo - file: ../abis/DODOZoo.json - eventHandlers: - - event: Bid(address,uint256,uint256) - handler: handleBid - - event: Cancel(address,uint256) - handler: handleCancel - - event: Settle() - handler: handleSettle - - event: Claim(address,uint256,uint256) - handler: handleClaim - - kind: ethereum/contract - name: DODO - network: bsc - source: - abi: DODO - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: DODOZoo/DODOZoo.wasm - entities: - - Pair - - Token - abis: - - name: DVMFactory - file: ../abis/DVMFactory.json - - name: DPPFactory - file: ../abis/DPPFactory.json - - name: DODO - file: ../abis/DODO.json - - name: DODOZoo - file: ../abis/DODOZoo.json - - name: DVM - file: ../abis/DVM.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - eventHandlers: - - event: Deposit(indexed address,indexed address,bool,uint256,uint256) + - event: Deposit(indexed address,uint256) handler: handleDeposit - - event: Withdraw(indexed address,indexed address,bool,uint256,uint256) + - event: Withdraw(indexed address,uint256) handler: handleWithdraw - - event: SellBaseToken(indexed address,uint256,uint256) - handler: handleSellBaseToken - - event: BuyBaseToken(indexed address,uint256,uint256) - handler: handleBuyBaseToken - - event: UpdateLiquidityProviderFeeRate(uint256,uint256) - handler: handleUpdateLiquidityProviderFeeRate - - event: ClaimAssets(indexed address,uint256,uint256) - handler: handleClaimAssets - - event: ChargeMaintainerFee(indexed address,bool,uint256) - handler: handleChargeMaintainerFee - - event: UpdateMaintainerFeeRate(uint256,uint256) - handler: handleUpdateMaintainerFeeRate - - kind: ethereum/contract - name: ERC20 - network: bsc - source: - abi: ERC20 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: templates/ERC20/ERC20.wasm - entities: - - Pair - - Token - abis: - - name: DVMFactory - file: ../abis/DVMFactory.json - - name: DPPFactory - file: ../abis/DPPFactory.json - - name: DODO - file: ../abis/DODO.json - - name: DODOZoo - file: ../abis/DODOZoo.json - - name: DVM - file: ../abis/DVM.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - eventHandlers: - - event: Transfer(indexed address,indexed address,uint256) - handler: handleTransfer - - kind: ethereum/contract - name: DODOLpToken - network: bsc - source: - abi: DODOLpToken - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: templates/ERC20/ERC20.wasm - entities: - - Pair - - Token - abis: - - name: DODOLpToken - file: ../abis/DODOLpToken.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - eventHandlers: - - event: Transfer(indexed address,indexed address,uint256) - handler: handleTransfer - - kind: ethereum/contract - name: CPV2 - network: bsc - source: - abi: CPV2 - mapping: - kind: ethereum/events - apiVersion: 0.0.6 - language: wasm/assemblyscript - file: templates/CP/CP.wasm - entities: - - CrowdPooling - - Token - abis: - - name: DVM - file: ../abis/DVM.json - - name: DPP - file: ../abis/DPP.json - - name: ERC20 - file: ../abis/ERC20.json - - name: ERC20SymbolBytes - file: ../abis/ERC20SymbolBytes.json - - name: ERC20NameBytes - file: ../abis/ERC20NameBytes.json - - name: CP - file: ../abis/CP.json - - name: CPV2 - file: ../abis/CPV2.json - - name: DVMFactory - file: ../abis/DVMFactory.json - - name: DODOZoo - file: ../abis/DODOZoo.json - eventHandlers: - - event: Bid(address,uint256,uint256) - handler: handleBid - - event: Cancel(address,uint256) - handler: handleCancel - - event: Settle() - handler: handleSettle + - event: NewRewardToken(indexed uint256,address) + handler: handleNewRewardToken + - event: UpdateEndBlock(indexed uint256,uint256) + handler: handleUpdateEndBlock + - event: UpdateReward(indexed uint256,uint256) + handler: handleUpdateReward diff --git a/build/templates/CP/CP.wasm b/build/templates/CP/CP.wasm index 4a744240bc8f529317e520e3a4fbd4b7bff44e43..59bc6a1532e2098b4d976e107d6ee725ba477167 100644 GIT binary patch delta 12431 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 P5S4x5jO*WicHRF1VhTfF delta 12528 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 delta 4736 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 diff --git a/build/templates/DVM/DVM.wasm b/build/templates/DVM/DVM.wasm index 3e63ad8e3efc75a713fe17911ced09c51abf3554..c7b6270756f9412c32b4d980e33c9dca844c366e 100644 GIT binary patch delta 19114 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Ð!uKS!4rQT;icXxd)Z_ythNZ32vJppqdl zB>ti|P`knC2-2R$0mD^%xpcX4d}u*~uQ^DGpW9XEA$?f&AsX{} zwpz#Nc=+WIUH^H3+RmsGVfioG{&}V9Jgifz4^z$;MQS6Xtm6}=O*mN<{- zXfAZ zi*$SwW$5L@x*OUH1~x+NH+0{>R@v*m1)70L03)u&Q(KVxF?sX1WIsGibvNs1O*374 z7~x`|&CTRKT%fwY0~M;(e20X3rP|IYRC9cfWV-P(_YXi}*c!k{3|K~VSFMp5p-U5B zWE))}-34ba$0=!0+kPO+mwj$SYm zGGHLc?0DmpU1tnQ>fr~xoy@RHHp4c=lfww)yZk!;odqb|MXM>>Aw!kO)i!X1uN zQpfYfBL~z1lq1VPM<%OdI&9r=idG-ZO>SXy3C=UX`J7Pa(7Z$G z^y$$lYVaqJya>0SDEsS2%bch6fz^PK6)YdyeFb#}W5a1W{k6SMi-EQQhEq0`e%sfq zxqpE~R`nN}`AvVdj#1X^7rNyetJ=aSYlfeYeX~FfwgF{r+K|LX(%5gy%baKQ0o8yV z8jb%AjSR+yGj!lvyV_!)ZD;5lQ1@9~OwCy;Xtob-WE5I80Y-v2TpMdGOl7Uk;@7=+ zHB;5BnS<@_}NG-()l2$ zq=ct--RET*pQyH!?aCJ_a1YQD00MC(`NXWBrQV z4v>mqF~ErZx!7kP@be?A+Gy}JIcV(hY_;7$9qZ_ZiH&%mYx`w68tMjaAq^$-$Z4$ znG(Mp0$MViIdN5)bAurmFyh(PY27_rXD~Kwpw+F|B8>8s8xS{()ZjzLG!G$Wc9c0? zhE%|a)aB>@hE#*G!9~YUW*4+D%5DUVyNRy-aaeAP zL2Uz!+&(XcPjD_fHyavlrrkfH$S}}`&2;p~T(yN!2x{9*eNGKe_7YGmt`;zo^YCAA zpBj_m-U1TrSpyih=b`WO=&n=!g*_X$>hm-KMpj;OVfU4{8;p)^wB;we>fNS~tKCNa zpR8)oK%2MG_duOhI<>lr`uv<*QfHtIfRW>Hfw*&sx(jGAxZ0}drk|0;s&yGP)wJzr ztJ=sY*4R`{{+}1Ab$CC&SHKl=HXDXQ}komBk@O>Uc~wi~G9 zQSt(9c@$KRhDRy&-zCXj4^XVBks;(Yd1&^(=c;v&>1e}a^pAhfo9caB=c)ya1m9G= z{FsW72CWG&vSwULOIPA0f!4xQ$ZdO^7Mz)vAACX=)C?G5{v+;|r@{zYJ5!;XV<&xo zrbw;Z3A6}q+ey~5X=)3jtocrwdbT*(`=lOlu{v@qFd!g!mN=Iv-qNcO6Rp-z<*Rj!j>q8VXw12Sw01@@quUEO7Y+lwgdH|R zIBd(g5y|aL!U)InvN?}QR?^O;(D8Fg$#v-B(LshVWApQr^y^|8daf@ye;t(Ud{G}+ z4LF!b+UeZa1Nu!yqUJlg>pAKgnFm9gUgSe?t3}q-Iv={cP|+t2!PZmi)-<^n&G`1J zvX+-X!rIyZBYWf0*$|Dt=*J`X%Q|Dt%T`mJqp-^|uOb)Uogckse6wSTYLuE@ptEsSH1Ho!>q@KcKZ za%{KGUA?>Nq#}=08yUw^ns!%}#>jYnGU$$1tNs`xk5=nm)%hDC11 z^WeXRy8VCE>Y`VGv;`W zPh-qs;Eva;o{p7^)wt4{-L(|5W`cPJU)wOC4}_2VlepLO^$a$UQk)bT7T8^J>*<9$oNcn*k5(1hde&nTMry|ZDd#nf7DkMCde|eo(bP zQ9i$-{R3m6&VbRVMnmRDYe1FPz<<2jy-a{=LBPJ;eNbmfx%b-Sd2t&4@ zap7ce^4}^QNJ`blUh+6)?}4huUb4NS<$%Gw`Xi&UCEVB9vMQmeA1bsdC|dyy?{dM!Ej^Cr$*1taN{5v o%zM;;KN+yDDLmF_tluri-ZFn_x%|_GHL{d)->WUX<^Rn2Uqg0Vx&QzG delta 19618 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 Date: Sat, 7 Sep 2024 08:56:08 +0800 Subject: [PATCH 09/11] fix: support GSP pool --- abis/GSP.json | 154 ++-- abis/GSPFactory.json | 5 + build/DODOMine/DODOMine.wasm | Bin 43491 -> 43517 bytes build/DODOZoo/DODOZoo.wasm | Bin 117758 -> 118252 bytes build/DVMFactory/DVMFactory.wasm | Bin 73879 -> 73890 bytes build/subgraph.yaml | 98 +-- build/templates/CP/CP.wasm | Bin 67248 -> 67259 bytes build/templates/DODOLpToken/DODOLpToken.wasm | Bin 42893 -> 42903 bytes build/templates/DVM/DVM.wasm | Bin 92507 -> 93358 bytes src/mappings/constant.ts | 22 +- src/mappings/dodoex/helpers.ts | 22 + src/mappings/dodoex/pool.ts | 64 +- src/mappings/vdodo/core.ts | 727 +++++++++++------- src/mappings/vdodo/helpers.ts | 409 +++++----- subgraphs/dodoex/dodoex_arbitrum.yaml | 107 ++- subgraphs/dodoex/dodoex_bsc.yaml | 89 ++- .../dodoex/dodoex_dodochain-testnet.yaml | 38 +- subgraphs/dodoex/dodoex_mainnet.yaml | 111 ++- subgraphs/dodoex/dodoex_mantle.yaml | 110 +++ subgraphs/dodoex/dodoex_sepolia.yaml | 47 +- subgraphs/mine/mine_dodochain-testnet.yaml | 6 +- subgraphs/token/token_dodochain-testnet.yaml | 2 +- subgraphs/vdodo/vdodo_mainnet.yaml | 4 +- 23 files changed, 1360 insertions(+), 655 deletions(-) diff --git a/abis/GSP.json b/abis/GSP.json index e6cc627..91e423a 100644 --- a/abis/GSP.json +++ b/abis/GSP.json @@ -68,19 +68,6 @@ "name": "BuyShares", "type": "event" }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "newOracle", - "type": "address" - } - ], - "name": "ChangeOracle", - "type": "event" - }, { "anonymous": false, "inputs": [ @@ -155,6 +142,45 @@ "name": "DODOSwap", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newI", + "type": "uint256" + } + ], + "name": "IChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newK", + "type": "uint256" + } + ], + "name": "KChange", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newLpFee", + "type": "uint256" + } + ], + "name": "LpFeeRateChange", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -496,19 +522,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "_O_", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "_PRICE_LIMIT_", @@ -593,6 +606,32 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "k", + "type": "uint256" + } + ], + "name": "adjustK", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "lpFeeRate", + "type": "uint256" + } + ], + "name": "adjustLpFeeRate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -606,6 +645,32 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "i", + "type": "uint256" + } + ], + "name": "adjustPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "priceLimit", + "type": "uint256" + } + ], + "name": "adjustPriceLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -715,32 +780,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "internalType": "address", - "name": "newAdmin", - "type": "address" - } - ], - "name": "changeAdmin", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOracle", - "type": "address" - } - ], - "name": "changeOracle", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], "name": "correctRState", @@ -1013,15 +1052,20 @@ "name": "mtFeeRate", "type": "uint256" }, + { + "internalType": "uint256", + "name": "i", + "type": "uint256" + }, { "internalType": "uint256", "name": "k", "type": "uint256" }, { - "internalType": "address", - "name": "o", - "type": "address" + "internalType": "uint256", + "name": "priceLimit", + "type": "uint256" }, { "internalType": "bool", diff --git a/abis/GSPFactory.json b/abis/GSPFactory.json index 867f06d..653e783 100644 --- a/abis/GSPFactory.json +++ b/abis/GSPFactory.json @@ -292,6 +292,11 @@ "name": "k", "type": "uint256" }, + { + "internalType": "uint256", + "name": "priceLimit", + "type": "uint256" + }, { "internalType": "bool", "name": "isOpenTWAP", diff --git a/build/DODOMine/DODOMine.wasm b/build/DODOMine/DODOMine.wasm index ab947b847f5ca2449ac6cc19fa30a85b4a992c08..d11879bcd288c671c486b40028cb3cf42ddeb22c 100644 GIT binary patch delta 3911 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 delta 24600 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 diff --git a/build/DVMFactory/DVMFactory.wasm b/build/DVMFactory/DVMFactory.wasm index 0ad34e4614c4ee81d19cabc016914e86f34ed649..dd26ff66a4f1755ad4415ddf6d4b6e9640e1cb0e 100644 GIT binary patch delta 12300 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 delta 12597 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 delta 11424 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 ULJ22mG(ms($>QG8ilg29e^f6k5&!@I delta 4756 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 F{|_7E9=!kn diff --git a/build/templates/DVM/DVM.wasm b/build/templates/DVM/DVM.wasm index c7b6270756f9412c32b4d980e33c9dca844c366e..3564bbae51b952df800683a9c84b7335c092d96c 100644 GIT binary patch delta 19919 zcmb7s31Cyz^7p+r3C(RNOXLMVeh2A&Kw=Ci`gM|T2Qof z-s0jL?<`t+*Zkr;g=aR0StdU#MyS=}M*`nbEbI(aOw=l#3shXMRXi_tQJYL&Ii|Sy z`l6M^8e`WUYgklNM5SmfTD*AKTrh+e*fnw8JH05%vu4d*ws>*z+?B#^c1N7m>=NZL zQBXvam>K@n>yl$nMcgq-?@Lsidltoa2@^eRZSpRnYgtZ8qTZQ;!nG+s=^GQ2+C8IE z2TPJIliAW!3FQt>VE;~^Xtm`io*dv*XNBd8v{G@f3mJKEU_xdV;MmMT>7F5^r?#~ot6&i_B|*`Tg(l}P#lxP@ zToUcEMw%=gpqw+41yrYHHR*kYC|G+Y=-t<#Frw#eBi*^AbAM}{<}|bx%<1M1ktW4A zRIv?H`!I~rmneckC3Mtb*-+>?-LojiRtO`a3_^bl0q*;oRp=<1(0G_d%#`#5Ix5aW zb5CFZtA?8g5QQ6Q$N8C|(aAh;+B&v6_3Dh6zfu2}*fylhD`B{h=+Ku-UOc zv;}N!gxP3fPB1MIMR-@SrI=HaMRKw`Q*mY~vDzGnOwNf_KFzj}!AgC$MdVgwE8c8! zre*`Rh*QF7))Z&5MKq_vD`6(nlR8N%5!WbAHajO)vZb(la*`xxD%+o%tW#<=Y)eyV z566tN`}N&J#dGt?GhXd>Fu;A`K5i`j}^-6dNxd%RaN+5Aecln$OWsU$^YoAMHLI?T(Z zUTKo;0JG)|mOU9#iA7R88EnPiE(RaEbh0&hiox>%l@8|RCe|KCsRnulwPP)=`=Cq3 zeS}$u#A?lY_D)b2(8S(*#8jIXP2LxjKcv8NfL~=(z*6UjWNC7Kj%2g2srhlDk1fo% zNbaK{3ZKvaB)t~hx<3*SPGrMjL%;^i9{w|}lSD%aMzp=}db#lvm;}LEmRryZ-kw=7 z7Fu@}WJlBNg|G^Es*4p#xhTb>n8K{a-V1@352odx&m!sed9l+_5SJ{T2?$lx)Y@f&o2c=Wzi} z78Q{#8$e<3?tp9voF9-a+dfx0dg91VjWTdKH(NHaZzK;Fb#A{PlV2H_Jo@67T7)#C zz+uDka0^dir z6R70^DVheaIVg~BGF>N%Yb+uqCB=4JP}AgbCT_~o!4;fz9%t6F#I#^Ee5D42?n38nSquXE7UD%K9)`yd^uo)h5D)0$;q&Z;`gXZ95|mtBy7)WrrXaNHbMo zlC;KHqWG+eE#7Rf>Z#O7B_jzc?l=?;yy)zPVh3I<>yBa=FN(En!O+Q6#1xM+8(DgBagSkXh|dwjG64TJY$R&_H7pn9 z`eDOSPAH`ED}~8yNnt$bM+!;qmBL;q`wFS$D}^a6>lzcMQ*>d9TC?VwDAbf)L()~( z;*_3fzW$OA3C-W0WGqYDP1JruVkuL zu>%#2Tt$v%`_Wdm_mf20mh?)2IojMKSwylzf)Uu%5j|L!5y>%p=ChOyu}UBHB!VfJ zFd`j}UoisPQD|m+WkhIHmo@RIKHY_)dh~0TG(S|Mpl(T*uq9n;>xZ*l`1lajzlB6K zUt+#Xp>t?g6B6YaOmc`L0#kHK-D5O?Rc)uJteK|BJu*4}wJQPBP*6>~0@JRvHSK*- zGtI;FqjHdY`;6*A4wy131?l0wJJQ88R1lRW(oh+fN+|eo68-XUON5R#j z`>7e3A2mES5i*|9$t7nW5Y_)gj}U6!6sL5Kp~glngYVWvIje zI-`+Ur#P+Vcp~*?y*WPFfMu&gMn(Mv+A}!DnMaSqrJhY#6_KDtibFjg7?254ahf3| zqB)+e86VHe#_3J&qiSnlw&RvAv0AGa0iqmxUrq+NE_VY+{`vHxI63(=M$p^p1QB_ zvrS;*akmmk#YACXP{1xvj11Wp${s^VWGR)2w1Dzodt3{PY82EceOy#rkGBnr7ZbIx zaI+x6?3HU% zF|)oYsp#A=l~!ri)C`2fb%2fRUO*??F?GZ!UuSco31fj%7PofE7Ewv(L$*CCT6Aq4 z25vVVfs*28*W8lL&fOdxs%%+nWm`ohb&cRO6ralOm<1Zn8SY5KG|)c?DDVck?hI>VT6JjMr8=2vbJG#B3=t4ACqqAeQm1% z;>QOqfP$w33ZS0t;-^)7WozMsV80=@1K(#1?AT-rtG*#kcGmObt9cw-eNzw0p@R%P6<4IQImzIqKjL!7-~j=$510yf`3cf7`kK$ z#?X;lb7UWdo_Va|+&n#rQoD6Jt;o^S)3Cr7O{aBvYI+)3(P=|6u9me#>TKt*ny05o zWt*9AI==+Z!2A-ChV7O(KF*Om>7XnI6LtVM>ohYXymk}KnV^)hkYP=q*$cfrG820X zKhFh@Rc}~B*N>XBH&MHQKy7;gm=q$gEjd&JKaZ%#u0YoRuDu2i+jLv-I`We0t%b(@8zOuW4(LOAF4Y#G@RVxUq<%i_3n`RPf*`@iWXQ$rIB@- z6_D>aD?c0ygV#HKEOJ(0`q$3Nr!``p)y1mq(JWwIggM=0jUYvM2(Uz0OziR7EzC4K zhRn0fCi5oF4wx4K^Gaq1x_f$dz`O`dQcL|$v-3@=c@YXQTRS`Od@#N!-=rECq0kC$ z;W&#hByIr=390|3XcW!ukU2dOQ1jSjpUMNbUw~WS`G1u+VW-Jx>_}=PA)V(o7dC9em+o+4Hh7 z@|!uFRUFHf%!>(A4_Q985%i&XsohCQc-!V8Zyr{hEqh8;OV_Z-Vyli0i?fRJkcT!F z57l@Ps6)tTA<fUz$a7ww51gI!rtYM&&}5N2Or7l_eM7xazxwGn`J z2pBc9wz1C_^p3W5ZLI|ThRE#ZGVV4quqZ^P3Nn47+K7}@go?bUb`{sUD^Ep8(tYi3 zH>jJQdb!G46w$M`i#ZWTD8U>TX_AI3MrD{eT5&rlPsS+jM@6O9froGGt9UhB^r+}z z=NBbRa&HsSszebfRp=Dwc914$i6$+)N>j@#+N(W+oaj{5*0LKHKc3R)6tTDA*-ABp z9$wW~qL%kEreBg`Xnc-N5jjid%Vm`);SKE?)@Mm)_VSV;^L#tVsNqWOGoogMYUXgI zF<4XftSV#M37OV|wThq*2pGL{Cm+2PucdhAYDCbMp8ui8rKrBaVMxQ_9^VV9w|qO{FRC(|3Fp)9fBm1WJz$i?HBt$GnSssPSu|w6 zsc2p&;yD>!fuMQ_*Q=&4%xHJk`OXL|a)Z@?Ef}S*r>C+NcVf4GnV1sZF;re) zOUG?XzN;r~GuXy;zDvAqXPOSYOd*zNCqIL|DMiov%;>>fcf}5_O$}UAuXc^ZgEhUo z({&YD2wx!JT^&)PPm#>|tZYSsQ8ee#`JjFT%^ zu#A~EX3Fj(v{4G?^=$dZBz9?KC)qZd+zyrk|^0uvVY!_3+H@rkCoSU8XlLi9v0p?68)0}KU*Yu581YP!hKhUe$(`%E5pZ!sLHS?puBi8pLz7_is?OHuk z)x>In+K30x2s~5A&=&_7@*ivab#_ESIypiSCMlvNB0fUst~|lUJg^BKt9zgqImo!K z2dqw8*Au}!bsfG2Il%t0E<^JC%w|5A%w}xq$htikCpo|8WWIVb) zp$u;!PFA-b7wTU%KUAZ@{owu;uZO?3^}`wU(T7H!^H44ZIQ^jv%*_K2Wx|5pD0|o^ zyyh~mNqu-!5?|Eebjq}b!5ZWldVy0b@S4vaes};{z58%7^qhWpU^o&GQlFK&NG&DS z%u-^Nlnw-}DjkxB2&6IU6&~3JtO3JS)xnfl#F0!iFS6(@ z9SI^e>){~8#9yhXdL$R4`u33tFrv?+%TV6&Xdn?(KgySw1VfPYXo*QMM7oM0ogU+c zeErWDHuW*%1kbDDUkhg`N20atFPXDVw5Q`y2UBHgqy38K1X76J( z7v~@A4%kv_wNvdBJMO6&Y`MLQtZf!fk?nu18{1_!6XPv=Ldf~MY!8N$rJRxJ{5@{x z>sn%Up}@n!`MRh$UT>SnzX{}VdSD8Ei*rb??)A1u*_6i zw=vq7-7I2*5_rVe7_L2HVEC+PL%PBD8TKURdA>7qZivJ*glv3I23{ery7BQX56TB^ zr0-&A*S~LLM(FW11-zj_R%K1%bw(4 z__;OG%}JyM>*jQw^DUA8Xae$xa;ovQ)JV>^S?#7Yo%3xj6x;4$%=b2JyvH^t-}1y> zZNeNV@Chs1i;Z`0+X-vZzBX2BX<`FkyR}p7L1RS2@s1P?V=um|DQ`xBD{p)kFDCD{ zRbJOoOP0PjLzHihkRs?!-^c#NCJidXP94r4Z-bAsv^7^rA&+n2{PC7&DmQqrWQ?4%FXEfSUCl8Q#o#n2UxF)v0-Iz@NU^YM|VA(Sj7^zTcNhPBF)+e z77no5(blA%U`!(#t3*26;wr#g+fPE)_s`)LALT6(32~7{MA}q zyh+s7^#>ia+<_mkm`uNR4ETHHQ9g$4;Mcn%^+my-qhB=1cRMf8-f{|K#P*i@@hj>o? znjsje#Q#aJz7u0UkpN2gnOZU@nEPQa`v z-2!oeAOD#9nJ19>bofPiBFgGOqUZ=Dnx~sS6D6Ix3jNOb5`O&_&BGLT1iyV#maLOK1!%XL^nOMiiTx&;=;Q%jDI)CJkKPu z<-3e}+9X-kGkuUZzk8;rEA2oe&yW55s~w&@*qmnv%WASKLau!7+4(xGP-fd{L8RsF zq?|ErCmpue?4&^3v6CL&ygTD~8=aZjT-Z4ufq3I{lx6<@9JSbrvX6NHo$SnWJ#}tq z#6F+#v}k%vulm{jUK?}hcV$)!p65T~UpH!xVDp||Df!-GC!Sv++1_W9cNIzQ_nCWF zXLV=h?-)LObBkQu)S1n=JF(=6Ls|-UprGEc4k6JWYMYBMb=Gn*Hw1}ZqJ!&obZ>?k zK}XTIx3EmF9LK!lU5sC5r7 zKN0wiKof!A30xv@nZOSO{sbsdZ1kS9mcTixJWt>Pfd{DWXDU5RrHjE*DUpv6c$~ln z0vidG5!ggvGXX{bzk*brpu!dcPZB66@J|Bk#nFIIQ_(?S2Z3h^JV#&`fl2~T5pWXV zPh~Gq=|uvZTfshjIj-boqTK{uC9sFUYXn{=u$90Y1nBuqd6U3)0?!kuBJdW0bp#$H zz}@>0mEI=s4uSOq_7dwa>{usR1-Kx zU>|`x0!ImaN8o(|7YOVpaDYG~fe#40N8mpM`~*sT1V1G3BY`6X4ior{z~=;x6F5ZR zV*(8XP7^psfUNQc3MZ)WE`hHJ{7m2^fv*VE6ZnY0_XKJI1}PV*c$UBq1b!j#6M>NgH9KIe%)-l}`ceGX+j>@tG zwbB`*Rhm%g(JJwHoQmHA0wOggnWa>nVzU70X?sXDC{7UFc~2%2j>e}Af?_xBNqO~6 zsbrF%)O9iq69qx&kIy_|8UGXu_XxSd-9kQKpl+_PKqwLx3QJM9QYaSg0$d8b5-(Me zCb5U0R7RR2NK*%VMhiCz8tCeqZEICz`mEfxUYi4U9dx}n4mnZ<(A6lt14 zGB@JW8~yhc`U!o|<3L!Zz><+D%@gJd1;PMf6u5&>-xreoz*SH`5A|cvA|LgmQBV9i zpo;n50=!I^xs`sise>MU2uA!=7*!>(uQbZkMTaV~Z@E$Zkc^0Xd=$5?Dyp@0stp6t zUorYALT_`?S6^7t8@>1Ey^{s~VD)_95x}EiPZ4ScK&k*^m;=rrp``DP z(GjA;-dXjxQ^puO^Khu_+~RI?Y&iUmkLGVLL=X*iZ2p_Gjn!Q^QNxbDIlIIa%k@>o znj$GqFipY@!p#`gRQw8D<<-TSVu;rfpGl~n1@0*PRs7&%o||G#-H0C@(Uer2h)8pUAk-qzdv`=GQrQibmW41Ja`+VR zB&3IKtE$`DVn;6YsNKRgrs$=5b&SU&4(PV8|AJdSfDbp(UWNuDHvZ)IVsuMn= zv|K+Oco{5JC2H7=z3CP|2>75W*<>PdTAB+ncZxm5B(5eG?%4acUiMT~XKKruT8_C` zi2g=G<0|Y9*c+-zQQqgK&`1Ydu?x_H1>~EOCE&?`oB($u@OQhKndB zg)Rgz;Tras5jzm0QD?L2!Lxd8#8 zT&@rAm8;)ZC2Cl&qYGu%2cTd=6>}b)9B!{sc@;G*@90=oc+8sBOjSK#&>^8E0B(d2 z79lv6V)>w6^?vEGY`LB&sB2)=$EHMAA6BUv;Oi)OCa^2N_t|_{&#tfSHoLJ<8Ey1$M;4#YE?begfX}p z_R+^T$c~Rdq5Ddf`^l4X^~azl5zqU{c-j7mN>#ALPlw6%M4?>+oA>F>(bb=-R1L7^ zls}ISW8t4g$&Sy!f=QJu^)qXUm#7{XIdIVYK#o=X8n+2J7}^UFk;m0m6~MvzMTkSK zzAChS4px;`Ul&@xf|k9;XaWv8ehxX_{<+o#aFDZt?|Z}^P8=sWb~t+Jme^xVX<>o@1yzg6{B00-S=%Wv#W}Yfa(D! z00*ZBmk&SHqvIyVPWF{u4JuW|j-ABZYg7}9_$pg=oda(s&6@Jn&9ePFP%sMTh_A{@ zT<1Yy$W_2Wqb&W}8&yw&FrxuDxEyXkDlWo$R+=?#sXv5ESJu05aaA0srM8u!-1+d~ zGUh&|PpQ_}HNe4urZc5dPaHn2pPx#Q?H5!v73_~w-DDS0WI0RnCCK#})xbvkl4Se$ zDzAbq@g?O}Yg7$z@B~KsL-MF!lWAga`K+?z2eo}AJL5}{y+px(bu9Ahn`KucDEP06 zE&IBxulGk)vJN=tzu^Ph`>$COEd7b)pH7usKdCya*sRkNC)$4o1qW3C2k%gK!NOH= z5)U(%CQ$_(JP6FeF<=?^$S+>v!y9$%m(v;1%|tE6u5nQ?713&+&OUlKo{c{Y zXIi%9j5FWytJ0y+mV6+BKo=P)u$);w3&AvjXP9uBtKW28@4_PLEGk9bm zc$ja80;lEvjHymy0S8^TK#N7iugNyCpT9%8ULRRt zhFq;tHB7#clIz!~Cg7m9Nyu&?X~OZS+P;$AdI1C0s5-X(LRxe)QJAvQ$HdS@m-~&8 zow_h2#*bk2%z`=RM<(mI#b-vUDvCO~65+I6t+<+iS zVbs&)9|p<(4O&lZ;}6^N9c7ws;Gk~X*sJK)1nbzW#x}vSX7%^I(Cv)FPKr&kJWj}Fw)6jic}AF-ipR2`f4V@7y0QP5J#*h4=S zL{~GA7)=duNYc9SWjI^>6JMM$t|uVk!h{0{d^qJ?2K(cR5i)n=*KbjKYXA<8b@+t# zW3@l23RW<~&na@XM%A!BKU-zLMm4b+pd96@WF=ewb4G8kM%4ia&jfS${XFFA+^k8J zRpHd}D@kLzFe&3|__PZd! zBcCn%B}J|$3Uk%Kp8loV*k+9?b%ZRurC1Y7_=KRAWGjJ#8_8(ldR+bU=?qy-{7Ezm zmwy=&W#6hwy9mSRDmM1lxw2!MN>#EwzZS{%?J8Bl5`HTRZzhT+)yYbK>m5~%Z$7EJ zdcu6vhkmt7N+`^@*-03gc`hJP8(6vhOdAlD(B6S5q%T zE-#Dmz5vPr3ivUe0v=>b-@KXmF8At)2QB}LV8f&)c5O2PZ?{TSvU{4dWG_+Zt&Y9e zoZa2-0)^gOglA$}fTvJy9LJ{q+Ld+q11Hg!)CLu7)E~Lsy+ombpD-NO1gx#GwarQF z#XqizuK$^1*uZYTQXKAe zgL1)2{NLf&qAp)qmf!pesxYY1S3^R2_AOTlX$Ytx?fBE0Tu&4XZU7FRdhtC%Gu5NN z(mm|dpEG0pdq6rc9^j4Kqor*7nY1l;iFf4NUsn}Y00$S7Fui@x)g(9+Az$866!UsF z6N#=%-w25!I`{L(JO^s|v;+4cU-T?LCW=YrkBVYsZapzE*aqO>7P7eY7Gi%>RZvm> zz93;X|4u|-b?p} zc+huSdk?xGKx(Rh7m`!v(0Q}`uwI-fyY{I%tI87%Vr72)yQ!lzqW%oEUJ1xNX%J1;c84kxub*VmL2~FITUNOd|H^; zPp&6&CUIGqIN4NvP$g>)itN;h!X)})j3!GxIrPHoBpp=VgAjaB`Cj>VVPa;MmuU1< z2OP|w>XQ_Y55FegR6fKgW`sN5*P6dyzSt=Ci1re_8qI-=$y2w(Qwim78pYA!-VeYd z?|)FV?jSg{B|3>h(Ay!n*QKX&40LjSh$!kRURo{5iZ6i)*OMJ zNYn#|TeuY7?vbVKUeOd?u0)72B}ygA5%C%`K~>~MokW6lD8vSsg!PIlNz7(0g>SG* zKSV$Ag7O4#G&n*Qgb4RkvEn8H2>O7FLe&Z715Dyg$@NFU#{e1#L$2%?vWu+tBwzrQ z$I4$eiLn!EP#+bk)rasKNIp;xLu|FsgLY*ab^-_asDG`t{0EabL3;3`@*y3?v5P+a zNE`3jK%o%@5zpWcehk;qQ0Na0+JOoYroIN;h3fCehwvH=hruyz8}0l=(|_=j@(Ufs zDU##U^1=u)sbrg=9Q;({)dvdxK%qHMuzv>o16H8(okUyEA^ic}3|a(s9oKYK2MS&k zT1~y5DgvrXXha7;R~!3*gB)T!Sf?@^z&sjUfr39!Xbu!yU#POx8un`Vi4%dgTESK& z>X#NRDHgw*^pg1Ij838{wR}e}F{ONaPq9Pz)S`uVPF=EOhgeWvlp%I6pVdn=mD}^h zNZm7HZcCLZ@GqP_D-I3Tb}YY`FUIP2iaEh5Q@HkTo;}y9Qu}w$o^MsD{o7}|Lc5M` z^Y5QkiX+Q+3={{M7S5ZsZ2qj3_bxAfq5QhO;>frc#m;LMFPxKi=gPdhR<4?pH*40a YrOOvC-CgeLE5?bgH{a_kKH2a80s5e}ZvX%Q delta 19268 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 Hwc`H)ebheP diff --git a/src/mappings/constant.ts b/src/mappings/constant.ts index 1d6cb3b..f89747e 100644 --- a/src/mappings/constant.ts +++ b/src/mappings/constant.ts @@ -7,24 +7,24 @@ export const TYPE_GSP_POOL = "GSP"; export const TYPE_CLASSICAL_POOL = "CLASSICAL"; export const SOURCE_SMART_ROUTE = "SMART_ROUTE"; export const SOURCE_POOL_SWAP = "DODO_POOL"; -export const DODOZooID = "dodoex-v2-okb-x1-layer"; +export const DODOZooID = "dodoex-v2-dodochain-testnet"; export const CHAIN_BASE_COIN_SYMBOL = "ETH"; export const CHAIN_BASE_COIN_NAME = "ethereum"; export const DIP3_TIMESTAMP = 1624442400; export const SMART_ROUTE_ADDRESSES: string[] = [ - "0x5b622A373b485CB9BA283ECd6CE6689a8b8FdC05", + "0x351a86A2C8dc47D396305AAcd7F126E096b2eee4", ]; -export const DVM_FACTORY_ADDRESS = "0xFaFC924BF0F70BdF4a722231622f559b94e53902"; -export const DPP_FACTORY_ADDRESS = "0xb546Add98c71D97Bb65De60B91021617AcD1262C"; +export const DVM_FACTORY_ADDRESS = "0x7D381e6a9c23A0E6969658f6B8Eba57A4Dbf93a0"; +export const DPP_FACTORY_ADDRESS = "0xF5378974cfD5042A58c458E06cB6D2A2D1c2FAF8"; export const CLASSIC_FACTORY_ADDRESS = - "0x8dD0Fea5FA2f7df535F87f312641Cc15d8B151BA"; + "0xF9a6c9BE0a1149C69EF537359c78DeB5e6264ec6"; export const CROWDPOOLING_FACTORY_V2: string[] = [ - "0x8dD0Fea5FA2f7df535F87f312641Cc15d8B151BA", + "0xF9a6c9BE0a1149C69EF537359c78DeB5e6264ec6", ]; -export const DVM_FACTORY_DEPLOY_BLOCK = 300062; -export const DPP_FACTORY_DEPLOY_BLOCK = 300062; +export const DVM_FACTORY_DEPLOY_BLOCK = 58; +export const DPP_FACTORY_DEPLOY_BLOCK = 58; export const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; export const BASE_COIN = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; @@ -39,10 +39,10 @@ export const TRANSACTION_TYPE_CP_CLAIM = "CP_CLAIM"; /** * usd pricing */ -export const WRAPPED_BASE_COIN = "0xb26c0d8be2960c70641a95a9195be1f59ac83ac0"; +export const WRAPPED_BASE_COIN = "0x3a64Ec3606FF7310E8fAd6FcC008e39705fB496d"; //pricing supported stable coins -export const STABLE_ONE_ADDRESS = "0x0adcbae18580120667f7ff6c6451a426b13c67b7"; //usdt -export const STABLE_TWO_ADDRESS = "0xab0733588776b8881f7712f6abca98f510e6b63d"; //usdc +export const STABLE_ONE_ADDRESS = "0xb95ed7e958e196688984951f41ac2888f4b10ab9"; //usdt +export const STABLE_TWO_ADDRESS = "0x46afe01d758a46d64c7d8e0791314d5db3e2e683"; //usdc //stable coins pairs export const STABLE_COIN_PAIR_ONE = "0xe8c1b7e0505c97c59ff2f12ebf91a8eaa59d4c73"; //[USDT_USDC_PAIR] diff --git a/src/mappings/dodoex/helpers.ts b/src/mappings/dodoex/helpers.ts index 78479ee..6c97e31 100644 --- a/src/mappings/dodoex/helpers.ts +++ b/src/mappings/dodoex/helpers.ts @@ -611,6 +611,28 @@ export function getPMMState( return null; } +export function updatePairPmm( + address: Address, + pair: Pair, + event: ethereum.Event +): void { + let pmmState: DVM__getPMMStateResultStateStruct | null; + pmmState = getPMMState(address); + if (pmmState == null) { + return; + } + createPairDetail(pair, pmmState, event.block.timestamp); + let baseToken = Token.load(pair.baseToken) as Token; + let quoteToken = Token.load(pair.quoteToken) as Token; + + pair.baseReserve = convertTokenToDecimal(pmmState.B, baseToken.decimals); + pair.quoteReserve = convertTokenToDecimal(pmmState.Q, quoteToken.decimals); + pair.i = pmmState.i; + pair.k = pmmState.K; + pair.updatedAt = event.block.timestamp; + pair.save(); +} + export function getQuoteTokenAddress(poolAddress: Address): Address { let pair = Pair.load(poolAddress.toHexString()); if (pair != null) { diff --git a/src/mappings/dodoex/pool.ts b/src/mappings/dodoex/pool.ts index eeb7308..3522f42 100644 --- a/src/mappings/dodoex/pool.ts +++ b/src/mappings/dodoex/pool.ts @@ -1,4 +1,10 @@ -import { BigInt, BigDecimal, ethereum, log } from "@graphprotocol/graph-ts"; +import { + BigInt, + BigDecimal, + ethereum, + log, + Address, +} from "@graphprotocol/graph-ts"; import { OrderHistory, Token, @@ -25,6 +31,7 @@ import { updateTokenTraderCount, createPairDetail, exponentToBigDecimal, + updatePairPmm, } from "./helpers"; import { DODOSwap, @@ -34,6 +41,12 @@ import { } from "../../types/dodoex/templates/DVM/DVM"; import { LpFeeRateChange, DPP } from "../../types/dodoex/templates/DPP/DPP"; import { OwnershipTransferred } from "../../types/dodoex/templates/DPPOracleAdmin/DPPOracleAdmin"; +import { + IChange, + KChange, + RChange, + MtFeeRateChange, +} from "../../types/dodoex/templates/GSP/GSP"; import { DVM__getPMMStateResultStateStruct } from "../../types/dodoex/DVMFactory/DVM"; import { calculateUsdVolume, updatePrice } from "./pricing"; import { addToken, addTransaction, addVolume } from "./transaction"; @@ -49,6 +62,7 @@ import { TRANSACTION_TYPE_LP_REMOVE, TRANSACTION_TYPE_CP_CLAIM, DIP3_TIMESTAMP, + TYPE_GSP_POOL, } from "../constant"; export function handleDODOSwap(event: DODOSwap): void { @@ -550,28 +564,14 @@ export function handleLpFeeRateChange(event: LpFeeRateChange): void { if (pair === null) { return; } - if (pair.type == TYPE_DPP_POOL) { + if (pair.type == TYPE_DPP_POOL || pair.type == TYPE_GSP_POOL) { let dpp = DPP.bind(event.address); pair.lpFeeRate = convertTokenToDecimal( dpp._LP_FEE_RATE_(), BigInt.fromI32(18) ); - let pmmState: DVM__getPMMStateResultStateStruct | null; - pmmState = getPMMState(event.address); - if (pmmState == null) { - return; - } - createPairDetail(pair, pmmState, event.block.timestamp); - let baseToken = Token.load(pair.baseToken) as Token; - let quoteToken = Token.load(pair.quoteToken) as Token; - - pair.baseReserve = convertTokenToDecimal(pmmState.B, baseToken.decimals); - pair.quoteReserve = convertTokenToDecimal(pmmState.Q, quoteToken.decimals); - pair.i = pmmState.i; - pair.k = pmmState.K; - pair.updatedAt = event.block.timestamp; - pair.save(); + updatePairPmm(event.address, pair, event); } } @@ -645,3 +645,33 @@ export function handleDPPOwnershipTransferred( dppOracleAdmin.updatedAt = event.block.timestamp; dppOracleAdmin.save(); } + +export function handleIChange(event: IChange): void { + let pair = Pair.load(event.address.toHexString()); + if (!pair) return; + pair.i = event.params.newI; + pair.updatedAt = event.block.timestamp; + pair.save(); +} + +export function handleKChange(event: KChange): void { + let pair = Pair.load(event.address.toHexString()); + if (!pair) return; + pair.k = event.params.newK; + pair.updatedAt = event.block.timestamp; + pair.save(); +} + +export function handleRChange(event: RChange): void { + let pair = Pair.load(event.address.toHexString()); + if (!pair) return; + updatePairPmm(event.address, pair, event); +} + +export function handleMtFeeRateChange(event: MtFeeRateChange): void { + let pair = Pair.load(event.address.toHexString()); + if (!pair) return; + pair.mtFeeRate = event.params.newMtFee; + pair.updatedAt = event.block.timestamp; + pair.save(); +} diff --git a/src/mappings/vdodo/core.ts b/src/mappings/vdodo/core.ts index 384e3d6..a9410f3 100644 --- a/src/mappings/vdodo/core.ts +++ b/src/mappings/vdodo/core.ts @@ -1,298 +1,475 @@ -import {BigInt, BigDecimal, ethereum, log, Address, dataSource} from '@graphprotocol/graph-ts' import { - User, - MintHistory, - RedeemHistory, - DODO, - vDODO, - UserOperationHistory, - TransferHistory, - DonateHistory -} from "../../types/vdodo/schema" + BigInt, + BigDecimal, + ethereum, + log, + Address, + dataSource, +} from "@graphprotocol/graph-ts"; import { - ZERO_BD, - ONE_BI, - convertTokenToDecimal, - createUser, - fetchUserInfo, - initTokenInfo, - fetchTokenBalance, ZERO_BI, fetchTotalSp -} from "./helpers" + User, + MintHistory, + RedeemHistory, + DODO, + vDODO, + UserOperationHistory, + TransferHistory, + DonateHistory, +} from "../../types/vdodo/schema"; import { - MintVDODO, - RedeemVDODO, - Transfer, - PreDeposit, - ChangePerReward, - DonateDODO -} from "../../types/vdodo/vDODOToken/vDODOToken" + ZERO_BD, + ONE_BI, + convertTokenToDecimal, + createUser, + fetchUserInfo, + initTokenInfo, + fetchTokenBalance, + ZERO_BI, + fetchTotalSp, +} from "./helpers"; import { - DODO_ADDRESS_KOVAN, - DODO_ADDRESS_MAINNET -} from "./constants" + MintVDODO, + RedeemVDODO, + Transfer, + PreDeposit, + ChangePerReward, + DonateDODO, +} from "../../types/vdodo/vDODOToken/vDODOToken"; +import { DODO_ADDRESS_KOVAN, DODO_ADDRESS_MAINNET } from "./constants"; export function handleMintVDODO(event: MintVDODO): void { - initTokenInfo(); - let vdodo = vDODO.load(dataSource.address().toHexString()); - let DODO_ADDRESS = dataSource.network() == "mainnet" ? DODO_ADDRESS_MAINNET : DODO_ADDRESS_KOVAN; - let dodo = DODO.load(DODO_ADDRESS); - - let user = User.load(event.params.user.toHexString()); - if (user == null) { - if (vdodo.totalUsers.equals(ZERO_BI)) { - vdodo.totalUsers = vdodo.totalUsers.plus(ONE_BI); - } - vdodo.totalUsers = vdodo.totalUsers.plus(ONE_BI); - user = createUser(event.params.user, event); + initTokenInfo(); + let vdodo = vDODO.load(dataSource.address().toHexString()); + if (vdodo == null) return; + let DODO_ADDRESS = + dataSource.network() == "mainnet" + ? DODO_ADDRESS_MAINNET + : DODO_ADDRESS_KOVAN; + let dodo = DODO.load(DODO_ADDRESS); + if (dodo == null) return; + + let user = User.load(event.params.user.toHexString()); + if (user == null) { + if (vdodo.totalUsers.equals(ZERO_BI)) { + vdodo.totalUsers = vdodo.totalUsers.plus(ONE_BI); } - let history = MintHistory.load(event.transaction.hash.toHexString().concat("-").concat(event.logIndex.toString())); - - let userInfo = fetchUserInfo(event.params.user); - let superiorSpChange = userInfo.value1.minus(user.superiorSP); - let userSpChange = userInfo.value0.minus(user.stakingPower); - user.stakingPower = userInfo.value0; - user.superiorSP = userInfo.value1; - user.credit = convertTokenToDecimal(userInfo.value3, dodo.decimals); - user.superior = userInfo.value2; - - if (history == null) { - history = new MintHistory(event.transaction.hash.toHexString().concat("-").concat(event.logIndex.toString())) - history.amount = convertTokenToDecimal(event.params.mintDODO, dodo.decimals); - history.user = user.id; - history.timestamp = event.block.timestamp; - } - - let operation = UserOperationHistory.load(event.transaction.hash.toHexString()); - if (operation == null) { - operation = new UserOperationHistory(event.transaction.hash.toHexString()); - operation.amount = ZERO_BD; - operation.timestamp = event.block.timestamp; - operation.type = "MINT"; - operation.user = user.id; - operation.superiorSpChange = ZERO_BI; - operation.superiorCreditChange = ZERO_BD; - } - - let superiorUserInfo = fetchUserInfo(Address.fromString(user.superior.toHexString())); - let superior = createUser(Address.fromString(user.superior.toHexString()), event) - - let superiorCreditChange = convertTokenToDecimal(superiorUserInfo.value3, dodo.decimals).minus(superior.credit); - - superior.stakingPower = superiorUserInfo.value0; - superior.superiorSP = superiorUserInfo.value1; - superior.credit = convertTokenToDecimal(superiorUserInfo.value3, dodo.decimals); - superior.superior = superiorUserInfo.value2; - superior.spFromInvited = superior.spFromInvited.plus(superiorSpChange); - superior.creditFromInvited = superior.creditFromInvited.plus(superiorCreditChange); - - operation.superiorSpChange = superiorSpChange; - operation.superiorCreditChange = superiorCreditChange; - operation.amount = operation.amount.plus(convertTokenToDecimal(event.params.mintDODO, dodo.decimals)); - - vdodo.mintAmount = vdodo.mintAmount.plus(convertTokenToDecimal(event.params.mintDODO, dodo.decimals)); - user.mintAmount = user.mintAmount.plus(convertTokenToDecimal(event.params.mintDODO, dodo.decimals)); - user.creditOfSuperior = user.creditOfSuperior.plus(superiorCreditChange); - vdodo.dodoBalance = convertTokenToDecimal(fetchTokenBalance(Address.fromString(DODO_ADDRESS), dataSource.address()), dodo.decimals); - vdodo.totalStakingPower = fetchTotalSp(); - - vdodo.updatedAt = event.block.timestamp; - superior.updatedAt = event.block.timestamp; - operation.updatedAt = event.block.timestamp; - history.updatedAt = event.block.timestamp; - user.updatedAt = event.block.timestamp; - - superior.save(); - vdodo.save(); - operation.save(); - history.save(); - user.save(); + vdodo.totalUsers = vdodo.totalUsers.plus(ONE_BI); + user = createUser(event.params.user, event); + } + let history = MintHistory.load( + event.transaction.hash + .toHexString() + .concat("-") + .concat(event.logIndex.toString()) + ); + + let userInfo = fetchUserInfo(event.params.user); + let superiorSpChange = userInfo.value1.minus(user.superiorSP); + let userSpChange = userInfo.value0.minus(user.stakingPower); + user.stakingPower = userInfo.value0; + user.superiorSP = userInfo.value1; + user.credit = convertTokenToDecimal(userInfo.value3, dodo.decimals); + user.superior = userInfo.value2; + + if (history == null) { + history = new MintHistory( + event.transaction.hash + .toHexString() + .concat("-") + .concat(event.logIndex.toString()) + ); + history.amount = convertTokenToDecimal( + event.params.mintDODO, + dodo.decimals + ); + history.user = user.id; + history.timestamp = event.block.timestamp; + } + + let operation = UserOperationHistory.load( + event.transaction.hash.toHexString() + ); + if (operation == null) { + operation = new UserOperationHistory(event.transaction.hash.toHexString()); + operation.amount = ZERO_BD; + operation.timestamp = event.block.timestamp; + operation.type = "MINT"; + operation.user = user.id; + operation.superiorSpChange = ZERO_BI; + operation.superiorCreditChange = ZERO_BD; + } + + let superiorUserInfo = fetchUserInfo( + Address.fromString(user.superior.toHexString()) + ); + let superior = createUser( + Address.fromString(user.superior.toHexString()), + event + ); + + let superiorCreditChange = convertTokenToDecimal( + superiorUserInfo.value3, + dodo.decimals + ).minus(superior.credit); + + superior.stakingPower = superiorUserInfo.value0; + superior.superiorSP = superiorUserInfo.value1; + superior.credit = convertTokenToDecimal( + superiorUserInfo.value3, + dodo.decimals + ); + superior.superior = superiorUserInfo.value2; + superior.spFromInvited = superior.spFromInvited.plus(superiorSpChange); + superior.creditFromInvited = + superior.creditFromInvited.plus(superiorCreditChange); + + operation.superiorSpChange = superiorSpChange; + operation.superiorCreditChange = superiorCreditChange; + operation.amount = operation.amount.plus( + convertTokenToDecimal(event.params.mintDODO, dodo.decimals) + ); + + vdodo.mintAmount = vdodo.mintAmount.plus( + convertTokenToDecimal(event.params.mintDODO, dodo.decimals) + ); + user.mintAmount = user.mintAmount.plus( + convertTokenToDecimal(event.params.mintDODO, dodo.decimals) + ); + user.creditOfSuperior = user.creditOfSuperior.plus(superiorCreditChange); + vdodo.dodoBalance = convertTokenToDecimal( + fetchTokenBalance(Address.fromString(DODO_ADDRESS), dataSource.address()), + dodo.decimals + ); + vdodo.totalStakingPower = fetchTotalSp(); + + vdodo.updatedAt = event.block.timestamp; + superior.updatedAt = event.block.timestamp; + operation.updatedAt = event.block.timestamp; + history.updatedAt = event.block.timestamp; + user.updatedAt = event.block.timestamp; + + superior.save(); + vdodo.save(); + operation.save(); + history.save(); + user.save(); } export function handleRedeemVDODO(event: RedeemVDODO): void { - initTokenInfo(); - let vdodo = vDODO.load(dataSource.address().toHexString()); - let DODO_ADDRESS = dataSource.network() == "mainnet" ? DODO_ADDRESS_MAINNET : DODO_ADDRESS_KOVAN; - let dodo = DODO.load(DODO_ADDRESS); - - let user = User.load(event.params.user.toHexString()); - if (user == null) { - vdodo.totalUsers = vdodo.totalUsers.plus(ONE_BI); - user = createUser(event.params.user, event); - } - - let history = RedeemHistory.load(event.transaction.hash.toHexString().concat("-").concat(event.logIndex.toString())); - - let userInfo = fetchUserInfo(event.params.user); - let superiorSpChange = userInfo.value1.minus(user.superiorSP); - let userSpChange = userInfo.value0.minus(user.stakingPower); - user.stakingPower = userInfo.value0; - user.superiorSP = userInfo.value1; - user.credit = convertTokenToDecimal(userInfo.value3, dodo.decimals); - user.superior = userInfo.value2; - - if (history == null) { - history = new RedeemHistory(event.transaction.hash.toHexString().concat("-").concat(event.logIndex.toString())) - history.recieve = convertTokenToDecimal(event.params.receiveDODO, dodo.decimals); - history.burn = convertTokenToDecimal(event.params.burnDODO, dodo.decimals); - history.fee = convertTokenToDecimal(event.params.feeDODO, dodo.decimals); - history.user = user.id; - history.timestamp = event.block.timestamp; - } - - let operation = UserOperationHistory.load(event.transaction.hash.toHexString()); - if (operation == null) { - operation = new UserOperationHistory(event.transaction.hash.toHexString()); - operation.amount = ZERO_BD; - operation.timestamp = event.block.timestamp; - operation.type = "REDEEM"; - operation.user = user.id; - operation.superiorSpChange = ZERO_BI; - operation.superiorCreditChange = ZERO_BD; - } - - let superiorUserInfo = fetchUserInfo(Address.fromString(user.superior.toHexString())); - let superior = createUser(Address.fromString(user.superior.toHexString()), event) - let superiorCreditChange = convertTokenToDecimal(superiorUserInfo.value3, dodo.decimals).minus(superior.credit); - - superior.stakingPower = superiorUserInfo.value0; - superior.superiorSP = superiorUserInfo.value1; - superior.credit = convertTokenToDecimal(superiorUserInfo.value3, dodo.decimals); - superior.superior = superiorUserInfo.value2; - superior.spFromInvited = superior.spFromInvited.plus(superiorSpChange); - superior.creditFromInvited = superior.creditFromInvited.plus(superiorCreditChange); - - operation.superiorSpChange = superiorSpChange; - operation.superiorCreditChange = superiorCreditChange; - operation.amount = operation.amount.plus(convertTokenToDecimal(event.params.receiveDODO, dodo.decimals)); - - vdodo.redeemAmount = vdodo.redeemAmount.plus(convertTokenToDecimal(event.params.receiveDODO, dodo.decimals)); - user.redeemRecieveAmount = user.redeemRecieveAmount.plus(convertTokenToDecimal(event.params.receiveDODO, dodo.decimals)); - user.redeemFeeAmount = user.redeemFeeAmount.plus(convertTokenToDecimal(event.params.feeDODO, dodo.decimals)); - user.redeemBurnAmount = user.redeemBurnAmount.plus(convertTokenToDecimal(event.params.burnDODO, dodo.decimals)); - user.creditOfSuperior = user.creditOfSuperior.plus(superiorCreditChange); - vdodo.dodoBalance = convertTokenToDecimal(fetchTokenBalance(Address.fromString(DODO_ADDRESS), dataSource.address()), dodo.decimals); - vdodo.totalStakingPower = fetchTotalSp(); - vdodo.feeAmount = vdodo.feeAmount.plus(convertTokenToDecimal(event.params.feeDODO, dodo.decimals)); - vdodo.burnAmount = vdodo.feeAmount.plus(convertTokenToDecimal(event.params.burnDODO, dodo.decimals)); - - vdodo.updatedAt = event.block.timestamp; - superior.updatedAt = event.block.timestamp; - operation.updatedAt = event.block.timestamp; - history.updatedAt = event.block.timestamp; - user.updatedAt = event.block.timestamp; - - superior.save(); - vdodo.save(); - operation.save(); - history.save(); - user.save(); + initTokenInfo(); + let vdodo = vDODO.load(dataSource.address().toHexString()); + if (vdodo == null) return; + let DODO_ADDRESS = + dataSource.network() == "mainnet" + ? DODO_ADDRESS_MAINNET + : DODO_ADDRESS_KOVAN; + let dodo = DODO.load(DODO_ADDRESS); + if (dodo == null) return; + + let user = User.load(event.params.user.toHexString()); + if (user == null) { + vdodo.totalUsers = vdodo.totalUsers.plus(ONE_BI); + user = createUser(event.params.user, event); + } + + let history = RedeemHistory.load( + event.transaction.hash + .toHexString() + .concat("-") + .concat(event.logIndex.toString()) + ); + + let userInfo = fetchUserInfo(event.params.user); + let superiorSpChange = userInfo.value1.minus(user.superiorSP); + let userSpChange = userInfo.value0.minus(user.stakingPower); + user.stakingPower = userInfo.value0; + user.superiorSP = userInfo.value1; + user.credit = convertTokenToDecimal(userInfo.value3, dodo.decimals); + user.superior = userInfo.value2; + + if (history == null) { + history = new RedeemHistory( + event.transaction.hash + .toHexString() + .concat("-") + .concat(event.logIndex.toString()) + ); + history.recieve = convertTokenToDecimal( + event.params.receiveDODO, + dodo.decimals + ); + history.burn = convertTokenToDecimal(event.params.burnDODO, dodo.decimals); + history.fee = convertTokenToDecimal(event.params.feeDODO, dodo.decimals); + history.user = user.id; + history.timestamp = event.block.timestamp; + } + + let operation = UserOperationHistory.load( + event.transaction.hash.toHexString() + ); + if (operation == null) { + operation = new UserOperationHistory(event.transaction.hash.toHexString()); + operation.amount = ZERO_BD; + operation.timestamp = event.block.timestamp; + operation.type = "REDEEM"; + operation.user = user.id; + operation.superiorSpChange = ZERO_BI; + operation.superiorCreditChange = ZERO_BD; + } + + let superiorUserInfo = fetchUserInfo( + Address.fromString(user.superior.toHexString()) + ); + let superior = createUser( + Address.fromString(user.superior.toHexString()), + event + ); + let superiorCreditChange = convertTokenToDecimal( + superiorUserInfo.value3, + dodo.decimals + ).minus(superior.credit); + + superior.stakingPower = superiorUserInfo.value0; + superior.superiorSP = superiorUserInfo.value1; + superior.credit = convertTokenToDecimal( + superiorUserInfo.value3, + dodo.decimals + ); + superior.superior = superiorUserInfo.value2; + superior.spFromInvited = superior.spFromInvited.plus(superiorSpChange); + superior.creditFromInvited = + superior.creditFromInvited.plus(superiorCreditChange); + + operation.superiorSpChange = superiorSpChange; + operation.superiorCreditChange = superiorCreditChange; + operation.amount = operation.amount.plus( + convertTokenToDecimal(event.params.receiveDODO, dodo.decimals) + ); + + vdodo.redeemAmount = vdodo.redeemAmount.plus( + convertTokenToDecimal(event.params.receiveDODO, dodo.decimals) + ); + user.redeemRecieveAmount = user.redeemRecieveAmount.plus( + convertTokenToDecimal(event.params.receiveDODO, dodo.decimals) + ); + user.redeemFeeAmount = user.redeemFeeAmount.plus( + convertTokenToDecimal(event.params.feeDODO, dodo.decimals) + ); + user.redeemBurnAmount = user.redeemBurnAmount.plus( + convertTokenToDecimal(event.params.burnDODO, dodo.decimals) + ); + user.creditOfSuperior = user.creditOfSuperior.plus(superiorCreditChange); + vdodo.dodoBalance = convertTokenToDecimal( + fetchTokenBalance(Address.fromString(DODO_ADDRESS), dataSource.address()), + dodo.decimals + ); + vdodo.totalStakingPower = fetchTotalSp(); + vdodo.feeAmount = vdodo.feeAmount.plus( + convertTokenToDecimal(event.params.feeDODO, dodo.decimals) + ); + vdodo.burnAmount = vdodo.feeAmount.plus( + convertTokenToDecimal(event.params.burnDODO, dodo.decimals) + ); + + vdodo.updatedAt = event.block.timestamp; + superior.updatedAt = event.block.timestamp; + operation.updatedAt = event.block.timestamp; + history.updatedAt = event.block.timestamp; + user.updatedAt = event.block.timestamp; + + superior.save(); + vdodo.save(); + operation.save(); + history.save(); + user.save(); } export function handlePreDeposit(event: PreDeposit): void { - initTokenInfo(); - let vdodo = vDODO.load(dataSource.address().toHexString()); - let DODO_ADDRESS = dataSource.network() == "mainnet" ? DODO_ADDRESS_MAINNET : DODO_ADDRESS_KOVAN; - let dodo = DODO.load(DODO_ADDRESS); - vdodo.totalBlockReward = vdodo.totalBlockReward.plus(convertTokenToDecimal(event.params.dodoAmount, dodo.decimals)); - vdodo.updatedAt = event.block.timestamp; - vdodo.save(); + initTokenInfo(); + let vdodo = vDODO.load(dataSource.address().toHexString()); + if (vdodo == null) return; + let DODO_ADDRESS = + dataSource.network() == "mainnet" + ? DODO_ADDRESS_MAINNET + : DODO_ADDRESS_KOVAN; + let dodo = DODO.load(DODO_ADDRESS); + if (dodo == null) return; + vdodo.totalBlockReward = vdodo.totalBlockReward.plus( + convertTokenToDecimal(event.params.dodoAmount, dodo.decimals) + ); + vdodo.updatedAt = event.block.timestamp; + vdodo.save(); } export function handleChangePerReward(event: ChangePerReward): void { - initTokenInfo(); - let vdodo = vDODO.load(dataSource.address().toHexString()); - let DODO_ADDRESS = dataSource.network() == "mainnet" ? DODO_ADDRESS_MAINNET : DODO_ADDRESS_KOVAN; - let dodo = DODO.load(DODO_ADDRESS); - - vdodo.dodoPerBlock = convertTokenToDecimal(event.params.dodoPerBlock, dodo.decimals); - vdodo.updatedAt = event.block.timestamp; - vdodo.save(); + initTokenInfo(); + let vdodo = vDODO.load(dataSource.address().toHexString()); + if (vdodo == null) return; + let DODO_ADDRESS = + dataSource.network() == "mainnet" + ? DODO_ADDRESS_MAINNET + : DODO_ADDRESS_KOVAN; + let dodo = DODO.load(DODO_ADDRESS); + if (dodo == null) return; + + vdodo.dodoPerBlock = convertTokenToDecimal( + event.params.dodoPerBlock, + dodo.decimals + ); + vdodo.updatedAt = event.block.timestamp; + vdodo.save(); } export function handleTransfer(event: Transfer): void { - let vdodo = vDODO.load(dataSource.address().toHexString()); - let DODO_ADDRESS = dataSource.network() == "mainnet" ? DODO_ADDRESS_MAINNET : DODO_ADDRESS_KOVAN; - let dodo = DODO.load(DODO_ADDRESS); - - let fromUser = createUser(event.params.from, event); - let toUser = createUser(event.params.to, event); - let fromUserInfo = fetchUserInfo(event.params.from); - let toUserInfo = fetchUserInfo(event.params.to); - let spChangeFrom = fromUserInfo.value0.minus(fromUser.stakingPower); - let spChangeTo = toUserInfo.value0.minus(toUser.stakingPower); - - fromUser.stakingPower = fromUserInfo.value0; - fromUser.superiorSP = fromUserInfo.value1; - fromUser.credit = convertTokenToDecimal(fromUserInfo.value3, dodo.decimals); - - toUser.stakingPower = toUserInfo.value0; - toUser.superiorSP = toUserInfo.value1; - toUser.credit = convertTokenToDecimal(toUserInfo.value3, dodo.decimals); - - let fromUserSuperior = createUser(Address.fromString(fromUser.superior.toHexString()), event); - let toUserSuperior = createUser(Address.fromString(toUser.superior.toHexString()), event); - let fromUserSuperiorInfo = fetchUserInfo(Address.fromString(fromUser.superior.toHexString())); - let toUserSuperiorInfo = fetchUserInfo(Address.fromString(toUser.superior.toHexString())); - let spChangeFromUserSuperior = fromUserSuperiorInfo.value0.minus(fromUserSuperior.stakingPower); - let spChangeToUserSuperior = toUserSuperiorInfo.value0.minus(toUserSuperior.stakingPower); - let creditChangeFromUserSuperior = convertTokenToDecimal(fromUserSuperiorInfo.value3, dodo.decimals).minus(fromUserSuperior.credit); - let creditChangeToUserSuperior = convertTokenToDecimal(toUserSuperiorInfo.value3, dodo.decimals).minus(toUserSuperior.credit); - - fromUserSuperior.stakingPower = fromUserSuperiorInfo.value0; - fromUserSuperior.credit = convertTokenToDecimal(fromUserSuperiorInfo.value3, dodo.decimals); - fromUserSuperior.spFromInvited = fromUserSuperior.spFromInvited.plus(spChangeToUserSuperior); - fromUserSuperior.creditFromInvited = fromUserSuperior.creditFromInvited.plus(creditChangeFromUserSuperior); - - toUserSuperior.stakingPower = toUserSuperiorInfo.value0; - toUserSuperior.credit = convertTokenToDecimal(toUserSuperiorInfo.value3, dodo.decimals); - toUserSuperior.spFromInvited = toUserSuperior.spFromInvited.plus(spChangeFromUserSuperior); - toUserSuperior.creditFromInvited = toUserSuperior.creditFromInvited.plus(creditChangeToUserSuperior); - - fromUser.creditOfSuperior = fromUser.creditOfSuperior.plus(creditChangeFromUserSuperior); - fromUser.redeemRecieveAmount = fromUser.redeemRecieveAmount.plus(convertTokenToDecimal(event.params.amount, vdodo.decimals).times(BigDecimal.fromString("100"))) - toUser.creditOfSuperior = toUser.creditOfSuperior.plus(creditChangeToUserSuperior); - toUser.mintAmount = toUser.mintAmount.plus(convertTokenToDecimal(event.params.amount, vdodo.decimals).times(BigDecimal.fromString("100"))) - - fromUser.updatedAt = event.block.timestamp; - toUser.updatedAt = event.block.timestamp; - fromUserSuperior.updatedAt = event.block.timestamp; - toUserSuperior.updatedAt = event.block.timestamp; - - fromUser.save(); - toUser.save(); - fromUserSuperior.save(); - toUserSuperior.save(); - - let transferHistoryID = event.transaction.hash.toHexString().concat("-").concat(event.logIndex.toString()); - let transferHistory = TransferHistory.load(transferHistoryID); - if (transferHistory == null) { - transferHistory = new TransferHistory(transferHistoryID); - transferHistory.from = event.params.from; - transferHistory.to = event.params.to; - transferHistory.amount = convertTokenToDecimal(event.params.amount, vdodo.decimals); - } - - transferHistory.updatedAt = event.block.timestamp; - transferHistory.save(); + let vdodo = vDODO.load(dataSource.address().toHexString()); + if (vdodo == null) return; + let DODO_ADDRESS = + dataSource.network() == "mainnet" + ? DODO_ADDRESS_MAINNET + : DODO_ADDRESS_KOVAN; + let dodo = DODO.load(DODO_ADDRESS); + if (dodo == null) return; + + let fromUser = createUser(event.params.from, event); + let toUser = createUser(event.params.to, event); + let fromUserInfo = fetchUserInfo(event.params.from); + let toUserInfo = fetchUserInfo(event.params.to); + let spChangeFrom = fromUserInfo.value0.minus(fromUser.stakingPower); + let spChangeTo = toUserInfo.value0.minus(toUser.stakingPower); + + fromUser.stakingPower = fromUserInfo.value0; + fromUser.superiorSP = fromUserInfo.value1; + fromUser.credit = convertTokenToDecimal(fromUserInfo.value3, dodo.decimals); + + toUser.stakingPower = toUserInfo.value0; + toUser.superiorSP = toUserInfo.value1; + toUser.credit = convertTokenToDecimal(toUserInfo.value3, dodo.decimals); + + let fromUserSuperior = createUser( + Address.fromString(fromUser.superior.toHexString()), + event + ); + let toUserSuperior = createUser( + Address.fromString(toUser.superior.toHexString()), + event + ); + let fromUserSuperiorInfo = fetchUserInfo( + Address.fromString(fromUser.superior.toHexString()) + ); + let toUserSuperiorInfo = fetchUserInfo( + Address.fromString(toUser.superior.toHexString()) + ); + let spChangeFromUserSuperior = fromUserSuperiorInfo.value0.minus( + fromUserSuperior.stakingPower + ); + let spChangeToUserSuperior = toUserSuperiorInfo.value0.minus( + toUserSuperior.stakingPower + ); + let creditChangeFromUserSuperior = convertTokenToDecimal( + fromUserSuperiorInfo.value3, + dodo.decimals + ).minus(fromUserSuperior.credit); + let creditChangeToUserSuperior = convertTokenToDecimal( + toUserSuperiorInfo.value3, + dodo.decimals + ).minus(toUserSuperior.credit); + + fromUserSuperior.stakingPower = fromUserSuperiorInfo.value0; + fromUserSuperior.credit = convertTokenToDecimal( + fromUserSuperiorInfo.value3, + dodo.decimals + ); + fromUserSuperior.spFromInvited = fromUserSuperior.spFromInvited.plus( + spChangeToUserSuperior + ); + fromUserSuperior.creditFromInvited = fromUserSuperior.creditFromInvited.plus( + creditChangeFromUserSuperior + ); + + toUserSuperior.stakingPower = toUserSuperiorInfo.value0; + toUserSuperior.credit = convertTokenToDecimal( + toUserSuperiorInfo.value3, + dodo.decimals + ); + toUserSuperior.spFromInvited = toUserSuperior.spFromInvited.plus( + spChangeFromUserSuperior + ); + toUserSuperior.creditFromInvited = toUserSuperior.creditFromInvited.plus( + creditChangeToUserSuperior + ); + + fromUser.creditOfSuperior = fromUser.creditOfSuperior.plus( + creditChangeFromUserSuperior + ); + fromUser.redeemRecieveAmount = fromUser.redeemRecieveAmount.plus( + convertTokenToDecimal(event.params.amount, vdodo.decimals).times( + BigDecimal.fromString("100") + ) + ); + toUser.creditOfSuperior = toUser.creditOfSuperior.plus( + creditChangeToUserSuperior + ); + toUser.mintAmount = toUser.mintAmount.plus( + convertTokenToDecimal(event.params.amount, vdodo.decimals).times( + BigDecimal.fromString("100") + ) + ); + + fromUser.updatedAt = event.block.timestamp; + toUser.updatedAt = event.block.timestamp; + fromUserSuperior.updatedAt = event.block.timestamp; + toUserSuperior.updatedAt = event.block.timestamp; + + fromUser.save(); + toUser.save(); + fromUserSuperior.save(); + toUserSuperior.save(); + + let transferHistoryID = event.transaction.hash + .toHexString() + .concat("-") + .concat(event.logIndex.toString()); + let transferHistory = TransferHistory.load(transferHistoryID); + if (transferHistory == null) { + transferHistory = new TransferHistory(transferHistoryID); + transferHistory.from = event.params.from; + transferHistory.to = event.params.to; + transferHistory.amount = convertTokenToDecimal( + event.params.amount, + vdodo.decimals + ); + } + + transferHistory.updatedAt = event.block.timestamp; + transferHistory.save(); } export function handleDonateDODO(event: DonateDODO): void { - initTokenInfo(); - let vdodo = vDODO.load(dataSource.address().toHexString()); - let DODO_ADDRESS = dataSource.network() == "mainnet" ? DODO_ADDRESS_MAINNET : DODO_ADDRESS_KOVAN; - let dodo = DODO.load(DODO_ADDRESS); - - let donateHistoryID = event.transaction.hash.toHexString().concat("-").concat(event.logIndex.toString()) - let donateHistory = DonateHistory.load(donateHistoryID); - - if (donateHistory == null) { - donateHistory = new DonateHistory(donateHistoryID); - donateHistory.donor = event.params.user; - donateHistory.dodoAmount = convertTokenToDecimal(event.params.donateDODO, dodo.decimals); - donateHistory.blockNumber = event.block.number; - donateHistory.timestamp = event.block.timestamp; - donateHistory.updatedAt=event.block.timestamp; - donateHistory.save(); - } - + initTokenInfo(); + let vdodo = vDODO.load(dataSource.address().toHexString()); + let DODO_ADDRESS = + dataSource.network() == "mainnet" + ? DODO_ADDRESS_MAINNET + : DODO_ADDRESS_KOVAN; + let dodo = DODO.load(DODO_ADDRESS); + if (dodo == null) return; + + let donateHistoryID = event.transaction.hash + .toHexString() + .concat("-") + .concat(event.logIndex.toString()); + let donateHistory = DonateHistory.load(donateHistoryID); + + if (donateHistory == null) { + donateHistory = new DonateHistory(donateHistoryID); + donateHistory.donor = event.params.user; + donateHistory.dodoAmount = convertTokenToDecimal( + event.params.donateDODO, + dodo.decimals + ); + donateHistory.blockNumber = event.block.number; + donateHistory.timestamp = event.block.timestamp; + donateHistory.updatedAt = event.block.timestamp; + donateHistory.save(); + } } diff --git a/src/mappings/vdodo/helpers.ts b/src/mappings/vdodo/helpers.ts index 608d8d5..30b6609 100644 --- a/src/mappings/vdodo/helpers.ts +++ b/src/mappings/vdodo/helpers.ts @@ -1,244 +1,275 @@ /* eslint-disable prefer-const */ -import {log, BigInt, BigDecimal, Address, ethereum, dataSource} from '@graphprotocol/graph-ts' import { - User, vDODO, DODO -} from '../../types/vdodo/schema' -import {ERC20} from "../../types/vdodo/vDODOToken/ERC20" -import {ERC20NameBytes} from "../../types/vdodo/vDODOToken/ERC20NameBytes" -import {ERC20SymbolBytes} from "../../types/vdodo/vDODOToken/ERC20SymbolBytes" -import {vDODOToken__userInfoResult, vDODOToken} from "../../types/vdodo/vDODOToken/vDODOToken" - + log, + BigInt, + BigDecimal, + Address, + ethereum, + dataSource, +} from "@graphprotocol/graph-ts"; +import { User, vDODO, DODO } from "../../types/vdodo/schema"; +import { ERC20 } from "../../types/vdodo/vDODOToken/ERC20"; +import { ERC20NameBytes } from "../../types/vdodo/vDODOToken/ERC20NameBytes"; +import { ERC20SymbolBytes } from "../../types/vdodo/vDODOToken/ERC20SymbolBytes"; import { - DODO_ADDRESS_KOVAN, - DODO_ADDRESS_MAINNET -} from "./constants" + vDODOToken__userInfoResult, + vDODOToken, +} from "../../types/vdodo/vDODOToken/vDODOToken"; + +import { DODO_ADDRESS_KOVAN, DODO_ADDRESS_MAINNET } from "./constants"; -export const ADDRESS_ZERO = '0x0000000000000000000000000000000000000000'; -export const USDT_ADDRESS = '0xdac17f958d2ee523a2206206994597c13d831ec7'; -export const WBTC_ADDRESS = '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599'; -export const BASE_COIN = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'; +export const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; +export const USDT_ADDRESS = "0xdac17f958d2ee523a2206206994597c13d831ec7"; +export const WBTC_ADDRESS = "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599"; +export const BASE_COIN = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; export let ZERO_BI = BigInt.fromI32(0); export let ONE_BI = BigInt.fromI32(1); -export let ZERO_BD = BigDecimal.fromString('0'); -export let ONE_BD = BigDecimal.fromString('1'); +export let ZERO_BD = BigDecimal.fromString("0"); +export let ONE_BD = BigDecimal.fromString("1"); export let BI_18 = BigInt.fromI32(18); export function exponentToBigDecimal(decimals: BigInt): BigDecimal { - let bd = BigDecimal.fromString('1') - for (let i = ZERO_BI; i.lt(decimals as BigInt); i = i.plus(ONE_BI)) { - bd = bd.times(BigDecimal.fromString('10')) - } - return bd + let bd = BigDecimal.fromString("1"); + for (let i = ZERO_BI; i.lt(decimals as BigInt); i = i.plus(ONE_BI)) { + bd = bd.times(BigDecimal.fromString("10")); + } + return bd; } export function bigDecimalExp18(): BigDecimal { - return BigDecimal.fromString('1000000000000000000') + return BigDecimal.fromString("1000000000000000000"); } export function convertEthToDecimal(eth: BigInt): BigDecimal { - return eth.toBigDecimal().div(exponentToBigDecimal(BigInt.fromI32(18))) + return eth.toBigDecimal().div(exponentToBigDecimal(BigInt.fromI32(18))); } -export function convertTokenToDecimal(tokenAmount: BigInt, exchangeDecimals: BigInt): BigDecimal { - if (exchangeDecimals == ZERO_BI) { - return tokenAmount.toBigDecimal() - } - return tokenAmount.toBigDecimal().div(exponentToBigDecimal(exchangeDecimals)) +export function convertTokenToDecimal( + tokenAmount: BigInt, + exchangeDecimals: BigInt +): BigDecimal { + if (exchangeDecimals == ZERO_BI) { + return tokenAmount.toBigDecimal(); + } + return tokenAmount.toBigDecimal().div(exponentToBigDecimal(exchangeDecimals)); } export function equalToZero(value: BigDecimal): boolean { - const formattedVal = parseFloat(value.toString()) - const zero = parseFloat(ZERO_BD.toString()) - if (zero == formattedVal) { - return true - } - return false + const formattedVal = parseFloat(value.toString()); + const zero = parseFloat(ZERO_BD.toString()); + if (zero == formattedVal) { + return true; + } + return false; } export function isNullEthValue(value: string): boolean { - return value == '0x0000000000000000000000000000000000000000000000000000000000000001' + return ( + value == + "0x0000000000000000000000000000000000000000000000000000000000000001" + ); } export function createUser(userAddr: Address, event: ethereum.Event): User { - let user = User.load(userAddr.toHexString()) - - if (user == null) { - user = new User(userAddr.toHexString()); - user.superior = Address.fromString(ADDRESS_ZERO); - user.credit = ZERO_BD; - user.stakingPower = ZERO_BI; - user.superiorSP = ZERO_BI; - user.spFromInvited = ZERO_BI; - user.creditFromInvited = ZERO_BD; - user.mintAmount = ZERO_BD; - user.redeemRecieveAmount = ZERO_BD; - user.redeemFeeAmount = ZERO_BD; - user.redeemBurnAmount = ZERO_BD; - user.creditOfSuperior = ZERO_BD; - user.timestamp = event.block.timestamp; - user.updatedAt = event.block.timestamp; - } - return user as User; + let user = User.load(userAddr.toHexString()); + + if (user == null) { + user = new User(userAddr.toHexString()); + user.superior = Address.fromString(ADDRESS_ZERO); + user.credit = ZERO_BD; + user.stakingPower = ZERO_BI; + user.superiorSP = ZERO_BI; + user.spFromInvited = ZERO_BI; + user.creditFromInvited = ZERO_BD; + user.mintAmount = ZERO_BD; + user.redeemRecieveAmount = ZERO_BD; + user.redeemFeeAmount = ZERO_BD; + user.redeemBurnAmount = ZERO_BD; + user.creditOfSuperior = ZERO_BD; + user.timestamp = event.block.timestamp; + user.updatedAt = event.block.timestamp; + } + return user as User; } export function fetchTokenSymbol(tokenAddress: Address): string { - // hard coded overrides - if (tokenAddress.toHexString() == '0xe0b7927c4af23765cb51314a0e0521a9645f0e2a') { - return 'DGD' - } - if (tokenAddress.toHexString() == '0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9') { - return 'AAVE' - } - if (tokenAddress.toHexString() == '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48') { - return 'USDC' - } - - let contract = ERC20.bind(tokenAddress) - let contractSymbolBytes = ERC20SymbolBytes.bind(tokenAddress) - - // try types string and bytes32 for symbol - let symbolValue = 'unknown' - let symbolResult = contract.try_symbol() - if (symbolResult.reverted) { - let symbolResultBytes = contractSymbolBytes.try_symbol() - if (!symbolResultBytes.reverted) { - // for broken pairs that have no symbol function exposed - if (!isNullEthValue(symbolResultBytes.value.toHexString())) { - symbolValue = symbolResultBytes.value.toString() - } - } - } else { - symbolValue = symbolResult.value + // hard coded overrides + if ( + tokenAddress.toHexString() == "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a" + ) { + return "DGD"; + } + if ( + tokenAddress.toHexString() == "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9" + ) { + return "AAVE"; + } + if ( + tokenAddress.toHexString() == "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" + ) { + return "USDC"; + } + + let contract = ERC20.bind(tokenAddress); + let contractSymbolBytes = ERC20SymbolBytes.bind(tokenAddress); + + // try types string and bytes32 for symbol + let symbolValue = "unknown"; + let symbolResult = contract.try_symbol(); + if (symbolResult.reverted) { + let symbolResultBytes = contractSymbolBytes.try_symbol(); + if (!symbolResultBytes.reverted) { + // for broken pairs that have no symbol function exposed + if (!isNullEthValue(symbolResultBytes.value.toHexString())) { + symbolValue = symbolResultBytes.value.toString(); + } } + } else { + symbolValue = symbolResult.value; + } - return symbolValue + return symbolValue; } export function fetchTokenName(tokenAddress: Address): string { - // hard coded overrides - if (tokenAddress.toHexString() == '0xe0b7927c4af23765cb51314a0e0521a9645f0e2a') { - return 'DGD' - } - if (tokenAddress.toHexString() == '0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9') { - return 'Aave Token' + // hard coded overrides + if ( + tokenAddress.toHexString() == "0xe0b7927c4af23765cb51314a0e0521a9645f0e2a" + ) { + return "DGD"; + } + if ( + tokenAddress.toHexString() == "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9" + ) { + return "Aave Token"; + } + + let contract = ERC20.bind(tokenAddress); + let contractNameBytes = ERC20NameBytes.bind(tokenAddress); + + // try types string and bytes32 for name + let nameValue = "unknown"; + let nameResult = contract.try_name(); + if (nameResult.reverted) { + let nameResultBytes = contractNameBytes.try_name(); + if (!nameResultBytes.reverted) { + // for broken exchanges that have no name function exposed + if (!isNullEthValue(nameResultBytes.value.toHexString())) { + nameValue = nameResultBytes.value.toString(); + } } + } else { + nameValue = nameResult.value; + } - let contract = ERC20.bind(tokenAddress) - let contractNameBytes = ERC20NameBytes.bind(tokenAddress) - - // try types string and bytes32 for name - let nameValue = 'unknown' - let nameResult = contract.try_name() - if (nameResult.reverted) { - let nameResultBytes = contractNameBytes.try_name() - if (!nameResultBytes.reverted) { - // for broken exchanges that have no name function exposed - if (!isNullEthValue(nameResultBytes.value.toHexString())) { - nameValue = nameResultBytes.value.toString() - } - } - } else { - nameValue = nameResult.value - } - - return nameValue + return nameValue; } export function fetchTokenTotalSupply(tokenAddress: Address): BigInt { - if (tokenAddress.toHexString() == BASE_COIN) { - return BigInt.fromI32(0) - } - let contract = ERC20.bind(tokenAddress) - let totalSupplyResult = contract.try_totalSupply() - if (totalSupplyResult.reverted) { - return BigInt.fromI32(0) - } - return totalSupplyResult.value + if (tokenAddress.toHexString() == BASE_COIN) { + return BigInt.fromI32(0); + } + let contract = ERC20.bind(tokenAddress); + let totalSupplyResult = contract.try_totalSupply(); + if (totalSupplyResult.reverted) { + return BigInt.fromI32(0); + } + return totalSupplyResult.value; } export function fetchTokenDecimals(tokenAddress: Address): BigInt { - // hardcode overrides - if (tokenAddress.toHexString() == '0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9') { - return BigInt.fromI32(18) - } - if (tokenAddress.toHexString() == BASE_COIN) { - return BigInt.fromI32(18) - } - - let contract = ERC20.bind(tokenAddress) - // try types uint8 for decimals - let decimalValue = null - let decimalResult = contract.try_decimals() - if (!decimalResult.reverted) { - decimalValue = decimalResult.value - } - return BigInt.fromI32(decimalValue as i32) + // hardcode overrides + if ( + tokenAddress.toHexString() == "0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9" + ) { + return BigInt.fromI32(18); + } + if (tokenAddress.toHexString() == BASE_COIN) { + return BigInt.fromI32(18); + } + + let contract = ERC20.bind(tokenAddress); + // try types uint8 for decimals + let decimalValue = null; + let decimalResult = contract.try_decimals(); + if (!decimalResult.reverted) { + decimalValue = decimalResult.value; + } + return BigInt.fromI32(decimalValue); } -export function fetchTokenBalance(tokenAddress: Address, user: Address): BigInt { - if (tokenAddress.toHexString() == BASE_COIN) { - return BigInt.fromI32(0) - } - let contract = ERC20.bind(tokenAddress) - let balance = 0; - let balanceResult = contract.try_balanceOf(user); - if (balanceResult.reverted) { - return BigInt.fromI32(0) - } - - return balanceResult.value; +export function fetchTokenBalance( + tokenAddress: Address, + user: Address +): BigInt { + if (tokenAddress.toHexString() == BASE_COIN) { + return BigInt.fromI32(0); + } + let contract = ERC20.bind(tokenAddress); + let balance = 0; + let balanceResult = contract.try_balanceOf(user); + if (balanceResult.reverted) { + return BigInt.fromI32(0); + } + + return balanceResult.value; } export function fetchUserInfo(addr: Address): vDODOToken__userInfoResult { - let vDODOContract = vDODOToken.bind(dataSource.address()); - let resopnse = vDODOContract.userInfo(addr); - return resopnse as vDODOToken__userInfoResult; + let vDODOContract = vDODOToken.bind(dataSource.address()); + let resopnse = vDODOContract.userInfo(addr); + return resopnse as vDODOToken__userInfoResult; } export function fetchTotalSp(): BigInt { - let vDODOContract = vDODOToken.bind(dataSource.address()); - let resopnse = vDODOContract._TOTAL_STAKING_POWER_(); - return resopnse as BigInt; + let vDODOContract = vDODOToken.bind(dataSource.address()); + let resopnse = vDODOContract._TOTAL_STAKING_POWER_(); + return resopnse as BigInt; } export function initTokenInfo(): void { - let vDODOAddress = dataSource.address(); - let DODOAddress = Address.fromString(dataSource.network() == "mainnet" ? DODO_ADDRESS_MAINNET : DODO_ADDRESS_KOVAN); - - let vdodo = vDODO.load(vDODOAddress.toHexString()); - if (vdodo == null) { - vdodo = new vDODO(vDODOAddress.toHexString()); - vdodo.decimals = fetchTokenDecimals(vDODOAddress); - vdodo.name = fetchTokenName(vDODOAddress); - vdodo.symbol = fetchTokenSymbol(vDODOAddress); - vdodo.dodo = DODOAddress; - vdodo.totalUsers = ZERO_BI; - vdodo.mintAmount = ZERO_BD; - vdodo.redeemAmount = ZERO_BD; - vdodo.totalBlockReward = ZERO_BD; - vdodo.totalBlockDistribution = ZERO_BD; - vdodo.totalDonate = ZERO_BD; - vdodo.totalStakingPower = ZERO_BI; - vdodo.dodoPerBlock = ZERO_BD; - vdodo.feeAmount = ZERO_BD; - vdodo.burnAmount = ZERO_BD; - vdodo.updatedAt = ZERO_BI; - } - - let dodo = DODO.load(DODOAddress.toHexString()); - if (dodo == null) { - dodo = new DODO(DODOAddress.toHexString()); - dodo.decimals = fetchTokenDecimals(DODOAddress); - dodo.name = fetchTokenName(DODOAddress); - dodo.symbol = fetchTokenSymbol(DODOAddress); - dodo.totalSupply = fetchTokenTotalSupply(DODOAddress); - dodo.updatedAt = ZERO_BI; - } - vdodo.dodoBalance = convertTokenToDecimal(fetchTokenBalance(DODOAddress, vDODOAddress), dodo.decimals); - - vdodo.save(); - dodo.save(); + let vDODOAddress = dataSource.address(); + let DODOAddress = Address.fromString( + dataSource.network() == "mainnet" + ? DODO_ADDRESS_MAINNET + : DODO_ADDRESS_KOVAN + ); + + let vdodo = vDODO.load(vDODOAddress.toHexString()); + if (vdodo == null) { + vdodo = new vDODO(vDODOAddress.toHexString()); + vdodo.decimals = fetchTokenDecimals(vDODOAddress); + vdodo.name = fetchTokenName(vDODOAddress); + vdodo.symbol = fetchTokenSymbol(vDODOAddress); + vdodo.dodo = DODOAddress; + vdodo.totalUsers = ZERO_BI; + vdodo.mintAmount = ZERO_BD; + vdodo.redeemAmount = ZERO_BD; + vdodo.totalBlockReward = ZERO_BD; + vdodo.totalBlockDistribution = ZERO_BD; + vdodo.totalDonate = ZERO_BD; + vdodo.totalStakingPower = ZERO_BI; + vdodo.dodoPerBlock = ZERO_BD; + vdodo.feeAmount = ZERO_BD; + vdodo.burnAmount = ZERO_BD; + vdodo.updatedAt = ZERO_BI; + } + + let dodo = DODO.load(DODOAddress.toHexString()); + if (dodo == null) { + dodo = new DODO(DODOAddress.toHexString()); + dodo.decimals = fetchTokenDecimals(DODOAddress); + dodo.name = fetchTokenName(DODOAddress); + dodo.symbol = fetchTokenSymbol(DODOAddress); + dodo.totalSupply = fetchTokenTotalSupply(DODOAddress); + dodo.updatedAt = ZERO_BI; + } + vdodo.dodoBalance = convertTokenToDecimal( + fetchTokenBalance(DODOAddress, vDODOAddress), + dodo.decimals + ); + + vdodo.save(); + dodo.save(); } - - diff --git a/subgraphs/dodoex/dodoex_arbitrum.yaml b/subgraphs/dodoex/dodoex_arbitrum.yaml index 5d7df7f..75de058 100644 --- a/subgraphs/dodoex/dodoex_arbitrum.yaml +++ b/subgraphs/dodoex/dodoex_arbitrum.yaml @@ -45,7 +45,7 @@ dataSources: startBlock: 45989363 mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/dodoex/smartRoute.ts entities: @@ -220,6 +220,39 @@ dataSources: handler: handleNewDSP - event: RemoveDSP(address) handler: handleRemoveDSP + - kind: ethereum/contract + name: GSPFactory + network: arbitrum-one + source: + address: '0x46E55A974c5995675b025f7F607C3278B36f0c29' + abi: GSPFactory + startBlock: 248209288 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/poolFactory.ts + entities: + - Pair + - Token + abis: + - name: GSPFactory + file: ../../abis/GSPFactory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: GSP + file: ../../abis/GSP.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + eventHandlers: + - event: NewGSP(address,address,address,address) + handler: handleNewGSP + - event: RemoveGSP(address) + handler: handleRemoveGSP - kind: ethereum/contract name: CrowdPoolingFactory network: arbitrum-one @@ -446,6 +479,12 @@ templates: file: ../../abis/FeeRateModel.json - name: DODOZoo file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: DODOSwap(address,address,uint256,uint256,address,address) handler: handleDODOSwap @@ -564,6 +603,62 @@ templates: file: ../../abis/FeeRateModel.json - name: DODOZoo file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: BuyShares(address,uint256,uint256) + handler: handleBuyShares + - event: SellShares(address,address,uint256,uint256) + handler: handleSellShares + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer + - kind: ethereum/contract + name: GSP + network: arbitrum-one + source: + abi: GSP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/pool.ts + entities: + - Pair + - Token + - DODOSwap + abis: + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: DPPFactory + file: ../../abis/DPPFactory.json + - name: DSPFactory + file: ../../abis/DSPFactory.json + - name: GSPFactory + file: ../../abis/GSPFactory.json + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DSP + file: ../../abis/DSP.json + - name: GSP + file: ../../abis/GSP.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + - name: DODOZoo + file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: DODOSwap(address,address,uint256,uint256,address,address) handler: handleDODOSwap @@ -573,6 +668,16 @@ templates: handler: handleSellShares - event: Transfer(indexed address,indexed address,uint256) handler: handleTransfer + - event: IChange(uint256) + handler: handleIChange + - event: KChange(uint256) + handler: handleKChange + - event: LpFeeRateChange(uint256) + handler: handleLpFeeRateChange + - event: MtFeeRateChange(uint256) + handler: handleMtFeeRateChange + - event: RChange(uint8) + handler: handleRChange - kind: ethereum/contract name: CP network: arbitrum-one diff --git a/subgraphs/dodoex/dodoex_bsc.yaml b/subgraphs/dodoex/dodoex_bsc.yaml index 4623ebe..bbc0cfc 100644 --- a/subgraphs/dodoex/dodoex_bsc.yaml +++ b/subgraphs/dodoex/dodoex_bsc.yaml @@ -1,8 +1,8 @@ specVersion: 0.0.4 description: Dodoex.io -graft: - base: QmU2D6A3QDtTwrzC6NgK2ngZEskS1bzEwo599bUdjhzPVz - block: 39336465 +# graft: +# base: QmUMiKv8gQVhZwrfSkhM24J5YoEau3KkK9xPGfY5PWeSza +# block: 41809388 features: - grafting repository: https://github.com/DODOEX/dodoex_v2_subgraph @@ -522,6 +522,39 @@ dataSources: handler: handleNewDSP - event: RemoveDSP(address) handler: handleRemoveDSP + - kind: ethereum/contract + name: GSPFactory + network: bsc + source: + address: '0x78d43a889F42a344Fe98C3fb9455791Dc8178d55' + abi: GSPFactory + startBlock: 41809388 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/poolFactory.ts + entities: + - Pair + - Token + abis: + - name: GSPFactory + file: ../../abis/GSPFactory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: GSP + file: ../../abis/GSP.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + eventHandlers: + - event: NewGSP(address,address,address,address) + handler: handleNewGSP + - event: RemoveGSP(address) + handler: handleRemoveGSP - kind: ethereum/contract name: CrowdPoolingFactory_20200721 network: bsc @@ -889,6 +922,56 @@ templates: handler: handleSellShares - event: Transfer(indexed address,indexed address,uint256) handler: handleTransfer + - kind: ethereum/contract + name: GSP + network: bsc + source: + abi: GSP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/pool.ts + entities: + - Pair + - Token + - DODOSwap + abis: + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: DPPFactory + file: ../../abis/DPPFactory.json + - name: DSPFactory + file: ../../abis/DSPFactory.json + - name: GSPFactory + file: ../../abis/GSPFactory.json + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DSP + file: ../../abis/DSP.json + - name: GSP + file: ../../abis/GSP.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + - name: DODOZoo + file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: BuyShares(address,uint256,uint256) + handler: handleBuyShares + - event: SellShares(address,address,uint256,uint256) + handler: handleSellShares + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer - kind: ethereum/contract name: CP network: bsc diff --git a/subgraphs/dodoex/dodoex_dodochain-testnet.yaml b/subgraphs/dodoex/dodoex_dodochain-testnet.yaml index 13c6689..613618c 100644 --- a/subgraphs/dodoex/dodoex_dodochain-testnet.yaml +++ b/subgraphs/dodoex/dodoex_dodochain-testnet.yaml @@ -6,7 +6,7 @@ schema: dataSources: - kind: ethereum/contract name: DODOV2Proxy02 - network: dodochain-testnet2 + network: dodochain-testnet3 source: address: '0x351a86A2C8dc47D396305AAcd7F126E096b2eee4' abi: DODOV2Proxy02 @@ -33,7 +33,7 @@ dataSources: handler: handleOrderHistory - kind: ethereum/contract name: DODOFeeRouteProxy - network: dodochain-testnet2 + network: dodochain-testnet3 source: address: '0xf50d3a044ff63bb476e02f442d813b177c432bfd' abi: DODOFeeRouteProxy @@ -62,7 +62,7 @@ dataSources: handler: handleOrderHistory - kind: ethereum/contract name: DODOFeeRouteProxy-widgit - network: dodochain-testnet2 + network: dodochain-testnet3 source: address: '0x3a5980966a8774b357a807231f87f7fd792ff6f9' abi: DODOFeeRouteProxy @@ -91,7 +91,7 @@ dataSources: handler: handleOrderHistory - kind: ethereum/contract name: DVMFactory - network: dodochain-testnet2 + network: dodochain-testnet3 source: address: '0x7D381e6a9c23A0E6969658f6B8Eba57A4Dbf93a0' abi: DVMFactory @@ -124,7 +124,7 @@ dataSources: handler: handleRemoveDVM - kind: ethereum/contract name: DPPFactory - network: dodochain-testnet2 + network: dodochain-testnet3 source: address: "0x72A2c79E6D882AdabE02cEbC606b834b06831b3A" abi: DPPFactory @@ -155,7 +155,7 @@ dataSources: handler: handleNewDPP - kind: ethereum/contract name: DSPFactory - network: dodochain-testnet2 + network: dodochain-testnet3 source: address: '0x22AdDF954Ea92a3A80403Fe353093f7bF58665EC' abi: DSPFactory @@ -188,7 +188,7 @@ dataSources: handler: handleRemoveDSP - kind: ethereum/contract name: CrowdPoolingFactory - network: dodochain-testnet2 + network: dodochain-testnet3 source: address: '0xF9a6c9BE0a1149C69EF537359c78DeB5e6264ec6' abi: CrowdPoolingFactory @@ -223,7 +223,7 @@ dataSources: handler: handleNewCP # - kind: ethereum/contract # name: CrowdPoolingFactoryV2 - # network: dodochain-testnet2 + # network: dodochain-testnet3 # source: # address: '0x9a8c0e8b27fff5d00402733ca67432b6d64faff4' # abi: CrowdPoolingFactory @@ -258,7 +258,7 @@ dataSources: # handler: handleNewCP # - kind: ethereum/contract # name: UpCrowdPoolingFactory - # network: dodochain-testnet2 + # network: dodochain-testnet3 # source: # address: '0xE92787F457F541a9D5Ae17C1dbdBffA8D3BA3C25' # abi: UpCrowdPoolingFactory @@ -293,7 +293,7 @@ dataSources: # handler: handleNewCP # - kind: ethereum/contract # name: DODOZoo - # network: dodochain-testnet2 + # network: dodochain-testnet3 # source: # address: '0xBcC3401E16C25EaF4d3FeD632ce3288503883B1f' # abi: DODOZoo @@ -326,7 +326,7 @@ dataSources: # handler: handleDODOBirth # - kind: ethereum/contract # name: DODOMine - # network: dodochain-testnet2 + # network: dodochain-testnet3 # source: # address: '0xe3c10989ddc5df5b1b9c0e6229c2e4e0862fde3e' # abi: DODOMine @@ -358,7 +358,7 @@ dataSources: templates: - kind: ethereum/contract name: DVM - network: dodochain-testnet2 + network: dodochain-testnet3 source: abi: DVM mapping: @@ -402,7 +402,7 @@ templates: handler: handleTransfer - kind: ethereum/contract name: DPP - network: dodochain-testnet2 + network: dodochain-testnet3 source: abi: DPP mapping: @@ -441,7 +441,7 @@ templates: handler: handleLpFeeRateChange - kind: ethereum/contract name: DPPOracleAdmin - network: dodochain-testnet2 + network: dodochain-testnet3 source: abi: DPPOracleAdmin mapping: @@ -480,7 +480,7 @@ templates: handler: handleDPPOwnershipTransferred - kind: ethereum/contract name: DSP - network: dodochain-testnet2 + network: dodochain-testnet3 source: abi: DSP mapping: @@ -526,7 +526,7 @@ templates: handler: handleTransfer - kind: ethereum/contract name: CP - network: dodochain-testnet2 + network: dodochain-testnet3 source: abi: CP mapping: @@ -567,7 +567,7 @@ templates: handler: handleClaim - kind: ethereum/contract name: DODO - network: dodochain-testnet2 + network: dodochain-testnet3 source: abi: DODO mapping: @@ -616,7 +616,7 @@ templates: handler: handleUpdateMaintainerFeeRate - kind: ethereum/contract name: DODOLpToken - network: dodochain-testnet2 + network: dodochain-testnet3 source: abi: DODOLpToken mapping: @@ -641,7 +641,7 @@ templates: handler: handleTransfer - kind: ethereum/contract name: CPV2 - network: dodochain-testnet2 + network: dodochain-testnet3 source: abi: CPV2 mapping: diff --git a/subgraphs/dodoex/dodoex_mainnet.yaml b/subgraphs/dodoex/dodoex_mainnet.yaml index d6511a2..f0a81f9 100644 --- a/subgraphs/dodoex/dodoex_mainnet.yaml +++ b/subgraphs/dodoex/dodoex_mainnet.yaml @@ -1,8 +1,8 @@ specVersion: 0.0.4 description: Dodoex.io -graft: - base: QmQukqWv9VDsPAMMbEBjUSTY1aFnv8CENhX7JEL3zQzkac - block: 12316399 +# graft: +# base: QmUwBJMB9ZiKuipGaQ4fh57GwgMNhaDteo7G1qbUwVpZac +# block: 20639986 features: - grafting repository: https://github.com/DODOEX/dodoex_v2_subgraph @@ -542,6 +542,39 @@ dataSources: handler: handleNewDSP - event: RemoveDSP(address) handler: handleRemoveDSP + - kind: ethereum/contract + name: GSPFactory + network: mainnet + source: + address: '0x710409D2121B7C8EA4aCAdd6803FDE2D85DF6473' + abi: GSPFactory + startBlock: 20639986 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/poolFactory.ts + entities: + - Pair + - Token + abis: + - name: GSPFactory + file: ../../abis/GSPFactory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: GSP + file: ../../abis/GSP.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + eventHandlers: + - event: NewGSP(address,address,address,address) + handler: handleNewGSP + - event: RemoveGSP(address) + handler: handleRemoveGSP - kind: ethereum/contract name: CrowdPoolingFactory network: mainnet @@ -712,6 +745,12 @@ templates: file: ../../abis/FeeRateModel.json - name: DODOZoo file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: DODOSwap(address,address,uint256,uint256,address,address) handler: handleDODOSwap @@ -830,6 +869,12 @@ templates: file: ../../abis/FeeRateModel.json - name: DODOZoo file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: DODOSwap(address,address,uint256,uint256,address,address) handler: handleDODOSwap @@ -839,6 +884,66 @@ templates: handler: handleSellShares - event: Transfer(indexed address,indexed address,uint256) handler: handleTransfer + - kind: ethereum/contract + name: GSP + network: mainnet + source: + abi: GSP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/pool.ts + entities: + - Pair + - Token + - DODOSwap + abis: + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: DPPFactory + file: ../../abis/DPPFactory.json + - name: DSPFactory + file: ../../abis/DSPFactory.json + - name: GSPFactory + file: ../../abis/GSPFactory.json + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DSP + file: ../../abis/DSP.json + - name: GSP + file: ../../abis/GSP.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + - name: DODOZoo + file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: BuyShares(address,uint256,uint256) + handler: handleBuyShares + - event: SellShares(address,address,uint256,uint256) + handler: handleSellShares + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer + - event: IChange(uint256) + handler: handleIChange + - event: KChange(uint256) + handler: handleKChange + - event: LpFeeRateChange(uint256) + handler: handleLpFeeRateChange + - event: MtFeeRateChange(uint256) + handler: handleMtFeeRateChange + - event: RChange(uint8) + handler: handleRChange - kind: ethereum/contract name: CP network: mainnet diff --git a/subgraphs/dodoex/dodoex_mantle.yaml b/subgraphs/dodoex/dodoex_mantle.yaml index ac5d4b8..ad70fff 100644 --- a/subgraphs/dodoex/dodoex_mantle.yaml +++ b/subgraphs/dodoex/dodoex_mantle.yaml @@ -1,5 +1,10 @@ specVersion: 0.0.4 description: Dodoex.io +# graft: +# base: QmXvVqkD57W7zCj46qtb7yjxHsWF7mPM7odM7cBuRqTE1X +# block: 68446838 +# features: +# - grafting repository: https://github.com/DODOEX/dodoex_v2_subgraph schema: file: ./dodoex.graphql @@ -186,6 +191,39 @@ dataSources: handler: handleNewDSP - event: RemoveDSP(address) handler: handleRemoveDSP + - kind: ethereum/contract + name: GSPFactory + network: mantle + source: + address: '0xE6cecb7460c9E52aA483cb1f0E87d78D7085686F' + abi: GSPFactory + startBlock: 68446838 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/poolFactory.ts + entities: + - Pair + - Token + abis: + - name: GSPFactory + file: ../../abis/GSPFactory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: GSP + file: ../../abis/GSP.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + eventHandlers: + - event: NewGSP(address,address,address,address) + handler: handleNewGSP + - event: RemoveGSP(address) + handler: handleRemoveGSP # - kind: ethereum/contract # name: CrowdPoolingFactory # network: mantle @@ -385,6 +423,12 @@ templates: file: ../../abis/FeeRateModel.json - name: DODOZoo file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: DODOSwap(address,address,uint256,uint256,address,address) handler: handleDODOSwap @@ -503,6 +547,12 @@ templates: file: ../../abis/FeeRateModel.json - name: DODOZoo file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json eventHandlers: - event: DODOSwap(address,address,uint256,uint256,address,address) handler: handleDODOSwap @@ -512,6 +562,66 @@ templates: handler: handleSellShares - event: Transfer(indexed address,indexed address,uint256) handler: handleTransfer + - kind: ethereum/contract + name: GSP + network: mantle + source: + abi: GSP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/pool.ts + entities: + - Pair + - Token + - DODOSwap + abis: + - name: DVMFactory + file: ../../abis/DVMFactory.json + - name: DPPFactory + file: ../../abis/DPPFactory.json + - name: DSPFactory + file: ../../abis/DSPFactory.json + - name: GSPFactory + file: ../../abis/GSPFactory.json + - name: DVM + file: ../../abis/DVM.json + - name: DPP + file: ../../abis/DPP.json + - name: DSP + file: ../../abis/DSP.json + - name: GSP + file: ../../abis/GSP.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + - name: DODOZoo + file: ../../abis/DODOZoo.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + eventHandlers: + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: BuyShares(address,uint256,uint256) + handler: handleBuyShares + - event: SellShares(address,address,uint256,uint256) + handler: handleSellShares + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer + - event: IChange(uint256) + handler: handleIChange + - event: KChange(uint256) + handler: handleKChange + - event: LpFeeRateChange(uint256) + handler: handleLpFeeRateChange + - event: MtFeeRateChange(uint256) + handler: handleMtFeeRateChange + - event: RChange(uint8) + handler: handleRChange - kind: ethereum/contract name: CP network: mantle diff --git a/subgraphs/dodoex/dodoex_sepolia.yaml b/subgraphs/dodoex/dodoex_sepolia.yaml index 27db600..749f281 100644 --- a/subgraphs/dodoex/dodoex_sepolia.yaml +++ b/subgraphs/dodoex/dodoex_sepolia.yaml @@ -190,9 +190,9 @@ dataSources: name: GSPFactory network: sepolia source: - address: '0xD936B3CBFFbCE67315C1bc1957b261A6eF637128' + address: '0xa4aAeb4ED67d4451E4Dfd7aA595f76265A6dC697' abi: GSPFactory - startBlock: 6492271 + startBlock: 6559916 mapping: kind: ethereum/events apiVersion: 0.0.6 @@ -219,6 +219,39 @@ dataSources: handler: handleNewGSP - event: RemoveGSP(address) handler: handleRemoveGSP + - kind: ethereum/contract + name: GSPFactory-2 + network: sepolia + source: + address: '0xd936b3cbffbce67315c1bc1957b261a6ef637128' + abi: GSPFactory + startBlock: 6492271 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: ../../src/mappings/dodoex/poolFactory.ts + entities: + - Pair + - Token + abis: + - name: GSPFactory + file: ../../abis/GSPFactory.json + - name: ERC20 + file: ../../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../../abis/ERC20NameBytes.json + - name: GSP + file: ../../abis/GSP.json + - name: FeeRateModel + file: ../../abis/FeeRateModel.json + eventHandlers: + - event: NewGSP(address,address,address,address) + handler: handleNewGSP + - event: RemoveGSP(address) + handler: handleRemoveGSP - kind: ethereum/contract name: CrowdPoolingFactory network: sepolia @@ -607,6 +640,16 @@ templates: handler: handleSellShares - event: Transfer(indexed address,indexed address,uint256) handler: handleTransfer + - event: IChange(uint256) + handler: handleIChange + - event: KChange(uint256) + handler: handleKChange + - event: LpFeeRateChange(uint256) + handler: handleLpFeeRateChange + - event: MtFeeRateChange(uint256) + handler: handleMtFeeRateChange + - event: RChange(uint8) + handler: handleRChange - kind: ethereum/contract name: CP network: sepolia diff --git a/subgraphs/mine/mine_dodochain-testnet.yaml b/subgraphs/mine/mine_dodochain-testnet.yaml index d6b3fc3..7f756df 100644 --- a/subgraphs/mine/mine_dodochain-testnet.yaml +++ b/subgraphs/mine/mine_dodochain-testnet.yaml @@ -6,7 +6,7 @@ schema: dataSources: - kind: ethereum/contract name: DODOMineV3ProxyV2 - network: dodochain-testnet2 + network: dodochain-testnet3 source: address: '0x391f8D754E4BaC453d059BA7D2137C4905bF48d4' abi: DODOMineV3ProxyV2 @@ -36,7 +36,7 @@ dataSources: handler: handleV2CreateMineV3 - kind: ethereum/contract name: DODOMineV3Registry - network: dodochain-testnet2 + network: dodochain-testnet3 source: address: '0x85C23863977dA7c3CEaCe129e292ba0F4d8aAA00' abi: DODOMineV3Registry @@ -67,7 +67,7 @@ dataSources: templates: - kind: ethereum/contract name: ERC20MineV3 - network: dodochain-testnet2 + network: dodochain-testnet3 source: abi: ERC20MineV3 mapping: diff --git a/subgraphs/token/token_dodochain-testnet.yaml b/subgraphs/token/token_dodochain-testnet.yaml index c7c6c21..283bffd 100644 --- a/subgraphs/token/token_dodochain-testnet.yaml +++ b/subgraphs/token/token_dodochain-testnet.yaml @@ -6,7 +6,7 @@ schema: dataSources: - kind: ethereum/contract name: ERC20V3Factory - network: dodochain-testnet2 + network: dodochain-testnet3 source: address: '0xDC249Ea92D2e532ed63B45dc7C05B21926B97c6F' abi: ERC20V3Factory diff --git a/subgraphs/vdodo/vdodo_mainnet.yaml b/subgraphs/vdodo/vdodo_mainnet.yaml index ad69c37..ecab449 100644 --- a/subgraphs/vdodo/vdodo_mainnet.yaml +++ b/subgraphs/vdodo/vdodo_mainnet.yaml @@ -1,4 +1,4 @@ -specVersion: 0.0.2 +specVersion: 0.0.4 description: Dodoex.io repository: https://github.com/DODOEX/dodoex_v2_subgraph schema: @@ -13,7 +13,7 @@ dataSources: startBlock: 11848651 mapping: kind: ethereum/events - apiVersion: 0.0.4 + apiVersion: 0.0.6 language: wasm/assemblyscript file: ../../src/mappings/vdodo/core.ts entities: From 96b6c209b458a9e61a84c3f97fff29f42d0b6a5b Mon Sep 17 00:00:00 2001 From: yongjun Date: Tue, 10 Sep 2024 18:05:16 +0800 Subject: [PATCH 10/11] fix: support GSP pool --- build/DODOMine/DODOMine.wasm | Bin 43517 -> 43191 bytes build/DODOZoo/DODOZoo.wasm | Bin 118252 -> 117871 bytes build/DVMFactory/DVMFactory.wasm | Bin 73890 -> 73977 bytes build/subgraph.yaml | 825 ++++++++++++++++++- build/templates/CP/CP.wasm | Bin 67259 -> 67341 bytes build/templates/DODOLpToken/DODOLpToken.wasm | Bin 42903 -> 42987 bytes build/templates/DVM/DVM.wasm | Bin 93358 -> 93439 bytes src/mappings/constant.ts | 37 +- src/mappings/dodoex/helpers.ts | 2 +- subgraphs/dodoex/dodoex_arbitrum.yaml | 6 +- subgraphs/dodoex/dodoex_bsc.yaml | 14 +- 11 files changed, 841 insertions(+), 43 deletions(-) diff --git a/build/DODOMine/DODOMine.wasm b/build/DODOMine/DODOMine.wasm index d11879bcd288c671c486b40028cb3cf42ddeb22c..53a7d0a81bb5604f3fca106790a58cb2a1b44f51 100644 GIT binary patch delta 4793 zcmai1YiwK99Y6Or4!OSVa+5X*N%Oc)oW#!4jvq-zOE@iUp($-z=tSuw&8u6Xg^IR- zHio;c+pNt4kF!D0j0h9jGR@i|1!w-fCpca<&KMW^%b-J!8b@>r0=f{2cB$g^&smun zHE_dEont)xhE#7?A44`qoxUC<9g#?@+hFthGLRyQ zJlV)UX%aiVl^ajDn3N5Vw3v!?*TU1yvaFUb68*G^-$FIx3pJ)wPuTh@v^6u_*0%5 zHJP9gyE8dl&t1yFsq2-w|`YIZPC>s9(mMF~-oOWhl}Ouoc+uVd5oBy_21 zDI8??l1X$vd86|NirdH+ZJGX!OhYc)Ko1oUMZPJsE8a$R_PlWTox*JEQb(pmUt5uS zYFfPLcZe6-ZdWHSiU0Z?>g*-q2-Hw(9KJerBq1ISI4H>@J{N)Kd>czg8qlJ06ue<6 z!&6sfLI34zwww$sbI|+$jQ=yU(ZUST4&rQvcxrWqsDl`-v?Q5PJ_?)2^tpEul%zE;yMIs84 z4i)Ii5oBGU?J=YG(v%ssLqKJ0Cf zA-z7x1R=}QmY;Cpaz8^MSu8JhKT70*3o2v)M!hgW>g`yAONN4wvkKh?8fgWg<%28* z=Vg4pP$sna1xM5rvJ^ltoq!Zt2fVa*K$$u^2qJZggxbNR{0C(goq&{MC(Kg~1__F* zcb1AjZr-US)<}OdYeeamUTvaCwrHwId~3^UEoEVIMdHORC0ZI7x)ClGuWzZ?5igdK zXNvXJRQQ!x8(9zQWgFPt>`vTv@F6`@td|nMaEZSW7h^kQH?eIft0fgK5$?OzhTb)YmOCOH zy5@9^Nv=)0rTPs@Dvb=)umiY{h1zkTLQ+&TUgX%5$;Ji%6$qG5_1f+J6JED^PAnX$ttqI{c2m(dSQ){K8xwXqPqFd4-RVZqbY=;?o zs74+(|UoLx<-~&EDv6s7Io?-DrP(d zDsq@J#oOJrTEw9%PvSM{5dZEztVODIWgoC=adg{mZ64SWWLqsRZTsr_RE_j8SEJ{X z54>)1t0`)Tq%B?;zYd5;wK$B5@|e@AhEqIp&srm4VKdIm%@>pR6xn$iR74Q26~Djd zxR$Qfl?h;VBC!28+C;te#ZoWkxBE)cz{Jq^n-CEkh!fx>cU@5ni zqg#Biqg0DDNWI~PXM0MtI1r?Nra_oJ6>4ajF*baX8EC9Qj4f8rT67=PrAa)q$01hk z$~RJApl)+5dM`2V7xDew;;~%?TB22I%(RN=E}s_hSl#i6#I8rQh*$E4z2eS$y|#o` ze`bX+ce}=ae(zz$p7QHzc@9ka$BTBa%+b>8WG>2=D1K;O_V<1-LXzO$vGG zv_}#^sfY>TK4=zB5DM-TVCK$z+>1#%SWuWI79tP7&Gc_jQYU0muO95PM=pc)B#c}Z zRei_okt;ysK(B}w`hMk`NCJh6DZr)cI#N$1nz#7qnn55C0ghF@4n)oC&87hBtOiJT%az&Ri2O4HU0kgoKh0 z>UE~uO(}zM=9vELA~{fU_YCN()@JAxmW4EED#=9Og|Y@^KsyNXqk`}%5puEwNG9JE zp21>u;azdp;CA)=pTzLsme5b$%h-7(dlFXA>|q`U1(BpPF!G^=Uk9{wGlwhRQ*s{eJ36F1UA}>>e(K2hYlk*${2x3+KrjFR delta 5232 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 UBw#E7Uw%I+@cu++->H571(7y*LI3~& diff --git a/build/DODOZoo/DODOZoo.wasm b/build/DODOZoo/DODOZoo.wasm index e703f29641ab6b1d66292c7dfc409e9da15608fe..5cdedda0f2a33d61a3a05ff5a0671efe6c3b7b6d 100644 GIT binary patch delta 24585 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 WyLchHf8l3LOT1_AKNhmYYyS@tpv1!f delta 25055 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 K)912;TmBd3T*n~* diff --git a/build/DVMFactory/DVMFactory.wasm b/build/DVMFactory/DVMFactory.wasm index dd26ff66a4f1755ad4415ddf6d4b6e9640e1cb0e..83cccaa4c32ed59602615cb81188ad0ed18bf470 100644 GIT binary patch delta 13118 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 Tez1J0lz#u>)(P*;zx4kBYn9c( delta 12976 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 diff --git a/build/subgraph.yaml b/build/subgraph.yaml index 4acba8c..082f91c 100644 --- a/build/subgraph.yaml +++ b/build/subgraph.yaml @@ -1,27 +1,447 @@ specVersion: 0.0.4 description: Dodoex.io +graft: + base: QmbhmHajvCeLUhwWsy7rcJZcCb7zWmHazYeor5Z3G5UjD6 + block: 248209289 +features: + - grafting repository: https://github.com/DODOEX/dodoex_v2_subgraph schema: - file: vdodo.graphql + file: dodoex.graphql dataSources: - kind: ethereum/contract - name: vDODOToken - network: mainnet + name: DODOFeeRouteProxy + network: arbitrum-one source: - address: "0xc4436fbae6eba5d95bf7d53ae515f8a707bd402a" - abi: vDODOToken - startBlock: 11848651 + address: "0xe05dd51e4eb5636f4f0e8e7fbe82ea31a2ecef16" + abi: DODOFeeRouteProxy + startBlock: 45989363 mapping: kind: ethereum/events apiVersion: 0.0.6 language: wasm/assemblyscript - file: vDODOToken/vDODOToken.wasm + file: DODOFeeRouteProxy/DODOFeeRouteProxy.wasm + entities: + - Pair + - Token + abis: + - name: DODOFeeRouteProxy + file: ../abis/DODOFeeRouteProxy.json + - name: DODOV2Proxy02 + file: ../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory + - kind: ethereum/contract + name: DODOFeeRouteProxyWidgit + network: arbitrum-one + source: + address: "0xc4A1a152812dE96b2B1861E433f42290CDD7f113" + abi: DODOFeeRouteProxy + startBlock: 45989363 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODOFeeRouteProxy/DODOFeeRouteProxy.wasm + entities: + - Pair + - Token + abis: + - name: DODOFeeRouteProxy + file: ../abis/DODOFeeRouteProxy.json + - name: DODOV2Proxy02 + file: ../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory + - kind: ethereum/contract + name: DODOV2Proxy02 + network: arbitrum-one + source: + address: "0x88CBf433471A0CD8240D2a12354362988b4593E5" + abi: DODOV2Proxy02 + startBlock: 226001 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODOFeeRouteProxy/DODOFeeRouteProxy.wasm + entities: + - Pair + - Token + abis: + - name: DODOV2Proxy02 + file: ../abis/DODOV2Proxy02.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory + - kind: ethereum/contract + name: DVMFactory + network: arbitrum-one + source: + address: "0xDa4c4411c55B0785e501332354A036c04833B72b" + abi: DVMFactory + startBlock: 226001 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DVMFactory/DVMFactory.wasm + entities: + - Pair + - Token + abis: + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: DVM + file: ../abis/DVM.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + eventHandlers: + - event: NewDVM(address,address,address,address) + handler: handleNewDVM + - event: RemoveDVM(address) + handler: handleRemoveDVM + - kind: ethereum/contract + name: DPPFactory + network: arbitrum-one + source: + address: "0xDdB13e6dd168E1a68DC2285Cb212078ae10394A9" + abi: DPPFactory + startBlock: 226002 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DVMFactory/DVMFactory.wasm + entities: + - Pair + - Token + abis: + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: DPP + file: ../abis/DPP.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + eventHandlers: + - event: NewDPP(address,address,address,address) + handler: handleNewDPP + - kind: ethereum/contract + name: DPPFactory_21_10_13 + network: arbitrum-one + source: + address: "0xa6cf3d163358af376ec5e8b7cc5e102a05fde63d" + abi: DPPFactory + startBlock: 2112221 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DVMFactory/DVMFactory.wasm + entities: + - Pair + - Token + abis: + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: DPP + file: ../abis/DPP.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + eventHandlers: + - event: NewDPP(address,address,address,address) + handler: handleNewDPP + - kind: ethereum/contract + name: DSPFactory + network: arbitrum-one + source: + address: "0xC8fE2440744dcd733246a4dB14093664DEFD5A53" + abi: DSPFactory + startBlock: 226003 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DVMFactory/DVMFactory.wasm + entities: + - Pair + - Token + abis: + - name: DSPFactory + file: ../abis/DSPFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: DSP + file: ../abis/DSP.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + eventHandlers: + - event: NewDSP(address,address,address,address) + handler: handleNewDSP + - event: RemoveDSP(address) + handler: handleRemoveDSP + - kind: ethereum/contract + name: GSPFactory + network: arbitrum-one + source: + address: "0x46E55A974c5995675b025f7F607C3278B36f0c29" + abi: GSPFactory + startBlock: 248209288 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DVMFactory/DVMFactory.wasm + entities: + - Pair + - Token + abis: + - name: GSPFactory + file: ../abis/GSPFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: GSP + file: ../abis/GSP.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + eventHandlers: + - event: NewGSP(address,address,address,address) + handler: handleNewGSP + - event: RemoveGSP(address) + handler: handleRemoveGSP + - kind: ethereum/contract + name: CrowdPoolingFactory + network: arbitrum-one + source: + address: "0x6E5f239f729c83E976a7A280F81Dd1685dd89218" + abi: CrowdPoolingFactory + startBlock: 226004 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DVMFactory/DVMFactory.wasm + entities: + - Pair + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: DODO + file: ../abis/DODO.json + - name: CrowdPoolingFactory + file: ../abis/CrowdPoolingFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: CP + file: ../abis/CP.json + eventHandlers: + - event: NewCP(address,address,address,address) + handler: handleNewCP + - kind: ethereum/contract + name: CrowdPoolingFactoryV2 + network: arbitrum-one + source: + address: "0x9a8c0e8b27fff5d00402733ca67432b6d64faff4" + abi: CrowdPoolingFactory + startBlock: 4407201 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DVMFactory/DVMFactory.wasm + entities: + - Pair + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: CrowdPoolingFactory + file: ../abis/CrowdPoolingFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: CP + file: ../abis/CP.json + - name: CPV2 + file: ../abis/CPV2.json + eventHandlers: + - event: NewCP(address,address,address,address) + handler: handleNewCP + - kind: ethereum/contract + name: UpCrowdPoolingFactory + network: arbitrum-one + source: + address: "0xE92787F457F541a9D5Ae17C1dbdBffA8D3BA3C25" + abi: UpCrowdPoolingFactory + startBlock: 226005 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DVMFactory/DVMFactory.wasm + entities: + - Pair + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: CrowdPoolingFactory + file: ../abis/CrowdPoolingFactory.json + - name: UpCrowdPoolingFactory + file: ../abis/UpCrowdPoolingFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: CP + file: ../abis/CP.json + eventHandlers: + - event: NewCP(address,address,address,address) + handler: handleNewCP + - kind: ethereum/contract + name: DODOZoo + network: arbitrum-one + source: + address: "0xBcC3401E16C25EaF4d3FeD632ce3288503883B1f" + abi: DODOZoo + startBlock: 226006 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODOZoo/DODOZoo.wasm + entities: + - Pair + - Token + abis: + - name: DODOZoo + file: ../abis/DODOZoo.json + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: DODO + file: ../abis/DODO.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: DODOBirth(address,address,address) + handler: handleDODOBirth + - kind: ethereum/contract + name: DODOMine + network: arbitrum-one + source: + address: "0xe3c10989ddc5df5b1b9c0e6229c2e4e0862fde3e" + abi: DODOMine + startBlock: 226006 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODOMine/DODOMine.wasm entities: - User - StakeHistory abis: - - name: vDODOToken - file: ../abis/vDODOToken.json + - name: DODOMine + file: ../abis/DODOMine.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: Deposit(indexed address,indexed uint256,uint256) + handler: handleDeposit + - event: Withdraw(indexed address,indexed uint256,uint256) + handler: handleWithdraw + - event: Claim(indexed address,uint256) + handler: handleClaim + - kind: ethereum/contract + name: DODORouteProxy + network: arbitrum-one + source: + address: "0x3b6067d4caa8a14c63fdbe6318f27a0bbc9f9237" + abi: DODORouteProxy + startBlock: 226006 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODOFeeRouteProxy/DODOFeeRouteProxy.wasm + entities: + - Pair + - Token + abis: + - name: DODORouteProxy + file: ../abis/DODORouteProxy.json - name: ERC20 file: ../abis/ERC20.json - name: ERC20SymbolBytes @@ -29,15 +449,382 @@ dataSources: - name: ERC20NameBytes file: ../abis/ERC20NameBytes.json eventHandlers: - - event: MintVDODO(address,address,uint256) - handler: handleMintVDODO - - event: RedeemVDODO(address,uint256,uint256,uint256) - handler: handleRedeemVDODO + - event: OrderHistory(address,address,address,uint256,uint256) + handler: handleOrderHistory +templates: + - kind: ethereum/contract + name: DVM + network: arbitrum-one + source: + abi: DVM + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/DVM/DVM.wasm + entities: + - Pair + - Token + - DODOSwap + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: DODO + file: ../abis/DODO.json + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + - name: DODOZoo + file: ../abis/DODOZoo.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: BuyShares(address,uint256,uint256) + handler: handleBuyShares + - event: SellShares(address,address,uint256,uint256) + handler: handleSellShares - event: Transfer(indexed address,indexed address,uint256) handler: handleTransfer - - event: PreDeposit(uint256) - handler: handlePreDeposit - - event: ChangePerReward(uint256) - handler: handleChangePerReward - - event: DonateDODO(address,uint256) - handler: handleDonateDODO + - kind: ethereum/contract + name: DPP + network: arbitrum-one + source: + abi: DPP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/DVM/DVM.wasm + entities: + - Pair + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: DODO + file: ../abis/DODO.json + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + - name: DODOZoo + file: ../abis/DODOZoo.json + eventHandlers: + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: LpFeeRateChange(uint256) + handler: handleLpFeeRateChange + - kind: ethereum/contract + name: DPPOracleAdmin + network: arbitrum-one + source: + abi: DPPOracleAdmin + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/DVM/DVM.wasm + entities: + - Pair + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: DPPOracleAdmin + file: ../abis/DPPOracleAdmin.json + - name: DODO + file: ../abis/DODO.json + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + - name: DODOZoo + file: ../abis/DODOZoo.json + eventHandlers: + - event: OwnershipTransferred(indexed address,indexed address) + handler: handleDPPOwnershipTransferred + - kind: ethereum/contract + name: DSP + network: arbitrum-one + source: + abi: DSP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/DVM/DVM.wasm + entities: + - Pair + - Token + - DODOSwap + abis: + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: DSPFactory + file: ../abis/DSPFactory.json + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: DSP + file: ../abis/DSP.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + - name: DODOZoo + file: ../abis/DODOZoo.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: BuyShares(address,uint256,uint256) + handler: handleBuyShares + - event: SellShares(address,address,uint256,uint256) + handler: handleSellShares + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer + - kind: ethereum/contract + name: GSP + network: arbitrum-one + source: + abi: GSP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/DVM/DVM.wasm + entities: + - Pair + - Token + - DODOSwap + abis: + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: DSPFactory + file: ../abis/DSPFactory.json + - name: GSPFactory + file: ../abis/GSPFactory.json + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: DSP + file: ../abis/DSP.json + - name: GSP + file: ../abis/GSP.json + - name: FeeRateModel + file: ../abis/FeeRateModel.json + - name: DODOZoo + file: ../abis/DODOZoo.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: DODOSwap(address,address,uint256,uint256,address,address) + handler: handleDODOSwap + - event: BuyShares(address,uint256,uint256) + handler: handleBuyShares + - event: SellShares(address,address,uint256,uint256) + handler: handleSellShares + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer + - event: IChange(uint256) + handler: handleIChange + - event: KChange(uint256) + handler: handleKChange + - event: LpFeeRateChange(uint256) + handler: handleLpFeeRateChange + - event: MtFeeRateChange(uint256) + handler: handleMtFeeRateChange + - event: RChange(uint8) + handler: handleRChange + - kind: ethereum/contract + name: CP + network: arbitrum-one + source: + abi: CP + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/CP/CP.wasm + entities: + - CrowdPooling + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: DODO + file: ../abis/DODO.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: CP + file: ../abis/CP.json + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DODOZoo + file: ../abis/DODOZoo.json + eventHandlers: + - event: Bid(address,uint256,uint256) + handler: handleBid + - event: Cancel(address,uint256) + handler: handleCancel + - event: Settle() + handler: handleSettle + - event: Claim(address,uint256,uint256) + handler: handleClaim + - kind: ethereum/contract + name: DODO + network: arbitrum-one + source: + abi: DODO + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: DODOZoo/DODOZoo.wasm + entities: + - Pair + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: DODO + file: ../abis/DODO.json + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DPPFactory + file: ../abis/DPPFactory.json + - name: DODOZoo + file: ../abis/DODOZoo.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + eventHandlers: + - event: Deposit(indexed address,indexed address,bool,uint256,uint256) + handler: handleDeposit + - event: Withdraw(indexed address,indexed address,bool,uint256,uint256) + handler: handleWithdraw + - event: SellBaseToken(indexed address,uint256,uint256) + handler: handleSellBaseToken + - event: BuyBaseToken(indexed address,uint256,uint256) + handler: handleBuyBaseToken + - event: UpdateLiquidityProviderFeeRate(uint256,uint256) + handler: handleUpdateLiquidityProviderFeeRate + - event: ClaimAssets(indexed address,uint256,uint256) + handler: handleClaimAssets + - event: ChargeMaintainerFee(indexed address,bool,uint256) + handler: handleChargeMaintainerFee + - event: UpdateMaintainerFeeRate(uint256,uint256) + handler: handleUpdateMaintainerFeeRate + - kind: ethereum/contract + name: DODOLpToken + network: arbitrum-one + source: + abi: DODOLpToken + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/DODOLpToken/DODOLpToken.wasm + entities: + - Pair + - Token + abis: + - name: DODOLpToken + file: ../abis/DODOLpToken.json + eventHandlers: + - event: Transfer(indexed address,indexed address,uint256) + handler: handleTransfer + - kind: ethereum/contract + name: CPV2 + network: arbitrum-one + source: + abi: CPV2 + mapping: + kind: ethereum/events + apiVersion: 0.0.6 + language: wasm/assemblyscript + file: templates/CP/CP.wasm + entities: + - CrowdPooling + - Token + abis: + - name: DVM + file: ../abis/DVM.json + - name: DPP + file: ../abis/DPP.json + - name: ERC20 + file: ../abis/ERC20.json + - name: ERC20SymbolBytes + file: ../abis/ERC20SymbolBytes.json + - name: ERC20NameBytes + file: ../abis/ERC20NameBytes.json + - name: CP + file: ../abis/CP.json + - name: CPV2 + file: ../abis/CPV2.json + - name: DVMFactory + file: ../abis/DVMFactory.json + - name: DODOZoo + file: ../abis/DODOZoo.json + eventHandlers: + - event: Bid(address,uint256,uint256) + handler: handleBid + - event: Cancel(address,uint256) + handler: handleCancel + - event: Settle() + handler: handleSettle diff --git a/build/templates/CP/CP.wasm b/build/templates/CP/CP.wasm index 3568bd119653b6f5cfbe6fc3b21602e1e2b4d803..37391763b37a83cd5482fb4bad7d3b9d2e8fcede 100644 GIT binary patch delta 12005 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 AiU0rr diff --git a/build/templates/DODOLpToken/DODOLpToken.wasm b/build/templates/DODOLpToken/DODOLpToken.wasm index ea288a95b2b46583589353eaaa679889fca8718c..1a85f9fe1af75c1db58772beb56169edba9f80b4 100644 GIT binary patch delta 5133 zcmZu!drVu`89(=8C$?`AE+G&gKx|{cfB|FkTu8{tt9g(nZPTP}o;;Vdd96*VOp0cf zbsE}S$<@hL{_r16n^x4h8WGtV>D>Ds!^!rp>(HK^C7e?lvs60!C(xR8HPgH1zGf=PjmaAx{kb$N8$F zM&05Smy5_t-U9J=*BCuNALT2kqieaU>&I{dAqm>?Zy(JC9gADb|!!D@n1f zqzvz~B~9l3X4(=dDa#Cb(lz@s0FgnRjE6i!(3H7BIgG530N&n8m-+x@M;)Fz~oVP^Hf!?^OagRM|BjYl`x zO;ifJR`8w{-Jv^qe~a!+*Z8;%fT#d`8HJ3tz!h)eW}`Y~X_i;?G_uf(^kp!=e!~E$ z7a{~7yuo5CF*6;M;(B zTfA1Dt0#(}O4Cga6D;|7x_H0bp@M9zaH~@;p;S1OV!Z8YR1&2}+^=wmPb!?s6s^>r zQt^ParP8R!E&QI%YSbkzdhBXXiFg^L|E74|QwsZ!JXz^7AqgV%CPTx_l}>*37Blh) zV<8g@-C{g=YoUHdN?)X?Y)7PvZ!Btvbsb#hxi~rLs~bL1nHS{-Jx7gP2tp zS>#KLGXA1Tx-ld10!{NGB+9(V#ocNL?YLjs;o$OdX1KB| zG_?-JzMPMXmwaneNMG}nRE*no)u9$C4kc}~U9p?>avsp^S^4`JGBa-0{2A!7=f`@4y&j)H-uQ z<7AenVK!@=CW#v`F_U|0%N?jBDFFnj>2B4nuY;XW`c9L+e^g7pKd&X!Lc(w!HPR7H!)C}la25D?~y0Gsg-p?YCp^fRmNOoQ$iw)w zu4Sb`gk!_@Ta1TH6jUXUp(!XsU&hihw6iv#YLba}%Xb^A0pEtCx{!DmKJ6$`9nx=y z%qW6a7RQgb4>q)~4L0?#@9L#-x&pFpHF(#eCSHV~n%2Q-4P4On20Wefj_P4& z)Z7Od?W)HvKWqtH4dXMbWkR!G2}J!NPjvv(1WM2v5oJpwHdAvuA*7~}Q3I5ef2Yi% z36yedf_th#r=&cdDFaPsirH<)#e;2Y#o6tT1V*xCk4Ce!bm|eR%^qWiFzNfz4nsGc zrDc+C1)f&Ok3+i+AD)CB?dr|ea!J2>UjHa2U@zOp4ubMXwu~^Gz2If5^s@QXQXj0Tc|LI6u%oJ>3E>C`)SX7Sqyg)a zU}z3%AoW604}CY*?f5i_f9}W)(3mv=s25iCup`*D(9#atN4}}WZFmSIolo*hr`0c` zbVAY&o}xFR4Y?A0Z{AYyw1-YVoo=%8$*2vD5Ohj0%@5U!Bz~-DB+#YO^N z3$9(`O8GvBZn9!i`SiT&?c)oGnBv#_+ zL4?7Z&0n}~POQRBgeP^~gbSp_K!LW7CVY+f$`Ast;L#Sq6KMLN?Wb9ad~=+KnQxF;QA%kERwpi@(hfOCrLyZ2aT zz@0|kV)>qv$KpjY!gSHX1@Jg~4sFF1orDe^dtF)0$8l-VO#&-?6-|~bTs1VX^ZFU+QT18zdaK78DK(;% ziuxn;Crw>Y-9z#0dKa!tF1emF;j_inYs%49hw#b5WfS|jC}5@vk3 zTr@v?)e@^nB|iCZ$;KoY;OX^f3ckC-AV_GyqvbhKf;D(HXW@mvsT9?-kp#>Da#C#A z*Juq^%GiCC;_|)@YZ4q(y;Wj*pWixCC0jgNC0zT@Sx2g+ZnRp2_tz-Np?mv(sMvyj zP0cr<@&2JRkFGFTBO4^};SJ)-!N;t@W=&~@vRQm^utkp>+;p>6N3E<95B9AWt%owV zL^c{d-ncL!#+N_7CS!(fa^u2RJe|4Ia)S5_w7@$netf90BeKbGvuRB-<#r- zCl6ZVZ-Nce>27^04UrUU%W ziEmhAzXlf}Zd=={{^W1K!ENuvqQ0Fd`#*hyfxJ~FP>~;4W4{H9h;i}Dc6U?oeZxy1 z===}msd8K+cxdu0_zxAjm3Ocvp8hboagp8OKiT&?re##F4@aX!i7KxgvZ?lmgN;5%hLeiB!GDk6B{*}U=p$rlbBcAB;#mC z=xC=*yLQlHE1g+K{%}Ud?pUVSk#=aiNzstFF=XNcD_V5&2Qyu#+m6%H%4mPzxyvK& zopZnU^L*!U`TI@vrJL%=PaSIPgVBJaKUw+NXj=MXs(m(x4~f2vKW`<(d$!CXoZAv09LZDcUiNNQ8wT*pWgVPAQl?j2}`IN8B! zks{;DNf%qK=sJ%znRaRtUaR>?v*9w_e5%=SC+U1D5jjey3FI`^3|G8?JFLDH*_^K# zHqtQij0C9P30pZEIS9dL!;H^_rL}qy)ro%=rMA6!d8Nw8WyV97msJcGyu_@KMyh^V zQF^J{c}A97p`9D@@_{10UVL4V(|)JKq)K?S#8hOs59z-_7?y^IZ&#o086}u8=*VfsbrVY`>afBEUN{Q=* z61Nf~L>(y*u@Y0AwZMRfDDirUTa9^0T^%VD)uk;ej4zggDiDJJQ? z)5KhQRl}=#jg1%?S*6S@e1-7=kx=I56BEoTE&@bW8=hc%d}3wCsLub{;)TjevQ0Y* zMe0c6N9Adb7;FZ_Gi7DDBZV@s&G6`^UH8bXaGJ_)Y6p(Z=*_Ybg>r^fmb5D3&)KDG z%$AX@>lHAejx4*4l)K2{ALU-#>l;;`l0MT=U22}j6Y+GpCzZM8i~3~3zL$> zM^fUvMDPaa=q2%?b#a~!UfAL>V_m+&6}(kGn`@}~HcrjVs_DA2e$q<=}UN-wul^@Y}#A z`B6|k@~OsMYRELBhMr(Y4CZ9Ld;vTp*q^MY*}$R%&pE9{Its4WWSQMq^4-~4In*Ow z58`wonjf)z$fN?%Yh`rGpaxkV1KbMOhJ3ofse@KEYB<^pQ3H&+V8nwdGSG0!-GSO+ z;Dbp$H0xmIhfOPZ6~L?DhyqYk2vXU#ptj=ODy3C`l`^$<=(ahuv)$bt< zHKxjT52sq~&Z2%BiPnnuI|3C#os@EWEcLpQ1CwX9pLxi_QtC~)d7&3BK)$)Hkd)WVnsqh4Cjc{v7*P7O^X z$tYko=8nR50XAS?GGy}onRh2&jfh>)?tx~dj7B5XMXr$w7R_EAFbZD*tO06NS2cJw zSVuwiAS?|+J@biAk$ev@KXi`DkOPEzth@B_2 zahI-if^rGRu3cKtZB3`J%d7|U|odt6y&Fo=7TujIJ*nbLbv)o%V(SBbV(lc z$f&~}y^y?^Sf{b$B4c;9He<==JYvgkpEFo!X^JOzmufR0(1E!^@tfV*&VW~TZ&19y zyVJP<0*&n#_4jpXGex=*gkF(&?!FhD3&ql^Uli@}G=)lJW@7;OTM+?(!|4(|(~TTb zv10VXZy?Qr;WU&3H8iPT1oqTxUxkn~GcaOOJ&^~Q^v##LMn%peP z_ir%*jglH{)N80sn?%drT=DY$b=zhj$U=dQ%VTmLBXR*9<_ngrze!IfBV5)vXkFML z8Y3QTvijL1p4;OQ84oA>XTTv}P0N#g5MC^9f3vRT!vo#i=vS~=>JB&SO9NJl-Q(jH ze-hdhlTOE@7)NkX%v>{y@rvI)oUVnoSl!x!=w9*7!%14y;>>Rm8y>0I778Lfxzc?I&spj2!7xpE$|nRL41gbp#uZH(1fKr2DmgdLoO?ol|wT_ilRmNrI<&IzF$lP{sr1K(kCP;b9s&Lsr-iYn#jS(s!guKL#F=*?3!u1n#qgn@xS|ou z$voiFzLnu7ya7Jy7!-RCm$yZTLa1rLrSE}rNaO@vZ_&7Pex>xn;^h~3Z_(4l;kvR2 zQ7CO1aOpBU#m?bd^elTEC7!_q$94LJ_lPScbknjQ1N2cXIKGE-#gj*pQ=%k7E%Sg+ zk?1_iED%?Y?9&#eAi6|zk<;~kZQ&NE5K)6&uQ!HngF+5tfJ=j56u}<9y9R+2(Z@N! zdM9S$+?horx`-?+B7sjagNyMI_En-ygrXnl z1<(p$=(D)5@kJy8Lo%`%Pxu9Wa+XDvYxP_{B;A)@72syp<#B^-~# QNF2WS#iH_P|1m%RKdh8sF#rGn diff --git a/build/templates/DVM/DVM.wasm b/build/templates/DVM/DVM.wasm index 3564bbae51b952df800683a9c84b7335c092d96c..ee516260e411ccea1f263980e2be2c00bc15f51a 100644 GIT binary patch delta 18895 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 A(EtDd delta 18780 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 F{{v)_6R7|I diff --git a/src/mappings/constant.ts b/src/mappings/constant.ts index f89747e..6936ef6 100644 --- a/src/mappings/constant.ts +++ b/src/mappings/constant.ts @@ -1,4 +1,4 @@ -//kovan +//mainnet export const TYPE_VIRTUAL_POOL = "VIRTUAL"; export const TYPE_DVM_POOL = "DVM"; export const TYPE_DPP_POOL = "DPP"; @@ -7,24 +7,20 @@ export const TYPE_GSP_POOL = "GSP"; export const TYPE_CLASSICAL_POOL = "CLASSICAL"; export const SOURCE_SMART_ROUTE = "SMART_ROUTE"; export const SOURCE_POOL_SWAP = "DODO_POOL"; -export const DODOZooID = "dodoex-v2-dodochain-testnet"; +export const DODOV2Proxy02 = "0x45894c062e6f4e58b257e0826675355305dfef0d"; +export const DIP3_TIMESTAMP = 100; + +export const DODOZooID = "dodoex-v2-arbitrum"; export const CHAIN_BASE_COIN_SYMBOL = "ETH"; -export const CHAIN_BASE_COIN_NAME = "ethereum"; -export const DIP3_TIMESTAMP = 1624442400; +export const CHAIN_BASE_COIN_NAME = "ether"; export const SMART_ROUTE_ADDRESSES: string[] = [ - "0x351a86A2C8dc47D396305AAcd7F126E096b2eee4", + "0x45894c062e6f4e58b257e0826675355305dfef0d", ]; -export const DVM_FACTORY_ADDRESS = "0x7D381e6a9c23A0E6969658f6B8Eba57A4Dbf93a0"; -export const DPP_FACTORY_ADDRESS = "0xF5378974cfD5042A58c458E06cB6D2A2D1c2FAF8"; +export const DVM_FACTORY_ADDRESS = "0xbab9f4ff4a19a0e8eebc56b06750253228ffac6e"; +export const DPP_FACTORY_ADDRESS = "0xe55154d09265b18ac7cdac6e646672a5460389a1"; export const CLASSIC_FACTORY_ADDRESS = - "0xF9a6c9BE0a1149C69EF537359c78DeB5e6264ec6"; -export const CROWDPOOLING_FACTORY_V2: string[] = [ - "0xF9a6c9BE0a1149C69EF537359c78DeB5e6264ec6", -]; - -export const DVM_FACTORY_DEPLOY_BLOCK = 58; -export const DPP_FACTORY_DEPLOY_BLOCK = 58; + "0x357c5e9cfa8b834edcef7c7aabd8f9db09119d11"; //dodo zoo export const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; export const BASE_COIN = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; @@ -39,12 +35,15 @@ export const TRANSACTION_TYPE_CP_CLAIM = "CP_CLAIM"; /** * usd pricing */ -export const WRAPPED_BASE_COIN = "0x3a64Ec3606FF7310E8fAd6FcC008e39705fB496d"; +export const WRAPPED_BASE_COIN = "0x82af49447d8a07e3bd95bd0d56f35241523fbab1"; //pricing supported stable coins -export const STABLE_ONE_ADDRESS = "0xb95ed7e958e196688984951f41ac2888f4b10ab9"; //usdt -export const STABLE_TWO_ADDRESS = "0x46afe01d758a46d64c7d8e0791314d5db3e2e683"; //usdc +export const STABLE_ONE_ADDRESS = "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9"; //usdt +export const STABLE_TWO_ADDRESS = "0xff970a61a04b1ca14834a43f5de4533ebddb5cc8"; //usdc //stable coins pairs export const STABLE_COIN_PAIR_ONE = - "0xe8c1b7e0505c97c59ff2f12ebf91a8eaa59d4c73"; //[USDT_USDC_PAIR] + "0xe4b2dfc82977dd2dce7e8d37895a6a8f50cbb4fb"; //[USDT_USDC_PAIR] //base currency pair -export const BASE_COIN_PAIR = "0x75f5d66a7bbb9330a9067c0833ec9b3198b71666"; //[WETH_USDC_PAIR] +export const BASE_COIN_PAIR = "0xfe176a2b1e1f67250d2903b8d25f56c0dabcd6b2"; //[WETH_USDC_PAIR] +export const CROWDPOOLING_FACTORY_V2: string[] = [ + "0x9a8c0e8b27fff5d00402733ca67432b6d64faff4", +]; diff --git a/src/mappings/dodoex/helpers.ts b/src/mappings/dodoex/helpers.ts index 6c97e31..2c80075 100644 --- a/src/mappings/dodoex/helpers.ts +++ b/src/mappings/dodoex/helpers.ts @@ -603,7 +603,7 @@ export function getPMMState( if (pair != null && pair.type != TYPE_CLASSICAL_POOL) { let pool = DVM.bind(poolAddress); let pmmState = pool.try_getPMMState(); - if (pmmState.reverted == false) { + if (pmmState.reverted) { log.warning("getPMMState reverted: {}", [poolAddress.toHexString()]); } return pmmState.value as DVM__getPMMStateResultStateStruct; diff --git a/subgraphs/dodoex/dodoex_arbitrum.yaml b/subgraphs/dodoex/dodoex_arbitrum.yaml index 75de058..591feab 100644 --- a/subgraphs/dodoex/dodoex_arbitrum.yaml +++ b/subgraphs/dodoex/dodoex_arbitrum.yaml @@ -1,8 +1,10 @@ specVersion: 0.0.4 description: Dodoex.io # graft: -# base: QmVbEmYjNRU5zyRDq6WDCWLnq952vDVWaM8AmVtvxpMy4b -# block: 45989363 +# base: QmbhmHajvCeLUhwWsy7rcJZcCb7zWmHazYeor5Z3G5UjD6 +# block: 248209289 +features: + - grafting repository: https://github.com/DODOEX/dodoex_v2_subgraph schema: file: ./dodoex.graphql diff --git a/subgraphs/dodoex/dodoex_bsc.yaml b/subgraphs/dodoex/dodoex_bsc.yaml index bbc0cfc..2103d66 100644 --- a/subgraphs/dodoex/dodoex_bsc.yaml +++ b/subgraphs/dodoex/dodoex_bsc.yaml @@ -1,8 +1,8 @@ specVersion: 0.0.4 description: Dodoex.io # graft: -# base: QmUMiKv8gQVhZwrfSkhM24J5YoEau3KkK9xPGfY5PWeSza -# block: 41809388 +# base: QmdiudgxBoBikgSkqBktvLVAMhtoawNsY5oYXY3GY5REoq +# block: 42127304 features: - grafting repository: https://github.com/DODOEX/dodoex_v2_subgraph @@ -972,6 +972,16 @@ templates: handler: handleSellShares - event: Transfer(indexed address,indexed address,uint256) handler: handleTransfer + - event: IChange(uint256) + handler: handleIChange + - event: KChange(uint256) + handler: handleKChange + - event: LpFeeRateChange(uint256) + handler: handleLpFeeRateChange + - event: MtFeeRateChange(uint256) + handler: handleMtFeeRateChange + - event: RChange(uint8) + handler: handleRChange - kind: ethereum/contract name: CP network: bsc From 633bce56d50182f105f6ba9d50d76b221ca91cc2 Mon Sep 17 00:00:00 2001 From: yongjun Date: Wed, 11 Sep 2024 13:36:50 +0800 Subject: [PATCH 11/11] fix: function handleNewGSP not found error --- src/mappings/dodoex/helpers.ts | 3 +- src/mappings/dodoex/poolFactory.ts | 180 +++++++++++++------------- subgraphs/dodoex/dodoex_arbitrum.yaml | 6 +- 3 files changed, 95 insertions(+), 94 deletions(-) diff --git a/src/mappings/dodoex/helpers.ts b/src/mappings/dodoex/helpers.ts index 2c80075..9ddfb58 100644 --- a/src/mappings/dodoex/helpers.ts +++ b/src/mappings/dodoex/helpers.ts @@ -605,8 +605,9 @@ export function getPMMState( let pmmState = pool.try_getPMMState(); if (pmmState.reverted) { log.warning("getPMMState reverted: {}", [poolAddress.toHexString()]); + } else { + return pmmState.value as DVM__getPMMStateResultStateStruct; } - return pmmState.value as DVM__getPMMStateResultStateStruct; } return null; } diff --git a/src/mappings/dodoex/poolFactory.ts b/src/mappings/dodoex/poolFactory.ts index ef9f621..a265d31 100644 --- a/src/mappings/dodoex/poolFactory.ts +++ b/src/mappings/dodoex/poolFactory.ts @@ -34,7 +34,7 @@ import { import { NewDPP, RemoveDPP } from "../../types/dodoex/DPPFactory/DPPFactory"; import { NewDVM, RemoveDVM } from "../../types/dodoex/DVMFactory/DVMFactory"; import { NewDSP, RemoveDSP } from "../../types/dodoex/DSPFactory/DSPFactory"; -// import { NewGSP, RemoveGSP } from "../../types/dodoex/GSPFactory/GSPFactory"; +import { NewGSP, RemoveGSP } from "../../types/dodoex/GSPFactory/GSPFactory"; import { NewRegistry, RemoveRegistry, @@ -42,7 +42,7 @@ import { import { DVM } from "../../types/dodoex/DVMFactory/DVM"; import { DPP } from "../../types/dodoex/DPPFactory/DPP"; import { DSP } from "../../types/dodoex/DSPFactory/DSP"; -// import { GSP } from "../../types/dodoex/GSPFactory/GSP"; +import { GSP } from "../../types/dodoex/GSPFactory/GSP"; import { NewCP } from "../../types/dodoex/CrowdPoolingFactory/CrowdPoolingFactory"; import { RemoveCP } from "../../types/dodoex/CrowdPoolingFactoryV2/CrowdPoolingFactoryV2"; @@ -52,7 +52,7 @@ import { CP as CPTemplate, CPV2 as CPV2Template, DSP as DSPTemplate, - // GSP as GSPTemplate, + GSP as GSPTemplate, DPPOracleAdmin as DPPOracleAdminTemplate, } from "../../types/dodoex/templates"; import { @@ -333,90 +333,90 @@ export function handleNewDSP(event: NewDSP): void { DSPTemplate.create(event.params.DSP); } -// export function handleNewGSP(event: NewGSP): void { -// createUser(event.params.creator, event); -// //1、获取token schema信息 -// let baseToken = createToken(event.params.baseToken, event); -// let quoteToken = createToken(event.params.quoteToken, event); -// let pair = Pair.load(event.params.GSP.toHexString()); - -// if (pair == null) { -// pair = new Pair(event.params.GSP.toHexString()); -// pair.baseToken = event.params.baseToken.toHexString(); -// pair.type = TYPE_GSP_POOL; -// pair.quoteToken = event.params.quoteToken.toHexString(); -// pair.baseSymbol = baseToken.symbol; -// pair.quoteSymbol = quoteToken.symbol; -// pair.creator = event.params.creator; -// pair.owner = pair.creator; -// pair.createdAtTimestamp = event.block.timestamp; -// pair.createdAtBlockNumber = event.block.number; - -// pair.baseLpToken = event.params.GSP.toHexString(); -// pair.quoteLpToken = event.params.GSP.toHexString(); -// createLpToken(event.params.GSP, pair as Pair); - -// pair.lastTradePrice = ZERO_BD; -// pair.txCount = ZERO_BI; -// pair.volumeBaseToken = ZERO_BD; -// pair.volumeQuoteToken = ZERO_BD; -// pair.liquidityProviderCount = ZERO_BI; -// pair.untrackedBaseVolume = ZERO_BD; -// pair.untrackedQuoteVolume = ZERO_BD; -// pair.feeBase = ZERO_BD; -// pair.feeQuote = ZERO_BD; -// pair.traderCount = ZERO_BI; -// pair.isTradeAllowed = true; -// pair.isDepositBaseAllowed = true; -// pair.isDepositQuoteAllowed = true; -// pair.volumeUSD = ZERO_BD; -// pair.feeUSD = ZERO_BD; - -// let gsp = GSP.bind(event.params.GSP); -// let pmmState = gsp.try_getPMMState(); -// if (pmmState.reverted == false) { -// createPairDetail(pair, pmmState.value, event.block.timestamp); -// pair.i = pmmState.value.i; -// pair.k = pmmState.value.K; -// pair.baseReserve = convertTokenToDecimal( -// pmmState.value.B, -// baseToken.decimals -// ); -// pair.quoteReserve = convertTokenToDecimal( -// pmmState.value.Q, -// quoteToken.decimals -// ); -// pair.lpFeeRate = convertTokenToDecimal( -// gsp._LP_FEE_RATE_(), -// BigInt.fromI32(18) -// ); -// pair.mtFeeRateModel = gsp._MT_FEE_RATE_MODEL_(); -// pair.maintainer = gsp._MAINTAINER_(); -// } else { -// pair.i = ZERO_BI; -// pair.k = ZERO_BI; -// pair.baseReserve = ZERO_BD; -// pair.quoteReserve = ZERO_BD; -// pair.lpFeeRate = ZERO_BD; -// pair.mtFeeRateModel = Address.fromString(ADDRESS_ZERO); -// pair.maintainer = Address.fromString(ADDRESS_ZERO); -// } -// pair.mtFeeRate = ZERO_BI; -// pair.mtFeeBase = ZERO_BD; -// pair.mtFeeQuote = ZERO_BD; -// pair.mtFeeUSD = ZERO_BD; -// pair.updatedAt = event.block.timestamp; - -// pair.save(); - -// let dodoZoo = getDODOZoo(); -// dodoZoo.pairCount = dodoZoo.pairCount.plus(ONE_BI); -// dodoZoo.updatedAt = event.block.timestamp; -// dodoZoo.save(); -// } - -// GSPTemplate.create(event.params.GSP); -// } +export function handleNewGSP(event: NewGSP): void { + createUser(event.params.creator, event); + //1、获取token schema信息 + let baseToken = createToken(event.params.baseToken, event); + let quoteToken = createToken(event.params.quoteToken, event); + let pair = Pair.load(event.params.GSP.toHexString()); + + if (pair == null) { + pair = new Pair(event.params.GSP.toHexString()); + pair.baseToken = event.params.baseToken.toHexString(); + pair.type = TYPE_GSP_POOL; + pair.quoteToken = event.params.quoteToken.toHexString(); + pair.baseSymbol = baseToken.symbol; + pair.quoteSymbol = quoteToken.symbol; + pair.creator = event.params.creator; + pair.owner = pair.creator; + pair.createdAtTimestamp = event.block.timestamp; + pair.createdAtBlockNumber = event.block.number; + + pair.baseLpToken = event.params.GSP.toHexString(); + pair.quoteLpToken = event.params.GSP.toHexString(); + createLpToken(event.params.GSP, pair as Pair); + + pair.lastTradePrice = ZERO_BD; + pair.txCount = ZERO_BI; + pair.volumeBaseToken = ZERO_BD; + pair.volumeQuoteToken = ZERO_BD; + pair.liquidityProviderCount = ZERO_BI; + pair.untrackedBaseVolume = ZERO_BD; + pair.untrackedQuoteVolume = ZERO_BD; + pair.feeBase = ZERO_BD; + pair.feeQuote = ZERO_BD; + pair.traderCount = ZERO_BI; + pair.isTradeAllowed = true; + pair.isDepositBaseAllowed = true; + pair.isDepositQuoteAllowed = true; + pair.volumeUSD = ZERO_BD; + pair.feeUSD = ZERO_BD; + + let gsp = GSP.bind(event.params.GSP); + let pmmState = gsp.try_getPMMState(); + if (pmmState.reverted == false) { + createPairDetail(pair, pmmState.value, event.block.timestamp); + pair.i = pmmState.value.i; + pair.k = pmmState.value.K; + pair.baseReserve = convertTokenToDecimal( + pmmState.value.B, + baseToken.decimals + ); + pair.quoteReserve = convertTokenToDecimal( + pmmState.value.Q, + quoteToken.decimals + ); + pair.lpFeeRate = convertTokenToDecimal( + gsp._LP_FEE_RATE_(), + BigInt.fromI32(18) + ); + pair.mtFeeRateModel = gsp._MT_FEE_RATE_MODEL_(); + pair.maintainer = gsp._MAINTAINER_(); + } else { + pair.i = ZERO_BI; + pair.k = ZERO_BI; + pair.baseReserve = ZERO_BD; + pair.quoteReserve = ZERO_BD; + pair.lpFeeRate = ZERO_BD; + pair.mtFeeRateModel = Address.fromString(ADDRESS_ZERO); + pair.maintainer = Address.fromString(ADDRESS_ZERO); + } + pair.mtFeeRate = ZERO_BI; + pair.mtFeeBase = ZERO_BD; + pair.mtFeeQuote = ZERO_BD; + pair.mtFeeUSD = ZERO_BD; + pair.updatedAt = event.block.timestamp; + + pair.save(); + + let dodoZoo = getDODOZoo(); + dodoZoo.pairCount = dodoZoo.pairCount.plus(ONE_BI); + dodoZoo.updatedAt = event.block.timestamp; + dodoZoo.save(); + } + + GSPTemplate.create(event.params.GSP); +} export function handleNewCP(event: NewCP): void { createUser(event.params.creator, event); @@ -585,9 +585,9 @@ export function handleRemoveDSP(event: RemoveDSP): void { store.remove("Pair", event.params.DSP.toHexString()); } -// export function handleRemoveGSP(event: RemoveGSP): void { -// store.remove("Pair", event.params.GSP.toHexString()); -// } +export function handleRemoveGSP(event: RemoveGSP): void { + store.remove("Pair", event.params.GSP.toHexString()); +} export function handleRemoveRegistry(event: RemoveRegistry): void { store.remove("Pair", event.params.fragment.toHexString()); diff --git a/subgraphs/dodoex/dodoex_arbitrum.yaml b/subgraphs/dodoex/dodoex_arbitrum.yaml index 591feab..ff0763d 100644 --- a/subgraphs/dodoex/dodoex_arbitrum.yaml +++ b/subgraphs/dodoex/dodoex_arbitrum.yaml @@ -1,8 +1,8 @@ specVersion: 0.0.4 description: Dodoex.io -# graft: -# base: QmbhmHajvCeLUhwWsy7rcJZcCb7zWmHazYeor5Z3G5UjD6 -# block: 248209289 +graft: + base: QmPMLJWfXJN9Juyj5h14NKJh9qvteiNs6PMTocqfHocWJk + block: 252253560 features: - grafting repository: https://github.com/DODOEX/dodoex_v2_subgraph