Fix #628 & #629 & #621: Store event log index for all records (#630)

* Store eventIndex.

* Changed in veDelegation. Removed import of String.

* linter.

* Removed tx hash.

* Revert some tweaks.

* added logIndex.

* converted to big int.

* 0 -> BigInt.zero().

* Added eventIndex to template and OPC.

* updated tweak

* updated tweak2

* Added eventIndex in tests.

* revert.

* Added eventIndex for TokenCreated and NFTCreated events. Increase time sleep for graphql request.

* Changed position of eventIndex in entity.

* Added eventIndex for order events and for dt events. Added new test commands in package.json.

* Added eventIndex for NFT Update events.

* Added eventIndex for dispenser.

* Modified dispenser tests.

* Reverted sleep secs. Updated tests.

* Updated dispenser tests. Added eventIndex for FRE.

* Added eventIndex in df rewards.

* Updated Ve with eventIndex.

* Updating order id with event index.

* Updated @ocean/lib with multichain version.

* Updated to number type.

* Updated tests for order.

* some changes.

* Fix dt tests. Added logs for provider fee. Need fix for Simple publish and consume tests.

* Problem raised by retrieving order event index in provider fee event handler.

* Added function for searching the right order.

* Debug order with provider fee.

* Removed console logs.

* Added debug logs.

* Hardcoded eventIndex just for testing.

* Paste logs from graph node.

* added extra sleep in test.

* fixed command.

* Added comments. Modified util function for Order Reuse.

* Added more logs and other tweaks.

* fixed command for docker logs.

* Added more logs.

* Converted to lowercase.

* Removed condition just for test.

* Added more logs. Order is not null.

* Call getOrder.

* Added verification back.

* converted to hex and add toString.

* Pass toString as param.

* Added ethereumjs util.

* replaced with ==.

* Refactored logic.

* Print event index.

* added more logs of event index.

* Modified tweaks and asserts.

* Added log for reuse order.

* updates.

* Reverted changes.

* Added check for eventIndex == 0.

* Enhanced the code. Replaced while with for.

* Added more logs for reuse test.

* added another condition.

* Added logs in tests. Removed redundant condition.

* Added more logs to test.

* Fixed typo.

* still debugging

* Refactored code.

* Getting closer.

* Fix tests for orders part. Removed logs.

* Removed more logs.

* Fix DT tests related to order.

* Implemented Publishing Market Fee event handler. Added test.

* Added consume market fee handler. Test consume market fee handler.

* Fixed tests for fees. Added TODOs.

* Generated ID with eventIndex in ficed rate. Added assert errors messages.

* Added FRE tests to workflow.

* Generated dispenser transaction with event index.

* Fixed dispenser tests.

* Add event index for NftUpdate entity ID.

* Changed IDs for VeDelegation and VeAllocationUpdate.

* Added full test suite to workflow.

* Fixed nft transfer ID.

* print blocks.

* test just dt and ending test to see the last block.

* Added df test.

* Added dispenser test.

* Added FRE test.

* Added NFT test.

* Added simple publish consume test.

* Added simple subgraph test.

* Added users test.

* Added ve test.

* Increased sleep time.

* commented delegation test.

* respect lint

* Fixed ending tests. Removed commented code. Brought back test suite.

* Print values from failing tests. Updated mappings.

* Rollback changes in veDelegation and veUtils. Added more prints for debug in tests.

* Removed veDelegation creation record.

* Rollback to the approach for veDelegation like it is in main.

* Removed prints. Match changes with main.

* Removed -1 from last block.

* Added prints for eventIndex. Fixed some suggestions.

* Fixed veDelegation.

* Removed prints.
This commit is contained in:
Maria Carmina 2023-05-13 15:00:52 +03:00 committed by GitHub
parent c42cd1c283
commit e1df119197
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 647 additions and 170 deletions

View File

@ -74,3 +74,6 @@ jobs:
env: env:
ADDRESS_FILE: /home/runner/.ocean/ocean-contracts/artifacts/address.json ADDRESS_FILE: /home/runner/.ocean/ocean-contracts/artifacts/address.json
BARGE_FOLDER: /home/runner/.ocean/ BARGE_FOLDER: /home/runner/.ocean/
- name: docker logs
run: docker logs ocean_graph-node_1
if: ${{ failure() }}

3
package-lock.json generated
View File

@ -11,7 +11,8 @@
"dependencies": { "dependencies": {
"@oceanprotocol/contracts": "^1.1.12", "@oceanprotocol/contracts": "^1.1.12",
"@oceanprotocol/lib": "^2.7.0", "@oceanprotocol/lib": "^2.7.0",
"cross-fetch": "^3.1.4" "cross-fetch": "^3.1.4",
"ethereumjs-util": "^7.1.5"
}, },
"devDependencies": { "devDependencies": {
"@graphprotocol/graph-cli": "^0.38.0", "@graphprotocol/graph-cli": "^0.38.0",

View File

@ -33,6 +33,8 @@
"test-df": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/DFRewards.test.ts'", "test-df": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/DFRewards.test.ts'",
"test-dt": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/Datatoken.test.ts'", "test-dt": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/Datatoken.test.ts'",
"test-zend": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/ZEnding.test.ts'", "test-zend": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/ZEnding.test.ts'",
"test-publish-consume": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/SimplePublishConsume.test.ts'",
"test-nft": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/Nft.test.ts'",
"lint": "eslint --ignore-path .gitignore --ext .js --ext .ts --ext .tsx .", "lint": "eslint --ignore-path .gitignore --ext .js --ext .ts --ext .tsx .",
"lint:fix": "eslint --ignore-path .gitignore --ext .js,.ts,.tsx . --fix", "lint:fix": "eslint --ignore-path .gitignore --ext .js,.ts,.tsx . --fix",
"format": "prettier --ignore-path .gitignore './**/*.{css,yml,js,ts,tsx,json,yaml}' --write", "format": "prettier --ignore-path .gitignore './**/*.{css,yml,js,ts,tsx,json,yaml}' --write",
@ -72,7 +74,8 @@
"dependencies": { "dependencies": {
"@oceanprotocol/contracts": "^1.1.12", "@oceanprotocol/contracts": "^1.1.12",
"@oceanprotocol/lib": "^2.7.0", "@oceanprotocol/lib": "^2.7.0",
"cross-fetch": "^3.1.4" "cross-fetch": "^3.1.4",
"ethereumjs-util": "^7.1.5"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

View File

@ -52,7 +52,7 @@ type Token @entity {
"datatoken creation transaction id" "datatoken creation transaction id"
tx: String! tx: String!
eventIndex: Int!
"block number when it was created" "block number when it was created"
block: Int! block: Int!
@ -105,6 +105,7 @@ type Nft @entity{
createdTimestamp: Int! createdTimestamp: Int!
"nft creation transaction id" "nft creation transaction id"
tx: String! tx: String!
eventIndex: Int!
"block number when it was created" "block number when it was created"
block: Int block: Int
@ -132,6 +133,7 @@ type OrderReuse @entity {
caller: String! caller: String!
createdTimestamp: Int! createdTimestamp: Int!
tx: String! tx: String!
eventIndex: Int!
block: Int! block: Int!
providerFee: String providerFee: String
providerFeeValidUntil: BigInt providerFeeValidUntil: BigInt
@ -141,7 +143,7 @@ type OrderReuse @entity {
} }
type Order @entity { type Order @entity {
"transaction hash - token address - from address" "transaction hash - token address - from address - eventIndex"
id: ID! id: ID!
datatoken: Token! datatoken: Token!
@ -167,6 +169,7 @@ type Order @entity {
createdTimestamp: Int! createdTimestamp: Int!
tx: String! tx: String!
eventIndex: Int!
block: Int! block: Int!
lastPriceToken: Token lastPriceToken: Token
@ -220,6 +223,7 @@ type FixedRateExchange @entity {
createdTimestamp: Int! createdTimestamp: Int!
tx: String! tx: String!
eventIndex: Int!
block: Int! block: Int!
"address of the market where the datatoken was created. This address collects market fees." "address of the market where the datatoken was created. This address collects market fees."
@ -246,6 +250,7 @@ type FixedRateExchangeUpdate @entity {
block: Int! block: Int!
createdTimestamp: Int! createdTimestamp: Int!
tx: String! tx: String!
eventIndex: Int!
} }
type FixedRateExchangeSwap @entity { type FixedRateExchangeSwap @entity {
@ -257,6 +262,7 @@ type FixedRateExchangeSwap @entity {
block: Int! block: Int!
createdTimestamp: Int! createdTimestamp: Int!
tx: String! tx: String!
eventIndex: Int!
oceanFeeAmount: BigDecimal! oceanFeeAmount: BigDecimal!
marketFeeAmount: BigDecimal! marketFeeAmount: BigDecimal!
consumeMarketFeeAmount: BigDecimal! consumeMarketFeeAmount: BigDecimal!
@ -285,6 +291,7 @@ type Dispenser @entity {
block: Int! block: Int!
createdTimestamp: Int! createdTimestamp: Int!
tx: String! tx: String!
eventIndex: Int!
dispenses: [DispenserTransaction!] @derivedFrom(field: "dispenser") dispenses: [DispenserTransaction!] @derivedFrom(field: "dispenser")
} }
@ -298,6 +305,7 @@ type DispenserTransaction @entity {
block: Int! block: Int!
createdTimestamp: Int! createdTimestamp: Int!
tx: String! tx: String!
eventIndex: Int!
} }
"utility type" "utility type"
@ -385,6 +393,7 @@ type NftUpdate @entity {
block: Int! block: Int!
timestamp: Int! timestamp: Int!
tx: String! tx: String!
eventIndex: Int!
} }
type Template @entity{ type Template @entity{
@ -406,6 +415,7 @@ type VeAllocateUser @entity{
firstContact: Int! firstContact: Int!
lastContact: Int! lastContact: Int!
tx: String! tx: String!
eventIndex: Int!
veOcean: VeOCEAN! veOcean: VeOCEAN!
} }
@ -422,6 +432,7 @@ type VeAllocateId @entity{
firstContact: Int! firstContact: Int!
lastContact: Int! lastContact: Int!
tx: String! tx: String!
eventIndex: Int!
} }
# we need to track allocation of user to id # we need to track allocation of user to id
@ -441,6 +452,7 @@ type VeAllocation @entity {
firstContact: Int! firstContact: Int!
lastContact: Int! lastContact: Int!
tx: String! tx: String!
eventIndex: Int!
} }
enum veAllocationUpdateType { enum veAllocationUpdateType {
@ -449,7 +461,7 @@ enum veAllocationUpdateType {
} }
type VeAllocationUpdate @entity { type VeAllocationUpdate @entity {
"{tx}-{VeAllocation id}" "{tx}-{VeAllocation id}-{eventIndex}"
id: ID! id: ID!
veAllocation: VeAllocation! veAllocation: VeAllocation!
@ -459,6 +471,7 @@ type VeAllocationUpdate @entity {
block: Int! block: Int!
timestamp: Int! timestamp: Int!
tx: String! tx: String!
eventIndex: Int!
} }
type VeDelegation @entity { type VeDelegation @entity {
@ -480,6 +493,7 @@ type VeDelegationUpdate @entity {
block: Int! block: Int!
timestamp: Int! timestamp: Int!
tx: String! tx: String!
eventIndex: Int!
sender: String! sender: String!
amount: BigDecimal! amount: BigDecimal!
cancelTime: BigInt! cancelTime: BigInt!
@ -521,6 +535,7 @@ type VeDeposit @entity {
timestamp: BigInt! timestamp: BigInt!
block: Int! block: Int!
tx: String! tx: String!
eventIndex: Int!
veOcean: VeOCEAN! veOcean: VeOCEAN!
totalOceanLocked:BigDecimal! totalOceanLocked:BigDecimal!
} }
@ -546,6 +561,7 @@ type VeFeeDistributorCheckPoint @entity {
timestamp: BigInt! timestamp: BigInt!
block: Int! block: Int!
tx: String! tx: String!
eventIndex: Int!
} }
type VeClaim @entity { type VeClaim @entity {
@ -560,6 +576,7 @@ type VeClaim @entity {
timestamp: BigInt! timestamp: BigInt!
block: Int! block: Int!
tx: String! tx: String!
eventIndex: Int!
veOcean: VeOCEAN! veOcean: VeOCEAN!
VeFeeDistributor: VeFeeDistributor! VeFeeDistributor: VeFeeDistributor!
} }
@ -588,6 +605,7 @@ type DFHistory @entity {
timestamp: BigInt! timestamp: BigInt!
block: Int! block: Int!
tx: String! tx: String!
eventIndex: Int!
} }
@ -606,6 +624,7 @@ type NftTransferHistory @entity {
oldOwner: User! oldOwner: User!
newOwner: User! newOwner: User!
txId: String txId: String
eventIndex: Int!
timestamp: Int! timestamp: Int!
block: Int! block: Int!
} }

View File

@ -26,6 +26,7 @@ export function handleAllocated(event: Allocated): void {
history.type = 'Allocated' history.type = 'Allocated'
history.timestamp = event.block.timestamp history.timestamp = event.block.timestamp
history.tx = event.transaction.hash.toHex() history.tx = event.transaction.hash.toHex()
history.eventIndex = event.logIndex.toI32()
history.block = event.block.number.toI32() history.block = event.block.number.toI32()
history.save() history.save()
@ -55,6 +56,7 @@ export function handleClaimed(event: Claimed): void {
history.type = 'Claimed' history.type = 'Claimed'
history.timestamp = event.block.timestamp history.timestamp = event.block.timestamp
history.tx = event.transaction.hash.toHex() history.tx = event.transaction.hash.toHex()
history.eventIndex = event.logIndex.toI32()
history.block = event.block.number.toI32() history.block = event.block.number.toI32()
history.save() history.save()

View File

@ -43,6 +43,7 @@ export function handleNewDispenser(event: DispenserCreated): void {
dispenser.allowedSwapper = event.params.allowedSwapper.toHex() dispenser.allowedSwapper = event.params.allowedSwapper.toHex()
dispenser.createdTimestamp = event.block.timestamp.toI32() dispenser.createdTimestamp = event.block.timestamp.toI32()
dispenser.tx = event.transaction.hash.toHex() dispenser.tx = event.transaction.hash.toHex()
dispenser.eventIndex = event.logIndex.toI32()
dispenser.block = event.block.number.toI32() dispenser.block = event.block.number.toI32()
dispenser.save() dispenser.save()
@ -57,6 +58,7 @@ export function handleActivate(event: DispenserActivated): void {
) )
const dispenser = getDispenser(dispenserID) const dispenser = getDispenser(dispenserID)
dispenser.active = true dispenser.active = true
dispenser.eventIndex = event.logIndex.toI32()
dispenser.save() dispenser.save()
} }
@ -67,6 +69,7 @@ export function handleDeactivate(event: DispenserDeactivated): void {
) )
const dispenser = getDispenser(dispenserID) const dispenser = getDispenser(dispenserID)
dispenser.active = false dispenser.active = false
dispenser.eventIndex = event.logIndex.toI32()
dispenser.save() dispenser.save()
} }
@ -76,6 +79,7 @@ export function handleAllowedSwapperChanged(
const dispenserID = getDispenserGraphID(event.address, event.params.datatoken) const dispenserID = getDispenserGraphID(event.address, event.params.datatoken)
const dispenser = getDispenser(dispenserID) const dispenser = getDispenser(dispenserID)
dispenser.allowedSwapper = event.params.newAllowedSwapper.toHex() dispenser.allowedSwapper = event.params.newAllowedSwapper.toHex()
dispenser.eventIndex = event.logIndex.toI32()
dispenser.save() dispenser.save()
} }
@ -84,10 +88,8 @@ export function handleTokensDispensed(event: TokensDispensed): void {
event.address, event.address,
event.params.datatokenAddress event.params.datatokenAddress
) )
const id = event.transaction.hash const eventIndex: number = event.logIndex.toI32()
.toHexString() const id = `${event.transaction.hash.toHexString()}-${dispenserID}-${eventIndex}`
.concat('-')
.concat(dispenserID)
const dispenserTransaction = new DispenserTransaction(id) const dispenserTransaction = new DispenserTransaction(id)
const dispenser = getDispenser(dispenserID) const dispenser = getDispenser(dispenserID)
@ -98,6 +100,7 @@ export function handleTokensDispensed(event: TokensDispensed): void {
dispenserTransaction.createdTimestamp = event.block.timestamp.toI32() dispenserTransaction.createdTimestamp = event.block.timestamp.toI32()
dispenserTransaction.tx = event.transaction.hash.toHex() dispenserTransaction.tx = event.transaction.hash.toHex()
dispenserTransaction.eventIndex = event.logIndex.toI32()
dispenserTransaction.block = event.block.number.toI32() dispenserTransaction.block = event.block.number.toI32()
const token = getToken(event.params.datatokenAddress, true) const token = getToken(event.params.datatokenAddress, true)
dispenserTransaction.amount = weiToDecimal( dispenserTransaction.amount = weiToDecimal(
@ -111,5 +114,6 @@ export function handleOwnerWinthdraw(event: OwnerWithdrawed): void {
const dispenserID = getDispenserGraphID(event.address, event.params.datatoken) const dispenserID = getDispenserGraphID(event.address, event.params.datatoken)
const dispenser = getDispenser(dispenserID) const dispenser = getDispenser(dispenserID)
dispenser.balance = decimal.ZERO dispenser.balance = decimal.ZERO
dispenser.eventIndex = event.logIndex.toI32()
dispenser.save() dispenser.save()
} }

View File

@ -1,11 +1,12 @@
import { Order, Nft, OrderReuse } from '../@types/schema' import { Order, Nft, OrderReuse } from '../@types/schema'
import { BigInt, BigDecimal, Address } from '@graphprotocol/graph-ts' import { BigInt, BigDecimal, Address, log } from '@graphprotocol/graph-ts'
import { import {
NewPaymentCollector, NewPaymentCollector,
OrderStarted, OrderStarted,
PublishMarketFee, PublishMarketFee,
PublishMarketFeeChanged, PublishMarketFeeChanged,
ConsumeMarketFee,
AddedMinter, AddedMinter,
AddedPaymentManager, AddedPaymentManager,
RemovedMinter, RemovedMinter,
@ -20,14 +21,19 @@ import { weiToDecimal } from './utils/generic'
import { addOrder } from './utils/globalUtils' import { addOrder } from './utils/globalUtils'
import { getToken, getUSDValue } from './utils/tokenUtils' import { getToken, getUSDValue } from './utils/tokenUtils'
import { getUser } from './utils/userUtils' import { getUser } from './utils/userUtils'
import { getOrderId } from './utils/orderUtils' import {
getOrderId,
searchOrderForEvent,
searchOrderReusedForEvent
} from './utils/orderUtils'
export function handleOrderStarted(event: OrderStarted): void { export function handleOrderStarted(event: OrderStarted): void {
const order = new Order( const order = new Order(
getOrderId( getOrderId(
event.transaction.hash.toHex(), event.transaction.hash.toHex(),
event.address.toHex(), event.address.toHex(),
event.transaction.from.toHex() event.transaction.from.toHex(),
event.logIndex.toI32()
) )
) )
@ -59,11 +65,9 @@ export function handleOrderStarted(event: OrderStarted): void {
const publishMarket = getUser(event.params.publishMarketAddress.toHex()) const publishMarket = getUser(event.params.publishMarketAddress.toHex())
order.publishingMarket = publishMarket.id order.publishingMarket = publishMarket.id
// const consumeMarket = getUser(event.params..toHex())
// order.consumerMarket = consumeMarket.id
order.createdTimestamp = event.block.timestamp.toI32() order.createdTimestamp = event.block.timestamp.toI32()
order.tx = event.transaction.hash.toHex() order.tx = event.transaction.hash.toHex()
order.eventIndex = event.logIndex.toI32()
order.block = event.block.number.toI32() order.block = event.block.number.toI32()
const tokenId = token.lastPriceToken const tokenId = token.lastPriceToken
if (tokenId) { if (tokenId) {
@ -103,32 +107,56 @@ export function handleOrderStarted(event: OrderStarted): void {
} }
export function handlerOrderReused(event: OrderReused): void { export function handlerOrderReused(event: OrderReused): void {
const orderId = getOrderId( const order = searchOrderForEvent(
event.params.orderTxId.toHexString(), event.params.orderTxId.toHexString(),
event.address.toHex(), event.address.toHex(),
event.params.caller.toHex() event.params.caller.toHex(),
event.logIndex.toI32()
) )
const order = Order.load(orderId)
if (!order) return if (!order) return
const eventIndex: number = event.logIndex.toI32()
const reuseOrder = new OrderReuse(event.transaction.hash.toHex()) const reuseOrder = new OrderReuse(
`${event.transaction.hash.toHex()}-${eventIndex}`
)
if (event.transaction.gasPrice) if (event.transaction.gasPrice)
reuseOrder.gasPrice = event.transaction.gasPrice reuseOrder.gasPrice = event.transaction.gasPrice
else reuseOrder.gasPrice = BigInt.zero() else reuseOrder.gasPrice = BigInt.zero()
if (event.receipt !== null && event.receipt!.gasUsed) { if (event.receipt !== null && event.receipt!.gasUsed) {
reuseOrder.gasUsed = event.receipt!.gasUsed.toBigDecimal() reuseOrder.gasUsed = event.receipt!.gasUsed.toBigDecimal()
} else reuseOrder.gasUsed = BigDecimal.zero() } else reuseOrder.gasUsed = BigDecimal.zero()
reuseOrder.order = orderId reuseOrder.order = order.id
reuseOrder.caller = event.params.caller.toHexString() reuseOrder.caller = event.params.caller.toHexString()
reuseOrder.createdTimestamp = event.params.timestamp.toI32() reuseOrder.createdTimestamp = event.params.timestamp.toI32()
reuseOrder.tx = event.transaction.hash.toHex() reuseOrder.tx = event.transaction.hash.toHex()
reuseOrder.eventIndex = event.logIndex.toI32()
reuseOrder.block = event.params.number.toI32() reuseOrder.block = event.params.number.toI32()
reuseOrder.save() reuseOrder.save()
} }
export function handlePublishMarketFee(event: PublishMarketFee): void {} export function handlePublishMarketFee(event: PublishMarketFee): void {
const order = searchOrderForEvent(
event.transaction.hash.toHex(),
event.address.toHex(),
event.transaction.from.toHex(),
event.logIndex.toI32()
)
if (!order) return
const publishMarket = getUser(event.params.PublishMarketFeeAddress.toHex())
order.publishingMarket = publishMarket.id
const publishMarketToken = getToken(event.params.PublishMarketFeeToken, true)
order.publishingMarketToken = publishMarketToken.id
order.publishingMarketAmmount = weiToDecimal(
event.params.PublishMarketFeeAmount.toBigDecimal(),
publishMarketToken.decimals
)
order.save()
}
export function handlePublishMarketFeeChanged( export function handlePublishMarketFeeChanged(
event: PublishMarketFeeChanged event: PublishMarketFeeChanged
): void { ): void {
@ -149,10 +177,33 @@ export function handlePublishMarketFeeChanged(
event.params.PublishMarketFeeAmount.toBigDecimal(), event.params.PublishMarketFeeAmount.toBigDecimal(),
decimals decimals
) )
token.eventIndex = event.logIndex.toI32()
token.save() token.save()
// TODO - shold we have a history // TODO - shold we have a history
} }
export function handleConsumeMarketFee(event: ConsumeMarketFee): void {
const order = searchOrderForEvent(
event.transaction.hash.toHex(),
event.address.toHex(),
event.transaction.from.toHex(),
event.logIndex.toI32()
)
if (!order) return
const consumeMarket = getUser(event.params.consumeMarketFeeAddress.toHex())
order.consumerMarket = consumeMarket.id
const consumeMarketToken = getToken(event.params.consumeMarketFeeToken, false)
order.consumerMarketToken = consumeMarketToken.id
order.consumerMarketAmmount = weiToDecimal(
event.params.consumeMarketFeeAmount.toBigDecimal(),
consumeMarketToken.decimals
)
order.save()
}
// roles // roles
// roles // roles
export function handleAddedMinter(event: AddedMinter): void { export function handleAddedMinter(event: AddedMinter): void {
@ -163,6 +214,7 @@ export function handleAddedMinter(event: AddedMinter): void {
if (!existingRoles.includes(event.params.user.toHexString())) if (!existingRoles.includes(event.params.user.toHexString()))
existingRoles.push(event.params.user.toHexString()) existingRoles.push(event.params.user.toHexString())
token.minter = existingRoles token.minter = existingRoles
token.eventIndex = event.logIndex.toI32()
token.save() token.save()
} }
@ -179,6 +231,7 @@ export function handleRemovedMinter(event: RemovedMinter): void {
if (role !== event.params.user.toHexString()) newList.push(role) if (role !== event.params.user.toHexString()) newList.push(role)
} }
token.minter = newList token.minter = newList
token.eventIndex = event.logIndex.toI32()
token.save() token.save()
} }
@ -190,6 +243,7 @@ export function handleAddedPaymentManager(event: AddedPaymentManager): void {
if (!existingRoles.includes(event.params.user.toHexString())) if (!existingRoles.includes(event.params.user.toHexString()))
existingRoles.push(event.params.user.toHexString()) existingRoles.push(event.params.user.toHexString())
token.paymentManager = existingRoles token.paymentManager = existingRoles
token.eventIndex = event.logIndex.toI32()
token.save() token.save()
} }
export function handleRemovedPaymentManager( export function handleRemovedPaymentManager(
@ -207,6 +261,7 @@ export function handleRemovedPaymentManager(
if (role !== event.params.user.toHexString()) newList.push(role) if (role !== event.params.user.toHexString()) newList.push(role)
} }
token.paymentManager = newList token.paymentManager = newList
token.eventIndex = event.logIndex.toI32()
token.save() token.save()
} }
export function handleCleanedPermissions(event: CleanedPermissions): void { export function handleCleanedPermissions(event: CleanedPermissions): void {
@ -217,12 +272,14 @@ export function handleCleanedPermissions(event: CleanedPermissions): void {
const nft = Nft.load(token.nft as string) const nft = Nft.load(token.nft as string)
if (nft) token.paymentCollector = nft.owner if (nft) token.paymentCollector = nft.owner
else token.paymentCollector = '0x0000000000000000000000000000000000000000' else token.paymentCollector = '0x0000000000000000000000000000000000000000'
token.eventIndex = event.logIndex.toI32()
token.save() token.save()
} }
export function handleNewPaymentCollector(event: NewPaymentCollector): void { export function handleNewPaymentCollector(event: NewPaymentCollector): void {
const token = getToken(event.address, true) const token = getToken(event.address, true)
token.paymentCollector = event.params._newPaymentCollector.toHexString() token.paymentCollector = event.params._newPaymentCollector.toHexString()
token.eventIndex = event.logIndex.toI32()
token.save() token.save()
} }
@ -235,12 +292,12 @@ export function handleProviderFee(event: ProviderFee): void {
event.params.validUntil event.params.validUntil
}"}` }"}`
const orderId = getOrderId( const order = searchOrderForEvent(
event.transaction.hash.toHex(), event.transaction.hash.toHex(),
event.address.toHex(), event.address.toHex(),
event.transaction.from.toHex() event.transaction.from.toHex(),
event.logIndex.toI32()
) )
const order = Order.load(orderId)
if (order) { if (order) {
order.providerFee = providerFee order.providerFee = providerFee
@ -248,27 +305,15 @@ export function handleProviderFee(event: ProviderFee): void {
order.save() order.save()
return return
} }
const orderReuse = searchOrderReusedForEvent(
let orderReuse = OrderReuse.load(event.transaction.hash.toHex()) event.transaction.hash.toHex(),
event.address.toHex(),
event.logIndex.toI32()
)
if (orderReuse) { if (orderReuse) {
log.info('order reuse id in provider fee handler: {}', [orderReuse.id])
orderReuse.providerFee = providerFee orderReuse.providerFee = providerFee
orderReuse.providerFeeValidUntil = event.params.validUntil orderReuse.providerFeeValidUntil = event.params.validUntil
orderReuse.save() orderReuse.save()
} else {
orderReuse = new OrderReuse(event.transaction.hash.toHex())
orderReuse.providerFee = providerFee
orderReuse.providerFeeValidUntil = event.params.validUntil
orderReuse.order = orderId
orderReuse.createdTimestamp = event.block.timestamp.toI32()
orderReuse.tx = event.transaction.hash.toHex()
orderReuse.block = event.block.number.toI32()
orderReuse.caller = event.transaction.from.toHex()
if (event.transaction.gasPrice)
orderReuse.gasPrice = event.transaction.gasPrice
else orderReuse.gasPrice = BigInt.zero()
if (event.receipt !== null && event.receipt!.gasUsed) {
orderReuse.gasUsed = event.receipt!.gasUsed.toBigDecimal()
} else orderReuse.gasUsed = BigDecimal.zero()
orderReuse.save()
} }
} }

View File

@ -25,6 +25,7 @@ export function handleNftCreated(event: NFTCreated): void {
nft.createdTimestamp = event.block.timestamp.toI32() nft.createdTimestamp = event.block.timestamp.toI32()
nft.tx = event.transaction.hash.toHex() nft.tx = event.transaction.hash.toHex()
nft.block = event.block.number.toI32() nft.block = event.block.number.toI32()
nft.eventIndex = event.logIndex.toI32()
nft.transferable = event.params.transferable nft.transferable = event.params.transferable
nft.save() nft.save()
@ -39,6 +40,7 @@ export function handleNewToken(event: TokenCreated): void {
token.createdTimestamp = event.block.timestamp.toI32() token.createdTimestamp = event.block.timestamp.toI32()
token.tx = event.transaction.hash.toHex() token.tx = event.transaction.hash.toHex()
token.block = event.block.number.toI32() token.block = event.block.number.toI32()
token.eventIndex = event.logIndex.toI32()
token.nft = event.params.creator.toHexString() token.nft = event.params.creator.toHexString()

View File

@ -50,6 +50,7 @@ export function handleExchangeCreated(event: ExchangeCreated): void {
) )
fixedRateExchange.createdTimestamp = event.block.timestamp.toI32() fixedRateExchange.createdTimestamp = event.block.timestamp.toI32()
fixedRateExchange.tx = event.transaction.hash.toHex() fixedRateExchange.tx = event.transaction.hash.toHex()
fixedRateExchange.eventIndex = event.logIndex.toI32()
fixedRateExchange.block = event.block.number.toI32() fixedRateExchange.block = event.block.number.toI32()
fixedRateExchange.save() fixedRateExchange.save()
@ -63,12 +64,14 @@ export function handleRateChange(event: ExchangeRateChanged): void {
event.address event.address
) )
const fixedRateExchange = getFixedRateExchange(fixedRateId) const fixedRateExchange = getFixedRateExchange(fixedRateId)
const eventIndex: number = event.logIndex.toI32()
const newExchangeUpdate = new FixedRateExchangeUpdate( const newExchangeUpdate = new FixedRateExchangeUpdate(
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId) getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId, eventIndex)
) )
newExchangeUpdate.oldPrice = fixedRateExchange.price newExchangeUpdate.oldPrice = fixedRateExchange.price
newExchangeUpdate.createdTimestamp = event.block.timestamp.toI32() newExchangeUpdate.createdTimestamp = event.block.timestamp.toI32()
newExchangeUpdate.tx = event.transaction.hash.toHex() newExchangeUpdate.tx = event.transaction.hash.toHex()
newExchangeUpdate.eventIndex = event.logIndex.toI32()
newExchangeUpdate.block = event.block.number.toI32() newExchangeUpdate.block = event.block.number.toI32()
newExchangeUpdate.exchangeId = fixedRateId newExchangeUpdate.exchangeId = fixedRateId
@ -89,6 +92,7 @@ export function handleMintStateChanged(event: ExchangeMintStateChanged): void {
) )
const fixedRateExchange = getFixedRateExchange(fixedRateId) const fixedRateExchange = getFixedRateExchange(fixedRateId)
fixedRateExchange.withMint = event.params.withMint fixedRateExchange.withMint = event.params.withMint
fixedRateExchange.eventIndex = event.logIndex.toI32()
fixedRateExchange.save() fixedRateExchange.save()
} }
@ -98,14 +102,16 @@ export function handleActivated(event: ExchangeActivated): void {
event.address event.address
) )
const fixedRateExchange = getFixedRateExchange(fixedRateId) const fixedRateExchange = getFixedRateExchange(fixedRateId)
const eventIndex: number = event.logIndex.toI32()
const newExchangeUpdate = new FixedRateExchangeUpdate( const newExchangeUpdate = new FixedRateExchangeUpdate(
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId) getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId, eventIndex)
) )
newExchangeUpdate.exchangeId = fixedRateId newExchangeUpdate.exchangeId = fixedRateId
newExchangeUpdate.oldActive = fixedRateExchange.active newExchangeUpdate.oldActive = fixedRateExchange.active
newExchangeUpdate.newActive = true newExchangeUpdate.newActive = true
newExchangeUpdate.createdTimestamp = event.block.timestamp.toI32() newExchangeUpdate.createdTimestamp = event.block.timestamp.toI32()
newExchangeUpdate.tx = event.transaction.hash.toHex() newExchangeUpdate.tx = event.transaction.hash.toHex()
newExchangeUpdate.eventIndex = event.logIndex.toI32()
newExchangeUpdate.block = event.block.number.toI32() newExchangeUpdate.block = event.block.number.toI32()
fixedRateExchange.active = true fixedRateExchange.active = true
@ -120,8 +126,9 @@ export function handleDeactivated(event: ExchangeDeactivated): void {
event.address event.address
) )
const fixedRateExchange = getFixedRateExchange(fixedRateId) const fixedRateExchange = getFixedRateExchange(fixedRateId)
const eventIndex: number = event.logIndex.toI32()
const newExchangeUpdate = new FixedRateExchangeUpdate( const newExchangeUpdate = new FixedRateExchangeUpdate(
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId) getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId, eventIndex)
) )
newExchangeUpdate.oldActive = fixedRateExchange.active newExchangeUpdate.oldActive = fixedRateExchange.active
newExchangeUpdate.newActive = false newExchangeUpdate.newActive = false
@ -129,6 +136,7 @@ export function handleDeactivated(event: ExchangeDeactivated): void {
newExchangeUpdate.exchangeId = fixedRateId newExchangeUpdate.exchangeId = fixedRateId
newExchangeUpdate.createdTimestamp = event.block.timestamp.toI32() newExchangeUpdate.createdTimestamp = event.block.timestamp.toI32()
newExchangeUpdate.tx = event.transaction.hash.toHex() newExchangeUpdate.tx = event.transaction.hash.toHex()
newExchangeUpdate.eventIndex = event.logIndex.toI32()
newExchangeUpdate.block = event.block.number.toI32() newExchangeUpdate.block = event.block.number.toI32()
fixedRateExchange.active = false fixedRateExchange.active = false
@ -144,11 +152,13 @@ export function handleAllowedSwapperChanged(
event.address event.address
) )
const fixedRateExchange = getFixedRateExchange(fixedRateId) const fixedRateExchange = getFixedRateExchange(fixedRateId)
const eventIndex: number = event.logIndex.toI32()
const newExchangeUpdate = new FixedRateExchangeUpdate( const newExchangeUpdate = new FixedRateExchangeUpdate(
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId) getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId, eventIndex)
) )
newExchangeUpdate.createdTimestamp = event.block.timestamp.toI32() newExchangeUpdate.createdTimestamp = event.block.timestamp.toI32()
newExchangeUpdate.tx = event.transaction.hash.toHex() newExchangeUpdate.tx = event.transaction.hash.toHex()
newExchangeUpdate.eventIndex = event.logIndex.toI32()
newExchangeUpdate.block = event.block.number.toI32() newExchangeUpdate.block = event.block.number.toI32()
newExchangeUpdate.oldAllowedSwapper = fixedRateExchange.allowedSwapper newExchangeUpdate.oldAllowedSwapper = fixedRateExchange.allowedSwapper
newExchangeUpdate.exchangeId = fixedRateId newExchangeUpdate.exchangeId = fixedRateId
@ -165,12 +175,13 @@ export function handleSwap(event: Swapped): void {
event.address event.address
) )
const fixedRateExchange = getFixedRateExchange(fixedRateId) const fixedRateExchange = getFixedRateExchange(fixedRateId)
const eventIndex: number = event.logIndex.toI32()
const swap = new FixedRateExchangeSwap( const swap = new FixedRateExchangeSwap(
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId) getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId, eventIndex)
) )
swap.createdTimestamp = event.block.timestamp.toI32() swap.createdTimestamp = event.block.timestamp.toI32()
swap.tx = event.transaction.hash.toHex() swap.tx = event.transaction.hash.toHex()
swap.eventIndex = event.logIndex.toI32()
swap.block = event.block.number.toI32() swap.block = event.block.number.toI32()
swap.exchangeId = fixedRateId swap.exchangeId = fixedRateId
@ -244,6 +255,7 @@ export function handlePublishMarketFeeChanged(
event.params.swapFee.toBigDecimal(), event.params.swapFee.toBigDecimal(),
BigInt.fromI32(18).toI32() BigInt.fromI32(18).toI32()
) )
fixedRateExchange.eventIndex = event.logIndex.toI32()
fixedRateExchange.save() fixedRateExchange.save()
} }
} }
@ -261,7 +273,7 @@ export function handleTokenCollected(event: TokenCollected): void {
fixedRateExchange.baseTokenBalance.minus( fixedRateExchange.baseTokenBalance.minus(
weiToDecimal(event.params.amount.toBigDecimal(), baseToken.decimals) weiToDecimal(event.params.amount.toBigDecimal(), baseToken.decimals)
) )
fixedRateExchange.eventIndex = event.logIndex.toI32()
fixedRateExchange.save() fixedRateExchange.save()
} }
} }

View File

@ -20,8 +20,8 @@ import { NftUpdateType } from './utils/constants'
import { getNftToken, getNftTokenWithID } from './utils/tokenUtils' import { getNftToken, getNftTokenWithID } from './utils/tokenUtils'
import { getUser } from './utils/userUtils' import { getUser } from './utils/userUtils'
function getId(tx: string, nftAddress: string): string { function getId(tx: string, nftAddress: string, eventIndex: number): string {
return `${tx}-${nftAddress}` return `${tx}-${nftAddress}-${eventIndex}`
} }
export function handleMetadataCreated(event: MetadataCreated): void { export function handleMetadataCreated(event: MetadataCreated): void {
@ -33,8 +33,9 @@ export function handleMetadataCreated(event: MetadataCreated): void {
nft.providerUrl = event.params.decryptorUrl.toString() nft.providerUrl = event.params.decryptorUrl.toString()
nft.hasMetadata = true nft.hasMetadata = true
const eventIndex: number = event.logIndex.toI32()
const nftUpdate = new NftUpdate( const nftUpdate = new NftUpdate(
getId(event.transaction.hash.toHex(), nftAddress) getId(event.transaction.hash.toHex(), nftAddress, eventIndex)
) )
nftUpdate.type = NftUpdateType.METADATA_CREATED nftUpdate.type = NftUpdateType.METADATA_CREATED
@ -47,6 +48,7 @@ export function handleMetadataCreated(event: MetadataCreated): void {
nftUpdate.timestamp = event.block.timestamp.toI32() nftUpdate.timestamp = event.block.timestamp.toI32()
nftUpdate.tx = event.transaction.hash.toHex() nftUpdate.tx = event.transaction.hash.toHex()
nftUpdate.eventIndex = event.logIndex.toI32()
nftUpdate.block = event.block.number.toI32() nftUpdate.block = event.block.number.toI32()
nftUpdate.save() nftUpdate.save()
@ -60,8 +62,9 @@ export function handleMetadataUpdated(event: MetadataUpdated): void {
nft.assetState = event.params.state nft.assetState = event.params.state
nft.hasMetadata = true nft.hasMetadata = true
const eventIndex: number = event.logIndex.toI32()
const nftUpdate = new NftUpdate( const nftUpdate = new NftUpdate(
getId(event.transaction.hash.toHex(), nftAddress) getId(event.transaction.hash.toHex(), nftAddress, eventIndex)
) )
nftUpdate.nft = nft.id nftUpdate.nft = nft.id
@ -71,6 +74,7 @@ export function handleMetadataUpdated(event: MetadataUpdated): void {
nftUpdate.timestamp = event.block.timestamp.toI32() nftUpdate.timestamp = event.block.timestamp.toI32()
nftUpdate.tx = event.transaction.hash.toHex() nftUpdate.tx = event.transaction.hash.toHex()
nftUpdate.eventIndex = event.logIndex.toI32()
nftUpdate.block = event.block.number.toI32() nftUpdate.block = event.block.number.toI32()
nftUpdate.save() nftUpdate.save()
@ -83,9 +87,9 @@ export function handleMetadataState(event: MetadataState): void {
if (!nft) return if (!nft) return
nft.assetState = event.params.state nft.assetState = event.params.state
const eventIndex: number = event.logIndex.toI32()
const nftUpdate = new NftUpdate( const nftUpdate = new NftUpdate(
getId(event.transaction.hash.toHex(), nftAddress) getId(event.transaction.hash.toHex(), nftAddress, eventIndex)
) )
nftUpdate.nft = nft.id nftUpdate.nft = nft.id
@ -95,6 +99,7 @@ export function handleMetadataState(event: MetadataState): void {
nftUpdate.timestamp = event.block.timestamp.toI32() nftUpdate.timestamp = event.block.timestamp.toI32()
nftUpdate.tx = event.transaction.hash.toHex() nftUpdate.tx = event.transaction.hash.toHex()
nftUpdate.eventIndex = event.logIndex.toI32()
nftUpdate.block = event.block.number.toI32() nftUpdate.block = event.block.number.toI32()
nftUpdate.save() nftUpdate.save()
@ -108,9 +113,9 @@ export function handleTokenUriUpdate(event: TokenURIUpdate): void {
if (!nft) return if (!nft) return
nft.tokenUri = event.params.tokenURI.toString() nft.tokenUri = event.params.tokenURI.toString()
const eventIndex: number = event.logIndex.toI32()
const nftUpdate = new NftUpdate( const nftUpdate = new NftUpdate(
getId(event.transaction.hash.toHex(), nftAddress) getId(event.transaction.hash.toHex(), nftAddress, eventIndex)
) )
nftUpdate.nft = nft.id nftUpdate.nft = nft.id
nftUpdate.type = NftUpdateType.TOKENURI_UPDATED nftUpdate.type = NftUpdateType.TOKENURI_UPDATED
@ -118,6 +123,7 @@ export function handleTokenUriUpdate(event: TokenURIUpdate): void {
nftUpdate.tokenUri = nft.tokenUri nftUpdate.tokenUri = nft.tokenUri
nftUpdate.timestamp = event.block.timestamp.toI32() nftUpdate.timestamp = event.block.timestamp.toI32()
nftUpdate.tx = event.transaction.hash.toHex() nftUpdate.tx = event.transaction.hash.toHex()
nftUpdate.eventIndex = event.logIndex.toI32()
nftUpdate.block = event.block.number.toI32() nftUpdate.block = event.block.number.toI32()
nftUpdate.assetState = nft.assetState nftUpdate.assetState = nft.assetState
nftUpdate.save() nftUpdate.save()
@ -133,6 +139,7 @@ export function handleAddedManager(event: AddedManager): void {
if (!existingRoles.includes(event.params.user.toHexString())) if (!existingRoles.includes(event.params.user.toHexString()))
existingRoles.push(event.params.user.toHexString()) existingRoles.push(event.params.user.toHexString())
nft.managerRole = existingRoles nft.managerRole = existingRoles
nft.eventIndex = event.logIndex.toI32()
nft.save() nft.save()
} }
export function handleRemovedManager(event: RemovedManager): void { export function handleRemovedManager(event: RemovedManager): void {
@ -148,6 +155,7 @@ export function handleRemovedManager(event: RemovedManager): void {
if (role !== event.params.user.toHexString()) newList.push(role) if (role !== event.params.user.toHexString()) newList.push(role)
} }
nft.managerRole = newList nft.managerRole = newList
nft.eventIndex = event.logIndex.toI32()
nft.save() nft.save()
} }
@ -160,6 +168,7 @@ export function handleAddedTo725StoreList(event: AddedTo725StoreList): void {
if (!existingRoles.includes(event.params.user.toHexString())) if (!existingRoles.includes(event.params.user.toHexString()))
existingRoles.push(event.params.user.toHexString()) existingRoles.push(event.params.user.toHexString())
nft.storeUpdateRole = existingRoles nft.storeUpdateRole = existingRoles
nft.eventIndex = event.logIndex.toI32()
nft.save() nft.save()
} }
@ -178,6 +187,7 @@ export function handleRemovedFrom725StoreList(
if (role !== event.params.user.toHexString()) newList.push(role) if (role !== event.params.user.toHexString()) newList.push(role)
} }
nft.storeUpdateRole = newList nft.storeUpdateRole = newList
nft.eventIndex = event.logIndex.toI32()
nft.save() nft.save()
} }
@ -192,6 +202,7 @@ export function handleAddedToCreateERC20List(
if (!existingRoles.includes(event.params.user.toHexString())) if (!existingRoles.includes(event.params.user.toHexString()))
existingRoles.push(event.params.user.toHexString()) existingRoles.push(event.params.user.toHexString())
nft.erc20DeployerRole = existingRoles nft.erc20DeployerRole = existingRoles
nft.eventIndex = event.logIndex.toI32()
nft.save() nft.save()
} }
@ -210,6 +221,7 @@ export function handleRemovedFromCreateERC20List(
if (role !== event.params.user.toHexString()) newList.push(role) if (role !== event.params.user.toHexString()) newList.push(role)
} }
nft.erc20DeployerRole = newList nft.erc20DeployerRole = newList
nft.eventIndex = event.logIndex.toI32()
nft.save() nft.save()
} }
@ -222,6 +234,7 @@ export function handleAddedToMetadataList(event: AddedToMetadataList): void {
if (!existingRoles.includes(event.params.user.toHexString())) if (!existingRoles.includes(event.params.user.toHexString()))
existingRoles.push(event.params.user.toHexString()) existingRoles.push(event.params.user.toHexString())
nft.metadataRole = existingRoles nft.metadataRole = existingRoles
nft.eventIndex = event.logIndex.toI32()
nft.save() nft.save()
} }
@ -240,6 +253,7 @@ export function handleRemovedFromMetadataList(
if (role !== event.params.user.toHexString()) newList.push(role) if (role !== event.params.user.toHexString()) newList.push(role)
} }
nft.metadataRole = newList nft.metadataRole = newList
nft.eventIndex = event.logIndex.toI32()
nft.save() nft.save()
} }
@ -250,6 +264,7 @@ export function handleCleanedPermissions(event: CleanedPermissions): void {
nft.erc20DeployerRole = newList nft.erc20DeployerRole = newList
nft.storeUpdateRole = newList nft.storeUpdateRole = newList
nft.managerRole = newList nft.managerRole = newList
nft.eventIndex = event.logIndex.toI32()
nft.save() nft.save()
} }
@ -260,15 +275,16 @@ export function handleNftTransferred(event: Transfer): void {
const newOwner = getUser(event.params.to.toHexString()) const newOwner = getUser(event.params.to.toHexString())
nft.owner = newOwner.id nft.owner = newOwner.id
nft.save() nft.save()
const eventIndex: number = event.logIndex.toI32()
const transferId = `${nft.address}-${event.transaction.hash.toHex()}-${ const transferId = `${
event.logIndex nft.address
}` }-${event.transaction.hash.toHex()}-${eventIndex}`
const newTransfer = new NftTransferHistory(transferId) const newTransfer = new NftTransferHistory(transferId)
newTransfer.oldOwner = oldOwner newTransfer.oldOwner = oldOwner
newTransfer.nft = nft.id newTransfer.nft = nft.id
newTransfer.newOwner = newOwner.id newTransfer.newOwner = newOwner.id
newTransfer.txId = event.transaction.hash.toHex() newTransfer.txId = event.transaction.hash.toHex()
newTransfer.eventIndex = event.logIndex.toI32()
newTransfer.timestamp = event.block.timestamp.toI32() newTransfer.timestamp = event.block.timestamp.toI32()
newTransfer.block = event.block.number.toI32() newTransfer.block = event.block.number.toI32()
newTransfer.save() newTransfer.save()

View File

@ -57,7 +57,8 @@ export function updateFixedRateExchangeSupply(
export function getUpdateOrSwapId( export function getUpdateOrSwapId(
txAddress: string, txAddress: string,
exchangeId: string exchangeId: string,
eventIndex: number
): string { ): string {
return `${txAddress}-${exchangeId}` return `${txAddress}-${exchangeId}-${eventIndex}`
} }

View File

@ -1,11 +1,12 @@
import { Order } from '../../@types/schema' import { Order, OrderReuse } from '../../@types/schema'
export function getOrderId( export function getOrderId(
tx: string, tx: string,
tokenAddress: string, tokenAddress: string,
fromAddress: string fromAddress: string,
eventIndex: number
): string { ): string {
return `${tx}-${tokenAddress}-${fromAddress}` return `${tx}-${tokenAddress}-${fromAddress}-${eventIndex}`
} }
export function createOrder(orderId: string): Order { export function createOrder(orderId: string): Order {
@ -16,12 +17,53 @@ export function createOrder(orderId: string): Order {
export function getOrder( export function getOrder(
transactionHash: string, transactionHash: string,
address: string, address: string,
transactionFrom: string transactionFrom: string,
eventIndex: number
): Order { ): Order {
const orderId = getOrderId(transactionHash, address, transactionFrom) const orderId = getOrderId(
transactionHash,
address,
transactionFrom,
eventIndex
)
let newOrder = Order.load(orderId) let newOrder = Order.load(orderId)
if (newOrder === null) { if (newOrder === null) {
newOrder = createOrder(orderId) newOrder = createOrder(orderId)
} }
return newOrder return newOrder
} }
export function searchOrderForEvent(
transactionHash: string,
address: string,
transactionFrom: string,
eventIndex: number
): Order | null {
for (let i = eventIndex; i >= 0; i--) {
const orderId = getOrderId(transactionHash, address, transactionFrom, i)
const order = Order.load(orderId)
if (order && order.datatoken == address) {
return order
}
}
return null
}
export function searchOrderReusedForEvent(
transactionHash: string,
eventAddress: string,
eventIndex: number
): OrderReuse | null {
for (let i = eventIndex; i >= 0; i--) {
const orderReused = OrderReuse.load(`${transactionHash}-${i}`)
if (!orderReused) {
continue
}
const order = Order.load(orderReused.order)
if (order && order.datatoken == eventAddress) {
return orderReused
}
}
return null
}

View File

@ -30,6 +30,7 @@ export function createToken(address: Address, isDatatoken: boolean): Token {
token.createdTimestamp = 0 token.createdTimestamp = 0
token.block = 0 token.block = 0
token.tx = '' token.tx = ''
token.eventIndex = 0
token.save() token.save()
return token return token
} }
@ -60,6 +61,7 @@ export function createNftToken(address: Address): Nft {
token.tx = '' token.tx = ''
token.orderCount = BigInt.zero() token.orderCount = BigInt.zero()
token.hasMetadata = false token.hasMetadata = false
token.eventIndex = 0
token.save() token.save()
addNft() addNft()
return token return token
@ -93,6 +95,7 @@ export function getNftTokenWithID(tokenId: string): Nft {
nftToken.tx = '' nftToken.tx = ''
nftToken.orderCount = BigInt.zero() nftToken.orderCount = BigInt.zero()
nftToken.hasMetadata = false nftToken.hasMetadata = false
nftToken.eventIndex = 0
nftToken.save() nftToken.save()
addNft() addNft()
} }

View File

@ -38,6 +38,7 @@ export function getveAllocateUser(
allocateUser.firstContact = event.block.timestamp.toI32() allocateUser.firstContact = event.block.timestamp.toI32()
allocateUser.tx = event.transaction.hash.toHex() allocateUser.tx = event.transaction.hash.toHex()
allocateUser.eventIndex = event.logIndex.toI32()
allocateUser.block = event.block.number.toI32() allocateUser.block = event.block.number.toI32()
allocateUser.lastContact = 0 allocateUser.lastContact = 0
const veOcean = getveOCEAN(sender) const veOcean = getveOCEAN(sender)
@ -60,6 +61,7 @@ export function getveAllocateId(
allocateId.firstContact = event.block.timestamp.toI32() allocateId.firstContact = event.block.timestamp.toI32()
allocateId.tx = event.transaction.hash.toHex() allocateId.tx = event.transaction.hash.toHex()
allocateId.eventIndex = event.logIndex.toI32()
allocateId.block = event.block.number.toI32() allocateId.block = event.block.number.toI32()
allocateId.lastContact = 0 allocateId.lastContact = 0
allocateId.chainId = BigInt.zero() allocateId.chainId = BigInt.zero()
@ -87,6 +89,7 @@ export function getveAllocation(
veAllocation.firstContact = event.block.timestamp.toI32() veAllocation.firstContact = event.block.timestamp.toI32()
veAllocation.tx = event.transaction.hash.toHex() veAllocation.tx = event.transaction.hash.toHex()
veAllocation.eventIndex = event.logIndex.toI32()
veAllocation.block = event.block.number.toI32() veAllocation.block = event.block.number.toI32()
veAllocation.lastContact = 0 veAllocation.lastContact = 0
@ -103,16 +106,17 @@ export function writeveAllocationUpdate(
allocationType: string, allocationType: string,
amount: BigDecimal amount: BigDecimal
): VeAllocationUpdate { ): VeAllocationUpdate {
const tx = event.transaction.hash.toHex() const id = `${event.transaction.hash.toHex()}-${veAllocationId}-${event.logIndex.toString()}`
let allocationUpdate = VeAllocationUpdate.load(tx + '-' + veAllocationId) let allocationUpdate = VeAllocationUpdate.load(id)
if (allocationUpdate === null) { if (allocationUpdate === null) {
allocationUpdate = new VeAllocationUpdate(tx + '-' + veAllocationId) allocationUpdate = new VeAllocationUpdate(id)
allocationUpdate.veAllocation = veAllocationId allocationUpdate.veAllocation = veAllocationId
allocationUpdate.type = allocationType allocationUpdate.type = allocationType
allocationUpdate.allocatedTotal = amount allocationUpdate.allocatedTotal = amount
allocationUpdate.timestamp = event.block.timestamp.toI32() allocationUpdate.timestamp = event.block.timestamp.toI32()
allocationUpdate.tx = event.transaction.hash.toHex() allocationUpdate.tx = event.transaction.hash.toHex()
allocationUpdate.eventIndex = event.logIndex.toI32()
allocationUpdate.block = event.block.number.toI32() allocationUpdate.block = event.block.number.toI32()
allocationUpdate.save() allocationUpdate.save()
@ -140,10 +144,8 @@ export function getveDelegation(
} }
return veDelegation return veDelegation
} }
export function getDeposit(id: string): VeDeposit { export function getDeposit(id: string): VeDeposit {
let deposit = VeDeposit.load(id) let deposit = VeDeposit.load(id)
if (deposit === null) { if (deposit === null) {
deposit = new VeDeposit(id) deposit = new VeDeposit(id)
deposit.provider = '' deposit.provider = ''
@ -153,6 +155,7 @@ export function getDeposit(id: string): VeDeposit {
deposit.type = BigInt.zero() deposit.type = BigInt.zero()
deposit.timestamp = BigInt.zero() deposit.timestamp = BigInt.zero()
deposit.tx = '' deposit.tx = ''
deposit.eventIndex = 0
deposit.block = 0 deposit.block = 0
// do not save it // do not save it
// deposit.save() // deposit.save()

View File

@ -40,6 +40,7 @@ export function handleDelegation(event: DelegateBoost): void {
veDelegationUpdate.block = event.block.number.toI32() veDelegationUpdate.block = event.block.number.toI32()
veDelegationUpdate.timestamp = event.block.timestamp.toI32() veDelegationUpdate.timestamp = event.block.timestamp.toI32()
veDelegationUpdate.tx = event.transaction.hash.toHex() veDelegationUpdate.tx = event.transaction.hash.toHex()
veDelegationUpdate.eventIndex = event.logIndex.toI32()
veDelegationUpdate.amount = veDelegation.amount veDelegationUpdate.amount = veDelegation.amount
veDelegationUpdate.cancelTime = _cancelTime veDelegationUpdate.cancelTime = _cancelTime
veDelegationUpdate.expireTime = _expireTime veDelegationUpdate.expireTime = _expireTime
@ -79,6 +80,7 @@ export function handleExtendBoost(event: ExtendBoost): void {
veDelegationUpdate.block = event.block.number.toI32() veDelegationUpdate.block = event.block.number.toI32()
veDelegationUpdate.timestamp = event.block.timestamp.toI32() veDelegationUpdate.timestamp = event.block.timestamp.toI32()
veDelegationUpdate.tx = event.transaction.hash.toHex() veDelegationUpdate.tx = event.transaction.hash.toHex()
veDelegationUpdate.eventIndex = event.logIndex.toI32()
veDelegationUpdate.amount = veDelegation.amount veDelegationUpdate.amount = veDelegation.amount
veDelegationUpdate.cancelTime = _cancelTime veDelegationUpdate.cancelTime = _cancelTime
veDelegationUpdate.expireTime = _expireTime veDelegationUpdate.expireTime = _expireTime
@ -111,6 +113,7 @@ export function handleBurnBoost(event: BurnBoost): void {
veDelegationUpdate.block = event.block.number.toI32() veDelegationUpdate.block = event.block.number.toI32()
veDelegationUpdate.timestamp = event.block.timestamp.toI32() veDelegationUpdate.timestamp = event.block.timestamp.toI32()
veDelegationUpdate.tx = event.transaction.hash.toHex() veDelegationUpdate.tx = event.transaction.hash.toHex()
veDelegationUpdate.eventIndex = event.logIndex.toI32()
veDelegationUpdate.amount = veDelegation.amount veDelegationUpdate.amount = veDelegation.amount
veDelegationUpdate.cancelTime = veDelegation.cancelTime veDelegationUpdate.cancelTime = veDelegation.cancelTime
veDelegationUpdate.expireTime = veDelegation.expireTime veDelegationUpdate.expireTime = veDelegation.expireTime

View File

@ -27,6 +27,7 @@ export function handleClaimed(event: Claimed): void {
claim.block = event.block.number.toI32() claim.block = event.block.number.toI32()
claim.tx = event.transaction.hash.toHex() claim.tx = event.transaction.hash.toHex()
claim.eventIndex = event.logIndex.toI32()
claim.timestamp = event.block.timestamp claim.timestamp = event.block.timestamp
claim.save() claim.save()
} }
@ -44,6 +45,7 @@ export function handleCheckpoint(event: CheckpointToken): void {
checkpoint.sender = event.transaction.from.toHexString() checkpoint.sender = event.transaction.from.toHexString()
checkpoint.block = event.block.number.toI32() checkpoint.block = event.block.number.toI32()
checkpoint.tx = event.transaction.hash.toHex() checkpoint.tx = event.transaction.hash.toHex()
checkpoint.eventIndex = event.logIndex.toI32()
checkpoint.timestamp = event.params.time checkpoint.timestamp = event.params.time
checkpoint.VeFeeDistributor = distributor.id checkpoint.VeFeeDistributor = distributor.id
checkpoint.save() checkpoint.save()

View File

@ -68,6 +68,7 @@ export function handleWithdraw(event: Withdraw): void {
deposit.timestamp = ts deposit.timestamp = ts
deposit.block = event.block.number.toI32() deposit.block = event.block.number.toI32()
deposit.tx = event.transaction.hash.toHex() deposit.tx = event.transaction.hash.toHex()
deposit.eventIndex = event.logIndex.toI32()
deposit.sender = event.transaction.from.toHex() deposit.sender = event.transaction.from.toHex()
deposit.veOcean = veOCEAN.id deposit.veOcean = veOCEAN.id
deposit.totalOceanLocked = totalOceanLocked.plus(deposit.value) // it's already negated above deposit.totalOceanLocked = totalOceanLocked.plus(deposit.value) // it's already negated above

View File

@ -38,6 +38,8 @@ templates:
handler: handlePublishMarketFee handler: handlePublishMarketFee
- event: PublishMarketFeeChanged(address,address,address,uint256) - event: PublishMarketFeeChanged(address,address,address,uint256)
handler: handlePublishMarketFeeChanged handler: handlePublishMarketFeeChanged
- event: ConsumeMarketFee(indexed address,indexed address,uint256)
handler: handleConsumeMarketFee
- event: AddedMinter(indexed address,indexed address,uint256,uint256) - event: AddedMinter(indexed address,indexed address,uint256,uint256)
handler: handleAddedMinter handler: handleAddedMinter
- event: AddedPaymentManager(indexed address,indexed address,uint256,uint256) - event: AddedPaymentManager(indexed address,indexed address,uint256,uint256)

View File

@ -159,6 +159,7 @@ describe('DFRewards tests', async () => {
} }
type type
tx tx
eventIndex
} }
} }
}` }`
@ -175,6 +176,7 @@ describe('DFRewards tests', async () => {
) )
assert(info[0].history[0].amount === '100') assert(info[0].history[0].amount === '100')
assert(info[0].history[0].tx === tx.transactionHash.toLowerCase()) assert(info[0].history[0].tx === tx.transactionHash.toLowerCase())
assert(info[0].history[0].eventIndex === tx.events.Allocated.logIndex)
assert(info[0].history[0].type === 'Allocated') assert(info[0].history[0].type === 'Allocated')
}) })
@ -183,7 +185,7 @@ describe('DFRewards tests', async () => {
user2, user2,
datatokenAddress1 datatokenAddress1
) )
await dfRewards.claimRewards(user2, user2, datatokenAddress1) const tx = await dfRewards.claimRewards(user2, user2, datatokenAddress1)
const user2Balance = await dfRewards.getAvailableRewards( const user2Balance = await dfRewards.getAvailableRewards(
user2, user2,
@ -219,6 +221,7 @@ describe('DFRewards tests', async () => {
} }
type type
tx tx
eventIndex
} }
} }
}` }`
@ -235,5 +238,6 @@ describe('DFRewards tests', async () => {
) )
assert(info[0].history[0].amount === expectedReward) assert(info[0].history[0].amount === expectedReward)
assert(info[0].history[0].type === 'Claimed') assert(info[0].history[0].type === 'Claimed')
assert(info[0].history[0].eventIndex === tx.events.Claimed.logIndex)
}) })
}) })

View File

@ -135,7 +135,7 @@ describe('Datatoken tests', async () => {
datatokenAddress = result.events.TokenCreated.returnValues[0].toLowerCase() datatokenAddress = result.events.TokenCreated.returnValues[0].toLowerCase()
// Check values before updating metadata // Check values before updating metadata
await sleep(2000) await sleep(3000)
const initialQuery = { const initialQuery = {
query: `query { query: `query {
token(id: "${datatokenAddress}"){ token(id: "${datatokenAddress}"){
@ -161,6 +161,7 @@ describe('Datatoken tests', async () => {
dispensers {id}, dispensers {id},
createdTimestamp, createdTimestamp,
tx, tx,
eventIndex,
block, block,
lastPriceValue lastPriceValue
}}` }}`
@ -214,6 +215,10 @@ describe('Datatoken tests', async () => {
assert(dt.block >= blockNumber, 'incorrect value for: block') assert(dt.block >= blockNumber, 'incorrect value for: block')
assert(dt.block < blockNumber + 50, 'incorrect value for: block') assert(dt.block < blockNumber + 50, 'incorrect value for: block')
assert(dt.lastPriceValue === '0', 'incorrect value for: lastPriceValue') assert(dt.lastPriceValue === '0', 'incorrect value for: lastPriceValue')
assert(
dt.eventIndex !== null && dt.eventIndex > 0,
'incorrect value for: eventIndex'
)
}) })
it('Correct Datatoken fields after updating metadata', async () => { it('Correct Datatoken fields after updating metadata', async () => {
@ -247,7 +252,7 @@ describe('Datatoken tests', async () => {
) )
// Check values before updating metadata // Check values before updating metadata
await sleep(2000) await sleep(3000)
const initialQuery = { const initialQuery = {
query: `query { query: `query {
token(id: "${datatokenAddress}"){ token(id: "${datatokenAddress}"){
@ -273,6 +278,7 @@ describe('Datatoken tests', async () => {
dispensers {id}, dispensers {id},
createdTimestamp, createdTimestamp,
tx, tx,
eventIndex,
block, block,
lastPriceValue lastPriceValue
}}` }}`
@ -281,7 +287,7 @@ describe('Datatoken tests', async () => {
method: 'POST', method: 'POST',
body: JSON.stringify(initialQuery) body: JSON.stringify(initialQuery)
}) })
await sleep(2000) await sleep(3000)
const dt = (await initialResponse.json()).data.token const dt = (await initialResponse.json()).data.token
const tx: TransactionReceipt = await web3.eth.getTransactionReceipt(dt.tx) const tx: TransactionReceipt = await web3.eth.getTransactionReceipt(dt.tx)
@ -325,10 +331,41 @@ describe('Datatoken tests', async () => {
assert(dt.block >= blockNumber, 'incorrect value for: block') assert(dt.block >= blockNumber, 'incorrect value for: block')
assert(dt.block < blockNumber + 50, 'incorrect value for: block') assert(dt.block < blockNumber + 50, 'incorrect value for: block')
assert(dt.lastPriceValue === '0', 'incorrect value for: lastPriceValue') assert(dt.lastPriceValue === '0', 'incorrect value for: lastPriceValue')
assert(
dt.eventIndex !== null && dt.eventIndex > 0,
'incorrect value for: eventIndex'
)
}) })
it('Check datatoken orders are updated correctly after publishing & ordering a datatoken', async () => { it('Check datatoken orders are updated correctly after publishing & ordering a datatoken with fees', async () => {
// Start with publishing a new datatoken // Publish a datatoken for publishingMarketFeeToken
const nftParams1: NftCreateData = {
name: 'newNFT1',
symbol: 'newTST1',
templateIndex,
tokenURI: '',
transferable: true,
owner: publisher
}
const erc20Params1: DatatokenCreateParams = {
templateIndex,
cap: '100000',
feeAmount: '0',
paymentCollector: ZERO_ADDRESS,
feeToken: ZERO_ADDRESS,
minter: publisher,
mpFeeAddress: ZERO_ADDRESS
}
const result1 = await Factory.createNftWithDatatoken(
publisher,
nftParams1,
erc20Params1
)
await sleep(3000)
const publishingTokenAddress = result1.events.TokenCreated.returnValues[0]
const publishingDatatoken = new Datatoken(web3, 8996)
// Start with publishing the datatoken used for startOrder
const nftParams: NftCreateData = { const nftParams: NftCreateData = {
name: 'newNFT', name: 'newNFT',
symbol: 'newTST', symbol: 'newTST',
@ -340,42 +377,76 @@ describe('Datatoken tests', async () => {
const erc20Params: DatatokenCreateParams = { const erc20Params: DatatokenCreateParams = {
templateIndex, templateIndex,
cap: '100000', cap: '100000',
feeAmount: '0', feeAmount: '0.2',
paymentCollector: ZERO_ADDRESS, paymentCollector: ZERO_ADDRESS,
feeToken: ZERO_ADDRESS, feeToken: publishingTokenAddress,
minter: publisher, minter: publisher,
mpFeeAddress: ZERO_ADDRESS mpFeeAddress: publisher
} }
const result = await Factory.createNftWithDatatoken( const result = await Factory.createNftWithDatatoken(
publisher, publisher,
nftParams, nftParams,
erc20Params erc20Params
) )
await sleep(2000) await sleep(3000)
const newDtAddress = result.events.TokenCreated.returnValues[0] const newDtAddress = result.events.TokenCreated.returnValues[0]
const datatoken = new Datatoken(web3, 8996) const datatoken = new Datatoken(web3, 8996)
await datatoken.approve(
newDtAddress,
publishingTokenAddress,
'100000000000000000000000000',
user1
)
await publishingDatatoken.approve(
publishingTokenAddress,
newDtAddress,
'100000000000000000000000000',
user1
)
await datatoken.mint(newDtAddress, publisher, '100', user1) await datatoken.mint(newDtAddress, publisher, '100', user1)
await publishingDatatoken.mint(
publishingTokenAddress,
publisher,
'100',
user1
)
const user1balance = await datatoken.balance(newDtAddress, user1) const user1balance = await datatoken.balance(newDtAddress, user1)
const user2balance = await datatoken.balance(newDtAddress, user2) const user2balance = await datatoken.balance(newDtAddress, user2)
assert(Number(user1balance) === 100, 'Invalid user1 balance') assert(Number(user1balance) === 100, 'Invalid user1 balance')
assert(Number(user2balance) === 0, 'Invalid user2 balance') assert(Number(user2balance) === 0, 'Invalid user2 balance')
const user1balanceOfPublishing = await datatoken.balance(
publishingTokenAddress,
user1
)
const user2balanceOfPublishing = await datatoken.balance(
publishingTokenAddress,
user2
)
assert(Number(user1balanceOfPublishing) === 100, 'Invalid user1 balance')
assert(Number(user2balanceOfPublishing) === 0, 'Invalid user2 balance')
const query = { const query = {
query: `query {token(id: "${newDtAddress.toLowerCase()}"){id,orderCount,orders {id, nftOwner{id}, lastPriceToken{id}}}}` query: `query {token(id: "${newDtAddress.toLowerCase()}"){id,orderCount,orders {id, nftOwner{id}, lastPriceToken{id}, eventIndex}, eventIndex}}`
} }
await sleep(2000) await sleep(3000)
let response = await fetch(subgraphUrl, { let response = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
body: JSON.stringify(query) body: JSON.stringify(query)
}) })
await sleep(3000)
const initialToken = (await response.json()).data.token const initialToken = (await response.json()).data.token
assert(initialToken, 'Invalid initialToken') assert(initialToken, 'Invalid initialToken')
assert(initialToken.orderCount === '0', 'Invalid initial orderCount') assert(initialToken.orderCount === '0', 'Invalid initial orderCount')
assert(initialToken.orders.length === 0, 'Invalid initial orders') assert(initialToken.orders.length === 0, 'Invalid initial orders')
assert(
initialToken.eventIndex !== null && initialToken.eventIndex > 0,
'Invalid eventIndex'
)
const providerData = JSON.stringify({ timeout: 0 }) const providerData = JSON.stringify({ timeout: 0 })
const providerFeeToken = ZERO_ADDRESS const providerFeeToken = ZERO_ADDRESS
@ -400,22 +471,31 @@ describe('Datatoken tests', async () => {
providerData: web3.utils.toHex(web3.utils.asciiToHex(providerData)), providerData: web3.utils.toHex(web3.utils.asciiToHex(providerData)),
validUntil: providerValidUntil validUntil: providerValidUntil
} }
const consumeMarketFees = {
consumeMarketFeeAddress: publisher,
consumeMarketFeeToken: publishingTokenAddress,
consumeMarketFeeAmount: '20000'
}
assert(setProviderFee, 'Invalid setProviderFee') assert(setProviderFee, 'Invalid setProviderFee')
const orderTx = await datatoken.startOrder( const orderTx = await datatoken.startOrder(
newDtAddress, newDtAddress,
user1, user1,
user2, user2,
1, 1,
setProviderFee setProviderFee,
consumeMarketFees
) )
assert(orderTx, 'Invalid orderTx') assert(orderTx, 'Invalid orderTx')
const orderId = `${orderTx.transactionHash.toLowerCase()}-${newDtAddress.toLowerCase()}-${user1.toLowerCase()}` const orderId = `${orderTx.transactionHash.toLowerCase()}-${newDtAddress.toLowerCase()}-${user1.toLowerCase()}-${orderTx.events.OrderStarted.logIndex.toFixed(
1
)}`
await sleep(2000) await sleep(3000)
response = await fetch(subgraphUrl, { response = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
body: JSON.stringify(query) body: JSON.stringify(query)
}) })
await sleep(3000)
const token = (await response.json()).data.token const token = (await response.json()).data.token
@ -424,5 +504,48 @@ describe('Datatoken tests', async () => {
assert(token.orders[0].id === orderId) assert(token.orders[0].id === orderId)
assert(token.orders[0].lastPriceToken.id === ZERO_ADDRESS) assert(token.orders[0].lastPriceToken.id === ZERO_ADDRESS)
assert(token.orders[0].nftOwner.id === publisher, 'invalid nftOwner') assert(token.orders[0].nftOwner.id === publisher, 'invalid nftOwner')
assert(token.orders[0].eventIndex === 0, 'invalid order eventIndex')
assert(token.eventIndex !== null, 'Invalid eventIndex')
assert(
token.eventIndex !== token.orders[0].eventIndex,
'Invalid log indeces'
)
const orderQuery = {
query: `query {order(id:"${orderId}"){id, publishingMarket{id}, publishingMarketToken{id}, publishingMarketAmmount, consumerMarket{id}, consumerMarketToken{id}, consumerMarketAmmount, eventIndex}}`
}
await sleep(3000)
const orderResponse = await fetch(subgraphUrl, {
method: 'POST',
body: JSON.stringify(orderQuery)
})
await sleep(3000)
const queryResult = await orderResponse.json()
const order = queryResult.data.order
assert(
order.publishingMarket.id === erc20Params.mpFeeAddress.toLowerCase(),
'incorrect publish market fee address'
)
assert(
order.publishingMarketToken.id === erc20Params.feeToken.toLowerCase(),
'incorrect publish market fee token'
)
assert(
order.publishingMarketAmmount === erc20Params.feeAmount,
'incorrect publish market fee amount'
)
assert(
order.consumerMarket.id ===
consumeMarketFees.consumeMarketFeeAddress.toLowerCase(),
'incorrect consume market fee address'
)
assert(
order.consumerMarketToken.id ===
consumeMarketFees.consumeMarketFeeToken.toLowerCase(),
'incorrect consume market fee token'
)
assert(
order.consumerMarketAmmount === '0.00000000000002',
'incorrect consume market fee amount'
)
}) })
}) })

View File

@ -138,6 +138,7 @@ describe('Dispenser tests', async () => {
transferable, transferable,
createdTimestamp, createdTimestamp,
tx, tx,
eventIndex,
block, block,
orderCount}}` orderCount}}`
} }
@ -172,6 +173,10 @@ describe('Dispenser tests', async () => {
assert(nft.block >= blockNumber, 'incorrect value for: block') assert(nft.block >= blockNumber, 'incorrect value for: block')
assert(nft.block < blockNumber + 50, 'incorrect value for: block') assert(nft.block < blockNumber + 50, 'incorrect value for: block')
assert(nft.orderCount === '0', 'incorrect value for: orderCount') assert(nft.orderCount === '0', 'incorrect value for: orderCount')
assert(
nft.eventIndex !== null && nft.eventIndex > 0,
'Invalid eventIndex for NFT creation'
)
}) })
it('Test all DT Fields after deploying', async () => { it('Test all DT Fields after deploying', async () => {
@ -201,6 +206,7 @@ describe('Dispenser tests', async () => {
dispensers {id}, dispensers {id},
createdTimestamp, createdTimestamp,
tx, tx,
eventIndex,
block, block,
lastPriceValue lastPriceValue
}}` }}`
@ -254,6 +260,10 @@ describe('Dispenser tests', async () => {
assert(dt.block >= blockNumber, 'incorrect value for: block') assert(dt.block >= blockNumber, 'incorrect value for: block')
assert(dt.block < blockNumber + 50, 'incorrect value for: block') assert(dt.block < blockNumber + 50, 'incorrect value for: block')
assert(dt.lastPriceValue === '0', 'incorrect value for: lastPriceValue') assert(dt.lastPriceValue === '0', 'incorrect value for: lastPriceValue')
assert(
dt.eventIndex !== null && dt.eventIndex > 0,
'incorrect value for: eventIndex'
)
}) })
it('Make user1 minter', async () => { it('Make user1 minter', async () => {
@ -262,15 +272,16 @@ describe('Dispenser tests', async () => {
assert((await datatoken.getPermissions(dtAddress, user1)).minter === true) assert((await datatoken.getPermissions(dtAddress, user1)).minter === true)
await sleep(sleepMs) await sleep(sleepMs)
const minterQuery = { const minterQuery = {
query: `query {token(id: "${dtAddress}"){minter{id}}}` query: `query {token(id: "${dtAddress}"){minter{id}, eventIndex}}`
} }
const minterResponse = await fetch(subgraphUrl, { const minterResponse = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
body: JSON.stringify(minterQuery) body: JSON.stringify(minterQuery)
}) })
const minter = (await minterResponse.json()).data.token.minter const dt = (await minterResponse.json()).data.token
assert(minter[1] === user1, 'incorrect value for: minter') assert(dt.minter[1] === user1, 'incorrect value for: minter')
assert(dt.eventIndex !== null, 'incorrect value for: eventIndex')
}) })
it('Create dispenser', async () => { it('Create dispenser', async () => {
@ -310,6 +321,7 @@ describe('Dispenser tests', async () => {
block block
createdTimestamp createdTimestamp
tx tx
eventIndex
dispenses { dispenses {
id id
} }
@ -336,13 +348,17 @@ describe('Dispenser tests', async () => {
assert(response.createdTimestamp >= time, 'incorrect: createdTimestamp') assert(response.createdTimestamp >= time, 'incorrect: createdTimestamp')
assert(response.createdTimestamp < time + 15, 'incorrect: createdTimestamp') assert(response.createdTimestamp < time + 15, 'incorrect: createdTimestamp')
assert(response.tx === tx.transactionHash, 'incorrect value for: tx') assert(response.tx === tx.transactionHash, 'incorrect value for: tx')
assert(
response.eventIndex !== null && response.eventIndex > 0,
'incorrect value for: eventIndex'
)
assert(response.dispenses.length === 0, 'incorrect value for: dispenses') assert(response.dispenses.length === 0, 'incorrect value for: dispenses')
assert(response.__typename === 'Dispenser', 'incorrect value: __typename') assert(response.__typename === 'Dispenser', 'incorrect value: __typename')
}) })
it('Deactivates dispenser', async () => { it('Deactivates dispenser', async () => {
const deactiveQuery = { const deactiveQuery = {
query: `query {dispenser(id: "${dispenserId}"){active}}` query: `query {dispenser(id: "${dispenserId}"){active, eventIndex}}`
} }
const initialResponse = await fetch(subgraphUrl, { const initialResponse = await fetch(subgraphUrl, {
@ -353,7 +369,7 @@ describe('Dispenser tests', async () => {
assert(initialActive === true, 'incorrect value for: initialActive') assert(initialActive === true, 'incorrect value for: initialActive')
// Deactivate exchange // Deactivate exchange
await dispenser.deactivate(dtAddress, publisher) const tx = await dispenser.deactivate(dtAddress, publisher)
const status = await dispenser.status(dtAddress) const status = await dispenser.status(dtAddress)
assert(status.active === false, 'Dispenser is still active') assert(status.active === false, 'Dispenser is still active')
await sleep(sleepMs) await sleep(sleepMs)
@ -362,23 +378,29 @@ describe('Dispenser tests', async () => {
method: 'POST', method: 'POST',
body: JSON.stringify(deactiveQuery) body: JSON.stringify(deactiveQuery)
}) })
const updatedActive = (await updatedResponse.json()).data.dispenser.active const updatedActive = (await updatedResponse.json()).data.dispenser
assert(updatedActive === false, 'incorrect value for: updatedActive') assert(updatedActive.active === false, 'incorrect value for: updatedActive')
assert(updatedActive.eventIndex !== null, 'incorrect value for: eventIndex')
assert(
updatedActive.eventIndex === tx.events.DispenserDeactivated.logIndex,
'incorrect value for: eventIndex'
)
}) })
it('Activates exchange', async () => { it('Activates dispenser', async () => {
const activeQuery = { const activeQuery = {
query: `query {dispenser(id: "${dispenserId}"){active}}` query: `query {dispenser(id: "${dispenserId}"){active, eventIndex}}`
} }
const initialResponse = await fetch(subgraphUrl, { const initialResponse = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
body: JSON.stringify(activeQuery) body: JSON.stringify(activeQuery)
}) })
const initialActive = (await initialResponse.json()).data.dispenser.active const initialActive = (await initialResponse.json()).data.dispenser
assert(initialActive === false, 'incorrect value for: initialActive') assert(initialActive.active === false, 'incorrect value for: initialActive')
assert(initialActive.eventIndex !== null, 'incorrect value for: eventIndex')
// Activate exchange // Activate dispenser
await dispenser.activate(dtAddress, '100', '100', publisher) const tx = await dispenser.activate(dtAddress, '100', '100', publisher)
await sleep(sleepMs) await sleep(sleepMs)
// Check the updated value for active // Check the updated value for active
@ -386,8 +408,13 @@ describe('Dispenser tests', async () => {
method: 'POST', method: 'POST',
body: JSON.stringify(activeQuery) body: JSON.stringify(activeQuery)
}) })
const updatedActive = (await updatedResponse.json()).data.dispenser.active const updatedActive = (await updatedResponse.json()).data.dispenser
assert(updatedActive === true, 'incorrect value for: updatedActive') assert(updatedActive.active === true, 'incorrect value for: updatedActive')
assert(updatedActive.eventIndex !== null, 'incorrect value for: eventIndex')
assert(
updatedActive.eventIndex === tx.events.DispenserActivated.logIndex,
'incorrect value for: eventIndex'
)
}) })
it('User2 gets datatokens from the dispenser', async () => { it('User2 gets datatokens from the dispenser', async () => {
@ -402,6 +429,7 @@ describe('Dispenser tests', async () => {
block block
createdTimestamp createdTimestamp
tx tx
eventIndex
__typename __typename
}}}` }}}`
} }
@ -410,6 +438,7 @@ describe('Dispenser tests', async () => {
method: 'POST', method: 'POST',
body: JSON.stringify(dispenseQuery) body: JSON.stringify(dispenseQuery)
}) })
await sleep(sleepMs)
const before = (await response1.json()).data.dispenser.dispenses const before = (await response1.json()).data.dispenser.dispenses
assert(before.length === 0, 'incorrect value for: dispenses') assert(before.length === 0, 'incorrect value for: dispenses')
@ -423,7 +452,13 @@ describe('Dispenser tests', async () => {
}) })
const dispense = (await response2.json()).data.dispenser.dispenses[0] const dispense = (await response2.json()).data.dispenser.dispenses[0]
assert(dispense.id === `${tx.transactionHash}-${dispenserId}`, 'wrong id') assert(
dispense.id ===
`${
tx.transactionHash
}-${dispenserId}-${tx.events.TokensDispensed.logIndex.toFixed(1)}`,
'wrong id'
)
assert(dispense.dispenser.id === dispenserId, 'incorrect value for: user') assert(dispense.dispenser.id === dispenserId, 'incorrect value for: user')
assert(dispense.user.id === user2, 'incorrect value for: user') assert(dispense.user.id === user2, 'incorrect value for: user')
assert(dispense.amount === amount, 'incorrect value for: user') assert(dispense.amount === amount, 'incorrect value for: user')
@ -431,6 +466,7 @@ describe('Dispenser tests', async () => {
assert(dispense.createdTimestamp >= time, 'incorrect: createdTimestamp') assert(dispense.createdTimestamp >= time, 'incorrect: createdTimestamp')
assert(dispense.createdTimestamp < time + 15, 'incorrect: createdTimestamp') assert(dispense.createdTimestamp < time + 15, 'incorrect: createdTimestamp')
assert(dispense.tx === tx.transactionHash, 'incorrect value for: tx') assert(dispense.tx === tx.transactionHash, 'incorrect value for: tx')
assert(dispense.eventIndex !== null, 'incorrect value for: eventIndex')
assert(dispense.__typename === 'DispenserTransaction', 'wrong __typename') assert(dispense.__typename === 'DispenserTransaction', 'wrong __typename')
}) })
@ -440,21 +476,21 @@ describe('Dispenser tests', async () => {
// Check balance after owner withdraw // Check balance after owner withdraw
const balanceQuery = { const balanceQuery = {
query: `query {dispenser(id: "${dispenserId}"){balance}}` query: `query {dispenser(id: "${dispenserId}"){balance, eventIndex}}`
} }
const response = await fetch(subgraphUrl, { const response = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
body: JSON.stringify(balanceQuery) body: JSON.stringify(balanceQuery)
}) })
const balance = (await response.json()).data.dispenser.balance const balance = (await response.json()).data.dispenser
assert(balance.balance === '0', 'incorrect value for: balance')
assert(balance === '0', 'incorrect value for: balance') assert(balance.eventIndex !== null, 'incorrect value for: eventIndex')
}) })
it('Updates allowed swapper', async () => { it('Updates allowed swapper', async () => {
const swapperQuery = { const swapperQuery = {
query: `query {dispenser(id: "${dispenserId}"){allowedSwapper}}` query: `query {dispenser(id: "${dispenserId}"){allowedSwapper, eventIndex}}`
} }
// Check initial allowedSwapper // Check initial allowedSwapper
const swapperResponse1 = await fetch(subgraphUrl, { const swapperResponse1 = await fetch(subgraphUrl, {
@ -468,7 +504,7 @@ describe('Dispenser tests', async () => {
'incorrect value for: allowedSwapper' 'incorrect value for: allowedSwapper'
) )
await dispenser.setAllowedSwapper(dtAddress, publisher, user1) const tx = await dispenser.setAllowedSwapper(dtAddress, publisher, user1)
await sleep(sleepMs) await sleep(sleepMs)
const swapperResponse2 = await fetch(subgraphUrl, { const swapperResponse2 = await fetch(subgraphUrl, {
@ -476,8 +512,16 @@ describe('Dispenser tests', async () => {
body: JSON.stringify(swapperQuery) body: JSON.stringify(swapperQuery)
}) })
const allowedSwapper2 = (await swapperResponse2.json()).data.dispenser const allowedSwapper2 = (await swapperResponse2.json()).data.dispenser
.allowedSwapper
assert(allowedSwapper2 === user1, 'incorrect value for: allowedSwapper 2') assert(
allowedSwapper2.allowedSwapper === user1,
'incorrect value for: allowedSwapper 2'
)
assert(
allowedSwapper2.eventIndex !== null &&
allowedSwapper2.eventIndex ===
tx.events.DispenserAllowedSwapperChanged.logIndex,
'incorrect value for: eventIndex'
)
}) })
}) })

View File

@ -151,6 +151,7 @@ describe('Fixed Rate Exchange tests', async () => {
transferable, transferable,
createdTimestamp, createdTimestamp,
tx, tx,
eventIndex,
block, block,
orderCount}}` orderCount}}`
} }
@ -191,6 +192,10 @@ describe('Fixed Rate Exchange tests', async () => {
assert(nft.block >= blockNumber, 'incorrect value for: block') assert(nft.block >= blockNumber, 'incorrect value for: block')
assert(nft.block < blockNumber + 50, 'incorrect value for: block') assert(nft.block < blockNumber + 50, 'incorrect value for: block')
assert(nft.orderCount === '0', 'incorrect value for: orderCount') assert(nft.orderCount === '0', 'incorrect value for: orderCount')
assert(
nft.eventIndex !== null && nft.eventIndex > 0,
'incorrect value for: eventIndex'
)
}) })
it('Test DT Fields after deploying Fixed rate exchange', async () => { it('Test DT Fields after deploying Fixed rate exchange', async () => {
@ -220,6 +225,7 @@ describe('Fixed Rate Exchange tests', async () => {
dispensers {id}, dispensers {id},
createdTimestamp, createdTimestamp,
tx, tx,
eventIndex,
block, block,
lastPriceToken, lastPriceToken,
lastPriceValue lastPriceValue
@ -274,6 +280,10 @@ describe('Fixed Rate Exchange tests', async () => {
assert(dt.block >= blockNumber, 'incorrect value for: block') assert(dt.block >= blockNumber, 'incorrect value for: block')
assert(dt.block < blockNumber + 50, 'incorrect value for: block') assert(dt.block < blockNumber + 50, 'incorrect value for: block')
assert(dt.lastPriceValue === '0', 'incorrect value for: lastPriceValue') assert(dt.lastPriceValue === '0', 'incorrect value for: lastPriceValue')
assert(
dt.eventIndex !== null && dt.eventIndex > 0,
'incorrect value for: eventIndex'
)
}) })
it('Test fixedRateExchanges Fields', async () => { it('Test fixedRateExchanges Fields', async () => {
@ -310,6 +320,7 @@ describe('Fixed Rate Exchange tests', async () => {
} }
createdTimestamp createdTimestamp
tx tx
eventIndex
block block
publishMarketFeeAddress publishMarketFeeAddress
publishMarketSwapFee publishMarketSwapFee
@ -385,6 +396,10 @@ describe('Fixed Rate Exchange tests', async () => {
) )
assert(fixedTx.from === publisher, 'incorrect value for: tx') assert(fixedTx.from === publisher, 'incorrect value for: tx')
assert(fixedTx.to === factoryAddress, 'incorrect value for: tx') assert(fixedTx.to === factoryAddress, 'incorrect value for: tx')
assert(
fixed.eventIndex !== null && fixed.eventIndex > 0,
'incorrect value for: eventIndex'
)
}) })
it('Updates Fixed Rate Price', async () => { it('Updates Fixed Rate Price', async () => {
@ -398,6 +413,7 @@ describe('Fixed Rate Exchange tests', async () => {
} }
oldPrice oldPrice
newPrice newPrice
eventIndex
} }
}}` }}`
} }
@ -422,7 +438,7 @@ describe('Fixed Rate Exchange tests', async () => {
// Update price // Update price
const newPrice = '999' const newPrice = '999'
await fixedRate.setRate(publisher, exchangeId, newPrice) const tx = await fixedRate.setRate(publisher, exchangeId, newPrice)
await sleep(sleepMs) await sleep(sleepMs)
// Check price after first update // Check price after first update
@ -441,10 +457,14 @@ describe('Fixed Rate Exchange tests', async () => {
) )
assert(updates2.oldPrice === price1, 'incorrect value: 2nd oldPrice') assert(updates2.oldPrice === price1, 'incorrect value: 2nd oldPrice')
assert(updates2.newPrice === newPrice, 'incorrect value: 2nd newPrice') assert(updates2.newPrice === newPrice, 'incorrect value: 2nd newPrice')
assert(
updates2.eventIndex === tx.events.ExchangeRateChanged.logIndex,
'incorrect value: 2nd eventIndex'
)
// Update price a 2nd time // Update price a 2nd time
const newPrice2 = '1' // '5.123' const newPrice2 = '1' // '5.123'
await fixedRate.setRate(publisher, exchangeId, newPrice2) const tx2 = await fixedRate.setRate(publisher, exchangeId, newPrice2)
await sleep(sleepMs) await sleep(sleepMs)
// Check price after 2nd update // Check price after 2nd update
@ -464,10 +484,14 @@ describe('Fixed Rate Exchange tests', async () => {
) )
assert(updates3.oldPrice === newPrice, 'incorrect value: 3rd oldPrice') assert(updates3.oldPrice === newPrice, 'incorrect value: 3rd oldPrice')
assert(updates3.newPrice === newPrice2, 'incorrect value: 3rd newPrice') assert(updates3.newPrice === newPrice2, 'incorrect value: 3rd newPrice')
assert(
updates3.eventIndex === tx2.events.ExchangeRateChanged.logIndex,
'incorrect value: 3nd eventIndex'
)
}) })
it('Deactivates exchange', async () => { it('Deactivates exchange', async () => {
const deactiveQuery = { const deactiveQuery = {
query: `query {fixedRateExchange(id: "${fixedRateId}"){active}}` query: `query {fixedRateExchange(id: "${fixedRateId}"){active, eventIndex}}`
} }
const initialResponse = await fetch(subgraphUrl, { const initialResponse = await fetch(subgraphUrl, {
@ -488,13 +512,17 @@ describe('Fixed Rate Exchange tests', async () => {
body: JSON.stringify(deactiveQuery) body: JSON.stringify(deactiveQuery)
}) })
const updatedActive = (await updatedResponse.json()).data.fixedRateExchange const updatedActive = (await updatedResponse.json()).data.fixedRateExchange
.active
assert(updatedActive === false, 'incorrect value for: updatedActive') assert(updatedActive.active === false, 'incorrect value for: updatedActive')
assert(
updatedActive.eventIndex !== null && updatedActive.eventIndex > 0,
'incorrect value: eventIndex'
)
}) })
it('Activates exchange', async () => { it('Activates exchange', async () => {
const activeQuery = { const activeQuery = {
query: `query {fixedRateExchange(id: "${fixedRateId}"){active}}` query: `query {fixedRateExchange(id: "${fixedRateId}"){active, eventIndex}}`
} }
const initialResponse = await fetch(subgraphUrl, { const initialResponse = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
@ -514,13 +542,16 @@ describe('Fixed Rate Exchange tests', async () => {
body: JSON.stringify(activeQuery) body: JSON.stringify(activeQuery)
}) })
const updatedActive = (await updatedResponse.json()).data.fixedRateExchange const updatedActive = (await updatedResponse.json()).data.fixedRateExchange
.active assert(updatedActive.active === true, 'incorrect value for: updatedActive')
assert(updatedActive === true, 'incorrect value for: updatedActive') assert(
updatedActive.eventIndex !== null && updatedActive.eventIndex > 0,
'incorrect value: eventIndex'
)
}) })
it('Activate Minting', async () => { it('Activate Minting', async () => {
const mintingQuery = { const mintingQuery = {
query: `query {fixedRateExchange(id: "${fixedRateId}"){withMint}}` query: `query {fixedRateExchange(id: "${fixedRateId}"){withMint, eventIndex}}`
} }
const initialResponse = await fetch(subgraphUrl, { const initialResponse = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
@ -531,7 +562,7 @@ describe('Fixed Rate Exchange tests', async () => {
assert(initialMint === null, 'incorrect value for: initialMint') assert(initialMint === null, 'incorrect value for: initialMint')
// Activate minting // Activate minting
await fixedRate.activateMint(publisher, exchangeId) const tx = await fixedRate.activateMint(publisher, exchangeId)
await sleep(sleepMs) await sleep(sleepMs)
// Check the updated value for active // Check the updated value for active
@ -541,13 +572,16 @@ describe('Fixed Rate Exchange tests', async () => {
}) })
const updatedMint = (await updatedResponse.json()).data.fixedRateExchange const updatedMint = (await updatedResponse.json()).data.fixedRateExchange
.withMint assert(updatedMint.withMint === true, 'incorrect value for: updatedMint')
assert(updatedMint === true, 'incorrect value for: updatedMint') assert(
updatedMint.eventIndex === tx.events.ExchangeMintStateChanged.logIndex,
'incorrect value for: eventIndex'
)
}) })
it('Deactivate Minting', async () => { it('Deactivate Minting', async () => {
const mintingQuery = { const mintingQuery = {
query: `query {fixedRateExchange(id: "${fixedRateId}"){withMint}}` query: `query {fixedRateExchange(id: "${fixedRateId}"){withMint, eventIndex}}`
} }
const initialResponse = await fetch(subgraphUrl, { const initialResponse = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
@ -558,7 +592,7 @@ describe('Fixed Rate Exchange tests', async () => {
assert(initialMint === true, 'incorrect value for: initialMint') assert(initialMint === true, 'incorrect value for: initialMint')
// Activate minting // Activate minting
await fixedRate.deactivateMint(publisher, exchangeId) const tx = await fixedRate.deactivateMint(publisher, exchangeId)
await sleep(sleepMs) await sleep(sleepMs)
// Check the updated value for active // Check the updated value for active
@ -568,8 +602,11 @@ describe('Fixed Rate Exchange tests', async () => {
}) })
const updatedMint = (await updatedResponse.json()).data.fixedRateExchange const updatedMint = (await updatedResponse.json()).data.fixedRateExchange
.withMint assert(updatedMint.withMint === false, 'incorrect value for: updatedMint')
assert(updatedMint === false, 'incorrect value for: updatedMint') assert(
updatedMint.eventIndex === tx.events.ExchangeMintStateChanged.logIndex,
'incorrect value for: eventIndex'
)
}) })
it('User1 buys a datatoken', async () => { it('User1 buys a datatoken', async () => {
@ -584,6 +621,7 @@ describe('Fixed Rate Exchange tests', async () => {
block block
createdTimestamp createdTimestamp
tx tx
eventIndex
oceanFeeAmount oceanFeeAmount
marketFeeAmount marketFeeAmount
consumeMarketFeeAmount consumeMarketFeeAmount
@ -654,7 +692,11 @@ describe('Fixed Rate Exchange tests', async () => {
const swappedAmount = web3.utils.fromWei( const swappedAmount = web3.utils.fromWei(
new BN(tx.returnValues.baseTokenSwappedAmount) new BN(tx.returnValues.baseTokenSwappedAmount)
) )
assert(swaps.id === `${tx.transactionHash}-${fixedRateId}`, 'incorrect: id') assert(
swaps.id ===
`${tx.transactionHash}-${fixedRateId}-${tx.logIndex.toFixed(1)}`,
'incorrect: id'
)
assert(swaps.exchangeId.id === fixedRateId, 'incorrect: exchangeId') assert(swaps.exchangeId.id === fixedRateId, 'incorrect: exchangeId')
assert(swaps.by.id === user1, 'incorrect value for: id') assert(swaps.by.id === user1, 'incorrect value for: id')
assert(swaps.baseTokenAmount === swappedAmount, 'incorrect baseTokenAmount') assert(swaps.baseTokenAmount === swappedAmount, 'incorrect baseTokenAmount')
@ -669,6 +711,7 @@ describe('Fixed Rate Exchange tests', async () => {
'wrong consumeMarketFeeAmount' 'wrong consumeMarketFeeAmount'
) )
assert(swaps.tx === tx.transactionHash, 'incorrect value for: tx') assert(swaps.tx === tx.transactionHash, 'incorrect value for: tx')
assert(swaps.eventIndex === tx.logIndex, 'incorrect value for: eventIndex')
assert(swaps.__typename === 'FixedRateExchangeSwap', 'incorrect __typename') assert(swaps.__typename === 'FixedRateExchangeSwap', 'incorrect __typename')
}) })
it('User1 sells a datatoken', async () => { it('User1 sells a datatoken', async () => {
@ -691,6 +734,7 @@ describe('Fixed Rate Exchange tests', async () => {
block block
createdTimestamp createdTimestamp
tx tx
eventIndex
oceanFeeAmount oceanFeeAmount
__typename __typename
} }
@ -705,7 +749,11 @@ describe('Fixed Rate Exchange tests', async () => {
const swappedAmount = web3.utils.fromWei( const swappedAmount = web3.utils.fromWei(
new BN(tx.returnValues.baseTokenSwappedAmount) new BN(tx.returnValues.baseTokenSwappedAmount)
) )
assert(swaps.id === `${tx.transactionHash}-${fixedRateId}`, 'incorrect: id') assert(
swaps.id ===
`${tx.transactionHash}-${fixedRateId}-${tx.logIndex.toFixed(1)}`,
'incorrect: id'
)
assert(swaps.exchangeId.id === fixedRateId, 'incorrect: exchangeId') assert(swaps.exchangeId.id === fixedRateId, 'incorrect: exchangeId')
assert(swaps.by.id === user1, 'incorrect value for: id') assert(swaps.by.id === user1, 'incorrect value for: id')
assert(swaps.baseTokenAmount === swappedAmount, 'incorrect baseTokenAmount') assert(swaps.baseTokenAmount === swappedAmount, 'incorrect baseTokenAmount')
@ -715,12 +763,13 @@ describe('Fixed Rate Exchange tests', async () => {
assert(swaps.createdTimestamp < time + 25, 'incorrect: createdTimestamp 2') assert(swaps.createdTimestamp < time + 25, 'incorrect: createdTimestamp 2')
assert(swaps.oceanFeeAmount === oceanFeeAmount, 'incorrect: oceanFeeAmount') assert(swaps.oceanFeeAmount === oceanFeeAmount, 'incorrect: oceanFeeAmount')
assert(swaps.tx === tx.transactionHash, 'incorrect value for: tx') assert(swaps.tx === tx.transactionHash, 'incorrect value for: tx')
assert(swaps.eventIndex === tx.logIndex, 'incorrect value for: eventIndex')
assert(swaps.__typename === 'FixedRateExchangeSwap', 'incorrect __typename') assert(swaps.__typename === 'FixedRateExchangeSwap', 'incorrect __typename')
}) })
it('Updates allowed swapper', async () => { it('Updates allowed swapper', async () => {
const swapperQuery = { const swapperQuery = {
query: `query {fixedRateExchange(id: "${fixedRateId}"){allowedSwapper}}` query: `query {fixedRateExchange(id: "${fixedRateId}"){allowedSwapper, eventIndex}}`
} }
// Check initial allowedSwapper // Check initial allowedSwapper
const swapperResponse1 = await fetch(subgraphUrl, { const swapperResponse1 = await fetch(subgraphUrl, {
@ -734,7 +783,7 @@ describe('Fixed Rate Exchange tests', async () => {
'incorrect value for: allowedSwapper' 'incorrect value for: allowedSwapper'
) )
await fixedRate.setAllowedSwapper(publisher, exchangeId, user1) const tx = await fixedRate.setAllowedSwapper(publisher, exchangeId, user1)
await sleep(sleepMs) await sleep(sleepMs)
const swapperResponse2 = await fetch(subgraphUrl, { const swapperResponse2 = await fetch(subgraphUrl, {
@ -742,8 +791,16 @@ describe('Fixed Rate Exchange tests', async () => {
body: JSON.stringify(swapperQuery) body: JSON.stringify(swapperQuery)
}) })
const allowedSwapper2 = (await swapperResponse2.json()).data const allowedSwapper2 = (await swapperResponse2.json()).data
.fixedRateExchange.allowedSwapper .fixedRateExchange
assert(allowedSwapper2 === user1, 'incorrect value for: allowedSwapper 2') assert(
allowedSwapper2.allowedSwapper === user1,
'incorrect value for: allowedSwapper 2'
)
assert(
allowedSwapper2.eventIndex ===
tx.events.ExchangeAllowedSwapperChanged.logIndex,
'incorrect value for: eventIndex'
)
}) })
}) })

View File

@ -121,7 +121,7 @@ describe('NFT tests', async () => {
datatokenAddress = result.events.TokenCreated.returnValues[0] datatokenAddress = result.events.TokenCreated.returnValues[0]
// Check values before updating metadata // Check values before updating metadata
await sleep(2000) await sleep(3000)
nftAddress = erc721Address.toLowerCase() nftAddress = erc721Address.toLowerCase()
const initialQuery = { const initialQuery = {
query: `query { query: `query {
@ -143,6 +143,7 @@ describe('NFT tests', async () => {
transferable, transferable,
createdTimestamp, createdTimestamp,
tx, tx,
eventIndex,
block, block,
orderCount}}` orderCount}}`
} }
@ -150,7 +151,7 @@ describe('NFT tests', async () => {
method: 'POST', method: 'POST',
body: JSON.stringify(initialQuery) body: JSON.stringify(initialQuery)
}) })
await sleep(2000) await sleep(3000)
const nft = (await initialResponse.json()).data.nft const nft = (await initialResponse.json()).data.nft
const tx: TransactionReceipt = await web3.eth.getTransactionReceipt(nft.tx) const tx: TransactionReceipt = await web3.eth.getTransactionReceipt(nft.tx)
assert(nft.id === nftAddress, 'incorrect value for: id') assert(nft.id === nftAddress, 'incorrect value for: id')
@ -182,6 +183,10 @@ describe('NFT tests', async () => {
assert(nft.block >= blockNumber, 'incorrect value for: block') assert(nft.block >= blockNumber, 'incorrect value for: block')
assert(nft.block < blockNumber + 50, 'incorrect value for: block') assert(nft.block < blockNumber + 50, 'incorrect value for: block')
assert(nft.orderCount === '0', 'incorrect value for: orderCount') assert(nft.orderCount === '0', 'incorrect value for: orderCount')
assert(
nft.eventIndex !== null && nft.eventIndex > 0,
'Invalid eventIndex for NFT creation'
)
}) })
it('Update metadata', async () => { it('Update metadata', async () => {
@ -215,7 +220,7 @@ describe('NFT tests', async () => {
) )
// graph tests here // graph tests here
await sleep(2000) await sleep(3000)
const query = { const query = {
query: `query { query: `query {
nft(id:"${nftAddress}"){ nft(id:"${nftAddress}"){
@ -236,6 +241,7 @@ describe('NFT tests', async () => {
transferable, transferable,
createdTimestamp, createdTimestamp,
tx, tx,
eventIndex,
block, block,
orderCount}}` orderCount}}`
} }
@ -243,6 +249,7 @@ describe('NFT tests', async () => {
method: 'POST', method: 'POST',
body: JSON.stringify(query) body: JSON.stringify(query)
}) })
await sleep(3000)
const updatedNft = (await response.json()).data.nft const updatedNft = (await response.json()).data.nft
const tx: TransactionReceipt = await web3.eth.getTransactionReceipt( const tx: TransactionReceipt = await web3.eth.getTransactionReceipt(
updatedNft.tx updatedNft.tx
@ -288,6 +295,10 @@ describe('NFT tests', async () => {
assert(updatedNft.block >= blockNumber, 'incorrect value for: block') assert(updatedNft.block >= blockNumber, 'incorrect value for: block')
assert(updatedNft.block < blockNumber + 50, 'incorrect value for: block') assert(updatedNft.block < blockNumber + 50, 'incorrect value for: block')
assert(updatedNft.orderCount === '0', 'incorrect value for: orderCount') assert(updatedNft.orderCount === '0', 'incorrect value for: orderCount')
assert(
updatedNft.eventIndex !== null && updatedNft.eventIndex > 0,
'Invalid eventIndex for NFT update'
)
}) })
it('Set a key/value in erc725 store', async () => { it('Set a key/value in erc725 store', async () => {
@ -301,6 +312,7 @@ describe('NFT tests', async () => {
key key
value value
} }
eventIndex
} }
}` }`
} }
@ -310,5 +322,9 @@ describe('NFT tests', async () => {
}) })
const updatedNft = (await response.json()).data.nft const updatedNft = (await response.json()).data.nft
assert(updatedNft.nftData.key !== null, 'incorrect value for key') assert(updatedNft.nftData.key !== null, 'incorrect value for key')
assert(
updatedNft.eventIndex !== null && updatedNft.eventIndex > 0,
'Invalid eventIndex for NFT update'
)
}) })
}) })

View File

@ -152,18 +152,24 @@ describe('Simple Publish & consume test', async () => {
) )
// graph tests here // graph tests here
await sleep(2000) await sleep(3000)
const graphNftToken = erc721Address.toLowerCase() const graphNftToken = erc721Address.toLowerCase()
const query = { const query = {
query: `query { query: `query {
nft(id:"${graphNftToken}"){symbol,id}}` nft(id:"${graphNftToken}"){symbol,id,eventIndex}}`
} }
const response = await fetch(subgraphUrl, { const response = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
body: JSON.stringify(query) body: JSON.stringify(query)
}) })
await sleep(3000)
const queryResult = await response.json() const queryResult = await response.json()
assert(queryResult.data.nft.id === graphNftToken) assert(queryResult.data.nft.id === graphNftToken)
assert(
queryResult.data.nft.eventIndex !== null &&
queryResult.data.nft.eventIndex > 0,
'Invalid eventIndex for NFT creation'
)
}) })
it('should publish and transfer an NFT', async () => { it('should publish and transfer an NFT', async () => {
const nftParams: NftCreateData = { const nftParams: NftCreateData = {
@ -188,27 +194,34 @@ describe('Simple Publish & consume test', async () => {
nftParams, nftParams,
erc20Params erc20Params
) )
await sleep(2000) await sleep(3000)
const erc721Address = result.events.NFTCreated.returnValues[0] const erc721Address = result.events.NFTCreated.returnValues[0]
const datatokenAddress = result.events.TokenCreated.returnValues[0] const datatokenAddress = result.events.TokenCreated.returnValues[0]
const graphNftToken = erc721Address.toLowerCase() const graphNftToken = erc721Address.toLowerCase()
const queryOriginalOwner = { const queryOriginalOwner = {
query: `query { query: `query {
nft(id:"${graphNftToken}"){symbol,id,owner{id}}}` nft(id:"${graphNftToken}"){symbol,id,owner{id},eventIndex}}`
} }
const initialResponse = await fetch(subgraphUrl, { const initialResponse = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
body: JSON.stringify(queryOriginalOwner) body: JSON.stringify(queryOriginalOwner)
}) })
await sleep(3000)
const initialResult = await initialResponse.json() const initialResult = await initialResponse.json()
// Checking original owner account has been set correctly // Checking original owner account has been set correctly
assert( assert(
initialResult.data.nft.owner.id.toLowerCase() === initialResult.data.nft.owner.id.toLowerCase() ===
publisherAccount.toLowerCase() publisherAccount.toLowerCase()
) )
const chain = await web3.eth.getChainId() assert(
initialResult.data.nft.eventIndex !== null &&
initialResult.data.nft.eventIndex > 0,
'Invalid eventIndex for NFT creation'
)
// create the files encrypted string // create the files encrypted string
const chain = await web3.eth.getChainId()
let providerResponse = await ProviderInstance.encrypt( let providerResponse = await ProviderInstance.encrypt(
assetUrl, assetUrl,
chain, chain,
@ -235,21 +248,27 @@ describe('Simple Publish & consume test', async () => {
encryptedResponse, encryptedResponse,
'0x' + metadataHash '0x' + metadataHash
) )
await sleep(2000) await sleep(3000)
// Transfer the NFT // Transfer the NFT
await nft.transferNft(graphNftToken, publisherAccount, newOwnerAccount) await nft.transferNft(graphNftToken, publisherAccount, newOwnerAccount)
await sleep(2000) await sleep(3000)
const query2 = { const query2 = {
query: `query { query: `query {
nft(id:"${graphNftToken}"){symbol,id,owner{id}, transferable}}` nft(id:"${graphNftToken}"){symbol,id,owner{id}, transferable, eventIndex}}`
} }
const response = await fetch(subgraphUrl, { const response = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
body: JSON.stringify(query2) body: JSON.stringify(query2)
}) })
await sleep(3000)
const queryResult = await response.json() const queryResult = await response.json()
assert(queryResult.data.nft.owner.id === newOwnerAccount) assert(queryResult.data.nft.owner.id === newOwnerAccount)
assert(
queryResult.data.nft.eventIndex !== null &&
queryResult.data.nft.eventIndex > 0,
'Invalid eventIndex for NFT creation'
)
}) })
it('should save provider fees after startOrder is called', async () => { it('should save provider fees after startOrder is called', async () => {
@ -287,18 +306,20 @@ describe('Simple Publish & consume test', async () => {
1, 1,
setProviderFee setProviderFee
) )
const orderId = `${orderTx.transactionHash.toLowerCase()}-${datatokenAddress.toLowerCase()}-${user1.toLowerCase()}` await sleep(3000)
const orderId = `${orderTx.transactionHash.toLowerCase()}-${datatokenAddress.toLowerCase()}-${user1.toLowerCase()}-${orderTx.events.OrderStarted.logIndex.toFixed(
1
)}`
const query = { const query = {
query: `query {order(id:"${orderId}"){id, providerFee, lastPriceToken{id}}}` query: `query {order(id:"${orderId}"){id, providerFee, lastPriceToken{id}, eventIndex}}`
} }
await sleep(2000) await sleep(3000)
const response = await fetch(subgraphUrl, { const response = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
body: JSON.stringify(query) body: JSON.stringify(query)
}) })
await sleep(3000)
const queryResult = await response.json() const queryResult = await response.json()
const providerFeeJSON = JSON.parse(queryResult.data.order.providerFee) const providerFeeJSON = JSON.parse(queryResult.data.order.providerFee)
@ -321,6 +342,10 @@ describe('Simple Publish & consume test', async () => {
setProviderFee.providerFeeToken.toLowerCase(), setProviderFee.providerFeeToken.toLowerCase(),
'Wrong providerFeeToken set' 'Wrong providerFeeToken set'
) )
assert(
queryResult.data.order.eventIndex !== null,
'Invalid eventIndex for order'
)
}) })
it('should save provider fees after calling reuseOrder on a using a previous txId', async () => { it('should save provider fees after calling reuseOrder on a using a previous txId', async () => {
@ -361,16 +386,19 @@ describe('Simple Publish & consume test', async () => {
assert(orderTx.transactionHash, 'Failed to start order') assert(orderTx.transactionHash, 'Failed to start order')
// Check initial provider fee has been set correctly // Check initial provider fee has been set correctly
const orderId = `${orderTx.transactionHash.toLowerCase()}-${datatokenAddress.toLowerCase()}-${user4.toLowerCase()}` const orderId = `${orderTx.transactionHash.toLowerCase()}-${datatokenAddress.toLowerCase()}-${user4.toLowerCase()}-${orderTx.events.OrderStarted.logIndex.toFixed(
1
)}`
const initialQuery = { const initialQuery = {
query: `query {order(id:"${orderId}"){id, providerFee, lastPriceToken{id}}}` query: `query {order(id:"${orderId}"){id, providerFee, lastPriceToken{id}, eventIndex}}`
} }
await sleep(2000) await sleep(3000)
const initialResponse = await fetch(subgraphUrl, { const initialResponse = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
body: JSON.stringify(initialQuery) body: JSON.stringify(initialQuery)
}) })
await sleep(3000)
const initialQueryResult = await initialResponse.json() const initialQueryResult = await initialResponse.json()
const initialProviderFeeJSON = JSON.parse( const initialProviderFeeJSON = JSON.parse(
initialQueryResult.data.order.providerFee initialQueryResult.data.order.providerFee
@ -393,6 +421,10 @@ describe('Simple Publish & consume test', async () => {
setInitialProviderFee.providerFeeToken.toLowerCase(), setInitialProviderFee.providerFeeToken.toLowerCase(),
'Wrong initial providerFeeToken set' 'Wrong initial providerFeeToken set'
) )
assert(
initialQueryResult.data.order.eventIndex !== null,
'Invalid eventIndex for order'
)
providerFeeAmount = '990000' providerFeeAmount = '990000'
providerValidUntil = '10000' providerValidUntil = '10000'
@ -421,7 +453,7 @@ describe('Simple Publish & consume test', async () => {
const reusedOrder = await datatoken.reuseOrder( const reusedOrder = await datatoken.reuseOrder(
datatokenAddress, datatokenAddress,
user2, user4,
orderTx.transactionHash, orderTx.transactionHash,
setNewProviderFee setNewProviderFee
) )
@ -433,7 +465,11 @@ describe('Simple Publish & consume test', async () => {
// Check the new provider fee has been set in OrderReuse // Check the new provider fee has been set in OrderReuse
const reuseQuery = { const reuseQuery = {
query: `query {orderReuse(id:"${reusedOrder.transactionHash}"){id, providerFee}}` query: `query {orderReuse(id:"${
reusedOrder.transactionHash
}-${reusedOrder.events.OrderReused.logIndex.toFixed(
1
)}"){id, providerFee, eventIndex}}`
} }
await sleep(2000) await sleep(2000)
@ -463,5 +499,17 @@ describe('Simple Publish & consume test', async () => {
setNewProviderFee.providerFeeToken.toLowerCase(), setNewProviderFee.providerFeeToken.toLowerCase(),
'New providerFeeToken set in reuse order is wrong' 'New providerFeeToken set in reuse order is wrong'
) )
assert(
reuseQueryResult.data.orderReuse.eventIndex !== null,
'Invalid eventIndex for reuse order'
)
assert(
reuseQueryResult.data.orderReuse.eventIndex === 0,
'Invalid reuse order event index'
)
assert(
initialQueryResult.data.order.eventIndex === 0,
'Invalid start order event index'
)
}) })
}) })

View File

@ -69,18 +69,23 @@ describe('Tests coverage without provider/aquarius', async () => {
const erc721Address = result.events.NFTCreated.returnValues[0] const erc721Address = result.events.NFTCreated.returnValues[0]
// graph tests here // graph tests here
await sleep(2000) await sleep(3000)
const graphNftToken = erc721Address.toLowerCase() const graphNftToken = erc721Address.toLowerCase()
const query = { const query = {
query: `query { query: `query {
nft(id:"${graphNftToken}"){symbol,id}}` nft(id:"${graphNftToken}"){symbol,id,eventIndex}}`
} }
const response = await fetch(subgraphUrl, { const response = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
body: JSON.stringify(query) body: JSON.stringify(query)
}) })
await sleep(3000)
const queryResult = await response.json() const queryResult = await response.json()
assert(queryResult.data.nft.id === graphNftToken) assert(queryResult.data.nft.id === graphNftToken)
assert(
queryResult.data.nft.eventIndex !== null &&
queryResult.data.nft.eventIndex > 0
)
}) })
it('should publish and transfer an NFT', async () => { it('should publish and transfer an NFT', async () => {
@ -106,7 +111,7 @@ describe('Tests coverage without provider/aquarius', async () => {
nftParams, nftParams,
erc20Params erc20Params
) )
await sleep(2000) await sleep(3000)
const erc721Address = result.events.NFTCreated.returnValues[0] const erc721Address = result.events.NFTCreated.returnValues[0]
const nftAddress = erc721Address.toLowerCase() const nftAddress = erc721Address.toLowerCase()
@ -117,7 +122,7 @@ describe('Tests coverage without provider/aquarius', async () => {
newOwnerAccount newOwnerAccount
) )
await sleep(2000) await sleep(3000)
const query2 = { const query2 = {
query: `query { query: `query {
nft(id:"${nftAddress}"){ nft(id:"${nftAddress}"){
@ -125,23 +130,30 @@ describe('Tests coverage without provider/aquarius', async () => {
id, id,
owner{id}, owner{id},
transferable, transferable,
transferHistory(orderBy: timestamp, orderDirection: desc){id,nft,oldOwner,newOwner,txId,timestamp,block} transferHistory(orderBy: timestamp, orderDirection: desc){id,nft,oldOwner,newOwner,txId,eventIndex,timestamp,block}
}}` }}`
} }
const response = await fetch(subgraphUrl, { const response = await fetch(subgraphUrl, {
method: 'POST', method: 'POST',
body: JSON.stringify(query2) body: JSON.stringify(query2)
}) })
await sleep(3000)
const queryResult = await response.json() const queryResult = await response.json()
const transferHistory = queryResult.data.nft.transferHistory[0] const transferHistory = queryResult.data.nft.transferHistory[0]
assert(queryResult.data.nft.owner.id === newOwnerAccount) assert(queryResult.data.nft.owner.id === newOwnerAccount)
assert( assert(
transferHistory.id === transferHistory.id ===
`${nftAddress}-${tx.transactionHash}-${tx.events.Transfer.logIndex}`, `${nftAddress}-${
tx.transactionHash
}-${tx.events.Transfer.logIndex.toFixed(1)}`,
'Invalid transferHistory Id' 'Invalid transferHistory Id'
) )
assert(transferHistory.txId === tx.transactionHash, 'invalid txId') assert(transferHistory.txId === tx.transactionHash, 'invalid txId')
assert(
transferHistory.eventIndex === tx.events.Transfer.logIndex,
'invalid eventIndex'
)
assert(transferHistory.timestamp) assert(transferHistory.timestamp)
assert(transferHistory.timestamp >= time - 500, 'incorrect value timestamp') assert(transferHistory.timestamp >= time - 500, 'incorrect value timestamp')

View File

@ -324,7 +324,7 @@ describe('veOcean tests', async () => {
}) })
it('Alice should allocate 10% to NFT1', async () => { it('Alice should allocate 10% to NFT1', async () => {
await veAllocate.setAllocation(Alice, '1000', nft1, chainId) const tx = await veAllocate.setAllocation(Alice, '1000', nft1, chainId)
const newTotalAllocation = await veAllocate.getTotalAllocation(Alice) const newTotalAllocation = await veAllocate.getTotalAllocation(Alice)
await sleep(2000) await sleep(2000)
let initialQuery = { let initialQuery = {
@ -332,6 +332,7 @@ describe('veOcean tests', async () => {
veAllocateUsers(id:"${Alice.toLowerCase()}"){ veAllocateUsers(id:"${Alice.toLowerCase()}"){
id, id,
allocatedTotal allocatedTotal
eventIndex
} }
}` }`
} }
@ -347,13 +348,15 @@ describe('veOcean tests', async () => {
' to equal subgraph value ' + ' to equal subgraph value ' +
info[0].allocatedTotal info[0].allocatedTotal
) )
assert(info[0].eventIndex === tx.events.AllocationSet.logIndex)
initialQuery = { initialQuery = {
query: `query { query: `query {
veAllocations( veAllocations(
where: {allocationUser:"${Alice.toLowerCase()}", chainId:"${chainId}", nftAddress:"${nft1.toLowerCase()}"} where: {allocationUser:"${Alice.toLowerCase()}", chainId:"${chainId}", nftAddress:"${nft1.toLowerCase()}"}
){ ){
id, id,
allocated allocated,
eventIndex
} }
}` }`
} }
@ -367,10 +370,11 @@ describe('veOcean tests', async () => {
'Expected totalAllocation 1000 to equal subgraph value ' + 'Expected totalAllocation 1000 to equal subgraph value ' +
info[0].allocatedTotal info[0].allocatedTotal
) )
assert(info[0].eventIndex === tx.events.AllocationSet.logIndex)
}) })
it('Alice should allocate 10% to NFT2 and 20% to NFT3', async () => { it('Alice should allocate 10% to NFT2 and 20% to NFT3', async () => {
await veAllocate.setBatchAllocation( const tx = await veAllocate.setBatchAllocation(
Alice, Alice,
['1000', '2000'], ['1000', '2000'],
[nft2, nft3], [nft2, nft3],
@ -383,7 +387,8 @@ describe('veOcean tests', async () => {
query: `query { query: `query {
veAllocateUsers(id:"${Alice.toLowerCase()}"){ veAllocateUsers(id:"${Alice.toLowerCase()}"){
id, id,
allocatedTotal allocatedTotal,
eventIndex
} }
}` }`
} }
@ -399,13 +404,15 @@ describe('veOcean tests', async () => {
' to equal subgraph value ' + ' to equal subgraph value ' +
info[0].allocatedTotal info[0].allocatedTotal
) )
assert(info[0].eventIndex === tx.events.AllocationSetMultiple.logIndex)
initialQuery = { initialQuery = {
query: `query { query: `query {
veAllocations( veAllocations(
where: {allocationUser:"${Alice.toLowerCase()}", chainId:"${chainId}", nftAddress:"${nft2.toLowerCase()}"} where: {allocationUser:"${Alice.toLowerCase()}", chainId:"${chainId}", nftAddress:"${nft2.toLowerCase()}"}
){ ){
id, id,
allocated allocated,
eventIndex
} }
}` }`
} }
@ -419,6 +426,7 @@ describe('veOcean tests', async () => {
'Expected totalAllocation 1000 to equal subgraph value ' + 'Expected totalAllocation 1000 to equal subgraph value ' +
info[0].allocatedTotal info[0].allocatedTotal
) )
assert(info[0].eventIndex === tx.events.AllocationSetMultiple.logIndex)
initialQuery = { initialQuery = {
query: `query { query: `query {
veAllocations( veAllocations(
@ -749,6 +757,7 @@ describe('veOcean tests', async () => {
block block
timestamp timestamp
tx tx
eventIndex
sender sender
amount amount
cancelTime cancelTime