mirror of
https://github.com/oceanprotocol/ocean-subgraph.git
synced 2024-10-31 23:35:19 +01:00
Compare commits
137 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
2f322ee016 | ||
|
ecc9092f5b | ||
|
ae1a33755f | ||
|
63bc3f8409 | ||
|
b9bfe07a92 | ||
|
d80ba60637 | ||
|
4e939c70c0 | ||
|
ba5e514ddf | ||
|
8930eef827 | ||
|
36ae877984 | ||
|
cf58c9aae4 | ||
|
8bc4dab920 | ||
|
fc07962311 | ||
|
0077cfa69f | ||
|
90ad128bc2 | ||
|
0880f714b0 | ||
|
7ee41bc29b | ||
|
957db42e59 | ||
|
db6c3eeeea | ||
|
329ea980b6 | ||
|
c6004336ae | ||
|
87e42fd6ce | ||
|
f5b5400261 | ||
|
aeef30129a | ||
|
299d196162 | ||
|
fa58272978 | ||
|
bc56752f3c | ||
|
ab62f18c3e | ||
|
a62a4c189d | ||
|
39a1210c82 | ||
|
ae9c371e8f | ||
|
86cc7f0608 | ||
|
b412d2b0b6 | ||
|
207a4ac806 | ||
|
60b8728225 | ||
|
dcaf83775d | ||
|
2ca1280328 | ||
|
e1df119197 | ||
|
c42cd1c283 | ||
|
e30047c430 | ||
|
093b452441 | ||
|
8691538078 | ||
|
5b2ccbc276 | ||
|
9fd0553337 | ||
|
c33868d841 | ||
|
68944f02a5 | ||
|
a77ea45d5f | ||
|
fa071a9cd2 | ||
|
9164897f2c | ||
|
4794dec64e | ||
|
c8541a071e | ||
|
b376cb3942 | ||
|
81b43ecc20 | ||
|
c02b32b47e | ||
|
a6ded85a37 | ||
|
4607c673b4 | ||
|
d888d7d256 | ||
|
420a229a61 | ||
|
0cf40d40ce | ||
|
b803f1eb6b | ||
|
1a44345d05 | ||
|
de5f1aab4b | ||
|
0a3d513262 | ||
|
81eb7ea738 | ||
|
40f09aa6fe | ||
|
1a5b1a500c | ||
|
dd0512e793 | ||
|
140bcc6341 | ||
|
6a9b342c52 | ||
|
ec9d7e733f | ||
|
4c3fd95abc | ||
|
46f88599b4 | ||
|
86c6551f31 | ||
|
1191594196 | ||
|
88a2eecb9b | ||
|
15af2cd609 | ||
|
1a5906b2b3 | ||
|
6925cfdde3 | ||
|
21618b89cf | ||
|
8ad4f4852b | ||
|
4cacee3f45 | ||
|
3de53c5197 | ||
|
7c35711f72 | ||
|
26a53431ea | ||
|
25021ac9ea | ||
|
38a7166041 | ||
|
9c56b00faa | ||
|
957488077b | ||
|
688166e2a0 | ||
|
1e5e461286 | ||
|
e15d69ebf9 | ||
|
a48b376fa5 | ||
|
1bb6c9da78 | ||
|
a923bd943f | ||
|
574b20795b | ||
|
65515d9d91 | ||
|
cb16d01926 | ||
|
1293e6ebd7 | ||
|
004930fd69 | ||
|
2c7ccabe02 | ||
|
a36c2aecce | ||
|
f34e863623 | ||
|
8ef553769a | ||
|
c8a4978bc8 | ||
|
c636ad2680 | ||
|
941dfa28ed | ||
|
d9c5e71d9f | ||
|
20c27cd521 | ||
|
6c4fc1c346 | ||
|
8eb80507c9 | ||
|
5ef15e8845 | ||
|
39ef388831 | ||
|
e6975c60cb | ||
|
5be8f397af | ||
|
bb90457b91 | ||
|
89db52ff41 | ||
|
3a629c7d3e | ||
|
d7e0643c1d | ||
|
a0d3c365bb | ||
|
52ab055c1a | ||
|
0cf93fbc52 | ||
|
5b787d72b5 | ||
|
e9fdbb96d8 | ||
|
c7668c4f1d | ||
|
45ac3c3d96 | ||
|
619571b0c2 | ||
|
29b5efe472 | ||
|
1e2a3b1814 | ||
|
ae78cae608 | ||
|
95fcfe9ba7 | ||
|
7be20246c0 | ||
|
92094086f9 | ||
|
868f991f17 | ||
|
93a05eb767 | ||
|
12ac5cb523 | ||
|
253dc63fa8 | ||
|
24df9f332e |
7
.github/workflows/tests.yml
vendored
7
.github/workflows/tests.yml
vendored
@ -37,8 +37,6 @@ jobs:
|
||||
with:
|
||||
repository: 'oceanprotocol/barge'
|
||||
path: 'barge'
|
||||
ref: main
|
||||
|
||||
- name: Login to Docker Hub
|
||||
if: ${{ env.DOCKERHUB_PASSWORD && env.DOCKERHUB_USERNAME }}
|
||||
run: |
|
||||
@ -51,8 +49,6 @@ jobs:
|
||||
working-directory: ${{ github.workspace }}/barge
|
||||
run: |
|
||||
bash -x start_ocean.sh --with-thegraph --skip-subgraph-deploy --no-dashboard 2>&1 > start_ocean.log &
|
||||
env:
|
||||
CONTRACTS_VERSION: v1.1.7
|
||||
|
||||
- run: npm ci
|
||||
|
||||
@ -74,3 +70,6 @@ jobs:
|
||||
env:
|
||||
ADDRESS_FILE: /home/runner/.ocean/ocean-contracts/artifacts/address.json
|
||||
BARGE_FOLDER: /home/runner/.ocean/
|
||||
- name: docker logs
|
||||
run: docker logs ocean_graph-node_1
|
||||
if: ${{ failure() }}
|
||||
|
244
CHANGELOG.md
244
CHANGELOG.md
@ -4,9 +4,253 @@ All notable changes to this project will be documented in this file. Dates are d
|
||||
|
||||
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
||||
|
||||
#### [v4.0.2](https://github.com/oceanprotocol/ocean-subgraph/compare/v4.0.1...v4.0.2)
|
||||
|
||||
- fix deps [`#744`](https://github.com/oceanprotocol/ocean-subgraph/pull/744)
|
||||
|
||||
#### [v4.0.1](https://github.com/oceanprotocol/ocean-subgraph/compare/v4.0.0...v4.0.1)
|
||||
|
||||
> 22 November 2023
|
||||
|
||||
- Feature/add_optimism & use graph-node 0.33.0 [`#742`](https://github.com/oceanprotocol/ocean-subgraph/pull/742)
|
||||
- Bump chai and @types/chai [`#729`](https://github.com/oceanprotocol/ocean-subgraph/pull/729)
|
||||
- Bump @graphprotocol/graph-cli from 0.56.0 to 0.61.0 [`#738`](https://github.com/oceanprotocol/ocean-subgraph/pull/738)
|
||||
- Bump crypto-js from 4.1.1 to 4.2.0 [`#733`](https://github.com/oceanprotocol/ocean-subgraph/pull/733)
|
||||
- Bump release-it from 15.11.0 to 17.0.0 [`#737`](https://github.com/oceanprotocol/ocean-subgraph/pull/737)
|
||||
- Bump minimist from 1.2.5 to 1.2.6 [`#740`](https://github.com/oceanprotocol/ocean-subgraph/pull/740)
|
||||
- Bump tar from 4.4.13 to 4.4.19 [`#741`](https://github.com/oceanprotocol/ocean-subgraph/pull/741)
|
||||
- Bump @graphprotocol/graph-ts from 0.30.0 to 0.31.0 [`#730`](https://github.com/oceanprotocol/ocean-subgraph/pull/730)
|
||||
- Release 4.0.1 [`cf58c9a`](https://github.com/oceanprotocol/ocean-subgraph/commit/cf58c9aae4aa16f7a30b4c93de72786b1d4b3b3f)
|
||||
|
||||
### [v4.0.0](https://github.com/oceanprotocol/ocean-subgraph/compare/v3.0.10...v4.0.0)
|
||||
|
||||
> 21 November 2023
|
||||
|
||||
- Predictoor support [`#678`](https://github.com/oceanprotocol/ocean-subgraph/pull/678)
|
||||
- bump deps [`#725`](https://github.com/oceanprotocol/ocean-subgraph/pull/725)
|
||||
- Release 4.0.0 [`329ea98`](https://github.com/oceanprotocol/ocean-subgraph/commit/329ea980b628417652de8a444808ba7f470515c8)
|
||||
|
||||
#### [v3.0.10](https://github.com/oceanprotocol/ocean-subgraph/compare/v3.0.9...v3.0.10)
|
||||
|
||||
> 15 August 2023
|
||||
|
||||
- Bump to graphnode 0.28.2 [`#702`](https://github.com/oceanprotocol/ocean-subgraph/pull/702)
|
||||
- Template id detection [`#705`](https://github.com/oceanprotocol/ocean-subgraph/pull/705)
|
||||
- reduce docker siz [`#709`](https://github.com/oceanprotocol/ocean-subgraph/pull/709)
|
||||
- Create README.md [`#698`](https://github.com/oceanprotocol/ocean-subgraph/pull/698)
|
||||
- Bump word-wrap from 1.2.3 to 1.2.4 [`#701`](https://github.com/oceanprotocol/ocean-subgraph/pull/701)
|
||||
- Release 3.0.10 [`f5b5400`](https://github.com/oceanprotocol/ocean-subgraph/commit/f5b540026106cdaddfdfb1ba1edce0cc1eb333fc)
|
||||
|
||||
#### [v3.0.9](https://github.com/oceanprotocol/ocean-subgraph/compare/v3.0.8...v3.0.9)
|
||||
|
||||
> 4 July 2023
|
||||
|
||||
- bump to latest contracts [`#695`](https://github.com/oceanprotocol/ocean-subgraph/pull/695)
|
||||
- Bump release-it from 15.10.3 to 15.11.0 [`#688`](https://github.com/oceanprotocol/ocean-subgraph/pull/688)
|
||||
- Bump mock-local-storage from 1.1.23 to 1.1.24 [`#683`](https://github.com/oceanprotocol/ocean-subgraph/pull/683)
|
||||
- Bump vm2 from 3.9.17 to 3.9.18 [`#681`](https://github.com/oceanprotocol/ocean-subgraph/pull/681)
|
||||
- Release 3.0.9 [`a62a4c1`](https://github.com/oceanprotocol/ocean-subgraph/commit/a62a4c189ddd5f712acb62a683dec1c9c8e067b9)
|
||||
|
||||
#### [v3.0.8](https://github.com/oceanprotocol/ocean-subgraph/compare/v3.0.7...v3.0.8)
|
||||
|
||||
> 16 May 2023
|
||||
|
||||
- Bump @graphprotocol/graph-ts from 0.29.3 to 0.30.0 [`#680`](https://github.com/oceanprotocol/ocean-subgraph/pull/680)
|
||||
- Bump cross-fetch from 3.1.5 to 3.1.6 [`#679`](https://github.com/oceanprotocol/ocean-subgraph/pull/679)
|
||||
- Add lockedAmount to veDelegation [`#672`](https://github.com/oceanprotocol/ocean-subgraph/pull/672)
|
||||
- Fix #628 & #629 & #621: Store event log index for all records [`#630`](https://github.com/oceanprotocol/ocean-subgraph/pull/630)
|
||||
- Bump release-it from 15.10.2 to 15.10.3 [`#673`](https://github.com/oceanprotocol/ocean-subgraph/pull/673)
|
||||
- Bump @types/chai from 4.3.4 to 4.3.5 [`#669`](https://github.com/oceanprotocol/ocean-subgraph/pull/669)
|
||||
- Bump release-it from 15.10.1 to 15.10.2 [`#668`](https://github.com/oceanprotocol/ocean-subgraph/pull/668)
|
||||
- Fix #628 & #629 & #621: Store event log index for all records (#630) [`#628`](https://github.com/oceanprotocol/ocean-subgraph/issues/628)
|
||||
- Release 3.0.8 [`207a4ac`](https://github.com/oceanprotocol/ocean-subgraph/commit/207a4ac806d0f7817ac7f2f4ace5d3c2160ad64c)
|
||||
|
||||
#### [v3.0.7](https://github.com/oceanprotocol/ocean-subgraph/compare/v3.0.6...v3.0.7)
|
||||
|
||||
> 28 April 2023
|
||||
|
||||
- switch amount from wei to numeric [`#666`](https://github.com/oceanprotocol/ocean-subgraph/pull/666)
|
||||
- Release 3.0.7 [`8691538`](https://github.com/oceanprotocol/ocean-subgraph/commit/8691538078f0d8aa81a0543de403a4e540adbfbd)
|
||||
|
||||
#### [v3.0.6](https://github.com/oceanprotocol/ocean-subgraph/compare/v3.0.5...v3.0.6)
|
||||
|
||||
> 28 April 2023
|
||||
|
||||
- proper veDelegation [`#663`](https://github.com/oceanprotocol/ocean-subgraph/pull/663)
|
||||
- Release 3.0.6 [`9fd0553`](https://github.com/oceanprotocol/ocean-subgraph/commit/9fd055333705185b5f507fddcdf0f5502add1f1c)
|
||||
|
||||
#### [v3.0.5](https://github.com/oceanprotocol/ocean-subgraph/compare/v3.0.4...v3.0.5)
|
||||
|
||||
> 26 April 2023
|
||||
|
||||
- add events handlers [`#662`](https://github.com/oceanprotocol/ocean-subgraph/pull/662)
|
||||
- Bump prettier from 2.8.7 to 2.8.8 [`#660`](https://github.com/oceanprotocol/ocean-subgraph/pull/660)
|
||||
- Bump vm2 from 3.9.16 to 3.9.17 [`#659`](https://github.com/oceanprotocol/ocean-subgraph/pull/659)
|
||||
- Add missing veDelegation.save() [`#658`](https://github.com/oceanprotocol/ocean-subgraph/pull/658)
|
||||
- Release 3.0.5 [`68944f0`](https://github.com/oceanprotocol/ocean-subgraph/commit/68944f02a545ea9c06881dcd8883f7dcecd72063)
|
||||
|
||||
#### [v3.0.4](https://github.com/oceanprotocol/ocean-subgraph/compare/v3.0.3...v3.0.4)
|
||||
|
||||
> 14 April 2023
|
||||
|
||||
- add more veOcean stats [`#655`](https://github.com/oceanprotocol/ocean-subgraph/pull/655)
|
||||
- Bump vm2 from 3.9.15 to 3.9.16 [`#653`](https://github.com/oceanprotocol/ocean-subgraph/pull/653)
|
||||
- Bump typescript from 5.0.3 to 5.0.4 [`#652`](https://github.com/oceanprotocol/ocean-subgraph/pull/652)
|
||||
- Bump vm2 from 3.9.11 to 3.9.15 [`#649`](https://github.com/oceanprotocol/ocean-subgraph/pull/649)
|
||||
- Bump release-it from 15.10.0 to 15.10.1 [`#651`](https://github.com/oceanprotocol/ocean-subgraph/pull/651)
|
||||
- Release 3.0.4 [`c8541a0`](https://github.com/oceanprotocol/ocean-subgraph/commit/c8541a071ef13d51e2e62822a194710bef660729)
|
||||
|
||||
#### [v3.0.3](https://github.com/oceanprotocol/ocean-subgraph/compare/v3.0.2...v3.0.3)
|
||||
|
||||
> 6 April 2023
|
||||
|
||||
- Removing amountFraction and adding timestamp [`#647`](https://github.com/oceanprotocol/ocean-subgraph/pull/647)
|
||||
- Fixing decimals issue [`#644`](https://github.com/oceanprotocol/ocean-subgraph/pull/644)
|
||||
- Bump typescript from 5.0.2 to 5.0.3 [`#641`](https://github.com/oceanprotocol/ocean-subgraph/pull/641)
|
||||
- Bump release-it from 15.9.3 to 15.10.0 [`#640`](https://github.com/oceanprotocol/ocean-subgraph/pull/640)
|
||||
- Release 3.0.3 [`d888d7d`](https://github.com/oceanprotocol/ocean-subgraph/commit/d888d7d2566c5fa0fe21903bd16d0b5329815526)
|
||||
|
||||
#### [v3.0.2](https://github.com/oceanprotocol/ocean-subgraph/compare/v3.0.1...v3.0.2)
|
||||
|
||||
> 31 March 2023
|
||||
|
||||
- Storing the fraction of veOcean [`#623`](https://github.com/oceanprotocol/ocean-subgraph/pull/623)
|
||||
- Bump eslint-config-prettier from 8.7.0 to 8.8.0 [`#637`](https://github.com/oceanprotocol/ocean-subgraph/pull/637)
|
||||
- Bump prettier from 2.8.4 to 2.8.7 [`#636`](https://github.com/oceanprotocol/ocean-subgraph/pull/636)
|
||||
- Bump release-it from 15.9.1 to 15.9.3 [`#638`](https://github.com/oceanprotocol/ocean-subgraph/pull/638)
|
||||
- Bump typescript from 4.9.5 to 5.0.2 [`#632`](https://github.com/oceanprotocol/ocean-subgraph/pull/632)
|
||||
- Bump release-it from 15.8.0 to 15.9.1 [`#634`](https://github.com/oceanprotocol/ocean-subgraph/pull/634)
|
||||
- Update ocean-lib with 2.7.0 version. [`#633`](https://github.com/oceanprotocol/ocean-subgraph/pull/633)
|
||||
- Bump eslint-config-prettier from 8.6.0 to 8.7.0 [`#625`](https://github.com/oceanprotocol/ocean-subgraph/pull/625)
|
||||
- Bump @oceanprotocol/lib from 2.6.1 to 2.6.3 [`#614`](https://github.com/oceanprotocol/ocean-subgraph/pull/614)
|
||||
- Bump release-it from 15.7.0 to 15.8.0 [`#624`](https://github.com/oceanprotocol/ocean-subgraph/pull/624)
|
||||
- Bump @oceanprotocol/contracts from 1.1.8 to 1.1.12 [`#627`](https://github.com/oceanprotocol/ocean-subgraph/pull/627)
|
||||
- Bump release-it from 15.6.0 to 15.7.0 [`#618`](https://github.com/oceanprotocol/ocean-subgraph/pull/618)
|
||||
- Update README.md [`#617`](https://github.com/oceanprotocol/ocean-subgraph/pull/617)
|
||||
- Update copyright year. [`#615`](https://github.com/oceanprotocol/ocean-subgraph/pull/615)
|
||||
- Bump prettier from 2.8.3 to 2.8.4 [`#612`](https://github.com/oceanprotocol/ocean-subgraph/pull/612)
|
||||
- Bump http-cache-semantics from 4.1.0 to 4.1.1 [`#608`](https://github.com/oceanprotocol/ocean-subgraph/pull/608)
|
||||
- Bump @graphprotocol/graph-ts from 0.29.1 to 0.29.3 [`#611`](https://github.com/oceanprotocol/ocean-subgraph/pull/611)
|
||||
- Bump typescript from 4.9.4 to 4.9.5 [`#610`](https://github.com/oceanprotocol/ocean-subgraph/pull/610)
|
||||
- Bump @graphprotocol/graph-cli from 0.37.7 to 0.38.0 [`#609`](https://github.com/oceanprotocol/ocean-subgraph/pull/609)
|
||||
- Release 3.0.2 [`de5f1aa`](https://github.com/oceanprotocol/ocean-subgraph/commit/de5f1aab4bc70d6ec831fa0f24099666ef3c46a1)
|
||||
|
||||
#### [v3.0.1](https://github.com/oceanprotocol/ocean-subgraph/compare/v3.0.0...v3.0.1)
|
||||
|
||||
> 27 January 2023
|
||||
|
||||
- fix veDeposit id generation [`#606`](https://github.com/oceanprotocol/ocean-subgraph/pull/606)
|
||||
- Bump @graphprotocol/graph-cli from 0.37.2 to 0.37.7 [`#603`](https://github.com/oceanprotocol/ocean-subgraph/pull/603)
|
||||
- Bump eslint-plugin-import from 2.27.4 to 2.27.5 [`#602`](https://github.com/oceanprotocol/ocean-subgraph/pull/602)
|
||||
- Tracking OPC fees [`#593`](https://github.com/oceanprotocol/ocean-subgraph/pull/593)
|
||||
- Bump prettier from 2.8.2 to 2.8.3 [`#600`](https://github.com/oceanprotocol/ocean-subgraph/pull/600)
|
||||
- Bump @graphprotocol/graph-cli from 0.37.1 to 0.37.2 [`#599`](https://github.com/oceanprotocol/ocean-subgraph/pull/599)
|
||||
- Bump eslint-plugin-import from 2.26.0 to 2.27.4 [`#601`](https://github.com/oceanprotocol/ocean-subgraph/pull/601)
|
||||
- Bump eslint-config-prettier from 8.5.0 to 8.6.0 [`#596`](https://github.com/oceanprotocol/ocean-subgraph/pull/596)
|
||||
- Bump prettier from 2.8.1 to 2.8.2 [`#597`](https://github.com/oceanprotocol/ocean-subgraph/pull/597)
|
||||
- Bump @oceanprotocol/lib from 2.6.0 to 2.6.1 [`#598`](https://github.com/oceanprotocol/ocean-subgraph/pull/598)
|
||||
- Bump json5 from 1.0.1 to 1.0.2 [`#594`](https://github.com/oceanprotocol/ocean-subgraph/pull/594)
|
||||
- Bump @graphprotocol/graph-ts from 0.29.0 to 0.29.1 [`#590`](https://github.com/oceanprotocol/ocean-subgraph/pull/590)
|
||||
- Bump @oceanprotocol/lib from 2.5.2 to 2.6.0 [`#591`](https://github.com/oceanprotocol/ocean-subgraph/pull/591)
|
||||
- Bump release-it from 15.5.1 to 15.6.0 [`#592`](https://github.com/oceanprotocol/ocean-subgraph/pull/592)
|
||||
- Bump typescript from 4.9.3 to 4.9.4 [`#586`](https://github.com/oceanprotocol/ocean-subgraph/pull/586)
|
||||
- Bump mocha from 10.1.0 to 10.2.0 [`#583`](https://github.com/oceanprotocol/ocean-subgraph/pull/583)
|
||||
- Bump qs from 6.5.2 to 6.5.3 [`#587`](https://github.com/oceanprotocol/ocean-subgraph/pull/587)
|
||||
- Bump @graphprotocol/graph-cli from 0.37.0 to 0.37.1 [`#585`](https://github.com/oceanprotocol/ocean-subgraph/pull/585)
|
||||
- Bump prettier from 2.8.0 to 2.8.1 [`#584`](https://github.com/oceanprotocol/ocean-subgraph/pull/584)
|
||||
- Bump @graphprotocol/graph-cli from 0.36.1 to 0.37.0 [`#578`](https://github.com/oceanprotocol/ocean-subgraph/pull/578)
|
||||
- Bump decode-uri-component from 0.2.0 to 0.2.2 [`#581`](https://github.com/oceanprotocol/ocean-subgraph/pull/581)
|
||||
- Bump release-it from 15.5.0 to 15.5.1 [`#579`](https://github.com/oceanprotocol/ocean-subgraph/pull/579)
|
||||
- Bump @types/mocha from 10.0.0 to 10.0.1 [`#580`](https://github.com/oceanprotocol/ocean-subgraph/pull/580)
|
||||
- Bump prettier from 2.7.1 to 2.8.0 [`#577`](https://github.com/oceanprotocol/ocean-subgraph/pull/577)
|
||||
- Release 2.1.4 [`7c35711`](https://github.com/oceanprotocol/ocean-subgraph/commit/7c35711f722b7ea487d8b8c9aa3e42d71f2beb56)
|
||||
- Release 3.0.1 [`3de53c5`](https://github.com/oceanprotocol/ocean-subgraph/commit/3de53c519750ca40ec269ed21f7c17773b53b139)
|
||||
|
||||
### [v3.0.0](https://github.com/oceanprotocol/ocean-subgraph/compare/v2.1.4...v3.0.0)
|
||||
|
||||
> 24 November 2022
|
||||
|
||||
#### [v2.1.4](https://github.com/oceanprotocol/ocean-subgraph/compare/v2.1.3...v2.1.4)
|
||||
|
||||
> 27 January 2023
|
||||
|
||||
- fix veDeposit id generation [`#606`](https://github.com/oceanprotocol/ocean-subgraph/pull/606)
|
||||
- Bump @graphprotocol/graph-cli from 0.37.2 to 0.37.7 [`#603`](https://github.com/oceanprotocol/ocean-subgraph/pull/603)
|
||||
- Bump eslint-plugin-import from 2.27.4 to 2.27.5 [`#602`](https://github.com/oceanprotocol/ocean-subgraph/pull/602)
|
||||
- Tracking OPC fees [`#593`](https://github.com/oceanprotocol/ocean-subgraph/pull/593)
|
||||
- Bump prettier from 2.8.2 to 2.8.3 [`#600`](https://github.com/oceanprotocol/ocean-subgraph/pull/600)
|
||||
- Bump @graphprotocol/graph-cli from 0.37.1 to 0.37.2 [`#599`](https://github.com/oceanprotocol/ocean-subgraph/pull/599)
|
||||
- Bump eslint-plugin-import from 2.26.0 to 2.27.4 [`#601`](https://github.com/oceanprotocol/ocean-subgraph/pull/601)
|
||||
- Bump eslint-config-prettier from 8.5.0 to 8.6.0 [`#596`](https://github.com/oceanprotocol/ocean-subgraph/pull/596)
|
||||
- Bump prettier from 2.8.1 to 2.8.2 [`#597`](https://github.com/oceanprotocol/ocean-subgraph/pull/597)
|
||||
- Bump @oceanprotocol/lib from 2.6.0 to 2.6.1 [`#598`](https://github.com/oceanprotocol/ocean-subgraph/pull/598)
|
||||
- Bump json5 from 1.0.1 to 1.0.2 [`#594`](https://github.com/oceanprotocol/ocean-subgraph/pull/594)
|
||||
- Bump @graphprotocol/graph-ts from 0.29.0 to 0.29.1 [`#590`](https://github.com/oceanprotocol/ocean-subgraph/pull/590)
|
||||
- Bump @oceanprotocol/lib from 2.5.2 to 2.6.0 [`#591`](https://github.com/oceanprotocol/ocean-subgraph/pull/591)
|
||||
- Bump release-it from 15.5.1 to 15.6.0 [`#592`](https://github.com/oceanprotocol/ocean-subgraph/pull/592)
|
||||
- Bump typescript from 4.9.3 to 4.9.4 [`#586`](https://github.com/oceanprotocol/ocean-subgraph/pull/586)
|
||||
- Bump mocha from 10.1.0 to 10.2.0 [`#583`](https://github.com/oceanprotocol/ocean-subgraph/pull/583)
|
||||
- Bump qs from 6.5.2 to 6.5.3 [`#587`](https://github.com/oceanprotocol/ocean-subgraph/pull/587)
|
||||
- Bump @graphprotocol/graph-cli from 0.37.0 to 0.37.1 [`#585`](https://github.com/oceanprotocol/ocean-subgraph/pull/585)
|
||||
- Bump prettier from 2.8.0 to 2.8.1 [`#584`](https://github.com/oceanprotocol/ocean-subgraph/pull/584)
|
||||
- Bump @graphprotocol/graph-cli from 0.36.1 to 0.37.0 [`#578`](https://github.com/oceanprotocol/ocean-subgraph/pull/578)
|
||||
- Bump decode-uri-component from 0.2.0 to 0.2.2 [`#581`](https://github.com/oceanprotocol/ocean-subgraph/pull/581)
|
||||
- Bump release-it from 15.5.0 to 15.5.1 [`#579`](https://github.com/oceanprotocol/ocean-subgraph/pull/579)
|
||||
- Bump @types/mocha from 10.0.0 to 10.0.1 [`#580`](https://github.com/oceanprotocol/ocean-subgraph/pull/580)
|
||||
- Bump prettier from 2.7.1 to 2.8.0 [`#577`](https://github.com/oceanprotocol/ocean-subgraph/pull/577)
|
||||
- nft transfer event [`#573`](https://github.com/oceanprotocol/ocean-subgraph/pull/573)
|
||||
- add lastPriceToken [`#567`](https://github.com/oceanprotocol/ocean-subgraph/pull/567)
|
||||
- Bump typescript from 4.8.4 to 4.9.3 [`#576`](https://github.com/oceanprotocol/ocean-subgraph/pull/576)
|
||||
- Bump @graphprotocol/graph-cli from 0.35.0 to 0.36.1 [`#575`](https://github.com/oceanprotocol/ocean-subgraph/pull/575)
|
||||
- Bump @oceanprotocol/lib from 2.5.1 to 2.5.2 [`#574`](https://github.com/oceanprotocol/ocean-subgraph/pull/574)
|
||||
- Bump @graphprotocol/graph-ts from 0.28.1 to 0.29.0 [`#571`](https://github.com/oceanprotocol/ocean-subgraph/pull/571)
|
||||
- Bump chai and @types/chai [`#572`](https://github.com/oceanprotocol/ocean-subgraph/pull/572)
|
||||
- Bump @oceanprotocol/lib from 2.4.0 to 2.5.1 [`#569`](https://github.com/oceanprotocol/ocean-subgraph/pull/569)
|
||||
- Bump @oceanprotocol/lib from 2.3.0 to 2.4.0 [`#568`](https://github.com/oceanprotocol/ocean-subgraph/pull/568)
|
||||
- Bump @oceanprotocol/contracts from 1.1.7 to 1.1.8 [`#566`](https://github.com/oceanprotocol/ocean-subgraph/pull/566)
|
||||
- Bump @oceanprotocol/lib from 2.2.2 to 2.3.0 [`#565`](https://github.com/oceanprotocol/ocean-subgraph/pull/565)
|
||||
- Bump @graphprotocol/graph-ts from 0.28.0 to 0.28.1 [`#559`](https://github.com/oceanprotocol/ocean-subgraph/pull/559)
|
||||
- Bump @graphprotocol/graph-cli from 0.34.0 to 0.35.0 [`#560`](https://github.com/oceanprotocol/ocean-subgraph/pull/560)
|
||||
- Bump mocha from 10.0.0 to 10.1.0 [`#561`](https://github.com/oceanprotocol/ocean-subgraph/pull/561)
|
||||
- Bump @oceanprotocol/lib from 2.2.1 to 2.2.2 [`#562`](https://github.com/oceanprotocol/ocean-subgraph/pull/562)
|
||||
- Bump @oceanprotocol/lib from 2.1.1 to 2.2.1 [`#557`](https://github.com/oceanprotocol/ocean-subgraph/pull/557)
|
||||
- Bump release-it from 15.4.2 to 15.5.0 [`#558`](https://github.com/oceanprotocol/ocean-subgraph/pull/558)
|
||||
- Bump @types/mocha from 9.1.1 to 10.0.0 [`#556`](https://github.com/oceanprotocol/ocean-subgraph/pull/556)
|
||||
- Bump @graphprotocol/graph-cli from 0.33.1 to 0.34.0 [`#555`](https://github.com/oceanprotocol/ocean-subgraph/pull/555)
|
||||
- Bump typescript from 4.8.3 to 4.8.4 [`#554`](https://github.com/oceanprotocol/ocean-subgraph/pull/554)
|
||||
- Bump @graphprotocol/graph-ts from 0.27.0 to 0.28.0 [`#553`](https://github.com/oceanprotocol/ocean-subgraph/pull/553)
|
||||
- Release 2.1.4 [`7c35711`](https://github.com/oceanprotocol/ocean-subgraph/commit/7c35711f722b7ea487d8b8c9aa3e42d71f2beb56)
|
||||
|
||||
#### [v2.1.3](https://github.com/oceanprotocol/ocean-subgraph/compare/v2.1.2...v2.1.3)
|
||||
|
||||
> 30 September 2022
|
||||
|
||||
- add chainId and nftAddress [`#552`](https://github.com/oceanprotocol/ocean-subgraph/pull/552)
|
||||
- Bump vm2 from 3.9.9 to 3.9.11 [`#550`](https://github.com/oceanprotocol/ocean-subgraph/pull/550)
|
||||
- Release 2.1.3 [`ae78cae`](https://github.com/oceanprotocol/ocean-subgraph/commit/ae78cae6083514592756f2549f21a307361d96d8)
|
||||
|
||||
#### [v2.1.2](https://github.com/oceanprotocol/ocean-subgraph/compare/v2.1.1...v2.1.2)
|
||||
|
||||
> 28 September 2022
|
||||
|
||||
- fix tokenRemoved [`#549`](https://github.com/oceanprotocol/ocean-subgraph/pull/549)
|
||||
- Bump @oceanprotocol/lib from 2.0.2 to 2.1.1 [`#545`](https://github.com/oceanprotocol/ocean-subgraph/pull/545)
|
||||
- Bump eslint-config-oceanprotocol from 2.0.3 to 2.0.4 [`#546`](https://github.com/oceanprotocol/ocean-subgraph/pull/546)
|
||||
- Release 2.1.2 [`9209408`](https://github.com/oceanprotocol/ocean-subgraph/commit/92094086f98ebe7470f1fcbeeb297fbb695a431e)
|
||||
|
||||
#### [v2.1.1](https://github.com/oceanprotocol/ocean-subgraph/compare/v2.1.0...v2.1.1)
|
||||
|
||||
> 26 September 2022
|
||||
|
||||
- fix allocation [`#544`](https://github.com/oceanprotocol/ocean-subgraph/pull/544)
|
||||
- Release 2.1.1 [`253dc63`](https://github.com/oceanprotocol/ocean-subgraph/commit/253dc63fa853011ed95f3501cc4cf0eed6d22f73)
|
||||
|
||||
#### [v2.1.0](https://github.com/oceanprotocol/ocean-subgraph/compare/v2.0.7...v2.1.0)
|
||||
|
||||
> 23 September 2022
|
||||
|
||||
- Feature/more ve [`#543`](https://github.com/oceanprotocol/ocean-subgraph/pull/543)
|
||||
- Release 2.1.0 [`6c4b270`](https://github.com/oceanprotocol/ocean-subgraph/commit/6c4b2705645632b23dc90809868f25550238f2e1)
|
||||
|
||||
#### [v2.0.7](https://github.com/oceanprotocol/ocean-subgraph/compare/v2.0.6...v2.0.7)
|
||||
|
||||
|
21
Dockerfile
21
Dockerfile
@ -1,9 +1,24 @@
|
||||
FROM node:16
|
||||
|
||||
FROM ubuntu:20.04 as base
|
||||
RUN apt-get update && apt-get -y install bash curl
|
||||
RUN curl -sL https://deb.nodesource.com/setup_16.x -o /tmp/nodesource_setup.sh
|
||||
RUN bash /tmp/nodesource_setup.sh
|
||||
RUN apt install nodejs
|
||||
|
||||
|
||||
|
||||
FROM base as builder
|
||||
RUN apt-get update && apt-get -y install wget
|
||||
COPY package*.json /usr/src/app/
|
||||
WORKDIR /usr/src/app
|
||||
RUN npm install
|
||||
WORKDIR /usr/src/app/
|
||||
ENV NODE_ENV=production
|
||||
RUN npm ci
|
||||
|
||||
|
||||
FROM base as runner
|
||||
ENV NODE_ENV=production
|
||||
COPY . /usr/src/app
|
||||
WORKDIR /usr/src/app/
|
||||
COPY --from=builder /usr/src/app/node_modules/ /usr/src/app/node_modules/
|
||||
ENV DEPLOY_SUBGRAPH=true
|
||||
ENTRYPOINT ["/usr/src/app/docker-entrypoint.sh"]
|
10
README.md
10
README.md
@ -30,10 +30,12 @@
|
||||
|
||||
This subgraph is deployed under `/subgraphs/name/oceanprotocol/ocean-subgraph/` namespace for all networks the Ocean Protocol contracts are deployed to:
|
||||
|
||||
- [v4.subgraph.ropsten.oceanprotocol.com](https://v4.subgraph.ropsten.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql)
|
||||
- [v4.subgraph.rinkeby.oceanprotocol.com](https://v4.subgraph.rinkeby.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql)
|
||||
- [v4.subgraph.mainnet.oceanprotocol.com](https://v4.subgraph.mainnet.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql)
|
||||
- [v4.subgraph.polygon.oceanprotocol.com](https://v4.subgraph.polygon.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql)
|
||||
- [v4.subgraph.bsc.oceanprotocol.com](https://v4.subgraph.bsc.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql)
|
||||
- [v4.subgraph.moonriver.oceanprotocol.com](https://v4.subgraph.moonriver.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql)
|
||||
- [v4.subgraph.energyweb.oceanprotocol.com](https://v4.subgraph.energyweb.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql)
|
||||
- [v4.subgraph.mumbai.oceanprotocol.com](https://v4.subgraph.mumbai.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql)
|
||||
- [v4.subgraph.moonbase.oceanprotocol.com](https://v4.subgraph.moonbase.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph/graphql)
|
||||
|
||||
## ⛵ Example Queries
|
||||
|
||||
@ -258,7 +260,7 @@ You can edit the event handler code and then run `npm run deploy:local`, with so
|
||||
## 🏛 License
|
||||
|
||||
```
|
||||
Copyright ((C)) 2022 Ocean Protocol Foundation
|
||||
Copyright ((C)) 2023 Ocean Protocol Foundation
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
|
@ -1,422 +0,0 @@
|
||||
{
|
||||
"_format": "hh-sol-artifact-1",
|
||||
"contractName": "ERC721RolesAddress",
|
||||
"sourceName": "contracts/utils/ERC721RolesAddress.sol",
|
||||
"abi": [
|
||||
{
|
||||
"anonymous": false,
|
||||
"inputs": [
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "user",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "signer",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "timestamp",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "blockNumber",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"name": "AddedManager",
|
||||
"type": "event"
|
||||
},
|
||||
{
|
||||
"anonymous": false,
|
||||
"inputs": [
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "user",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "signer",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "timestamp",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "blockNumber",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"name": "AddedTo725StoreList",
|
||||
"type": "event"
|
||||
},
|
||||
{
|
||||
"anonymous": false,
|
||||
"inputs": [
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "user",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "signer",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "timestamp",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "blockNumber",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"name": "AddedToCreateERC20List",
|
||||
"type": "event"
|
||||
},
|
||||
{
|
||||
"anonymous": false,
|
||||
"inputs": [
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "user",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "signer",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "timestamp",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "blockNumber",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"name": "AddedToMetadataList",
|
||||
"type": "event"
|
||||
},
|
||||
{
|
||||
"anonymous": false,
|
||||
"inputs": [
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "signer",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "timestamp",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "blockNumber",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"name": "CleanedPermissions",
|
||||
"type": "event"
|
||||
},
|
||||
{
|
||||
"anonymous": false,
|
||||
"inputs": [
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "user",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "signer",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "timestamp",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "blockNumber",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"name": "RemovedFrom725StoreList",
|
||||
"type": "event"
|
||||
},
|
||||
{
|
||||
"anonymous": false,
|
||||
"inputs": [
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "user",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "signer",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "timestamp",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "blockNumber",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"name": "RemovedFromCreateERC20List",
|
||||
"type": "event"
|
||||
},
|
||||
{
|
||||
"anonymous": false,
|
||||
"inputs": [
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "user",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "signer",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "timestamp",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "blockNumber",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"name": "RemovedFromMetadataList",
|
||||
"type": "event"
|
||||
},
|
||||
{
|
||||
"anonymous": false,
|
||||
"inputs": [
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "user",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": true,
|
||||
"internalType": "address",
|
||||
"name": "signer",
|
||||
"type": "address"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "timestamp",
|
||||
"type": "uint256"
|
||||
},
|
||||
{
|
||||
"indexed": false,
|
||||
"internalType": "uint256",
|
||||
"name": "blockNumber",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"name": "RemovedManager",
|
||||
"type": "event"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "_allowedAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "addTo725StoreList",
|
||||
"outputs": [],
|
||||
"stateMutability": "nonpayable",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "_allowedAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "addToCreateERC20List",
|
||||
"outputs": [],
|
||||
"stateMutability": "nonpayable",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "_allowedAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "addToMetadataList",
|
||||
"outputs": [],
|
||||
"stateMutability": "nonpayable",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "uint256",
|
||||
"name": "",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"name": "auth",
|
||||
"outputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"stateMutability": "view",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "user",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "getPermissions",
|
||||
"outputs": [
|
||||
{
|
||||
"components": [
|
||||
{
|
||||
"internalType": "bool",
|
||||
"name": "manager",
|
||||
"type": "bool"
|
||||
},
|
||||
{
|
||||
"internalType": "bool",
|
||||
"name": "deployERC20",
|
||||
"type": "bool"
|
||||
},
|
||||
{
|
||||
"internalType": "bool",
|
||||
"name": "updateMetadata",
|
||||
"type": "bool"
|
||||
},
|
||||
{
|
||||
"internalType": "bool",
|
||||
"name": "store",
|
||||
"type": "bool"
|
||||
}
|
||||
],
|
||||
"internalType": "struct ERC721RolesAddress.Roles",
|
||||
"name": "",
|
||||
"type": "tuple"
|
||||
}
|
||||
],
|
||||
"stateMutability": "view",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "_allowedAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "removeFrom725StoreList",
|
||||
"outputs": [],
|
||||
"stateMutability": "nonpayable",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "_allowedAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "removeFromCreateERC20List",
|
||||
"outputs": [],
|
||||
"stateMutability": "nonpayable",
|
||||
"type": "function"
|
||||
},
|
||||
{
|
||||
"inputs": [
|
||||
{
|
||||
"internalType": "address",
|
||||
"name": "_allowedAddress",
|
||||
"type": "address"
|
||||
}
|
||||
],
|
||||
"name": "removeFromMetadataList",
|
||||
"outputs": [],
|
||||
"stateMutability": "nonpayable",
|
||||
"type": "function"
|
||||
}
|
||||
],
|
||||
"bytecode": "0x608060405234801561001057600080fd5b5061090f806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063431053ac1161005b578063431053ac1461019f5780634a63740a146101b2578063b0c41ead146101c5578063fe1ec880146101f057600080fd5b806310c558bf1461008d578063160a7925146100a257806319c186e514610179578063273e06b31461018c575b600080fd5b6100a061009b366004610859565b610203565b005b6101356100b0366004610859565b604080516080810182526000808252602082018190529181018290526060810191909152506001600160a01b0316600090815260208181526040918290208251608081018452905460ff808216151583526101008204811615159383019390935262010000810483161515938201939093526301000000909204161515606082015290565b604051610170919081511515815260208083015115159082015260408083015115159082015260609182015115159181019190915260800190565b60405180910390f35b6100a0610187366004610859565b6102f0565b6100a061019a366004610859565b6103ca565b6100a06101ad366004610859565b6104fc565b6100a06101c0366004610859565b61062d565b6101d86101d3366004610889565b610703565b6040516001600160a01b039091168152602001610170565b6100a06101fe366004610859565b61072d565b3360009081526020819052604090205460ff1615156001146102405760405162461bcd60e51b8152600401610237906108a2565b60405180910390fd5b6001600160a01b038116600081815260208190526040808220805462ff000019166201000017815560018054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b0319168417905551909133917fc2a42571a74ce1442c8c44d375ba9442e7d55d94b37afeace261c83c62128fa4906102e49042904390918252602082015260400190565b60405180910390a35050565b3360009081526020819052604090205460ff1615156001146103245760405162461bcd60e51b8152600401610237906108a2565b6001600160a01b038116600081815260208190526040808220805463ff0000001916630100000017815560018054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b0319168417905551909133917feb09276310ed110a7e565d64966d0ff68a47112d2dd5eeb6cbd7451836ce35ee906102e49042904390918252602082015260400190565b3360009081526020819052604090205460ff1615156001148061041b5750336001600160a01b03821614801561041b5750336000908152602081905260409020546301000000900460ff1615156001145b1561047f576001600160a01b03811660008181526020818152604091829020805463ff000000191681558251428152439281019290925292339290917fc929b18b08ffea86a1f95e29384dbe8968f2fcbd70cfd735df3aba1cc548cbf391016102e4565b60405162461bcd60e51b815260206004820152604660248201527f455243373231526f6c6573416464726573733a204e6f7420656e6f756768207060448201527f65726d697373696f6e7320746f2072656d6f76652066726f6d2037323553746f6064820152651c99531a5cdd60d21b608482015260a401610237565b3360009081526020819052604090205460ff1615156001148061054c5750336001600160a01b03821614801561054c57503360009081526020819052604090205462010000900460ff1615156001145b156105af576001600160a01b03811660008181526020818152604091829020805462ff0000191681558251428152439281019290925292339290917f9b41e1311fa819e825bc77fa2568492112e15ea92d173f3f8ee1c8ec3c1c562b91016102e4565b60405162461bcd60e51b815260206004820152604760248201527f455243373231526f6c6573416464726573733a204e6f7420656e6f756768207060448201527f65726d697373696f6e7320746f2072656d6f76652066726f6d206d65746164616064820152661d18481b1a5cdd60ca1b608482015260a401610237565b3360009081526020819052604090205460ff1615156001146106615760405162461bcd60e51b8152600401610237906108a2565b6001600160a01b038116600081815260208190526040808220805461ff00191661010017815560018054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b0319168417905551909133917f0572d56343be407a66810f01449212e8545e14ff5049c479d34be944cdfd0d4f906102e49042904390918252602082015260400190565b6001818154811061071357600080fd5b6000918252602090912001546001600160a01b0316905081565b3360009081526020819052604090205460ff1615156001148061077d5750336001600160a01b03821614801561077d57503360009081526020819052604090205460ff6101009091041615156001145b156107df576001600160a01b03811660008181526020818152604091829020805461ff00191681558251428152439281019290925292339290917f59bd33f4c27cc16a2d74450e1fa43d7896020be9aecea4bee009db9294de899791016102e4565b60405162461bcd60e51b815260206004820152604360248201527f455243373231526f6c6573416464726573733a204e6f7420656e6f756768207060448201527f65726d697373696f6e7320746f2072656d6f76652066726f6d2045524332304c6064820152621a5cdd60ea1b608482015260a401610237565b60006020828403121561086b57600080fd5b81356001600160a01b038116811461088257600080fd5b9392505050565b60006020828403121561089b57600080fd5b5035919050565b6020808252601f908201527f455243373231526f6c6573416464726573733a204e4f54204d414e414745520060408201526060019056fea2646970667358221220cabd9a0cec3e45ffba59a95bb3ddc1d19aa1c82a0724b54aabff16b67c302d2c64736f6c634300080a0033",
|
||||
"deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063431053ac1161005b578063431053ac1461019f5780634a63740a146101b2578063b0c41ead146101c5578063fe1ec880146101f057600080fd5b806310c558bf1461008d578063160a7925146100a257806319c186e514610179578063273e06b31461018c575b600080fd5b6100a061009b366004610859565b610203565b005b6101356100b0366004610859565b604080516080810182526000808252602082018190529181018290526060810191909152506001600160a01b0316600090815260208181526040918290208251608081018452905460ff808216151583526101008204811615159383019390935262010000810483161515938201939093526301000000909204161515606082015290565b604051610170919081511515815260208083015115159082015260408083015115159082015260609182015115159181019190915260800190565b60405180910390f35b6100a0610187366004610859565b6102f0565b6100a061019a366004610859565b6103ca565b6100a06101ad366004610859565b6104fc565b6100a06101c0366004610859565b61062d565b6101d86101d3366004610889565b610703565b6040516001600160a01b039091168152602001610170565b6100a06101fe366004610859565b61072d565b3360009081526020819052604090205460ff1615156001146102405760405162461bcd60e51b8152600401610237906108a2565b60405180910390fd5b6001600160a01b038116600081815260208190526040808220805462ff000019166201000017815560018054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b0319168417905551909133917fc2a42571a74ce1442c8c44d375ba9442e7d55d94b37afeace261c83c62128fa4906102e49042904390918252602082015260400190565b60405180910390a35050565b3360009081526020819052604090205460ff1615156001146103245760405162461bcd60e51b8152600401610237906108a2565b6001600160a01b038116600081815260208190526040808220805463ff0000001916630100000017815560018054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b0319168417905551909133917feb09276310ed110a7e565d64966d0ff68a47112d2dd5eeb6cbd7451836ce35ee906102e49042904390918252602082015260400190565b3360009081526020819052604090205460ff1615156001148061041b5750336001600160a01b03821614801561041b5750336000908152602081905260409020546301000000900460ff1615156001145b1561047f576001600160a01b03811660008181526020818152604091829020805463ff000000191681558251428152439281019290925292339290917fc929b18b08ffea86a1f95e29384dbe8968f2fcbd70cfd735df3aba1cc548cbf391016102e4565b60405162461bcd60e51b815260206004820152604660248201527f455243373231526f6c6573416464726573733a204e6f7420656e6f756768207060448201527f65726d697373696f6e7320746f2072656d6f76652066726f6d2037323553746f6064820152651c99531a5cdd60d21b608482015260a401610237565b3360009081526020819052604090205460ff1615156001148061054c5750336001600160a01b03821614801561054c57503360009081526020819052604090205462010000900460ff1615156001145b156105af576001600160a01b03811660008181526020818152604091829020805462ff0000191681558251428152439281019290925292339290917f9b41e1311fa819e825bc77fa2568492112e15ea92d173f3f8ee1c8ec3c1c562b91016102e4565b60405162461bcd60e51b815260206004820152604760248201527f455243373231526f6c6573416464726573733a204e6f7420656e6f756768207060448201527f65726d697373696f6e7320746f2072656d6f76652066726f6d206d65746164616064820152661d18481b1a5cdd60ca1b608482015260a401610237565b3360009081526020819052604090205460ff1615156001146106615760405162461bcd60e51b8152600401610237906108a2565b6001600160a01b038116600081815260208190526040808220805461ff00191661010017815560018054808201825593527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690920180546001600160a01b0319168417905551909133917f0572d56343be407a66810f01449212e8545e14ff5049c479d34be944cdfd0d4f906102e49042904390918252602082015260400190565b6001818154811061071357600080fd5b6000918252602090912001546001600160a01b0316905081565b3360009081526020819052604090205460ff1615156001148061077d5750336001600160a01b03821614801561077d57503360009081526020819052604090205460ff6101009091041615156001145b156107df576001600160a01b03811660008181526020818152604091829020805461ff00191681558251428152439281019290925292339290917f59bd33f4c27cc16a2d74450e1fa43d7896020be9aecea4bee009db9294de899791016102e4565b60405162461bcd60e51b815260206004820152604360248201527f455243373231526f6c6573416464726573733a204e6f7420656e6f756768207060448201527f65726d697373696f6e7320746f2072656d6f76652066726f6d2045524332304c6064820152621a5cdd60ea1b608482015260a401610237565b60006020828403121561086b57600080fd5b81356001600160a01b038116811461088257600080fd5b9392505050565b60006020828403121561089b57600080fd5b5035919050565b6020808252601f908201527f455243373231526f6c6573416464726573733a204e4f54204d414e414745520060408201526060019056fea2646970667358221220cabd9a0cec3e45ffba59a95bb3ddc1d19aa1c82a0724b54aabff16b67c302d2c64736f6c634300080a0033",
|
||||
"linkReferences": {},
|
||||
"deployedLinkReferences": {}
|
||||
}
|
657
deployment/README.md
Normal file
657
deployment/README.md
Normal file
@ -0,0 +1,657 @@
|
||||
<!--
|
||||
Copyright 2023 Ocean Protocol Foundation
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
-->
|
||||
|
||||
- [Kubernetes deployment](#kubernetes-deployment)
|
||||
- [Postgresql](#postgresql)
|
||||
- [IPFS](#ipfs)
|
||||
- [Graph-node](#graph-node)
|
||||
- [Docker Compose deployment](#docker-compose-deployment)
|
||||
- [Single systemd service (Graph-node+Postgresql+IPFS)](#single-systemd-service-graph-nodepostgresqlipfs)
|
||||
- [Ocean-subgraph deployment](#ocean-subgraph-deployment)
|
||||
|
||||
#### Kubernetes deployment
|
||||
|
||||
[ocean-subgraph](https://github.com/oceanprotocol/ocean-subgraph) must be deployed on top of [graph-node](https://github.com/graphprotocol/graph-node) which has the following dependencies:
|
||||
|
||||
- PostgreSQL
|
||||
|
||||
- IPFS
|
||||
|
||||
Templates (yaml files) provided and could be customized based on the environment's specifics.
|
||||
|
||||
##### Postgresql
|
||||
|
||||
It is recommended to deploy PostgreSQL as helm chart
|
||||
|
||||
References: https://github.com/bitnami/charts/tree/main/bitnami/postgresql/#installing-the-chart
|
||||
|
||||
Once PostgreSQL pods are running, a database must be created: eg. `mumbai`
|
||||
|
||||
##### IPFS
|
||||
|
||||
The following template can be customized to deploy IPFS statefulset and service:
|
||||
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
labels:
|
||||
app: ipfs
|
||||
name: ipfs
|
||||
spec:
|
||||
podManagementPolicy: OrderedReady
|
||||
replicas: 1
|
||||
revisionHistoryLimit: 10
|
||||
selector:
|
||||
matchLabels:
|
||||
app: ipfs
|
||||
serviceName: ipfs
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
labels:
|
||||
app: ipfs
|
||||
spec:
|
||||
containers:
|
||||
- image: ipfs/go-ipfs:v0.4.22
|
||||
imagePullPolicy: IfNotPresent
|
||||
livenessProbe:
|
||||
failureThreshold: 3
|
||||
httpGet:
|
||||
path: /debug/metrics/prometheus
|
||||
port: api
|
||||
scheme: HTTP
|
||||
initialDelaySeconds: 15
|
||||
periodSeconds: 3
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 1
|
||||
name: s1-ipfs
|
||||
ports:
|
||||
- containerPort: 5001
|
||||
name: api
|
||||
protocol: TCP
|
||||
- containerPort: 8080
|
||||
name: gateway
|
||||
protocol: TCP
|
||||
readinessProbe:
|
||||
failureThreshold: 3
|
||||
httpGet:
|
||||
path: /debug/metrics/prometheus
|
||||
port: api
|
||||
scheme: HTTP
|
||||
initialDelaySeconds: 15
|
||||
periodSeconds: 3
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 1
|
||||
terminationMessagePath: /dev/termination-log
|
||||
terminationMessagePolicy: File
|
||||
volumeMounts:
|
||||
- mountPath: /data/ipfs
|
||||
name: ipfs-storage
|
||||
dnsPolicy: ClusterFirst
|
||||
restartPolicy: Always
|
||||
schedulerName: default-scheduler
|
||||
securityContext:
|
||||
fsGroup: 1000
|
||||
runAsUser: 1000
|
||||
terminationGracePeriodSeconds: 30
|
||||
updateStrategy:
|
||||
rollingUpdate:
|
||||
partition: 0
|
||||
type: RollingUpdate
|
||||
volumeClaimTemplates:
|
||||
- apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
name: ipfs-storage
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 1G
|
||||
volumeMode: Filesystem
|
||||
status:
|
||||
phase: Pending
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
labels:
|
||||
app: ipfs
|
||||
name: ipfs
|
||||
spec:
|
||||
clusterIP:
|
||||
clusterIPs:
|
||||
ipFamilies:
|
||||
- IPv4
|
||||
ipFamilyPolicy: SingleStack
|
||||
ports:
|
||||
- name: api
|
||||
port: 5001
|
||||
- name: gateway
|
||||
port: 8080
|
||||
selector:
|
||||
app: ipfs
|
||||
```
|
||||
|
||||
##### Graph-node
|
||||
|
||||
The following annotated templated can be customized to deploy graph-node deployment and service:
|
||||
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
annotations:
|
||||
labels:
|
||||
app: mumbai-graph-node
|
||||
name: mumbai-graph-node
|
||||
spec:
|
||||
progressDeadlineSeconds: 600
|
||||
replicas: 1
|
||||
revisionHistoryLimit: 10
|
||||
selector:
|
||||
matchLabels:
|
||||
app: mumbai-graph-node
|
||||
strategy:
|
||||
rollingUpdate:
|
||||
maxSurge: 25%
|
||||
maxUnavailable: 25%
|
||||
type: RollingUpdate
|
||||
template:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
labels:
|
||||
app: mumbai-graph-node
|
||||
spec:
|
||||
containers:
|
||||
- env:
|
||||
- name: ipfs
|
||||
value: ipfs.<namespace>.svc.cluster.local:5001
|
||||
- name: postgres_host
|
||||
value: postgresql.<namespace>.svc.cluster.local
|
||||
- name: postgres_user
|
||||
value: < postgresql user >
|
||||
- name: postgres_pass
|
||||
value: < postgresql database password >
|
||||
- name: postgres_db
|
||||
value: < postgresql database >
|
||||
- name: ethereum
|
||||
value: mumbai:https://polygon-mumbai.infura.io/v3/< INFURA ID>
|
||||
- name: GRAPH_KILL_IF_UNRESPONSIVE
|
||||
value: 'true'
|
||||
image: graphprotocol/graph-node:v0.28.2
|
||||
imagePullPolicy: IfNotPresent
|
||||
livenessProbe:
|
||||
failureThreshold: 3
|
||||
httpGet:
|
||||
path: /
|
||||
port: 8000
|
||||
scheme: HTTP
|
||||
initialDelaySeconds: 20
|
||||
periodSeconds: 10
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 1
|
||||
name: mumbai-graph-node
|
||||
ports:
|
||||
- containerPort: 8000
|
||||
name: graphql
|
||||
protocol: TCP
|
||||
- containerPort: 8020
|
||||
name: jsonrpc
|
||||
protocol: TCP
|
||||
- containerPort: 8030
|
||||
name: indexnode
|
||||
protocol: TCP
|
||||
- containerPort: 8040
|
||||
name: metrics
|
||||
protocol: TCP
|
||||
readinessProbe:
|
||||
failureThreshold: 3
|
||||
httpGet:
|
||||
path: /
|
||||
port: 8000
|
||||
scheme: HTTP
|
||||
initialDelaySeconds: 20
|
||||
periodSeconds: 10
|
||||
successThreshold: 1
|
||||
timeoutSeconds: 1
|
||||
resources:
|
||||
limits:
|
||||
cpu: '2'
|
||||
memory: 1536Mi
|
||||
requests:
|
||||
cpu: 1500m
|
||||
memory: 1536Mi
|
||||
terminationMessagePath: /dev/termination-log
|
||||
terminationMessagePolicy: File
|
||||
dnsPolicy: ClusterFirst
|
||||
restartPolicy: Always
|
||||
schedulerName: default-scheduler
|
||||
terminationGracePeriodSeconds: 30
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
labels:
|
||||
app: mumbai-graph-node
|
||||
name: mumbai-graph-node
|
||||
spec:
|
||||
clusterIP:
|
||||
clusterIPs:
|
||||
internalTrafficPolicy: Cluster
|
||||
ipFamilies:
|
||||
- IPv4
|
||||
ipFamilyPolicy: SingleStack
|
||||
ports:
|
||||
- name: graphql
|
||||
port: 8000
|
||||
- name: jsonrpc
|
||||
port: 8020
|
||||
- name: indexnode
|
||||
port: 8030
|
||||
- name: metrics
|
||||
port: 8040
|
||||
selector:
|
||||
app: mumbai-graph-node
|
||||
```
|
||||
|
||||
#### Docker Compose deployment
|
||||
|
||||
##### Single systemd service (Graph-node+Postgresql+IPFS)
|
||||
|
||||
a) create _/etc/docker/compose/graph-node/docker-compose.yml_ file
|
||||
|
||||
_/etc/docker/compose/graph-node/docker-compose.yml_ (annotated - example for `mumbai` network)
|
||||
|
||||
```yaml
|
||||
version: '3'
|
||||
services:
|
||||
graph-node:
|
||||
image: graphprotocol/graph-node:v0.28.2
|
||||
container_name: graph-node
|
||||
restart: on-failure
|
||||
ports:
|
||||
- '8000:8000'
|
||||
- '8020:8020'
|
||||
- '8030:8030'
|
||||
- '8040:8040'
|
||||
depends_on:
|
||||
- ipfs
|
||||
- postgres-graph
|
||||
environment:
|
||||
postgres_host: postgres-graph
|
||||
postgres_user: graph-node
|
||||
postgres_pass: < password >
|
||||
postgres_db: mumbai
|
||||
ipfs: 'ipfs:5001'
|
||||
ethereum: 'mumbai:https://polygon-mumbai.infura.io/v3/< INFURA ID >'
|
||||
GRAPH_LOG: info
|
||||
ipfs:
|
||||
image: ipfs/go-ipfs:v0.4.23
|
||||
container_name: ipfs
|
||||
restart: on-failure
|
||||
ports:
|
||||
- '5001:5001'
|
||||
volumes:
|
||||
- ipfs-graph-node:/data/ipfs
|
||||
postgres-graph:
|
||||
image: postgres:15.3
|
||||
container_name: postgres
|
||||
restart: on-failure
|
||||
ports:
|
||||
- '5432:5432'
|
||||
command: ['postgres', '-cshared_preload_libraries=pg_stat_statements']
|
||||
environment:
|
||||
POSTGRES_USER: graph-node
|
||||
POSTGRES_PASSWORD: < password >
|
||||
POSTGRES_DB: mumbai
|
||||
volumes:
|
||||
- pgdata-graph-node:/var/lib/postgresql/data
|
||||
volumes:
|
||||
pgdata-graph-node:
|
||||
driver: local
|
||||
ipfs-graph-node:
|
||||
driver: local
|
||||
```
|
||||
|
||||
b) create _/etc/systemd/system/docker-compose@graph-node.service_ file
|
||||
|
||||
```shell
|
||||
[Unit]
|
||||
Description=%i service with docker compose
|
||||
Requires=docker.service
|
||||
After=docker.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
RemainAfterExit=true
|
||||
Environment="PROJECT=ocean"
|
||||
WorkingDirectory=/etc/docker/compose/%i
|
||||
ExecStartPre=/usr/bin/env docker-compose -p $PROJECT pull
|
||||
ExecStart=/usr/bin/env docker-compose -p $PROJECT up -d
|
||||
ExecStop=/usr/bin/env docker-compose -p $PROJECT stop
|
||||
ExecStopPost=/usr/bin/env docker-compose -p $PROJECT down
|
||||
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
c) run:
|
||||
|
||||
```shell
|
||||
$ sudo systemctl daemon-reload
|
||||
```
|
||||
|
||||
optional - enable service to start at boot:
|
||||
|
||||
```shell
|
||||
$ sudo systemctl enable docker-compose@graph-node.service
|
||||
```
|
||||
|
||||
d) start aquarius service:
|
||||
|
||||
```shell
|
||||
$ sudo systemctl start docker-compose@graph-node.service
|
||||
```
|
||||
|
||||
check status:
|
||||
|
||||
```shell
|
||||
$ sudo systemctl status docker-compose@graph-node.service
|
||||
● docker-compose@graph-node.service - graph-node service with docker compose
|
||||
Loaded: loaded (/etc/systemd/system/docker-compose@graph-node.service; disabled; vendor preset: enabled)
|
||||
Active: active (exited) since Sun 2023-06-25 17:05:25 UTC; 6s ago
|
||||
Process: 4878 ExecStartPre=/usr/bin/env docker-compose -p $PROJECT pull (code=exited, status=0/SUCCESS)
|
||||
Process: 4887 ExecStart=/usr/bin/env docker-compose -p $PROJECT up -d (code=exited, status=0/SUCCESS)
|
||||
Main PID: 4887 (code=exited, status=0/SUCCESS)
|
||||
CPU: 123ms
|
||||
|
||||
Jun 25 17:05:24 testvm env[4887]: Container ipfs Created
|
||||
Jun 25 17:05:24 testvm env[4887]: Container graph-node Creating
|
||||
Jun 25 17:05:24 testvm env[4887]: Container graph-node Created
|
||||
Jun 25 17:05:24 testvm env[4887]: Container ipfs Starting
|
||||
Jun 25 17:05:24 testvm env[4887]: Container postgres Starting
|
||||
Jun 25 17:05:24 testvm env[4887]: Container ipfs Started
|
||||
Jun 25 17:05:25 testvm env[4887]: Container postgres Started
|
||||
Jun 25 17:05:25 testvm env[4887]: Container graph-node Starting
|
||||
Jun 25 17:05:25 testvm env[4887]: Container graph-node Started
|
||||
Jun 25 17:05:25 testvm systemd[1]: Finished graph-node service with docker compose.
|
||||
|
||||
```
|
||||
|
||||
- check containers status
|
||||
|
||||
```shell
|
||||
$ docker ps --format "table {{.Image}}\t{{.Ports}}\t{{.Names}}\t{{.Status}}"
|
||||
IMAGE PORTS NAMES STATUS
|
||||
graphprotocol/graph-node:v0.28.2 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 0.0.0.0:8020->8020/tcp, :::8020->8020/tcp, 0.0.0.0:8030->8030/tcp, :::8030->8030/tcp, 0.0.0.0:8040->8040/tcp, :::8040->8040/tcp, 8001/tcp graph-node Up 55 minutes
|
||||
ipfs/go-ipfs:v0.4.23 4001/tcp, 8080-8081/tcp, 0.0.0.0:5001->5001/tcp, :::5001->5001/tcp ipfs Up 55 minutes
|
||||
postgres:15.3 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp postgres Up 55 minutes
|
||||
```
|
||||
|
||||
- check logs for graph-node container
|
||||
|
||||
```shell
|
||||
$ docker logs graph-node [--follow]
|
||||
```
|
||||
|
||||
#### Ocean-subgraph deployment
|
||||
|
||||
- install Node.js locally
|
||||
|
||||
- download and extract [Ocean-subgraph](https://github.com/oceanprotocol/ocean-subgraph) (check [here](https://github.com/oceanprotocol/ocean-subgraph/releases) the available releases)
|
||||
- run inside the extracted directory:
|
||||
|
||||
```shell
|
||||
$ npm i
|
||||
```
|
||||
|
||||
then
|
||||
|
||||
(Note: in this example we are deploying on graph-node running for `mumbai` testnet )
|
||||
|
||||
Note: for `ocean-subgraph` deployment in kubernetes environment, both `graph-node` and `ipfs` services must be locally forwarded using `kubectl port-forward` command.
|
||||
|
||||
```shell
|
||||
$ npm run quickstart:mumbai
|
||||
|
||||
> ocean-subgraph@3.0.8 quickstart:mumbai
|
||||
> node ./scripts/generatenetworkssubgraphs.js mumbai && npm run codegen && npm run create:local && npm run deploy:local
|
||||
|
||||
Creating subgraph.yaml for mumbai
|
||||
Adding veOCEAN
|
||||
Skipping polygon
|
||||
Skipping bsc
|
||||
Skipping energyweb
|
||||
Skipping moonriver
|
||||
Skipping mainnet
|
||||
Skipping polygonedge
|
||||
Skipping gaiaxtestnet
|
||||
Skipping alfajores
|
||||
Skipping gen-x-testnet
|
||||
Skipping filecointestnet
|
||||
|
||||
> ocean-subgraph@3.0.8 codegen
|
||||
> graph codegen --output-dir src/@types
|
||||
|
||||
Skip migration: Bump mapping apiVersion from 0.0.1 to 0.0.2
|
||||
Skip migration: Bump mapping apiVersion from 0.0.2 to 0.0.3
|
||||
Skip migration: Bump mapping apiVersion from 0.0.3 to 0.0.4
|
||||
Skip migration: Bump mapping apiVersion from 0.0.4 to 0.0.5
|
||||
Skip migration: Bump mapping apiVersion from 0.0.5 to 0.0.6
|
||||
Skip migration: Bump manifest specVersion from 0.0.1 to 0.0.2
|
||||
Apply migration: Bump manifest specVersion from 0.0.2 to 0.0.4
|
||||
✔ Apply migrations
|
||||
✔ Load subgraph from subgraph.yaml
|
||||
Load contract ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json
|
||||
Load contract ABI from abis/ERC20.json
|
||||
Load contract ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/pools/FactoryRouter.sol/FactoryRouter.json
|
||||
Load contract ABI from abis/ERC20.json
|
||||
Load contract ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veAllocate.sol/veAllocate.json
|
||||
Load contract ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veOCEAN.vy/veOCEAN.json
|
||||
Load contract ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veDelegation.vy/veDelegation.json
|
||||
Load contract ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veFeeDistributor.vy/veFeeDistributor.json
|
||||
Load contract ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/df/DFRewards.sol/DFRewards.json
|
||||
✔ Load contract ABIs
|
||||
Generate types for contract ABI: ERC721Factory (node_modules/@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json)
|
||||
Write types to src/@types/ERC721Factory/ERC721Factory.ts
|
||||
Generate types for contract ABI: ERC20 (abis/ERC20.json)
|
||||
Write types to src/@types/ERC721Factory/ERC20.ts
|
||||
Generate types for contract ABI: FactoryRouter (node_modules/@oceanprotocol/contracts/artifacts/contracts/pools/FactoryRouter.sol/FactoryRouter.json)
|
||||
Write types to src/@types/FactoryRouter/FactoryRouter.ts
|
||||
Generate types for contract ABI: ERC20 (abis/ERC20.json)
|
||||
Write types to src/@types/FactoryRouter/ERC20.ts
|
||||
Generate types for contract ABI: veAllocate (node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veAllocate.sol/veAllocate.json)
|
||||
Write types to src/@types/veAllocate/veAllocate.ts
|
||||
Generate types for contract ABI: veOCEAN (node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veOCEAN.vy/veOCEAN.json)
|
||||
Write types to src/@types/veOCEAN/veOCEAN.ts
|
||||
Generate types for contract ABI: veDelegation (node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veDelegation.vy/veDelegation.json)
|
||||
Write types to src/@types/veDelegation/veDelegation.ts
|
||||
Generate types for contract ABI: veFeeDistributor (node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veFeeDistributor.vy/veFeeDistributor.json)
|
||||
Write types to src/@types/veFeeDistributor/veFeeDistributor.ts
|
||||
Generate types for contract ABI: DFRewards (node_modules/@oceanprotocol/contracts/artifacts/contracts/df/DFRewards.sol/DFRewards.json)
|
||||
Write types to src/@types/DFRewards/DFRewards.ts
|
||||
✔ Generate types for contract ABIs
|
||||
Generate types for data source template ERC20Template
|
||||
Generate types for data source template ERC721Template
|
||||
Generate types for data source template Dispenser
|
||||
Generate types for data source template FixedRateExchange
|
||||
Write types for templates to src/@types/templates.ts
|
||||
✔ Generate types for data source templates
|
||||
Load data source template ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json
|
||||
Load data source template ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json
|
||||
Load data source template ABI from abis/ERC20.json
|
||||
Load data source template ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/utils/ERC20Roles.sol/ERC20Roles.json
|
||||
Load data source template ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json
|
||||
Load data source template ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/utils/ERC721RolesAddress.sol/ERC721RolesAddress.json
|
||||
Load data source template ABI from abis/ERC20.json
|
||||
Load data source template ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/pools/dispenser/Dispenser.sol/Dispenser.json
|
||||
Load data source template ABI from abis/ERC20.json
|
||||
Load data source template ABI from node_modules/@oceanprotocol/contracts/artifacts/contracts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json
|
||||
Load data source template ABI from abis/ERC20.json
|
||||
✔ Load data source template ABIs
|
||||
Generate types for data source template ABI: ERC20Template > ERC20Template (node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json)
|
||||
Write types to src/@types/templates/ERC20Template/ERC20Template.ts
|
||||
Generate types for data source template ABI: ERC20Template > ERC20TemplateEnterprise (node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json)
|
||||
Write types to src/@types/templates/ERC20Template/ERC20TemplateEnterprise.ts
|
||||
Generate types for data source template ABI: ERC20Template > ERC20 (abis/ERC20.json)
|
||||
Write types to src/@types/templates/ERC20Template/ERC20.ts
|
||||
Generate types for data source template ABI: ERC20Template > ERC20Roles (node_modules/@oceanprotocol/contracts/artifacts/contracts/utils/ERC20Roles.sol/ERC20Roles.json)
|
||||
Write types to src/@types/templates/ERC20Template/ERC20Roles.ts
|
||||
Generate types for data source template ABI: ERC721Template > ERC721Template (node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json)
|
||||
Write types to src/@types/templates/ERC721Template/ERC721Template.ts
|
||||
Generate types for data source template ABI: ERC721Template > ERC721RolesAddress (node_modules/@oceanprotocol/contracts/artifacts/contracts/utils/ERC721RolesAddress.sol/ERC721RolesAddress.json)
|
||||
Write types to src/@types/templates/ERC721Template/ERC721RolesAddress.ts
|
||||
Generate types for data source template ABI: ERC721Template > ERC20 (abis/ERC20.json)
|
||||
Write types to src/@types/templates/ERC721Template/ERC20.ts
|
||||
Generate types for data source template ABI: Dispenser > Dispenser (node_modules/@oceanprotocol/contracts/artifacts/contracts/pools/dispenser/Dispenser.sol/Dispenser.json)
|
||||
Write types to src/@types/templates/Dispenser/Dispenser.ts
|
||||
Generate types for data source template ABI: Dispenser > ERC20 (abis/ERC20.json)
|
||||
Write types to src/@types/templates/Dispenser/ERC20.ts
|
||||
Generate types for data source template ABI: FixedRateExchange > FixedRateExchange (node_modules/@oceanprotocol/contracts/artifacts/contracts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json)
|
||||
Write types to src/@types/templates/FixedRateExchange/FixedRateExchange.ts
|
||||
Generate types for data source template ABI: FixedRateExchange > ERC20 (abis/ERC20.json)
|
||||
Write types to src/@types/templates/FixedRateExchange/ERC20.ts
|
||||
✔ Generate types for data source template ABIs
|
||||
✔ Load GraphQL schema from schema.graphql
|
||||
Write types to src/@types/schema.ts
|
||||
✔ Generate types for GraphQL schema
|
||||
|
||||
Types generated successfully
|
||||
|
||||
|
||||
> ocean-subgraph@3.0.8 create:local
|
||||
> graph create oceanprotocol/ocean-subgraph --node http://127.0.0.1:8020
|
||||
|
||||
Created subgraph: oceanprotocol/ocean-subgraph
|
||||
|
||||
> ocean-subgraph@3.0.8 deploy:local
|
||||
> graph deploy oceanprotocol/ocean-subgraph subgraph.yaml -l $npm_package_version --debug --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020
|
||||
|
||||
Skip migration: Bump mapping apiVersion from 0.0.1 to 0.0.2
|
||||
Skip migration: Bump mapping apiVersion from 0.0.2 to 0.0.3
|
||||
Skip migration: Bump mapping apiVersion from 0.0.3 to 0.0.4
|
||||
Skip migration: Bump mapping apiVersion from 0.0.4 to 0.0.5
|
||||
Skip migration: Bump mapping apiVersion from 0.0.5 to 0.0.6
|
||||
Skip migration: Bump manifest specVersion from 0.0.1 to 0.0.2
|
||||
Skip migration: Bump manifest specVersion from 0.0.2 to 0.0.4
|
||||
✔ Apply migrations
|
||||
✔ Load subgraph from subgraph.yaml
|
||||
Compile data source: ERC721Factory => build/ERC721Factory/ERC721Factory.wasm
|
||||
Compile data source: FactoryRouter => build/FactoryRouter/FactoryRouter.wasm
|
||||
Compile data source: veAllocate => build/veAllocate/veAllocate.wasm
|
||||
Compile data source: veOCEAN => build/veOCEAN/veOCEAN.wasm
|
||||
Compile data source: veDelegation => build/veDelegation/veDelegation.wasm
|
||||
Compile data source: veFeeDistributor => build/veFeeDistributor/veFeeDistributor.wasm
|
||||
Compile data source: DFRewards => build/DFRewards/DFRewards.wasm
|
||||
Compile data source template: ERC20Template => build/templates/ERC20Template/ERC20Template.wasm
|
||||
Compile data source template: ERC721Template => build/templates/ERC721Template/ERC721Template.wasm
|
||||
Compile data source template: Dispenser => build/templates/Dispenser/Dispenser.wasm
|
||||
Compile data source template: FixedRateExchange => build/templates/FixedRateExchange/FixedRateExchange.wasm
|
||||
✔ Compile subgraph
|
||||
Copy schema file build/schema.graphql
|
||||
Write subgraph file build/ERC721Factory/node_modules/@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json
|
||||
Write subgraph file build/ERC721Factory/abis/ERC20.json
|
||||
Write subgraph file build/FactoryRouter/node_modules/@oceanprotocol/contracts/artifacts/contracts/pools/FactoryRouter.sol/FactoryRouter.json
|
||||
Write subgraph file build/FactoryRouter/abis/ERC20.json
|
||||
Write subgraph file build/veAllocate/node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veAllocate.sol/veAllocate.json
|
||||
Write subgraph file build/veOCEAN/node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veOCEAN.vy/veOCEAN.json
|
||||
Write subgraph file build/veDelegation/node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veDelegation.vy/veDelegation.json
|
||||
Write subgraph file build/veFeeDistributor/node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veFeeDistributor.vy/veFeeDistributor.json
|
||||
Write subgraph file build/DFRewards/node_modules/@oceanprotocol/contracts/artifacts/contracts/df/DFRewards.sol/DFRewards.json
|
||||
Write subgraph file build/ERC20Template/node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json
|
||||
Write subgraph file build/ERC20Template/node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json
|
||||
Write subgraph file build/ERC20Template/abis/ERC20.json
|
||||
Write subgraph file build/ERC20Template/node_modules/@oceanprotocol/contracts/artifacts/contracts/utils/ERC20Roles.sol/ERC20Roles.json
|
||||
Write subgraph file build/ERC721Template/node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json
|
||||
Write subgraph file build/ERC721Template/node_modules/@oceanprotocol/contracts/artifacts/contracts/utils/ERC721RolesAddress.sol/ERC721RolesAddress.json
|
||||
Write subgraph file build/ERC721Template/abis/ERC20.json
|
||||
Write subgraph file build/Dispenser/node_modules/@oceanprotocol/contracts/artifacts/contracts/pools/dispenser/Dispenser.sol/Dispenser.json
|
||||
Write subgraph file build/Dispenser/abis/ERC20.json
|
||||
Write subgraph file build/FixedRateExchange/node_modules/@oceanprotocol/contracts/artifacts/contracts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json
|
||||
Write subgraph file build/FixedRateExchange/abis/ERC20.json
|
||||
Write subgraph manifest build/subgraph.yaml
|
||||
✔ Write compiled subgraph to build/
|
||||
Add file to IPFS build/schema.graphql
|
||||
.. QmQa3a9ypCLC84prHGQdhbcGG4DHJceqADGxmZMmAAXuTz
|
||||
Add file to IPFS build/ERC721Factory/node_modules/@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json
|
||||
.. QmSoG3r5vyWXqjEfKAQYjwtQcQkZCsZEcJXVFWVq1tT1dD
|
||||
Add file to IPFS build/ERC721Factory/abis/ERC20.json
|
||||
.. QmXuTbDkNrN27VydxbS2huvKRk62PMgUTdPDWkxcr2w7j2
|
||||
Add file to IPFS build/FactoryRouter/node_modules/@oceanprotocol/contracts/artifacts/contracts/pools/FactoryRouter.sol/FactoryRouter.json
|
||||
.. QmcBVA1R3yi2167UZMvV4LvG4cMHjL8ZZXmPMriCjn8DEe
|
||||
Add file to IPFS build/FactoryRouter/abis/ERC20.json
|
||||
.. QmXuTbDkNrN27VydxbS2huvKRk62PMgUTdPDWkxcr2w7j2 (already uploaded)
|
||||
Add file to IPFS build/veAllocate/node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veAllocate.sol/veAllocate.json
|
||||
.. Qmc3iwQkQAhqe1PjzTt6KZLh9rsWQvyxkFt7doj2iXv8C3
|
||||
Add file to IPFS build/veOCEAN/node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veOCEAN.vy/veOCEAN.json
|
||||
.. QmahFjirJqiwKpytFZ9CdE92LdPGBUDZs6AWpsrH2wn1VP
|
||||
Add file to IPFS build/veDelegation/node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veDelegation.vy/veDelegation.json
|
||||
.. QmfU6kZ5sksLdj3q88n7SUP63C1cnhQjU8vuMmRYwf2v5r
|
||||
Add file to IPFS build/veFeeDistributor/node_modules/@oceanprotocol/contracts/artifacts/contracts/ve/veFeeDistributor.vy/veFeeDistributor.json
|
||||
.. QmVU51oBr62D4UFXTwnMcbzuBBAAeQssqmqM9jic7A6L3v
|
||||
Add file to IPFS build/DFRewards/node_modules/@oceanprotocol/contracts/artifacts/contracts/df/DFRewards.sol/DFRewards.json
|
||||
.. QmcckRMahzpL7foEFGpWfkDBsyoWbNRfLC32uFq8ceUV3a
|
||||
Add file to IPFS build/ERC721Factory/ERC721Factory.wasm
|
||||
.. QmVfDAgZdKWxMuNfT7kso1LbFre2xhYbEeHBGm3gH3R9oE
|
||||
Add file to IPFS build/FactoryRouter/FactoryRouter.wasm
|
||||
.. QmYCC9AcaYw3nGSqNXNFHVsuB67FQEyZ8twRjRXrprcgyp
|
||||
Add file to IPFS build/veAllocate/veAllocate.wasm
|
||||
.. QmUFaYDxChi5nKEJLvHQZP1cRoqqP5k3fYSwk2JjuSceiJ
|
||||
Add file to IPFS build/veOCEAN/veOCEAN.wasm
|
||||
.. QmRYCyYKwHdSeM55vuvL1mdCooDkFQm6d2TQ7iK2N1qgur
|
||||
Add file to IPFS build/veDelegation/veDelegation.wasm
|
||||
.. QmaTjRLirzfidtQTYgzxqVVD9AX9e69TN1Y8fEsNQ9AEZq
|
||||
Add file to IPFS build/veFeeDistributor/veFeeDistributor.wasm
|
||||
.. QmZCEp4yxiDyuksEjSaceogJwLMto2UGfV1KxVuJTJLTqg
|
||||
Add file to IPFS build/DFRewards/DFRewards.wasm
|
||||
.. QmRSxe52B836bdfoJbuDY4tUCawzqgkHRNxe9ucU1JdYm5
|
||||
Add file to IPFS build/ERC20Template/node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json
|
||||
.. QmPkhFvnBbqA3You7NsK5Zsyh8kkizXUHF9pcC5V6qDJQu
|
||||
Add file to IPFS build/ERC20Template/node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json
|
||||
.. QmZnogwnfr4TeBPykvmCL2oaX63AKQP1F1uBAbbfnyPAzB
|
||||
Add file to IPFS build/ERC20Template/abis/ERC20.json
|
||||
.. QmXuTbDkNrN27VydxbS2huvKRk62PMgUTdPDWkxcr2w7j2 (already uploaded)
|
||||
Add file to IPFS build/ERC20Template/node_modules/@oceanprotocol/contracts/artifacts/contracts/utils/ERC20Roles.sol/ERC20Roles.json
|
||||
.. QmTWTzg4jTx4GxGApVyxirNRTxB7QovS4bHGuWnnW8Ciz2
|
||||
Add file to IPFS build/templates/ERC20Template/ERC20Template.wasm
|
||||
.. QmUcxes5La7n9481Vf9AoQ2Mjt1CrbS7T6tDhpnfF77Uh5
|
||||
Add file to IPFS build/ERC721Template/node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json
|
||||
.. QmPE82CiACicgu1WxEjeFrLmskiJADroQRnxH7owpK6jaP
|
||||
Add file to IPFS build/ERC721Template/node_modules/@oceanprotocol/contracts/artifacts/contracts/utils/ERC721RolesAddress.sol/ERC721RolesAddress.json
|
||||
.. Qmdhi7UK6Ww8vXH9YC3JxVUEFjTyx3XycF53rRZapVK5c3
|
||||
Add file to IPFS build/ERC721Template/abis/ERC20.json
|
||||
.. QmXuTbDkNrN27VydxbS2huvKRk62PMgUTdPDWkxcr2w7j2 (already uploaded)
|
||||
Add file to IPFS build/templates/ERC721Template/ERC721Template.wasm
|
||||
.. QmNhLws24szwpz8LM2sL6HHKc6KK4vtJwzfeZWkghuqn7Q
|
||||
Add file to IPFS build/Dispenser/node_modules/@oceanprotocol/contracts/artifacts/contracts/pools/dispenser/Dispenser.sol/Dispenser.json
|
||||
.. QmdiN7Fhw9sjoVVJgHtTtzxv5fwtFMHLNH1x1yqbswsThW
|
||||
Add file to IPFS build/Dispenser/abis/ERC20.json
|
||||
.. QmXuTbDkNrN27VydxbS2huvKRk62PMgUTdPDWkxcr2w7j2 (already uploaded)
|
||||
Add file to IPFS build/templates/Dispenser/Dispenser.wasm
|
||||
.. QmTpn9wagpmH6byjjdCBZdgypFgcw2mva3bC52nC4z3eLW
|
||||
Add file to IPFS build/FixedRateExchange/node_modules/@oceanprotocol/contracts/artifacts/contracts/pools/fixedRate/FixedRateExchange.sol/FixedRateExchange.json
|
||||
.. Qmd2ToAptK74j8pGxe8mZXfAvY3AxstgmYH8JDMAfLtAGd
|
||||
Add file to IPFS build/FixedRateExchange/abis/ERC20.json
|
||||
.. QmXuTbDkNrN27VydxbS2huvKRk62PMgUTdPDWkxcr2w7j2 (already uploaded)
|
||||
Add file to IPFS build/templates/FixedRateExchange/FixedRateExchange.wasm
|
||||
.. QmRrwwoFF33LvPhnGCGgLBLyuLizrFgD44kW9io81tPZzX
|
||||
✔ Upload subgraph to IPFS
|
||||
|
||||
Build completed: QmVUKpgwuyDh9KgUxTzZvVNFJbdevc56YrZpZjQvu8Yp7q
|
||||
|
||||
Deployed to http://127.0.0.1:8000/subgraphs/name/oceanprotocol/ocean-subgraph/graphql
|
||||
|
||||
Subgraph endpoints:
|
||||
Queries (HTTP): http://127.0.0.1:8000/subgraphs/name/oceanprotocol/ocean-subgraph
|
||||
```
|
||||
|
||||
- This subgraph is deployed under `/subgraphs/name/oceanprotocol/ocean-subgraph/`
|
||||
|
||||
http://127.0.0.1:8000/subgraphs/name/oceanprotocol/ocean-subgraph/graphql
|
@ -6,6 +6,7 @@ echo "deploy subgraph is ${DEPLOY_SUBGRAPH}"
|
||||
|
||||
if [ "${DEPLOY_SUBGRAPH}" = "true" ]
|
||||
then
|
||||
rm -f /ocean-subgraph/ready
|
||||
echo "Waiting for contracts to be deployed"
|
||||
while [ ! -f "/ocean-contracts/artifacts/ready" ]; do
|
||||
sleep 2
|
||||
@ -13,5 +14,7 @@ then
|
||||
export ADDRESS_FILE="/ocean-contracts/artifacts/address.json"
|
||||
cd /usr/src/app/
|
||||
npm run quickstart:barge
|
||||
sleep 3
|
||||
touch /ocean-subgraph/ready
|
||||
fi
|
||||
tail -f /dev/null
|
||||
|
@ -1,7 +1,7 @@
|
||||
version: '3'
|
||||
services:
|
||||
graph-node:
|
||||
image: graphprotocol/graph-node:v0.26.0
|
||||
image: graphprotocol/graph-node:v0.28.2
|
||||
ports:
|
||||
- '9000:8000'
|
||||
- '8001:8001'
|
||||
@ -17,8 +17,9 @@ services:
|
||||
postgres_pass: let-me-in
|
||||
postgres_db: graph-node
|
||||
ipfs: 'ipfs:5001'
|
||||
ethereum: 'rinkeby:https://rinkeby.infura.io/v3/${INFURA_PROJECT_ID}'
|
||||
RUST_LOG: info
|
||||
ethereum: 'oasis_saphire_testnet:http://192.168.136.129:8080'
|
||||
RUST_LOG: warning
|
||||
GRAPH_ETHEREUM_MAX_BLOCK_RANGE_SIZE: 100
|
||||
ipfs:
|
||||
image: ipfs/go-ipfs:v0.4.23
|
||||
ports:
|
||||
|
50587
package-lock.json
generated
50587
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
55
package.json
55
package.json
@ -1,12 +1,11 @@
|
||||
{
|
||||
"name": "ocean-subgraph",
|
||||
"version": "2.1.0",
|
||||
"version": "4.0.2",
|
||||
"scripts": {
|
||||
"start": "",
|
||||
"quickstart:development": "node ./scripts/generatenetworkssubgraphs.js development && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:barge": "node ./scripts/generatenetworkssubgraphs.js development && npm run codegen && npm run create:local-barge && npm run deploy:local-barge",
|
||||
"quickstart:rinkeby": "node ./scripts/generatenetworkssubgraphs.js rinkeby && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:goerli": "node ./scripts/generatenetworkssubgraphs.js goerli && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:ropsten": "node ./scripts/generatenetworkssubgraphs.js ropsten && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:mumbai": "node ./scripts/generatenetworkssubgraphs.js mumbai && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:moonbase": "node ./scripts/generatenetworkssubgraphs.js moonbase && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
@ -14,23 +13,33 @@
|
||||
"quickstart:mainnet": "node ./scripts/generatenetworkssubgraphs.js mainnet && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:moonriver": "node ./scripts/generatenetworkssubgraphs.js moonriver && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:energyweb": "node ./scripts/generatenetworkssubgraphs.js energyweb && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:sepolia": "node ./scripts/generatenetworkssubgraphs.js sepolia && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:gen-x-testnet": "node ./scripts/generatenetworkssubgraphs.js gen-x-testnet && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:bsc": "node ./scripts/generatenetworkssubgraphs.js bsc && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:oasis_saphire_testnet": "node ./scripts/generatenetworkssubgraphs.js oasis_saphire_testnet && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:oasis_saphire": "node ./scripts/generatenetworkssubgraphs.js oasis_saphire && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:optimism": "node ./scripts/generatenetworkssubgraphs.js optimism && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"quickstart:optimism_sepolia": "node ./scripts/generatenetworkssubgraphs.js optimism_sepolia && npm run codegen && npm run create:local && npm run deploy:local",
|
||||
"create:thegraph": "graph create oceanprotocol/ocean-subgraph --node https://api.thegraph.com/deploy/",
|
||||
"create:local": "graph create oceanprotocol/ocean-subgraph --node http://127.0.0.1:8020",
|
||||
"create:local-barge": "graph create oceanprotocol/ocean-subgraph --node http://172.15.0.15:8020",
|
||||
"codegen": "graph codegen --output-dir src/@types",
|
||||
"build": "graph build",
|
||||
"deploy:thegraph": "graph deploy oceanprotocol/ocean-subgraph -l $npm_package_version --ipfs https://api.thegraph.com/ipfs/ --node https://api.thegraph.com/deploy/",
|
||||
"deploy:local": "graph deploy oceanprotocol/ocean-subgraph subgraph.yaml -l $npm_package_version --debug --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020",
|
||||
"deploy:local-barge": "graph deploy oceanprotocol/ocean-subgraph subgraph.yaml -l $npm_package_version --debug --ipfs http://172.15.0.16:5001 --node http://172.15.0.15:8020",
|
||||
"deploy:local": "graph deploy oceanprotocol/ocean-subgraph subgraph.yaml -l $npm_package_version --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020",
|
||||
"deploy:local-barge": "graph deploy oceanprotocol/ocean-subgraph subgraph.yaml -l $npm_package_version --ipfs http://172.15.0.16:5001 --node http://172.15.0.15:8020",
|
||||
"test": "npm run codegen && npm run lint && npm run type-check",
|
||||
"test-integration": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/**/*.test.ts'",
|
||||
"test-dispenser": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/Dispenser.test.ts'",
|
||||
"test-simple": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/SimpleSubgraph.test.ts'",
|
||||
"test-fixed": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/FixedRateExchange.test.ts'",
|
||||
"test-users": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/users.test.ts'",
|
||||
"test-ve": "TS_NODE_PROJECT='test/integration/tsconfig.json' mocha --config=test/integration/.mocharc.json --node-env=test --exit 'test/integration/VeOcean.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-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:fix": "eslint --ignore-path .gitignore --ext .js,.ts,.tsx . --fix",
|
||||
"format": "prettier --ignore-path .gitignore './**/*.{css,yml,js,ts,tsx,json,yaml}' --write",
|
||||
@ -40,37 +49,39 @@
|
||||
"changelog": "auto-changelog -p"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@graphprotocol/graph-cli": "^0.33.1",
|
||||
"@graphprotocol/graph-ts": "^0.27.0",
|
||||
"@types/chai": "^4.3.3",
|
||||
"@types/chai": "^4.3.11",
|
||||
"@types/chai-spies": "^1.0.3",
|
||||
"@types/mocha": "^9.1.1",
|
||||
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
||||
"@typescript-eslint/parser": "^4.33.0",
|
||||
"@types/mocha": "^10.0.2",
|
||||
"@types/node": "^20.8.2",
|
||||
"@typescript-eslint/eslint-plugin": "^6.7.4",
|
||||
"@typescript-eslint/parser": "^6.19.0",
|
||||
"auto-changelog": "^2.4.0",
|
||||
"chai": "^4.3.6",
|
||||
"chai": "^4.3.10",
|
||||
"chai-spies": "^1.0.0",
|
||||
"cross-fetch": "^3.1.6",
|
||||
"eslint": "^7.32.0",
|
||||
"eslint-config-oceanprotocol": "^2.0.3",
|
||||
"eslint-config-prettier": "^8.5.0",
|
||||
"eslint-plugin-import": "^2.26.0",
|
||||
"eslint-config-oceanprotocol": "^2.0.4",
|
||||
"eslint-config-prettier": "^8.8.0",
|
||||
"eslint-plugin-import": "^2.27.5",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-prettier": "^4.2.1",
|
||||
"eslint-plugin-standard": "^5.0.0",
|
||||
"mocha": "^10.0.0",
|
||||
"mock-local-storage": "^1.1.23",
|
||||
"prettier": "^2.7.1",
|
||||
"release-it": "^15.4.2",
|
||||
"ethereumjs-util": "^7.1.5",
|
||||
"mocha": "^10.2.0",
|
||||
"mock-local-storage": "^1.1.24",
|
||||
"prettier": "^2.8.8",
|
||||
"release-it": "^17.0.0",
|
||||
"source-map-support": "^0.5.21",
|
||||
"ts-node": "^10.9.1",
|
||||
"ts-node-dev": "^2.0.0",
|
||||
"ts-node-register": "^1.0.0",
|
||||
"typescript": "^4.8.3"
|
||||
"typescript": "^5.4.5",
|
||||
"@oceanprotocol/lib": "^2.7.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@oceanprotocol/contracts": "^1.1.7",
|
||||
"@oceanprotocol/lib": "^2.0.2",
|
||||
"cross-fetch": "^3.1.4"
|
||||
"@oceanprotocol/contracts": "^2.0.3",
|
||||
"@graphprotocol/graph-cli": "^0.71.0",
|
||||
"@graphprotocol/graph-ts": "^0.31.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
238
schema.graphql
238
schema.graphql
@ -30,7 +30,7 @@ type Token @entity {
|
||||
publishMarketFeeAmount: BigDecimal
|
||||
|
||||
"template ID of the datatoken"
|
||||
templateId: Int
|
||||
templateId: BigInt!
|
||||
|
||||
"number of addresses holding a balance of datatoken , TODO: can we actually calculate this? what happens when users trade the dts"
|
||||
holderCount: BigInt!
|
||||
@ -52,11 +52,11 @@ type Token @entity {
|
||||
|
||||
"datatoken creation transaction id"
|
||||
tx: String!
|
||||
|
||||
eventIndex: Int!
|
||||
"block number when it was created"
|
||||
block: Int!
|
||||
|
||||
lastPriceToken: String!
|
||||
lastPriceToken: Token
|
||||
lastPriceValue: BigDecimal!
|
||||
}
|
||||
|
||||
@ -76,9 +76,9 @@ type Nft @entity{
|
||||
tokenUri: String
|
||||
|
||||
"address of the owner of the nft"
|
||||
owner: String!
|
||||
owner: User!
|
||||
"address of the creator of the nft"
|
||||
creator: String!
|
||||
creator: User!
|
||||
|
||||
"same as id, it's just for easy discoverability"
|
||||
address: String!
|
||||
@ -98,6 +98,9 @@ type Nft @entity{
|
||||
"template address"
|
||||
template: String!
|
||||
|
||||
"template ID of the datatoken"
|
||||
templateId: Int
|
||||
|
||||
"set if NFT is transferable"
|
||||
transferable: Boolean!
|
||||
|
||||
@ -105,6 +108,7 @@ type Nft @entity{
|
||||
createdTimestamp: Int!
|
||||
"nft creation transaction id"
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
"block number when it was created"
|
||||
block: Int
|
||||
|
||||
@ -115,6 +119,7 @@ type Nft @entity{
|
||||
hasMetadata: Boolean!
|
||||
|
||||
nftData: [NftData!] @derivedFrom(field: "nft")
|
||||
transferHistory: [NftTransferHistory!] @derivedFrom(field: "nft")
|
||||
}
|
||||
|
||||
type NftData @entity{
|
||||
@ -131,6 +136,7 @@ type OrderReuse @entity {
|
||||
caller: String!
|
||||
createdTimestamp: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
block: Int!
|
||||
providerFee: String
|
||||
providerFeeValidUntil: BigInt
|
||||
@ -140,7 +146,7 @@ type OrderReuse @entity {
|
||||
}
|
||||
|
||||
type Order @entity {
|
||||
"transaction hash - token address - from address"
|
||||
"transaction hash - token address - from address - eventIndex"
|
||||
id: ID!
|
||||
datatoken: Token!
|
||||
|
||||
@ -148,6 +154,7 @@ type Order @entity {
|
||||
payer: User!
|
||||
amount: BigDecimal!
|
||||
serviceIndex: Int!
|
||||
nftOwner: User!
|
||||
|
||||
|
||||
# the fees will be updated from an event that will be created after (todo)
|
||||
@ -165,9 +172,10 @@ type Order @entity {
|
||||
|
||||
createdTimestamp: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
block: Int!
|
||||
|
||||
lastPriceToken: String!
|
||||
lastPriceToken: Token
|
||||
lastPriceValue: BigDecimal!
|
||||
estimatedUSDValue: BigDecimal!
|
||||
gasUsed: BigDecimal
|
||||
@ -218,6 +226,7 @@ type FixedRateExchange @entity {
|
||||
|
||||
createdTimestamp: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
block: Int!
|
||||
|
||||
"address of the market where the datatoken was created. This address collects market fees."
|
||||
@ -244,6 +253,7 @@ type FixedRateExchangeUpdate @entity {
|
||||
block: Int!
|
||||
createdTimestamp: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
}
|
||||
|
||||
type FixedRateExchangeSwap @entity {
|
||||
@ -255,6 +265,10 @@ type FixedRateExchangeSwap @entity {
|
||||
block: Int!
|
||||
createdTimestamp: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
oceanFeeAmount: BigDecimal!
|
||||
marketFeeAmount: BigDecimal!
|
||||
consumeMarketFeeAmount: BigDecimal!
|
||||
}
|
||||
|
||||
|
||||
@ -280,7 +294,8 @@ type Dispenser @entity {
|
||||
block: Int!
|
||||
createdTimestamp: Int!
|
||||
tx: String!
|
||||
|
||||
eventIndex: Int!
|
||||
|
||||
dispenses: [DispenserTransaction!] @derivedFrom(field: "dispenser")
|
||||
}
|
||||
|
||||
@ -293,6 +308,7 @@ type DispenserTransaction @entity {
|
||||
block: Int!
|
||||
createdTimestamp: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
}
|
||||
|
||||
"utility type"
|
||||
@ -333,6 +349,9 @@ type GlobalStatistic @entity {
|
||||
"number of dispensers created"
|
||||
dispenserCount: Int!
|
||||
|
||||
"total ocean locked in veOcean"
|
||||
totalOceanLocked:BigDecimal!
|
||||
|
||||
"current version"
|
||||
version: String
|
||||
}
|
||||
@ -377,13 +396,13 @@ type NftUpdate @entity {
|
||||
block: Int!
|
||||
timestamp: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
}
|
||||
|
||||
type Template @entity{
|
||||
id: ID!
|
||||
fixedRateTemplates: [String!]
|
||||
dispenserTemplates: [String!]
|
||||
ssTemplates: [String!]
|
||||
}
|
||||
|
||||
# Not tracking allocationToId or idToAllocation
|
||||
@ -398,13 +417,16 @@ type VeAllocateUser @entity{
|
||||
firstContact: Int!
|
||||
lastContact: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
veOcean: VeOCEAN!
|
||||
}
|
||||
|
||||
type VeAllocateId @entity{
|
||||
"id = {DataNFT Address}-{chain id}"
|
||||
id: ID!
|
||||
|
||||
nftAddress: String!
|
||||
chainId: BigInt!
|
||||
|
||||
veAllocation: [VeAllocation!] @derivedFrom(field: "allocationId")
|
||||
allocatedTotal: BigDecimal!
|
||||
|
||||
@ -412,6 +434,7 @@ type VeAllocateId @entity{
|
||||
firstContact: Int!
|
||||
lastContact: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
}
|
||||
|
||||
# we need to track allocation of user to id
|
||||
@ -431,6 +454,7 @@ type VeAllocation @entity {
|
||||
firstContact: Int!
|
||||
lastContact: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
}
|
||||
|
||||
enum veAllocationUpdateType {
|
||||
@ -439,7 +463,7 @@ enum veAllocationUpdateType {
|
||||
}
|
||||
|
||||
type VeAllocationUpdate @entity {
|
||||
"{tx}-{VeAllocation id}"
|
||||
"{tx}-{VeAllocation id}-{eventIndex}"
|
||||
id: ID!
|
||||
|
||||
veAllocation: VeAllocation!
|
||||
@ -449,20 +473,41 @@ type VeAllocationUpdate @entity {
|
||||
block: Int!
|
||||
timestamp: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
}
|
||||
|
||||
type VeDelegation @entity {
|
||||
"id = tokenId"
|
||||
"id = VeDelegation contract + tokenId"
|
||||
id: ID!
|
||||
delegator: VeOCEAN!
|
||||
receiver: VeOCEAN!
|
||||
tokenId: BigInt!
|
||||
amount: BigInt!
|
||||
amount: BigDecimal!
|
||||
lockedAmount: BigDecimal!
|
||||
timeLeftUnlock: Int!
|
||||
cancelTime: BigInt!
|
||||
expireTime: BigInt!
|
||||
block: Int!
|
||||
updates: [VeDelegationUpdate!] @derivedFrom(field: "veDelegation")
|
||||
|
||||
}
|
||||
|
||||
type VeDelegationUpdate @entity {
|
||||
"id = {tx}-{eventIndex}"
|
||||
id: ID!
|
||||
block: Int!
|
||||
timestamp: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
sender: String!
|
||||
amount: BigDecimal!
|
||||
cancelTime: BigInt!
|
||||
expireTime: BigInt!
|
||||
"type: CREATE_BOOST = 0, EXTEND_BOOST = 1, BURN_BOOST = 2"
|
||||
type:Int!
|
||||
veDelegation:VeDelegation!
|
||||
}
|
||||
|
||||
|
||||
type VeOCEAN @entity {
|
||||
"id = {user address}"
|
||||
id: ID!
|
||||
@ -474,12 +519,12 @@ type VeOCEAN @entity {
|
||||
delegates: [VeDelegation!] @derivedFrom(field: "receiver")
|
||||
deposits: [VeDeposit!] @derivedFrom(field: "veOcean")
|
||||
claims: [VeClaim!] @derivedFrom(field: "veOcean")
|
||||
allocation: VeAllocateUser! @derivedFrom(field: "veOcean")
|
||||
allocation: VeAllocateUser @derivedFrom(field: "veOcean")
|
||||
block: Int!
|
||||
}
|
||||
|
||||
type VeDeposit @entity {
|
||||
"id = {user address}-{timestamp}"
|
||||
"id = {user address}-{tx}-{eventIndex}"
|
||||
id: ID!
|
||||
"veOcean holder"
|
||||
provider:String!
|
||||
@ -494,7 +539,9 @@ type VeDeposit @entity {
|
||||
timestamp: BigInt!
|
||||
block: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
veOcean: VeOCEAN!
|
||||
totalOceanLocked:BigDecimal!
|
||||
}
|
||||
|
||||
|
||||
@ -518,6 +565,7 @@ type VeFeeDistributorCheckPoint @entity {
|
||||
timestamp: BigInt!
|
||||
block: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
}
|
||||
|
||||
type VeClaim @entity {
|
||||
@ -532,6 +580,7 @@ type VeClaim @entity {
|
||||
timestamp: BigInt!
|
||||
block: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
veOcean: VeOCEAN!
|
||||
VeFeeDistributor: VeFeeDistributor!
|
||||
}
|
||||
@ -560,6 +609,7 @@ type DFHistory @entity {
|
||||
timestamp: BigInt!
|
||||
block: Int!
|
||||
tx: String!
|
||||
eventIndex: Int!
|
||||
}
|
||||
|
||||
|
||||
@ -569,4 +619,158 @@ type DFReward @entity {
|
||||
receiver: User!
|
||||
availableClaims: [DFAvailableClaim!] @derivedFrom(field: "receiver")
|
||||
history: [DFHistory!] @derivedFrom(field: "receiver")
|
||||
}
|
||||
}
|
||||
|
||||
type NftTransferHistory @entity {
|
||||
# ID = hash(nftAddress+txId+eventNumber)
|
||||
id: ID!
|
||||
nft: Nft!
|
||||
oldOwner: User!
|
||||
newOwner: User!
|
||||
txId: String
|
||||
eventIndex: Int!
|
||||
timestamp: Int!
|
||||
block: Int!
|
||||
}
|
||||
|
||||
type Erc721Template @entity {
|
||||
#ID = template address
|
||||
id: ID!
|
||||
templateId: BigInt!
|
||||
}
|
||||
|
||||
type Erc20Template @entity {
|
||||
#ID = template address
|
||||
id: ID!
|
||||
templateId: BigInt!
|
||||
}
|
||||
|
||||
|
||||
|
||||
type PredictSubscription @entity{
|
||||
"id = {contract address}-{txid}-{eventIndex}"
|
||||
id: ID!
|
||||
predictContract: PredictContract!
|
||||
user: User!
|
||||
expireTime: BigInt!
|
||||
"txId"
|
||||
txId: String
|
||||
eventIndex:Int!
|
||||
timestamp: Int!
|
||||
block: Int!
|
||||
}
|
||||
|
||||
enum PredictSlotStatus {
|
||||
Pending,
|
||||
Paying,
|
||||
Canceled
|
||||
}
|
||||
|
||||
|
||||
type PredictPayout @entity{
|
||||
"id = {contract address}-{slot}-{user}"
|
||||
id: ID!
|
||||
prediction: PredictPrediction!
|
||||
payout: BigDecimal!
|
||||
predictedValue: Boolean!
|
||||
trueValue: Boolean!
|
||||
aggregatedPredictedValue: BigDecimal!
|
||||
"txId"
|
||||
txId: String
|
||||
eventIndex:Int!
|
||||
timestamp: Int!
|
||||
block: Int!
|
||||
}
|
||||
|
||||
type PredictPrediction @entity{
|
||||
"id = {contract address}-{slot}-{user}"
|
||||
id: ID!
|
||||
slot: PredictSlot!
|
||||
user: User!
|
||||
stake: BigDecimal!
|
||||
payout: PredictPayout
|
||||
"txId"
|
||||
txId: String
|
||||
eventIndex:Int!
|
||||
timestamp: Int!
|
||||
block: Int!
|
||||
}
|
||||
|
||||
|
||||
type PredictTrueVal @entity{
|
||||
"id = {contract address}-{slot}"
|
||||
id: ID!
|
||||
slot: PredictSlot!
|
||||
trueValue: Boolean!
|
||||
"txId"
|
||||
txId: String
|
||||
eventIndex:Int!
|
||||
timestamp: Int!
|
||||
block: Int!
|
||||
}
|
||||
|
||||
type PredictionRevenue @entity{
|
||||
"id = {contract address}-{slot}-{txid}-{eventIndex}"
|
||||
id: ID!
|
||||
slot: PredictSlot!
|
||||
amount: BigDecimal!
|
||||
"txId"
|
||||
txId: String
|
||||
eventIndex:Int!
|
||||
timestamp: Int!
|
||||
block: Int!
|
||||
}
|
||||
|
||||
type PredictSlot @entity{
|
||||
"id = {contract address}-{slot}"
|
||||
id: ID!
|
||||
predictContract: PredictContract!
|
||||
slot: Int!
|
||||
predictions:[PredictPrediction!] @derivedFrom(field: "slot")
|
||||
trueValues: [PredictTrueVal!] @derivedFrom(field: "slot")
|
||||
revenue: BigDecimal!
|
||||
revenues: [PredictionRevenue!] @derivedFrom(field: "slot")
|
||||
status: PredictSlotStatus!
|
||||
roundSumStakesUp: BigDecimal!
|
||||
roundSumStakes: BigDecimal!
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
type PredictSettingUpdate @entity{
|
||||
"id = {contract address}-{txId}-{eventIndex}"
|
||||
id: ID!
|
||||
predictContract: PredictContract!
|
||||
secondsPerEpoch: BigInt!
|
||||
secondsPerSubscription: BigInt!
|
||||
truevalSubmitTimeout: BigInt!
|
||||
stakeToken: Token
|
||||
"txId"
|
||||
txId: String
|
||||
eventIndex:Int!
|
||||
timestamp: Int!
|
||||
block: Int!
|
||||
}
|
||||
type PredictContract @entity{
|
||||
"id = {contract address}"
|
||||
id: ID!
|
||||
token: Token!
|
||||
paused: Boolean!
|
||||
slots: [PredictSlot!] @derivedFrom(field: "predictContract")
|
||||
settingUpdates: [PredictSettingUpdate!] @derivedFrom(field: "predictContract")
|
||||
subscriptions: [PredictSubscription!] @derivedFrom(field: "predictContract")
|
||||
secondsPerEpoch: BigInt!
|
||||
secondsPerSubscription: BigInt!
|
||||
truevalSubmitTimeout: BigInt!
|
||||
stakeToken: Token
|
||||
"creation txId"
|
||||
txId: String
|
||||
"timestamp of creation tx"
|
||||
timestamp: Int!
|
||||
"block of creation tx"
|
||||
block: Int!
|
||||
eventIndex: Int!
|
||||
}
|
||||
|
||||
|
||||
|
@ -26,6 +26,7 @@ export function handleAllocated(event: Allocated): void {
|
||||
history.type = 'Allocated'
|
||||
history.timestamp = event.block.timestamp
|
||||
history.tx = event.transaction.hash.toHex()
|
||||
history.eventIndex = event.logIndex.toI32()
|
||||
history.block = event.block.number.toI32()
|
||||
history.save()
|
||||
|
||||
@ -55,6 +56,7 @@ export function handleClaimed(event: Claimed): void {
|
||||
history.type = 'Claimed'
|
||||
history.timestamp = event.block.timestamp
|
||||
history.tx = event.transaction.hash.toHex()
|
||||
history.eventIndex = event.logIndex.toI32()
|
||||
history.block = event.block.number.toI32()
|
||||
history.save()
|
||||
|
||||
|
@ -43,6 +43,7 @@ export function handleNewDispenser(event: DispenserCreated): void {
|
||||
dispenser.allowedSwapper = event.params.allowedSwapper.toHex()
|
||||
dispenser.createdTimestamp = event.block.timestamp.toI32()
|
||||
dispenser.tx = event.transaction.hash.toHex()
|
||||
dispenser.eventIndex = event.logIndex.toI32()
|
||||
dispenser.block = event.block.number.toI32()
|
||||
dispenser.save()
|
||||
|
||||
@ -57,6 +58,7 @@ export function handleActivate(event: DispenserActivated): void {
|
||||
)
|
||||
const dispenser = getDispenser(dispenserID)
|
||||
dispenser.active = true
|
||||
dispenser.eventIndex = event.logIndex.toI32()
|
||||
dispenser.save()
|
||||
}
|
||||
|
||||
@ -67,6 +69,7 @@ export function handleDeactivate(event: DispenserDeactivated): void {
|
||||
)
|
||||
const dispenser = getDispenser(dispenserID)
|
||||
dispenser.active = false
|
||||
dispenser.eventIndex = event.logIndex.toI32()
|
||||
dispenser.save()
|
||||
}
|
||||
|
||||
@ -76,6 +79,7 @@ export function handleAllowedSwapperChanged(
|
||||
const dispenserID = getDispenserGraphID(event.address, event.params.datatoken)
|
||||
const dispenser = getDispenser(dispenserID)
|
||||
dispenser.allowedSwapper = event.params.newAllowedSwapper.toHex()
|
||||
dispenser.eventIndex = event.logIndex.toI32()
|
||||
dispenser.save()
|
||||
}
|
||||
|
||||
@ -84,10 +88,8 @@ export function handleTokensDispensed(event: TokensDispensed): void {
|
||||
event.address,
|
||||
event.params.datatokenAddress
|
||||
)
|
||||
const id = event.transaction.hash
|
||||
.toHexString()
|
||||
.concat('-')
|
||||
.concat(dispenserID)
|
||||
const eventIndex: number = event.logIndex.toI32()
|
||||
const id = `${event.transaction.hash.toHexString()}-${dispenserID}-${eventIndex}`
|
||||
|
||||
const dispenserTransaction = new DispenserTransaction(id)
|
||||
const dispenser = getDispenser(dispenserID)
|
||||
@ -98,6 +100,7 @@ export function handleTokensDispensed(event: TokensDispensed): void {
|
||||
|
||||
dispenserTransaction.createdTimestamp = event.block.timestamp.toI32()
|
||||
dispenserTransaction.tx = event.transaction.hash.toHex()
|
||||
dispenserTransaction.eventIndex = event.logIndex.toI32()
|
||||
dispenserTransaction.block = event.block.number.toI32()
|
||||
const token = getToken(event.params.datatokenAddress, true)
|
||||
dispenserTransaction.amount = weiToDecimal(
|
||||
@ -111,5 +114,6 @@ export function handleOwnerWinthdraw(event: OwnerWithdrawed): void {
|
||||
const dispenserID = getDispenserGraphID(event.address, event.params.datatoken)
|
||||
const dispenser = getDispenser(dispenserID)
|
||||
dispenser.balance = decimal.ZERO
|
||||
dispenser.eventIndex = event.logIndex.toI32()
|
||||
dispenser.save()
|
||||
}
|
||||
|
284
src/mappings/erc20Template3.ts
Normal file
284
src/mappings/erc20Template3.ts
Normal file
@ -0,0 +1,284 @@
|
||||
import {
|
||||
PredictSubscription,
|
||||
PredictPayout,
|
||||
PredictPrediction,
|
||||
PredictTrueVal,
|
||||
PredictSlot,
|
||||
PredictSettingUpdate,
|
||||
PredictionRevenue
|
||||
} from '../@types/schema'
|
||||
import { BigInt, BigDecimal, Address } from '@graphprotocol/graph-ts'
|
||||
|
||||
import {
|
||||
PredictionSubmitted,
|
||||
PredictionPayout,
|
||||
NewSubscription,
|
||||
TruevalSubmitted,
|
||||
SettingChanged,
|
||||
RevenueAdded,
|
||||
Paused
|
||||
} from '../@types/templates/ERC20Template3/ERC20Template3'
|
||||
|
||||
import { weiToDecimal } from './utils/generic'
|
||||
import { getPredictContract, getToken } from './utils/tokenUtils'
|
||||
import { getUser } from './utils/userUtils'
|
||||
|
||||
function getPredictSlot(
|
||||
predictContractAddress: string,
|
||||
slot: i32
|
||||
): PredictSlot {
|
||||
const id = predictContractAddress + '-' + slot.toString()
|
||||
let newPredictSlot = PredictSlot.load(id)
|
||||
if (newPredictSlot === null) {
|
||||
newPredictSlot = new PredictSlot(id)
|
||||
newPredictSlot.predictContract = predictContractAddress
|
||||
newPredictSlot.slot = slot
|
||||
newPredictSlot.revenue = BigDecimal.zero()
|
||||
newPredictSlot.roundSumStakesUp = BigDecimal.zero()
|
||||
newPredictSlot.roundSumStakes = BigDecimal.zero()
|
||||
newPredictSlot.status = 'Pending'
|
||||
newPredictSlot.save()
|
||||
}
|
||||
return newPredictSlot
|
||||
}
|
||||
|
||||
export function handlePredictionSubmitted(event: PredictionSubmitted): void {
|
||||
const predictSlot = getPredictSlot(
|
||||
event.address.toHexString(),
|
||||
event.params.slot.toI32()
|
||||
)
|
||||
const user = getUser(event.params.predictoor.toHex())
|
||||
const id =
|
||||
event.address.toHexString() +
|
||||
'-' +
|
||||
event.params.slot.toString() +
|
||||
'-' +
|
||||
user.id
|
||||
const predictPrediction = new PredictPrediction(id)
|
||||
predictPrediction.slot = predictSlot.id
|
||||
predictPrediction.user = user.id
|
||||
const predictContract = getPredictContract(event.address)
|
||||
let decimals = 18
|
||||
if (predictContract.stakeToken) {
|
||||
const stakeToken = getToken(
|
||||
Address.fromString(predictContract.stakeToken!),
|
||||
false
|
||||
)
|
||||
decimals = stakeToken.decimals
|
||||
}
|
||||
predictPrediction.stake = weiToDecimal(
|
||||
event.params.stake.toBigDecimal(),
|
||||
BigInt.fromI32(decimals).toI32()
|
||||
)
|
||||
predictPrediction.payout = null
|
||||
predictPrediction.block = event.block.number.toI32()
|
||||
predictPrediction.txId = event.transaction.hash.toHexString()
|
||||
predictPrediction.eventIndex = event.logIndex.toI32()
|
||||
predictPrediction.timestamp = event.block.timestamp.toI32()
|
||||
predictPrediction.save()
|
||||
}
|
||||
|
||||
export function handlePredictionPayout(event: PredictionPayout): void {
|
||||
const user = getUser(event.params.predictoor.toHex())
|
||||
const predictionId =
|
||||
event.address.toHexString() +
|
||||
'-' +
|
||||
event.params.slot.toString() +
|
||||
'-' +
|
||||
user.id
|
||||
const predictPrediction = PredictPrediction.load(predictionId)
|
||||
if (!predictPrediction) return
|
||||
const predictionPayout = new PredictPayout(predictionId)
|
||||
predictionPayout.prediction = predictPrediction.id
|
||||
|
||||
let decimals = 18
|
||||
const predictContract = getPredictContract(event.address)
|
||||
if (predictContract.stakeToken) {
|
||||
const stakeToken = getToken(
|
||||
Address.fromString(predictContract.stakeToken!),
|
||||
false
|
||||
)
|
||||
decimals = stakeToken.decimals
|
||||
}
|
||||
predictionPayout.payout = weiToDecimal(
|
||||
event.params.payout.toBigDecimal(),
|
||||
BigInt.fromI32(decimals).toI32()
|
||||
)
|
||||
predictionPayout.predictedValue = event.params.predictedValue
|
||||
predictionPayout.trueValue = event.params.trueValue
|
||||
predictionPayout.aggregatedPredictedValue = weiToDecimal(
|
||||
event.params.aggregatedPredictedValue.toBigDecimal(),
|
||||
18
|
||||
)
|
||||
predictionPayout.block = event.block.number.toI32()
|
||||
predictionPayout.txId = event.transaction.hash.toHexString()
|
||||
predictionPayout.eventIndex = event.logIndex.toI32()
|
||||
predictionPayout.timestamp = event.block.timestamp.toI32()
|
||||
predictionPayout.save()
|
||||
|
||||
predictPrediction.payout = predictionPayout.id
|
||||
predictPrediction.save()
|
||||
|
||||
let shouldUpdateSlot = false
|
||||
const predictSlot = getPredictSlot(
|
||||
event.address.toHexString(),
|
||||
event.params.slot.toI32()
|
||||
)
|
||||
if (event.params.status == 1 && predictSlot.status !== 'Paying') {
|
||||
predictSlot.status = 'Paying'
|
||||
shouldUpdateSlot = true
|
||||
}
|
||||
if (event.params.status == 2 && predictSlot.status !== 'Canceled') {
|
||||
predictSlot.status = 'Canceled'
|
||||
shouldUpdateSlot = true
|
||||
}
|
||||
if (shouldUpdateSlot == true) predictSlot.save()
|
||||
}
|
||||
|
||||
export function handleNewSubscription(event: NewSubscription): void {
|
||||
const id =
|
||||
event.address.toHexString() +
|
||||
'-' +
|
||||
event.transaction.hash.toHexString() +
|
||||
'-' +
|
||||
event.logIndex.toString()
|
||||
const newSubscription = new PredictSubscription(id)
|
||||
const predictContract = getPredictContract(event.address)
|
||||
newSubscription.predictContract = predictContract.id
|
||||
const user = getUser(event.params.user.toHex())
|
||||
newSubscription.user = user.id
|
||||
newSubscription.expireTime = event.params.expires
|
||||
newSubscription.block = event.block.number.toI32()
|
||||
newSubscription.txId = event.transaction.hash.toHexString()
|
||||
newSubscription.eventIndex = event.logIndex.toI32()
|
||||
newSubscription.timestamp = event.block.timestamp.toI32()
|
||||
newSubscription.save()
|
||||
}
|
||||
|
||||
export function handleTruevalSubmitted(event: TruevalSubmitted): void {
|
||||
const predictSlot = getPredictSlot(
|
||||
event.address.toHexString(),
|
||||
event.params.slot.toI32()
|
||||
)
|
||||
const id = event.address.toHexString() + '-' + event.params.slot.toString()
|
||||
const newPredictTrueVals = new PredictTrueVal(id) // they share the same id
|
||||
newPredictTrueVals.slot = predictSlot.id
|
||||
newPredictTrueVals.trueValue = event.params.trueValue
|
||||
newPredictTrueVals.block = event.block.number.toI32()
|
||||
newPredictTrueVals.txId = event.transaction.hash.toHexString()
|
||||
newPredictTrueVals.eventIndex = event.logIndex.toI32()
|
||||
newPredictTrueVals.timestamp = event.block.timestamp.toI32()
|
||||
newPredictTrueVals.save()
|
||||
let decimals = 18
|
||||
const predictContract = getPredictContract(event.address)
|
||||
if (predictContract.stakeToken) {
|
||||
const stakeToken = getToken(
|
||||
Address.fromString(predictContract.stakeToken!),
|
||||
false
|
||||
)
|
||||
decimals = stakeToken.decimals
|
||||
}
|
||||
predictSlot.roundSumStakesUp = weiToDecimal(
|
||||
event.params.roundSumStakesUp.toBigDecimal(),
|
||||
BigInt.fromI32(decimals).toI32()
|
||||
)
|
||||
predictSlot.roundSumStakes = weiToDecimal(
|
||||
event.params.roundSumStakes.toBigDecimal(),
|
||||
BigInt.fromI32(decimals).toI32()
|
||||
)
|
||||
|
||||
if (event.params.status == 1) {
|
||||
predictSlot.status = 'Paying'
|
||||
}
|
||||
if (event.params.status == 2) {
|
||||
predictSlot.status = 'Canceled'
|
||||
}
|
||||
predictSlot.save()
|
||||
}
|
||||
|
||||
export function handleSettingChanged(event: SettingChanged): void {
|
||||
const predictContract = getPredictContract(event.address)
|
||||
predictContract.secondsPerEpoch = event.params.secondsPerEpoch
|
||||
predictContract.secondsPerSubscription = event.params.secondsPerSubscription
|
||||
predictContract.truevalSubmitTimeout = event.params.trueValueSubmitTimeout
|
||||
const stakeToken = getToken(event.params.stakeToken, false)
|
||||
predictContract.stakeToken = stakeToken.id
|
||||
predictContract.save()
|
||||
const predictSettingsUpdate = new PredictSettingUpdate(
|
||||
event.address.toHexString() +
|
||||
'- ' +
|
||||
event.transaction.hash.toHexString() +
|
||||
'-' +
|
||||
event.logIndex.toHexString()
|
||||
)
|
||||
predictSettingsUpdate.block = event.block.number.toI32()
|
||||
predictSettingsUpdate.txId = event.transaction.hash.toHexString()
|
||||
predictSettingsUpdate.eventIndex = event.logIndex.toI32()
|
||||
predictSettingsUpdate.timestamp = event.block.timestamp.toI32()
|
||||
predictSettingsUpdate.predictContract = predictContract.id
|
||||
predictSettingsUpdate.secondsPerEpoch = event.params.secondsPerEpoch
|
||||
predictSettingsUpdate.secondsPerSubscription =
|
||||
event.params.secondsPerSubscription
|
||||
predictSettingsUpdate.truevalSubmitTimeout =
|
||||
event.params.trueValueSubmitTimeout
|
||||
predictSettingsUpdate.stakeToken = stakeToken.id
|
||||
predictSettingsUpdate.save()
|
||||
}
|
||||
|
||||
export function handlePaused(event: Paused): void {
|
||||
const predictContract = getPredictContract(event.address)
|
||||
predictContract.paused = event.params.paused
|
||||
predictContract.save()
|
||||
}
|
||||
|
||||
export function handleRevenueAdded(event: RevenueAdded): void {
|
||||
/*
|
||||
for (uint256 i = 0; i < num_epochs; i++) {
|
||||
subscriptionRevenueAtBlock[
|
||||
slot + secondsPerEpoch * (i)
|
||||
] += amt_per_epoch;
|
||||
}
|
||||
emit RevenueAdded(amount,slot,amt_per_epoch,num_epochs,secondsPerEpoch);
|
||||
*/
|
||||
const numEpochs = event.params.numEpochs
|
||||
const secondsPerEpoch = event.params.secondsPerEpoch
|
||||
let decimals = 18
|
||||
const predictContract = getPredictContract(event.address)
|
||||
if (predictContract.stakeToken) {
|
||||
const stakeToken = getToken(
|
||||
Address.fromString(predictContract.stakeToken!),
|
||||
false
|
||||
)
|
||||
decimals = stakeToken.decimals
|
||||
}
|
||||
const amountPerEpoch = weiToDecimal(
|
||||
event.params.amountPerEpoch.toBigDecimal(),
|
||||
BigInt.fromI32(decimals).toI32()
|
||||
)
|
||||
const slot = event.params.slot
|
||||
for (let i = BigInt.zero(); i.lt(numEpochs); i = i.plus(BigInt.fromI32(1))) {
|
||||
const targetSlot = slot.plus(secondsPerEpoch.times(i))
|
||||
const predictSlot = getPredictSlot(
|
||||
event.address.toHexString(),
|
||||
targetSlot.toI32()
|
||||
)
|
||||
predictSlot.revenue = predictSlot.revenue.plus(amountPerEpoch)
|
||||
predictSlot.save()
|
||||
const revenueId =
|
||||
event.address.toHexString() +
|
||||
'-' +
|
||||
targetSlot.toString() +
|
||||
'-' +
|
||||
event.transaction.hash.toHexString() +
|
||||
'-' +
|
||||
event.logIndex.toHexString()
|
||||
const predictRevenue = new PredictionRevenue(revenueId)
|
||||
predictRevenue.slot = predictSlot.id
|
||||
predictRevenue.amount = amountPerEpoch
|
||||
predictRevenue.block = event.block.number.toI32()
|
||||
predictRevenue.txId = event.transaction.hash.toHexString()
|
||||
predictRevenue.eventIndex = event.logIndex.toI32()
|
||||
predictRevenue.timestamp = event.block.timestamp.toI32()
|
||||
predictRevenue.save()
|
||||
}
|
||||
}
|
@ -1,11 +1,12 @@
|
||||
import { Order, Nft, OrderReuse } from '../@types/schema'
|
||||
import { BigInt, BigDecimal } from '@graphprotocol/graph-ts'
|
||||
import { BigInt, BigDecimal, Address, log } from '@graphprotocol/graph-ts'
|
||||
|
||||
import {
|
||||
NewPaymentCollector,
|
||||
OrderStarted,
|
||||
PublishMarketFee,
|
||||
PublishMarketFeeChanged,
|
||||
ConsumeMarketFee,
|
||||
AddedMinter,
|
||||
AddedPaymentManager,
|
||||
RemovedMinter,
|
||||
@ -20,14 +21,19 @@ import { weiToDecimal } from './utils/generic'
|
||||
import { addOrder } from './utils/globalUtils'
|
||||
import { getToken, getUSDValue } from './utils/tokenUtils'
|
||||
import { getUser } from './utils/userUtils'
|
||||
import { getOrderId } from './utils/orderUtils'
|
||||
import {
|
||||
getOrderId,
|
||||
searchOrderForEvent,
|
||||
searchOrderReusedForEvent
|
||||
} from './utils/orderUtils'
|
||||
|
||||
export function handleOrderStarted(event: OrderStarted): void {
|
||||
const order = new Order(
|
||||
getOrderId(
|
||||
event.transaction.hash.toHex(),
|
||||
event.address.toHex(),
|
||||
event.transaction.from.toHex()
|
||||
event.transaction.from.toHex(),
|
||||
event.logIndex.toI32()
|
||||
)
|
||||
)
|
||||
|
||||
@ -38,6 +44,12 @@ export function handleOrderStarted(event: OrderStarted): void {
|
||||
const consumer = getUser(event.params.consumer.toHex())
|
||||
order.consumer = consumer.id
|
||||
|
||||
if (token.nft) {
|
||||
const nft = Nft.load(token.nft as string) as Nft
|
||||
const nftOwner = getUser(nft.owner)
|
||||
order.nftOwner = nftOwner.id
|
||||
}
|
||||
|
||||
const payer = getUser(event.params.payer.toHex())
|
||||
payer.totalOrders = payer.totalOrders.plus(integer.ONE)
|
||||
payer.save()
|
||||
@ -53,19 +65,22 @@ export function handleOrderStarted(event: OrderStarted): void {
|
||||
const publishMarket = getUser(event.params.publishMarketAddress.toHex())
|
||||
order.publishingMarket = publishMarket.id
|
||||
|
||||
// const consumeMarket = getUser(event.params..toHex())
|
||||
// order.consumerMarket = consumeMarket.id
|
||||
|
||||
order.createdTimestamp = event.block.timestamp.toI32()
|
||||
order.tx = event.transaction.hash.toHex()
|
||||
order.eventIndex = event.logIndex.toI32()
|
||||
order.block = event.block.number.toI32()
|
||||
order.lastPriceToken = token.lastPriceToken
|
||||
order.lastPriceValue = token.lastPriceValue
|
||||
order.estimatedUSDValue = getUSDValue(
|
||||
order.lastPriceToken,
|
||||
order.lastPriceValue,
|
||||
order.createdTimestamp
|
||||
)
|
||||
const tokenId = token.lastPriceToken
|
||||
if (tokenId) {
|
||||
const priceToken = getToken(Address.fromString(tokenId), false)
|
||||
order.lastPriceToken = priceToken.id
|
||||
order.lastPriceValue = token.lastPriceValue
|
||||
order.estimatedUSDValue = getUSDValue(
|
||||
priceToken.id,
|
||||
order.lastPriceValue,
|
||||
order.createdTimestamp
|
||||
)
|
||||
}
|
||||
|
||||
if (event.receipt !== null && event.receipt!.gasUsed) {
|
||||
order.gasUsed = event.receipt!.gasUsed.toBigDecimal()
|
||||
} else {
|
||||
@ -92,32 +107,56 @@ export function handleOrderStarted(event: OrderStarted): void {
|
||||
}
|
||||
|
||||
export function handlerOrderReused(event: OrderReused): void {
|
||||
const orderId = getOrderId(
|
||||
const order = searchOrderForEvent(
|
||||
event.params.orderTxId.toHexString(),
|
||||
event.address.toHex(),
|
||||
event.params.caller.toHex()
|
||||
event.params.caller.toHex(),
|
||||
event.logIndex.toI32()
|
||||
)
|
||||
const order = Order.load(orderId)
|
||||
|
||||
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)
|
||||
reuseOrder.gasPrice = event.transaction.gasPrice
|
||||
else reuseOrder.gasPrice = BigInt.zero()
|
||||
if (event.receipt !== null && event.receipt!.gasUsed) {
|
||||
reuseOrder.gasUsed = event.receipt!.gasUsed.toBigDecimal()
|
||||
} else reuseOrder.gasUsed = BigDecimal.zero()
|
||||
reuseOrder.order = orderId
|
||||
reuseOrder.order = order.id
|
||||
reuseOrder.caller = event.params.caller.toHexString()
|
||||
reuseOrder.createdTimestamp = event.params.timestamp.toI32()
|
||||
reuseOrder.tx = event.transaction.hash.toHex()
|
||||
reuseOrder.eventIndex = event.logIndex.toI32()
|
||||
reuseOrder.block = event.params.number.toI32()
|
||||
|
||||
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(
|
||||
event: PublishMarketFeeChanged
|
||||
): void {
|
||||
@ -138,10 +177,33 @@ export function handlePublishMarketFeeChanged(
|
||||
event.params.PublishMarketFeeAmount.toBigDecimal(),
|
||||
decimals
|
||||
)
|
||||
token.eventIndex = event.logIndex.toI32()
|
||||
token.save()
|
||||
// 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
|
||||
export function handleAddedMinter(event: AddedMinter): void {
|
||||
@ -152,6 +214,7 @@ export function handleAddedMinter(event: AddedMinter): void {
|
||||
if (!existingRoles.includes(event.params.user.toHexString()))
|
||||
existingRoles.push(event.params.user.toHexString())
|
||||
token.minter = existingRoles
|
||||
token.eventIndex = event.logIndex.toI32()
|
||||
token.save()
|
||||
}
|
||||
|
||||
@ -168,6 +231,7 @@ export function handleRemovedMinter(event: RemovedMinter): void {
|
||||
if (role !== event.params.user.toHexString()) newList.push(role)
|
||||
}
|
||||
token.minter = newList
|
||||
token.eventIndex = event.logIndex.toI32()
|
||||
token.save()
|
||||
}
|
||||
|
||||
@ -179,6 +243,7 @@ export function handleAddedPaymentManager(event: AddedPaymentManager): void {
|
||||
if (!existingRoles.includes(event.params.user.toHexString()))
|
||||
existingRoles.push(event.params.user.toHexString())
|
||||
token.paymentManager = existingRoles
|
||||
token.eventIndex = event.logIndex.toI32()
|
||||
token.save()
|
||||
}
|
||||
export function handleRemovedPaymentManager(
|
||||
@ -196,6 +261,7 @@ export function handleRemovedPaymentManager(
|
||||
if (role !== event.params.user.toHexString()) newList.push(role)
|
||||
}
|
||||
token.paymentManager = newList
|
||||
token.eventIndex = event.logIndex.toI32()
|
||||
token.save()
|
||||
}
|
||||
export function handleCleanedPermissions(event: CleanedPermissions): void {
|
||||
@ -206,12 +272,14 @@ export function handleCleanedPermissions(event: CleanedPermissions): void {
|
||||
const nft = Nft.load(token.nft as string)
|
||||
if (nft) token.paymentCollector = nft.owner
|
||||
else token.paymentCollector = '0x0000000000000000000000000000000000000000'
|
||||
token.eventIndex = event.logIndex.toI32()
|
||||
token.save()
|
||||
}
|
||||
|
||||
export function handleNewPaymentCollector(event: NewPaymentCollector): void {
|
||||
const token = getToken(event.address, true)
|
||||
token.paymentCollector = event.params._newPaymentCollector.toHexString()
|
||||
token.eventIndex = event.logIndex.toI32()
|
||||
token.save()
|
||||
}
|
||||
|
||||
@ -224,12 +292,12 @@ export function handleProviderFee(event: ProviderFee): void {
|
||||
event.params.validUntil
|
||||
}"}`
|
||||
|
||||
const orderId = getOrderId(
|
||||
const order = searchOrderForEvent(
|
||||
event.transaction.hash.toHex(),
|
||||
event.address.toHex(),
|
||||
event.transaction.from.toHex()
|
||||
event.transaction.from.toHex(),
|
||||
event.logIndex.toI32()
|
||||
)
|
||||
const order = Order.load(orderId)
|
||||
|
||||
if (order) {
|
||||
order.providerFee = providerFee
|
||||
@ -237,27 +305,15 @@ export function handleProviderFee(event: ProviderFee): void {
|
||||
order.save()
|
||||
return
|
||||
}
|
||||
|
||||
let orderReuse = OrderReuse.load(event.transaction.hash.toHex())
|
||||
const orderReuse = searchOrderReusedForEvent(
|
||||
event.transaction.hash.toHex(),
|
||||
event.address.toHex(),
|
||||
event.logIndex.toI32()
|
||||
)
|
||||
if (orderReuse) {
|
||||
log.info('order reuse id in provider fee handler: {}', [orderReuse.id])
|
||||
orderReuse.providerFee = providerFee
|
||||
orderReuse.providerFeeValidUntil = event.params.validUntil
|
||||
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()
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,24 @@
|
||||
import {
|
||||
NFTCreated,
|
||||
TokenCreated,
|
||||
ERC721Factory
|
||||
Template721Added,
|
||||
Template20Added
|
||||
} from '../@types/ERC721Factory/ERC721Factory'
|
||||
import { Erc721Template, Erc20Template } from '../@types/schema'
|
||||
import { decimal } from './utils/constants'
|
||||
import { weiToDecimal } from './utils/generic'
|
||||
|
||||
import {
|
||||
ERC20Template as factoryERC20Template,
|
||||
ERC20Template3 as factoryERC20Template3
|
||||
} from '../@types/templates'
|
||||
import { getUser } from './utils/userUtils'
|
||||
import { getToken, getNftToken } from './utils/tokenUtils'
|
||||
import {
|
||||
getToken,
|
||||
getNftToken,
|
||||
getErc20TemplateId,
|
||||
getPredictContract
|
||||
} from './utils/tokenUtils'
|
||||
import { addDatatoken } from './utils/globalUtils'
|
||||
import { BigInt } from '@graphprotocol/graph-ts'
|
||||
|
||||
export function handleNftCreated(event: NFTCreated): void {
|
||||
// const nft = new Nft(event.params.newTokenAddress.toHexString())
|
||||
@ -25,8 +34,9 @@ export function handleNftCreated(event: NFTCreated): void {
|
||||
nft.createdTimestamp = event.block.timestamp.toI32()
|
||||
nft.tx = event.transaction.hash.toHex()
|
||||
nft.block = event.block.number.toI32()
|
||||
nft.eventIndex = event.logIndex.toI32()
|
||||
nft.transferable = event.params.transferable
|
||||
|
||||
nft.template = event.params.templateAddress.toHexString()
|
||||
nft.save()
|
||||
}
|
||||
|
||||
@ -39,6 +49,7 @@ export function handleNewToken(event: TokenCreated): void {
|
||||
token.createdTimestamp = event.block.timestamp.toI32()
|
||||
token.tx = event.transaction.hash.toHex()
|
||||
token.block = event.block.number.toI32()
|
||||
token.eventIndex = event.logIndex.toI32()
|
||||
|
||||
token.nft = event.params.creator.toHexString()
|
||||
|
||||
@ -47,25 +58,37 @@ export function handleNewToken(event: TokenCreated): void {
|
||||
token.decimals = 18
|
||||
token.supply = decimal.ZERO
|
||||
token.cap = weiToDecimal(event.params.cap.toBigDecimal(), 18)
|
||||
const eventTemplateAddress = event.params.templateAddress
|
||||
.toHexString()
|
||||
.toLowerCase()
|
||||
const contract = ERC721Factory.bind(event.address)
|
||||
const templateCount = contract.try_getCurrentTemplateCount()
|
||||
if (templateCount.reverted) return
|
||||
const templateCountNum = templateCount.value.toI32()
|
||||
|
||||
for (let i = 0; i < templateCountNum; i++) {
|
||||
const template = contract.try_getTokenTemplate(BigInt.fromI32(1 + i))
|
||||
if (template.reverted) return
|
||||
const templateAddress = template.value.templateAddress
|
||||
.toHexString()
|
||||
.toLowerCase()
|
||||
if (templateAddress == eventTemplateAddress) {
|
||||
token.templateId = 1 + i
|
||||
}
|
||||
}
|
||||
|
||||
token.templateId = getErc20TemplateId(event.params.templateAddress)
|
||||
token.save()
|
||||
addDatatoken()
|
||||
if (token.templateId.toString() == '3') {
|
||||
factoryERC20Template3.create(event.params.newTokenAddress)
|
||||
const predictContract = getPredictContract(event.params.newTokenAddress)
|
||||
predictContract.timestamp = event.block.timestamp.toI32()
|
||||
predictContract.txId = event.transaction.hash.toHex()
|
||||
predictContract.block = event.block.number.toI32()
|
||||
predictContract.eventIndex = event.logIndex.toI32()
|
||||
predictContract.save()
|
||||
}
|
||||
factoryERC20Template.create(event.params.newTokenAddress)
|
||||
}
|
||||
|
||||
export function handleNew721Template(event: Template721Added): void {
|
||||
let template = Erc721Template.load(
|
||||
event.params._templateAddress.toHexString()
|
||||
)
|
||||
if (template === null) {
|
||||
template = new Erc721Template(event.params._templateAddress.toHexString())
|
||||
template.templateId = event.params.nftTemplateCount
|
||||
template.save()
|
||||
}
|
||||
}
|
||||
|
||||
export function handleNew20Template(event: Template20Added): void {
|
||||
let template = Erc20Template.load(event.params._templateAddress.toHexString())
|
||||
if (template === null) {
|
||||
template = new Erc20Template(event.params._templateAddress.toHexString())
|
||||
template.templateId = event.params.nftTemplateCount
|
||||
template.save()
|
||||
}
|
||||
}
|
||||
|
@ -3,8 +3,6 @@ import {
|
||||
TokenRemoved,
|
||||
OPCFeeChanged,
|
||||
FactoryRouter,
|
||||
SSContractAdded,
|
||||
SSContractRemoved,
|
||||
FixedRateContractAdded,
|
||||
FixedRateContractRemoved,
|
||||
DispenserContractAdded,
|
||||
@ -86,37 +84,11 @@ export function handleTokenRemoved(event: TokenRemoved): void {
|
||||
while (existingTokens.length > 0) {
|
||||
const role = existingTokens.shift().toString()
|
||||
if (!role) break
|
||||
if (role !== event.params.token.toHexString()) newList.push(role)
|
||||
if (role != event.params.token.toHexString()) newList.push(role)
|
||||
}
|
||||
opc.approvedTokens = newList
|
||||
opc.save()
|
||||
}
|
||||
export function handleSSContractAdded(event: SSContractAdded): void {
|
||||
// add token to approvedTokens
|
||||
const templates = getTemplates()
|
||||
let existingContracts: string[]
|
||||
if (!templates.ssTemplates) existingContracts = []
|
||||
else existingContracts = templates.ssTemplates as string[]
|
||||
if (!existingContracts.includes(event.params.contractAddress.toHexString()))
|
||||
existingContracts.push(event.params.contractAddress.toHexString())
|
||||
templates.ssTemplates = existingContracts
|
||||
templates.save()
|
||||
}
|
||||
export function handleSSContractRemoved(event: SSContractRemoved): void {
|
||||
const templates = getTemplates()
|
||||
const newList: string[] = []
|
||||
let existingContracts: string[]
|
||||
if (!templates.ssTemplates) existingContracts = []
|
||||
else existingContracts = templates.ssTemplates as string[]
|
||||
if (!existingContracts || existingContracts.length < 1) return
|
||||
while (existingContracts.length > 0) {
|
||||
const role = existingContracts.shift().toString()
|
||||
if (!role) break
|
||||
if (role !== event.params.contractAddress.toHexString()) newList.push(role)
|
||||
}
|
||||
templates.ssTemplates = newList
|
||||
templates.save()
|
||||
}
|
||||
|
||||
export function handleFixedRateContractAdded(
|
||||
event: FixedRateContractAdded
|
||||
@ -144,7 +116,7 @@ export function handleFixedRateContractRemoved(
|
||||
while (existingContracts.length > 0) {
|
||||
const role = existingContracts.shift().toString()
|
||||
if (!role) break
|
||||
if (role !== event.params.contractAddress.toHexString()) newList.push(role)
|
||||
if (role != event.params.contractAddress.toHexString()) newList.push(role)
|
||||
}
|
||||
templates.fixedRateTemplates = newList
|
||||
templates.save()
|
||||
@ -175,7 +147,7 @@ export function handleDispenserContractRemoved(
|
||||
while (existingContracts.length > 0) {
|
||||
const role = existingContracts.shift().toString()
|
||||
if (!role) break
|
||||
if (role !== event.params.contractAddress.toHexString()) newList.push(role)
|
||||
if (role != event.params.contractAddress.toHexString()) newList.push(role)
|
||||
}
|
||||
templates.dispenserTemplates = newList
|
||||
templates.save()
|
||||
|
@ -50,6 +50,7 @@ export function handleExchangeCreated(event: ExchangeCreated): void {
|
||||
)
|
||||
fixedRateExchange.createdTimestamp = event.block.timestamp.toI32()
|
||||
fixedRateExchange.tx = event.transaction.hash.toHex()
|
||||
fixedRateExchange.eventIndex = event.logIndex.toI32()
|
||||
fixedRateExchange.block = event.block.number.toI32()
|
||||
fixedRateExchange.save()
|
||||
|
||||
@ -63,12 +64,14 @@ export function handleRateChange(event: ExchangeRateChanged): void {
|
||||
event.address
|
||||
)
|
||||
const fixedRateExchange = getFixedRateExchange(fixedRateId)
|
||||
const eventIndex: number = event.logIndex.toI32()
|
||||
const newExchangeUpdate = new FixedRateExchangeUpdate(
|
||||
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId)
|
||||
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId, eventIndex)
|
||||
)
|
||||
newExchangeUpdate.oldPrice = fixedRateExchange.price
|
||||
newExchangeUpdate.createdTimestamp = event.block.timestamp.toI32()
|
||||
newExchangeUpdate.tx = event.transaction.hash.toHex()
|
||||
newExchangeUpdate.eventIndex = event.logIndex.toI32()
|
||||
newExchangeUpdate.block = event.block.number.toI32()
|
||||
newExchangeUpdate.exchangeId = fixedRateId
|
||||
|
||||
@ -89,6 +92,7 @@ export function handleMintStateChanged(event: ExchangeMintStateChanged): void {
|
||||
)
|
||||
const fixedRateExchange = getFixedRateExchange(fixedRateId)
|
||||
fixedRateExchange.withMint = event.params.withMint
|
||||
fixedRateExchange.eventIndex = event.logIndex.toI32()
|
||||
fixedRateExchange.save()
|
||||
}
|
||||
|
||||
@ -98,14 +102,16 @@ export function handleActivated(event: ExchangeActivated): void {
|
||||
event.address
|
||||
)
|
||||
const fixedRateExchange = getFixedRateExchange(fixedRateId)
|
||||
const eventIndex: number = event.logIndex.toI32()
|
||||
const newExchangeUpdate = new FixedRateExchangeUpdate(
|
||||
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId)
|
||||
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId, eventIndex)
|
||||
)
|
||||
newExchangeUpdate.exchangeId = fixedRateId
|
||||
newExchangeUpdate.oldActive = fixedRateExchange.active
|
||||
newExchangeUpdate.newActive = true
|
||||
newExchangeUpdate.createdTimestamp = event.block.timestamp.toI32()
|
||||
newExchangeUpdate.tx = event.transaction.hash.toHex()
|
||||
newExchangeUpdate.eventIndex = event.logIndex.toI32()
|
||||
newExchangeUpdate.block = event.block.number.toI32()
|
||||
|
||||
fixedRateExchange.active = true
|
||||
@ -120,8 +126,9 @@ export function handleDeactivated(event: ExchangeDeactivated): void {
|
||||
event.address
|
||||
)
|
||||
const fixedRateExchange = getFixedRateExchange(fixedRateId)
|
||||
const eventIndex: number = event.logIndex.toI32()
|
||||
const newExchangeUpdate = new FixedRateExchangeUpdate(
|
||||
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId)
|
||||
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId, eventIndex)
|
||||
)
|
||||
newExchangeUpdate.oldActive = fixedRateExchange.active
|
||||
newExchangeUpdate.newActive = false
|
||||
@ -129,6 +136,7 @@ export function handleDeactivated(event: ExchangeDeactivated): void {
|
||||
newExchangeUpdate.exchangeId = fixedRateId
|
||||
newExchangeUpdate.createdTimestamp = event.block.timestamp.toI32()
|
||||
newExchangeUpdate.tx = event.transaction.hash.toHex()
|
||||
newExchangeUpdate.eventIndex = event.logIndex.toI32()
|
||||
newExchangeUpdate.block = event.block.number.toI32()
|
||||
|
||||
fixedRateExchange.active = false
|
||||
@ -144,11 +152,13 @@ export function handleAllowedSwapperChanged(
|
||||
event.address
|
||||
)
|
||||
const fixedRateExchange = getFixedRateExchange(fixedRateId)
|
||||
const eventIndex: number = event.logIndex.toI32()
|
||||
const newExchangeUpdate = new FixedRateExchangeUpdate(
|
||||
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId)
|
||||
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId, eventIndex)
|
||||
)
|
||||
newExchangeUpdate.createdTimestamp = event.block.timestamp.toI32()
|
||||
newExchangeUpdate.tx = event.transaction.hash.toHex()
|
||||
newExchangeUpdate.eventIndex = event.logIndex.toI32()
|
||||
newExchangeUpdate.block = event.block.number.toI32()
|
||||
newExchangeUpdate.oldAllowedSwapper = fixedRateExchange.allowedSwapper
|
||||
newExchangeUpdate.exchangeId = fixedRateId
|
||||
@ -165,12 +175,13 @@ export function handleSwap(event: Swapped): void {
|
||||
event.address
|
||||
)
|
||||
const fixedRateExchange = getFixedRateExchange(fixedRateId)
|
||||
|
||||
const eventIndex: number = event.logIndex.toI32()
|
||||
const swap = new FixedRateExchangeSwap(
|
||||
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId)
|
||||
getUpdateOrSwapId(event.transaction.hash.toHex(), fixedRateId, eventIndex)
|
||||
)
|
||||
swap.createdTimestamp = event.block.timestamp.toI32()
|
||||
swap.tx = event.transaction.hash.toHex()
|
||||
swap.eventIndex = event.logIndex.toI32()
|
||||
swap.block = event.block.number.toI32()
|
||||
|
||||
swap.exchangeId = fixedRateId
|
||||
@ -191,6 +202,20 @@ export function handleSwap(event: Swapped): void {
|
||||
BigInt.fromI32(18).toI32()
|
||||
)
|
||||
|
||||
// Track fees
|
||||
swap.oceanFeeAmount = weiToDecimal(
|
||||
event.params.oceanFeeAmount.toBigDecimal(),
|
||||
BigInt.fromI32(baseToken.decimals).toI32()
|
||||
)
|
||||
swap.marketFeeAmount = weiToDecimal(
|
||||
event.params.marketFeeAmount.toBigDecimal(),
|
||||
BigInt.fromI32(baseToken.decimals).toI32()
|
||||
)
|
||||
swap.consumeMarketFeeAmount = weiToDecimal(
|
||||
event.params.consumeMarketFeeAmount.toBigDecimal(),
|
||||
BigInt.fromI32(baseToken.decimals).toI32()
|
||||
)
|
||||
|
||||
swap.save()
|
||||
|
||||
updateFixedRateExchangeSupply(event.params.exchangeId, event.address)
|
||||
@ -206,7 +231,11 @@ export function handleSwap(event: Swapped): void {
|
||||
Address.fromString(fixedRateExchange.datatoken),
|
||||
true
|
||||
)
|
||||
datatoken.lastPriceToken = fixedRateExchange.baseToken
|
||||
const priceToken = getToken(
|
||||
Address.fromString(fixedRateExchange.baseToken),
|
||||
false
|
||||
)
|
||||
datatoken.lastPriceToken = priceToken.id
|
||||
datatoken.lastPriceValue = fixedRateExchange.price
|
||||
datatoken.save()
|
||||
}
|
||||
@ -226,6 +255,7 @@ export function handlePublishMarketFeeChanged(
|
||||
event.params.swapFee.toBigDecimal(),
|
||||
BigInt.fromI32(18).toI32()
|
||||
)
|
||||
fixedRateExchange.eventIndex = event.logIndex.toI32()
|
||||
fixedRateExchange.save()
|
||||
}
|
||||
}
|
||||
@ -243,7 +273,7 @@ export function handleTokenCollected(event: TokenCollected): void {
|
||||
fixedRateExchange.baseTokenBalance.minus(
|
||||
weiToDecimal(event.params.amount.toBigDecimal(), baseToken.decimals)
|
||||
)
|
||||
|
||||
fixedRateExchange.eventIndex = event.logIndex.toI32()
|
||||
fixedRateExchange.save()
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { Nft, NftUpdate, NftData } from '../@types/schema'
|
||||
import { Nft, NftUpdate, NftData, NftTransferHistory } from '../@types/schema'
|
||||
import {
|
||||
MetadataCreated,
|
||||
MetadataState,
|
||||
@ -20,8 +20,8 @@ import { NftUpdateType } from './utils/constants'
|
||||
import { getNftToken, getNftTokenWithID } from './utils/tokenUtils'
|
||||
import { getUser } from './utils/userUtils'
|
||||
|
||||
function getId(tx: string, nftAddress: string): string {
|
||||
return `${tx}-${nftAddress}`
|
||||
function getId(tx: string, nftAddress: string, eventIndex: number): string {
|
||||
return `${tx}-${nftAddress}-${eventIndex}`
|
||||
}
|
||||
|
||||
export function handleMetadataCreated(event: MetadataCreated): void {
|
||||
@ -33,8 +33,9 @@ export function handleMetadataCreated(event: MetadataCreated): void {
|
||||
nft.providerUrl = event.params.decryptorUrl.toString()
|
||||
nft.hasMetadata = true
|
||||
|
||||
const eventIndex: number = event.logIndex.toI32()
|
||||
const nftUpdate = new NftUpdate(
|
||||
getId(event.transaction.hash.toHex(), nftAddress)
|
||||
getId(event.transaction.hash.toHex(), nftAddress, eventIndex)
|
||||
)
|
||||
|
||||
nftUpdate.type = NftUpdateType.METADATA_CREATED
|
||||
@ -47,6 +48,7 @@ export function handleMetadataCreated(event: MetadataCreated): void {
|
||||
|
||||
nftUpdate.timestamp = event.block.timestamp.toI32()
|
||||
nftUpdate.tx = event.transaction.hash.toHex()
|
||||
nftUpdate.eventIndex = event.logIndex.toI32()
|
||||
nftUpdate.block = event.block.number.toI32()
|
||||
|
||||
nftUpdate.save()
|
||||
@ -60,8 +62,9 @@ export function handleMetadataUpdated(event: MetadataUpdated): void {
|
||||
|
||||
nft.assetState = event.params.state
|
||||
nft.hasMetadata = true
|
||||
const eventIndex: number = event.logIndex.toI32()
|
||||
const nftUpdate = new NftUpdate(
|
||||
getId(event.transaction.hash.toHex(), nftAddress)
|
||||
getId(event.transaction.hash.toHex(), nftAddress, eventIndex)
|
||||
)
|
||||
|
||||
nftUpdate.nft = nft.id
|
||||
@ -71,6 +74,7 @@ export function handleMetadataUpdated(event: MetadataUpdated): void {
|
||||
|
||||
nftUpdate.timestamp = event.block.timestamp.toI32()
|
||||
nftUpdate.tx = event.transaction.hash.toHex()
|
||||
nftUpdate.eventIndex = event.logIndex.toI32()
|
||||
nftUpdate.block = event.block.number.toI32()
|
||||
|
||||
nftUpdate.save()
|
||||
@ -83,9 +87,9 @@ export function handleMetadataState(event: MetadataState): void {
|
||||
if (!nft) return
|
||||
|
||||
nft.assetState = event.params.state
|
||||
|
||||
const eventIndex: number = event.logIndex.toI32()
|
||||
const nftUpdate = new NftUpdate(
|
||||
getId(event.transaction.hash.toHex(), nftAddress)
|
||||
getId(event.transaction.hash.toHex(), nftAddress, eventIndex)
|
||||
)
|
||||
|
||||
nftUpdate.nft = nft.id
|
||||
@ -95,6 +99,7 @@ export function handleMetadataState(event: MetadataState): void {
|
||||
|
||||
nftUpdate.timestamp = event.block.timestamp.toI32()
|
||||
nftUpdate.tx = event.transaction.hash.toHex()
|
||||
nftUpdate.eventIndex = event.logIndex.toI32()
|
||||
nftUpdate.block = event.block.number.toI32()
|
||||
|
||||
nftUpdate.save()
|
||||
@ -108,9 +113,9 @@ export function handleTokenUriUpdate(event: TokenURIUpdate): void {
|
||||
if (!nft) return
|
||||
|
||||
nft.tokenUri = event.params.tokenURI.toString()
|
||||
|
||||
const eventIndex: number = event.logIndex.toI32()
|
||||
const nftUpdate = new NftUpdate(
|
||||
getId(event.transaction.hash.toHex(), nftAddress)
|
||||
getId(event.transaction.hash.toHex(), nftAddress, eventIndex)
|
||||
)
|
||||
nftUpdate.nft = nft.id
|
||||
nftUpdate.type = NftUpdateType.TOKENURI_UPDATED
|
||||
@ -118,6 +123,7 @@ export function handleTokenUriUpdate(event: TokenURIUpdate): void {
|
||||
nftUpdate.tokenUri = nft.tokenUri
|
||||
nftUpdate.timestamp = event.block.timestamp.toI32()
|
||||
nftUpdate.tx = event.transaction.hash.toHex()
|
||||
nftUpdate.eventIndex = event.logIndex.toI32()
|
||||
nftUpdate.block = event.block.number.toI32()
|
||||
nftUpdate.assetState = nft.assetState
|
||||
nftUpdate.save()
|
||||
@ -133,6 +139,7 @@ export function handleAddedManager(event: AddedManager): void {
|
||||
if (!existingRoles.includes(event.params.user.toHexString()))
|
||||
existingRoles.push(event.params.user.toHexString())
|
||||
nft.managerRole = existingRoles
|
||||
nft.eventIndex = event.logIndex.toI32()
|
||||
nft.save()
|
||||
}
|
||||
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)
|
||||
}
|
||||
nft.managerRole = newList
|
||||
nft.eventIndex = event.logIndex.toI32()
|
||||
nft.save()
|
||||
}
|
||||
|
||||
@ -160,6 +168,7 @@ export function handleAddedTo725StoreList(event: AddedTo725StoreList): void {
|
||||
if (!existingRoles.includes(event.params.user.toHexString()))
|
||||
existingRoles.push(event.params.user.toHexString())
|
||||
nft.storeUpdateRole = existingRoles
|
||||
nft.eventIndex = event.logIndex.toI32()
|
||||
nft.save()
|
||||
}
|
||||
|
||||
@ -178,6 +187,7 @@ export function handleRemovedFrom725StoreList(
|
||||
if (role !== event.params.user.toHexString()) newList.push(role)
|
||||
}
|
||||
nft.storeUpdateRole = newList
|
||||
nft.eventIndex = event.logIndex.toI32()
|
||||
nft.save()
|
||||
}
|
||||
|
||||
@ -192,6 +202,7 @@ export function handleAddedToCreateERC20List(
|
||||
if (!existingRoles.includes(event.params.user.toHexString()))
|
||||
existingRoles.push(event.params.user.toHexString())
|
||||
nft.erc20DeployerRole = existingRoles
|
||||
nft.eventIndex = event.logIndex.toI32()
|
||||
nft.save()
|
||||
}
|
||||
|
||||
@ -210,6 +221,7 @@ export function handleRemovedFromCreateERC20List(
|
||||
if (role !== event.params.user.toHexString()) newList.push(role)
|
||||
}
|
||||
nft.erc20DeployerRole = newList
|
||||
nft.eventIndex = event.logIndex.toI32()
|
||||
nft.save()
|
||||
}
|
||||
|
||||
@ -222,6 +234,7 @@ export function handleAddedToMetadataList(event: AddedToMetadataList): void {
|
||||
if (!existingRoles.includes(event.params.user.toHexString()))
|
||||
existingRoles.push(event.params.user.toHexString())
|
||||
nft.metadataRole = existingRoles
|
||||
nft.eventIndex = event.logIndex.toI32()
|
||||
nft.save()
|
||||
}
|
||||
|
||||
@ -240,6 +253,7 @@ export function handleRemovedFromMetadataList(
|
||||
if (role !== event.params.user.toHexString()) newList.push(role)
|
||||
}
|
||||
nft.metadataRole = newList
|
||||
nft.eventIndex = event.logIndex.toI32()
|
||||
nft.save()
|
||||
}
|
||||
|
||||
@ -250,15 +264,30 @@ export function handleCleanedPermissions(event: CleanedPermissions): void {
|
||||
nft.erc20DeployerRole = newList
|
||||
nft.storeUpdateRole = newList
|
||||
nft.managerRole = newList
|
||||
nft.eventIndex = event.logIndex.toI32()
|
||||
nft.save()
|
||||
}
|
||||
|
||||
export function handleNftTransferred(event: Transfer): void {
|
||||
const id = event.address.toHex()
|
||||
const nft = getNftTokenWithID(id)
|
||||
const oldOwner = nft.owner
|
||||
const newOwner = getUser(event.params.to.toHexString())
|
||||
nft.owner = newOwner.id
|
||||
nft.save()
|
||||
const eventIndex: number = event.logIndex.toI32()
|
||||
const transferId = `${
|
||||
nft.address
|
||||
}-${event.transaction.hash.toHex()}-${eventIndex}`
|
||||
const newTransfer = new NftTransferHistory(transferId)
|
||||
newTransfer.oldOwner = oldOwner
|
||||
newTransfer.nft = nft.id
|
||||
newTransfer.newOwner = newOwner.id
|
||||
newTransfer.txId = event.transaction.hash.toHex()
|
||||
newTransfer.eventIndex = event.logIndex.toI32()
|
||||
newTransfer.timestamp = event.block.timestamp.toI32()
|
||||
newTransfer.block = event.block.number.toI32()
|
||||
newTransfer.save()
|
||||
}
|
||||
|
||||
export function handleNftData(event: DataChanged): void {
|
||||
|
@ -52,12 +52,18 @@ export function updateFixedRateExchangeSupply(
|
||||
fixedRateDetails.value.value8.toBigDecimal(),
|
||||
baseToken.decimals
|
||||
)
|
||||
// update withMint state
|
||||
fixedRateExchange.withMint = fixedRateDetails.value.value11
|
||||
|
||||
// update active state
|
||||
fixedRateExchange.active = fixedRateDetails.value.value6
|
||||
fixedRateExchange.save()
|
||||
}
|
||||
|
||||
export function getUpdateOrSwapId(
|
||||
txAddress: string,
|
||||
exchangeId: string
|
||||
exchangeId: string,
|
||||
eventIndex: number
|
||||
): string {
|
||||
return `${txAddress}-${exchangeId}`
|
||||
return `${txAddress}-${exchangeId}-${eventIndex}`
|
||||
}
|
||||
|
@ -13,12 +13,13 @@ export function getGlobalStats(): GlobalStatistic {
|
||||
let globalStats = GlobalStatistic.load(GLOBAL_ID)
|
||||
if (!globalStats) {
|
||||
globalStats = new GlobalStatistic(GLOBAL_ID)
|
||||
globalStats.version = '2.1.0'
|
||||
globalStats.version = '4.0.2'
|
||||
globalStats.orderCount = 0
|
||||
globalStats.fixedCount = 0
|
||||
globalStats.datatokenCount = 0
|
||||
globalStats.dispenserCount = 0
|
||||
globalStats.nftCount = 0
|
||||
globalStats.totalOceanLocked = BigDecimal.zero()
|
||||
globalStats.save()
|
||||
}
|
||||
return globalStats
|
||||
@ -33,6 +34,11 @@ export function getOPC(): OPC {
|
||||
return globalStats
|
||||
}
|
||||
|
||||
export function getTotalOceanLocked(): BigDecimal {
|
||||
const globalStats = getGlobalStats()
|
||||
return globalStats.totalOceanLocked
|
||||
}
|
||||
|
||||
export function getTemplates(): Template {
|
||||
let templates = Template.load(GLOBAL_ID)
|
||||
if (!templates) {
|
||||
@ -42,6 +48,12 @@ export function getTemplates(): Template {
|
||||
return templates
|
||||
}
|
||||
|
||||
export function updateTotalOceanLocked(amount: BigDecimal): void {
|
||||
const globalStats = getGlobalStats()
|
||||
globalStats.totalOceanLocked = amount
|
||||
globalStats.save()
|
||||
}
|
||||
|
||||
export function addOrder(): void {
|
||||
const globalStats = getGlobalStats()
|
||||
globalStats.orderCount = globalStats.orderCount + 1
|
||||
|
@ -1,11 +1,12 @@
|
||||
import { Order } from '../../@types/schema'
|
||||
import { Order, OrderReuse } from '../../@types/schema'
|
||||
|
||||
export function getOrderId(
|
||||
tx: string,
|
||||
tokenAddress: string,
|
||||
fromAddress: string
|
||||
fromAddress: string,
|
||||
eventIndex: number
|
||||
): string {
|
||||
return `${tx}-${tokenAddress}-${fromAddress}`
|
||||
return `${tx}-${tokenAddress}-${fromAddress}-${eventIndex}`
|
||||
}
|
||||
|
||||
export function createOrder(orderId: string): Order {
|
||||
@ -16,12 +17,53 @@ export function createOrder(orderId: string): Order {
|
||||
export function getOrder(
|
||||
transactionHash: string,
|
||||
address: string,
|
||||
transactionFrom: string
|
||||
transactionFrom: string,
|
||||
eventIndex: number
|
||||
): Order {
|
||||
const orderId = getOrderId(transactionHash, address, transactionFrom)
|
||||
const orderId = getOrderId(
|
||||
transactionHash,
|
||||
address,
|
||||
transactionFrom,
|
||||
eventIndex
|
||||
)
|
||||
let newOrder = Order.load(orderId)
|
||||
if (newOrder === null) {
|
||||
newOrder = createOrder(orderId)
|
||||
}
|
||||
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
|
||||
}
|
||||
|
@ -1,15 +1,18 @@
|
||||
import { Address, log, BigDecimal, BigInt } from '@graphprotocol/graph-ts'
|
||||
import { Nft, Token } from '../../@types/schema'
|
||||
import {
|
||||
Nft,
|
||||
Token,
|
||||
PredictContract,
|
||||
Erc721Template,
|
||||
Erc20Template
|
||||
} from '../../@types/schema'
|
||||
import { ERC20 } from '../../@types/templates/ERC20Template/ERC20'
|
||||
import { ERC20Template, ERC721Template } from '../../@types/templates'
|
||||
import { ERC721Template } from '../../@types/templates'
|
||||
import { addNft } from './globalUtils'
|
||||
import { ZERO_ADDRESS } from './constants'
|
||||
|
||||
export function createToken(address: Address, isDatatoken: boolean): Token {
|
||||
log.debug('started creating token with address: {}', [address.toHexString()])
|
||||
if (isDatatoken) {
|
||||
ERC20Template.create(address)
|
||||
}
|
||||
const token = new Token(address.toHexString())
|
||||
const contract = ERC20.bind(address)
|
||||
const name = contract.try_name()
|
||||
@ -30,6 +33,8 @@ export function createToken(address: Address, isDatatoken: boolean): Token {
|
||||
token.createdTimestamp = 0
|
||||
token.block = 0
|
||||
token.tx = ''
|
||||
token.eventIndex = 0
|
||||
token.templateId = BigInt.zero()
|
||||
token.save()
|
||||
return token
|
||||
}
|
||||
@ -60,6 +65,7 @@ export function createNftToken(address: Address): Nft {
|
||||
token.tx = ''
|
||||
token.orderCount = BigInt.zero()
|
||||
token.hasMetadata = false
|
||||
token.eventIndex = 0
|
||||
token.save()
|
||||
addNft()
|
||||
return token
|
||||
@ -93,6 +99,7 @@ export function getNftTokenWithID(tokenId: string): Nft {
|
||||
nftToken.tx = ''
|
||||
nftToken.orderCount = BigInt.zero()
|
||||
nftToken.hasMetadata = false
|
||||
nftToken.eventIndex = 0
|
||||
nftToken.save()
|
||||
addNft()
|
||||
}
|
||||
@ -106,3 +113,44 @@ export function getUSDValue(
|
||||
): BigDecimal {
|
||||
return BigDecimal.zero()
|
||||
}
|
||||
|
||||
export function getErc721TemplateId(address: Address): BigInt {
|
||||
const template = Erc721Template.load(address.toHexString())
|
||||
if (template) {
|
||||
return template.templateId
|
||||
}
|
||||
return BigInt.zero()
|
||||
}
|
||||
|
||||
export function getErc20TemplateId(address: Address): BigInt {
|
||||
const template = Erc20Template.load(address.toHexString())
|
||||
if (template) {
|
||||
return template.templateId
|
||||
}
|
||||
return BigInt.zero()
|
||||
}
|
||||
|
||||
export function createPredictContract(address: Address): PredictContract {
|
||||
const predictContract = new PredictContract(address.toHexString())
|
||||
const token = getToken(address, true)
|
||||
predictContract.token = token.id
|
||||
predictContract.secondsPerEpoch = BigInt.zero()
|
||||
predictContract.secondsPerSubscription = BigInt.zero()
|
||||
predictContract.truevalSubmitTimeout = BigInt.zero()
|
||||
predictContract.stakeToken = null
|
||||
predictContract.txId = ''
|
||||
predictContract.timestamp = 0
|
||||
predictContract.block = 0
|
||||
predictContract.eventIndex = 0
|
||||
predictContract.paused = false
|
||||
predictContract.save()
|
||||
return predictContract
|
||||
}
|
||||
|
||||
export function getPredictContract(address: Address): PredictContract {
|
||||
let newPredictContract = PredictContract.load(address.toHexString())
|
||||
if (newPredictContract === null) {
|
||||
newPredictContract = createPredictContract(address)
|
||||
}
|
||||
return newPredictContract
|
||||
}
|
||||
|
@ -38,6 +38,7 @@ export function getveAllocateUser(
|
||||
|
||||
allocateUser.firstContact = event.block.timestamp.toI32()
|
||||
allocateUser.tx = event.transaction.hash.toHex()
|
||||
allocateUser.eventIndex = event.logIndex.toI32()
|
||||
allocateUser.block = event.block.number.toI32()
|
||||
allocateUser.lastContact = 0
|
||||
const veOcean = getveOCEAN(sender)
|
||||
@ -60,8 +61,11 @@ export function getveAllocateId(
|
||||
|
||||
allocateId.firstContact = event.block.timestamp.toI32()
|
||||
allocateId.tx = event.transaction.hash.toHex()
|
||||
allocateId.eventIndex = event.logIndex.toI32()
|
||||
allocateId.block = event.block.number.toI32()
|
||||
allocateId.lastContact = 0
|
||||
allocateId.chainId = BigInt.zero()
|
||||
allocateId.nftAddress = ''
|
||||
|
||||
allocateId.save()
|
||||
}
|
||||
@ -85,6 +89,7 @@ export function getveAllocation(
|
||||
|
||||
veAllocation.firstContact = event.block.timestamp.toI32()
|
||||
veAllocation.tx = event.transaction.hash.toHex()
|
||||
veAllocation.eventIndex = event.logIndex.toI32()
|
||||
veAllocation.block = event.block.number.toI32()
|
||||
veAllocation.lastContact = 0
|
||||
|
||||
@ -101,16 +106,17 @@ export function writeveAllocationUpdate(
|
||||
allocationType: string,
|
||||
amount: BigDecimal
|
||||
): VeAllocationUpdate {
|
||||
const tx = event.transaction.hash.toHex()
|
||||
let allocationUpdate = VeAllocationUpdate.load(tx + '-' + veAllocationId)
|
||||
const id = `${event.transaction.hash.toHex()}-${veAllocationId}-${event.logIndex.toString()}`
|
||||
let allocationUpdate = VeAllocationUpdate.load(id)
|
||||
if (allocationUpdate === null) {
|
||||
allocationUpdate = new VeAllocationUpdate(tx + '-' + veAllocationId)
|
||||
allocationUpdate = new VeAllocationUpdate(id)
|
||||
allocationUpdate.veAllocation = veAllocationId
|
||||
allocationUpdate.type = allocationType
|
||||
allocationUpdate.allocatedTotal = amount
|
||||
|
||||
allocationUpdate.timestamp = event.block.timestamp.toI32()
|
||||
allocationUpdate.tx = event.transaction.hash.toHex()
|
||||
allocationUpdate.eventIndex = event.logIndex.toI32()
|
||||
allocationUpdate.block = event.block.number.toI32()
|
||||
|
||||
allocationUpdate.save()
|
||||
@ -119,7 +125,11 @@ export function writeveAllocationUpdate(
|
||||
return allocationUpdate
|
||||
}
|
||||
|
||||
export function getveDelegation(id: string): VeDelegation {
|
||||
export function getveDelegation(
|
||||
contract: Address,
|
||||
eventid: string
|
||||
): VeDelegation {
|
||||
const id = contract.toHex() + '-' + eventid
|
||||
let veDelegation = VeDelegation.load(id)
|
||||
|
||||
if (veDelegation === null) {
|
||||
@ -127,18 +137,17 @@ export function getveDelegation(id: string): VeDelegation {
|
||||
veDelegation.cancelTime = BigInt.zero()
|
||||
veDelegation.expireTime = BigInt.zero()
|
||||
veDelegation.tokenId = BigInt.zero()
|
||||
veDelegation.amount = BigInt.zero()
|
||||
veDelegation.amount = BigDecimal.zero()
|
||||
veDelegation.receiver = ''
|
||||
veDelegation.delegator = ''
|
||||
veDelegation.block = 0
|
||||
veDelegation.lockedAmount = BigDecimal.zero()
|
||||
veDelegation.timeLeftUnlock = 0
|
||||
veDelegation.save()
|
||||
}
|
||||
return veDelegation
|
||||
}
|
||||
|
||||
export function getDeposit(id: string): VeDeposit {
|
||||
let deposit = VeDeposit.load(id)
|
||||
|
||||
if (deposit === null) {
|
||||
deposit = new VeDeposit(id)
|
||||
deposit.provider = ''
|
||||
@ -148,6 +157,7 @@ export function getDeposit(id: string): VeDeposit {
|
||||
deposit.type = BigInt.zero()
|
||||
deposit.timestamp = BigInt.zero()
|
||||
deposit.tx = ''
|
||||
deposit.eventIndex = 0
|
||||
deposit.block = 0
|
||||
// do not save it
|
||||
// deposit.save()
|
||||
@ -196,6 +206,9 @@ export function handleOneAllocation(
|
||||
allocationAmount
|
||||
)
|
||||
|
||||
allocateId.chainId = chainId
|
||||
allocateId.nftAddress = nftAddress
|
||||
|
||||
// save entities
|
||||
allocateUser.save()
|
||||
allocateId.save()
|
||||
|
@ -1,10 +1,12 @@
|
||||
import { BigInt } from '@graphprotocol/graph-ts'
|
||||
import { BigDecimal, BigInt } from '@graphprotocol/graph-ts'
|
||||
import { VeDelegationUpdate } from '../@types/schema'
|
||||
import {
|
||||
BurnBoost,
|
||||
DelegateBoost,
|
||||
ExtendBoost,
|
||||
TransferBoost
|
||||
} from '../@types/veDelegation/veDelegation'
|
||||
import { weiToDecimal } from './utils/generic'
|
||||
import { getveDelegation, getveOCEAN } from './utils/veUtils'
|
||||
|
||||
export function handleDelegation(event: DelegateBoost): void {
|
||||
@ -14,17 +16,39 @@ export function handleDelegation(event: DelegateBoost): void {
|
||||
const _amount = event.params._amount
|
||||
const _cancelTime = event.params._cancel_time
|
||||
const _expireTime = event.params._expire_time
|
||||
|
||||
const veDelegation = getveDelegation(_tokenId.toHex())
|
||||
veDelegation.delegator = _delegator
|
||||
// create veOcean if does not exists
|
||||
getveOCEAN(_receiver)
|
||||
const delegator = getveOCEAN(_delegator)
|
||||
const veDelegation = getveDelegation(event.address, _tokenId.toHex())
|
||||
const ts = event.block.timestamp.toI32()
|
||||
|
||||
veDelegation.delegator = _delegator
|
||||
veDelegation.receiver = _receiver
|
||||
veDelegation.tokenId = _tokenId
|
||||
veDelegation.amount = _amount
|
||||
veDelegation.amount = weiToDecimal(
|
||||
_amount.toBigDecimal(),
|
||||
BigInt.fromI32(18).toI32()
|
||||
)
|
||||
veDelegation.lockedAmount = delegator.lockedAmount
|
||||
veDelegation.timeLeftUnlock = delegator.unlockTime.toI32() - ts
|
||||
veDelegation.cancelTime = _cancelTime
|
||||
veDelegation.expireTime = _expireTime
|
||||
veDelegation.block = event.block.number.toI32()
|
||||
veDelegation.save()
|
||||
|
||||
const veDelegationUpdate = new VeDelegationUpdate(
|
||||
event.transaction.hash.toHex() + '-' + event.logIndex.toString()
|
||||
)
|
||||
veDelegationUpdate.type = 0
|
||||
veDelegationUpdate.veDelegation = veDelegation.id
|
||||
veDelegationUpdate.block = event.block.number.toI32()
|
||||
veDelegationUpdate.timestamp = event.block.timestamp.toI32()
|
||||
veDelegationUpdate.tx = event.transaction.hash.toHex()
|
||||
veDelegationUpdate.eventIndex = event.logIndex.toI32()
|
||||
veDelegationUpdate.amount = veDelegation.amount
|
||||
veDelegationUpdate.cancelTime = _cancelTime
|
||||
veDelegationUpdate.expireTime = _expireTime
|
||||
veDelegationUpdate.sender = event.transaction.from.toHex()
|
||||
veDelegationUpdate.save()
|
||||
}
|
||||
|
||||
export function handleExtendBoost(event: ExtendBoost): void {
|
||||
@ -34,15 +58,37 @@ export function handleExtendBoost(event: ExtendBoost): void {
|
||||
const _amount = event.params._amount
|
||||
const _cancelTime = event.params._cancel_time
|
||||
const _expireTime = event.params._expire_time
|
||||
|
||||
const veDelegation = getveDelegation(_tokenId.toHex())
|
||||
// create veOcean if does not exists
|
||||
getveOCEAN(_receiver)
|
||||
getveOCEAN(_delegator)
|
||||
// it's possible to not have veDelegation object, because we missed handleDelegation
|
||||
// that should not happend, but we create the object anyway
|
||||
const veDelegation = getveDelegation(event.address, _tokenId.toHex())
|
||||
veDelegation.delegator = _delegator
|
||||
veDelegation.receiver = _receiver
|
||||
veDelegation.tokenId = _tokenId
|
||||
veDelegation.amount = _amount
|
||||
veDelegation.amount = weiToDecimal(
|
||||
_amount.toBigDecimal(),
|
||||
BigInt.fromI32(18).toI32()
|
||||
)
|
||||
veDelegation.cancelTime = _cancelTime
|
||||
veDelegation.expireTime = _expireTime
|
||||
veDelegation.save()
|
||||
|
||||
const veDelegationUpdate = new VeDelegationUpdate(
|
||||
event.transaction.hash.toHex() + '-' + event.logIndex.toString()
|
||||
)
|
||||
veDelegationUpdate.veDelegation = veDelegation.id
|
||||
veDelegationUpdate.type = 1
|
||||
veDelegationUpdate.block = event.block.number.toI32()
|
||||
veDelegationUpdate.timestamp = event.block.timestamp.toI32()
|
||||
veDelegationUpdate.tx = event.transaction.hash.toHex()
|
||||
veDelegationUpdate.eventIndex = event.logIndex.toI32()
|
||||
veDelegationUpdate.amount = veDelegation.amount
|
||||
veDelegationUpdate.cancelTime = _cancelTime
|
||||
veDelegationUpdate.expireTime = _expireTime
|
||||
veDelegationUpdate.sender = event.transaction.from.toHex()
|
||||
veDelegationUpdate.save()
|
||||
}
|
||||
|
||||
export function handleTransferBoost(event: TransferBoost): void {
|
||||
@ -58,6 +104,22 @@ export function handleBurnBoost(event: BurnBoost): void {
|
||||
const _tokenId = event.params._token_id
|
||||
|
||||
// delete
|
||||
const veDelegation = getveDelegation(_tokenId.toHex())
|
||||
veDelegation.amount = BigInt.zero()
|
||||
const veDelegation = getveDelegation(event.address, _tokenId.toHex())
|
||||
veDelegation.amount = BigDecimal.zero()
|
||||
veDelegation.save()
|
||||
|
||||
const veDelegationUpdate = new VeDelegationUpdate(
|
||||
event.transaction.hash.toHex() + '-' + event.logIndex.toString()
|
||||
)
|
||||
veDelegationUpdate.veDelegation = veDelegation.id
|
||||
veDelegationUpdate.type = 2
|
||||
veDelegationUpdate.block = event.block.number.toI32()
|
||||
veDelegationUpdate.timestamp = event.block.timestamp.toI32()
|
||||
veDelegationUpdate.tx = event.transaction.hash.toHex()
|
||||
veDelegationUpdate.eventIndex = event.logIndex.toI32()
|
||||
veDelegationUpdate.amount = veDelegation.amount
|
||||
veDelegationUpdate.cancelTime = veDelegation.cancelTime
|
||||
veDelegationUpdate.expireTime = veDelegation.expireTime
|
||||
veDelegationUpdate.sender = event.transaction.from.toHex()
|
||||
veDelegationUpdate.save()
|
||||
}
|
||||
|
@ -27,6 +27,7 @@ export function handleClaimed(event: Claimed): void {
|
||||
|
||||
claim.block = event.block.number.toI32()
|
||||
claim.tx = event.transaction.hash.toHex()
|
||||
claim.eventIndex = event.logIndex.toI32()
|
||||
claim.timestamp = event.block.timestamp
|
||||
claim.save()
|
||||
}
|
||||
@ -44,6 +45,7 @@ export function handleCheckpoint(event: CheckpointToken): void {
|
||||
checkpoint.sender = event.transaction.from.toHexString()
|
||||
checkpoint.block = event.block.number.toI32()
|
||||
checkpoint.tx = event.transaction.hash.toHex()
|
||||
checkpoint.eventIndex = event.logIndex.toI32()
|
||||
checkpoint.timestamp = event.params.time
|
||||
checkpoint.VeFeeDistributor = distributor.id
|
||||
checkpoint.save()
|
||||
|
@ -2,6 +2,10 @@ import { BigDecimal, BigInt } from '@graphprotocol/graph-ts'
|
||||
import { Deposit, Supply, Withdraw } from '../@types/veOCEAN/veOCEAN'
|
||||
import { weiToDecimal } from './utils/generic'
|
||||
import { getDeposit, getveOCEAN } from './utils/veUtils'
|
||||
import {
|
||||
getTotalOceanLocked,
|
||||
updateTotalOceanLocked
|
||||
} from './utils/globalUtils'
|
||||
|
||||
export function handleDeposit(event: Deposit): void {
|
||||
const provider = event.params.provider
|
||||
@ -9,10 +13,16 @@ export function handleDeposit(event: Deposit): void {
|
||||
const locktime = event.params.locktime
|
||||
const type = event.params.type
|
||||
const ts = event.params.ts
|
||||
|
||||
const totalOceanLocked = getTotalOceanLocked()
|
||||
const veOCEAN = getveOCEAN(provider.toHex())
|
||||
// Create new Deposit entity
|
||||
const deposit = getDeposit(provider.toHex() + '-' + locktime.toString())
|
||||
const deposit = getDeposit(
|
||||
provider.toHex() +
|
||||
'-' +
|
||||
event.transaction.hash.toHex() +
|
||||
'-' +
|
||||
event.logIndex.toString()
|
||||
)
|
||||
deposit.provider = provider.toHex()
|
||||
deposit.value = weiToDecimal(value.toBigDecimal(), 18)
|
||||
deposit.unlockTime = locktime
|
||||
@ -22,6 +32,10 @@ export function handleDeposit(event: Deposit): void {
|
||||
deposit.tx = event.transaction.hash.toHex()
|
||||
deposit.sender = event.transaction.from.toHex()
|
||||
deposit.veOcean = veOCEAN.id
|
||||
|
||||
deposit.totalOceanLocked = totalOceanLocked.plus(deposit.value)
|
||||
updateTotalOceanLocked(deposit.totalOceanLocked)
|
||||
|
||||
deposit.save()
|
||||
// --------------------------------------------
|
||||
|
||||
@ -33,13 +47,20 @@ export function handleDeposit(event: Deposit): void {
|
||||
}
|
||||
export function handleSupply(event: Supply): void {}
|
||||
export function handleWithdraw(event: Withdraw): void {
|
||||
const totalOceanLocked = getTotalOceanLocked()
|
||||
const provider = event.params.provider
|
||||
const value = event.params.value
|
||||
const ts = event.params.ts
|
||||
|
||||
const veOCEAN = getveOCEAN(provider.toHex())
|
||||
// Create new Deposit entity
|
||||
const deposit = getDeposit(provider.toHex() + '-' + ts.toString())
|
||||
const deposit = getDeposit(
|
||||
provider.toHex() +
|
||||
'-' +
|
||||
event.transaction.hash.toHex() +
|
||||
'-' +
|
||||
event.logIndex.toString()
|
||||
)
|
||||
deposit.provider = provider.toHex()
|
||||
deposit.value = weiToDecimal(value.toBigDecimal(), 18).neg()
|
||||
deposit.unlockTime = BigInt.zero()
|
||||
@ -47,8 +68,11 @@ export function handleWithdraw(event: Withdraw): void {
|
||||
deposit.timestamp = ts
|
||||
deposit.block = event.block.number.toI32()
|
||||
deposit.tx = event.transaction.hash.toHex()
|
||||
deposit.eventIndex = event.logIndex.toI32()
|
||||
deposit.sender = event.transaction.from.toHex()
|
||||
deposit.veOcean = veOCEAN.id
|
||||
deposit.totalOceanLocked = totalOceanLocked.plus(deposit.value) // it's already negated above
|
||||
updateTotalOceanLocked(deposit.totalOceanLocked)
|
||||
deposit.save()
|
||||
// --------------------------------------------
|
||||
|
||||
|
@ -38,6 +38,8 @@ templates:
|
||||
handler: handlePublishMarketFee
|
||||
- event: PublishMarketFeeChanged(address,address,address,uint256)
|
||||
handler: handlePublishMarketFeeChanged
|
||||
- event: ConsumeMarketFee(indexed address,indexed address,uint256)
|
||||
handler: handleConsumeMarketFee
|
||||
- event: AddedMinter(indexed address,indexed address,uint256,uint256)
|
||||
handler: handleAddedMinter
|
||||
- event: AddedPaymentManager(indexed address,indexed address,uint256,uint256)
|
||||
@ -52,6 +54,41 @@ templates:
|
||||
handler: handleProviderFee
|
||||
receipt: true
|
||||
|
||||
- name: ERC20Template3
|
||||
kind: ethereum/contract
|
||||
network: __NETWORK__
|
||||
source:
|
||||
abi: ERC20Template3
|
||||
mapping:
|
||||
kind: ethereum/events
|
||||
apiVersion: 0.0.7
|
||||
language: wasm/assemblyscript
|
||||
file: ./src/mappings/erc20Template3.ts
|
||||
entities:
|
||||
- ERC20Template3
|
||||
abis:
|
||||
- name: ERC20Template3
|
||||
file: ./node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template3.sol/ERC20Template3.json
|
||||
- name: ERC20
|
||||
file: ./abis/ERC20.json
|
||||
- name: ERC20Roles
|
||||
file: ./node_modules/@oceanprotocol/contracts/artifacts/contracts/utils/ERC20Roles.sol/ERC20Roles.json
|
||||
eventHandlers:
|
||||
- event: PredictionSubmitted(indexed address,indexed uint256,uint256)
|
||||
handler: handlePredictionSubmitted
|
||||
- event: PredictionPayout(indexed address,indexed uint256,uint256,uint256,bool,bool,uint256,uint8)
|
||||
handler: handlePredictionPayout
|
||||
- event: NewSubscription(indexed address,uint256,uint256)
|
||||
handler: handleNewSubscription
|
||||
- event: TruevalSubmitted(indexed uint256,bool,uint8,uint256,uint256)
|
||||
handler: handleTruevalSubmitted
|
||||
- event: SettingChanged(uint256,uint256,uint256,address)
|
||||
handler: handleSettingChanged
|
||||
- event: RevenueAdded(uint256,uint256,uint256,uint256,uint256)
|
||||
handler: handleRevenueAdded
|
||||
- event: Paused(bool)
|
||||
handler: handlePaused
|
||||
|
||||
- name: ERC721Template
|
||||
kind: ethereum/contract
|
||||
network: __NETWORK__
|
||||
@ -187,6 +224,10 @@ dataSources:
|
||||
entities:
|
||||
- ERC721Factory
|
||||
abis:
|
||||
- name: ERC721Template
|
||||
file: ./node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC721Template.sol/ERC721Template.json
|
||||
- name: ERC20Template
|
||||
file: ./node_modules/@oceanprotocol/contracts/artifacts/contracts/templates/ERC20Template.sol/ERC20Template.json
|
||||
- name: ERC721Factory
|
||||
file: ./node_modules/@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json
|
||||
- name: ERC20
|
||||
@ -196,6 +237,10 @@ dataSources:
|
||||
handler: handleNftCreated
|
||||
- event: TokenCreated(indexed address,indexed address,string,string,uint256,address)
|
||||
handler: handleNewToken
|
||||
- event: Template721Added(indexed address,indexed uint256)
|
||||
handler: handleNew721Template
|
||||
- event: Template20Added(indexed address,indexed uint256)
|
||||
handler: handleNew20Template
|
||||
|
||||
- kind: ethereum/contract
|
||||
name: FactoryRouter
|
||||
@ -223,10 +268,6 @@ dataSources:
|
||||
handler: handleTokenRemoved
|
||||
- event: OPCFeeChanged(indexed address,uint256,uint256,uint256,uint256)
|
||||
handler: handleOPCFeeChanged
|
||||
- event: SSContractAdded(indexed address,indexed address)
|
||||
handler: handleSSContractAdded
|
||||
- event: SSContractRemoved(indexed address,indexed address)
|
||||
handler: handleSSContractRemoved
|
||||
- event: FixedRateContractAdded(indexed address,indexed address)
|
||||
handler: handleFixedRateContractAdded
|
||||
- event: FixedRateContractRemoved(indexed address,indexed address)
|
||||
|
@ -66,6 +66,10 @@
|
||||
eventHandlers:
|
||||
- event: DelegateBoost(indexed address,indexed address,indexed uint256,uint256,uint256,uint256)
|
||||
handler: handleDelegation
|
||||
- event: ExtendBoost(indexed address,indexed address,indexed uint256,uint256,uint256,uint256)
|
||||
handler: handleExtendBoost
|
||||
- event: BurnBoost(indexed address,indexed address,indexed uint256)
|
||||
handler: handleBurnBoost
|
||||
|
||||
- name: veFeeDistributor
|
||||
kind: ethereum/contract
|
||||
|
@ -159,6 +159,7 @@ describe('DFRewards tests', async () => {
|
||||
}
|
||||
type
|
||||
tx
|
||||
eventIndex
|
||||
}
|
||||
}
|
||||
}`
|
||||
@ -175,6 +176,7 @@ describe('DFRewards tests', async () => {
|
||||
)
|
||||
assert(info[0].history[0].amount === '100')
|
||||
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')
|
||||
})
|
||||
|
||||
@ -183,7 +185,7 @@ describe('DFRewards tests', async () => {
|
||||
user2,
|
||||
datatokenAddress1
|
||||
)
|
||||
await dfRewards.claimRewards(user2, user2, datatokenAddress1)
|
||||
const tx = await dfRewards.claimRewards(user2, user2, datatokenAddress1)
|
||||
|
||||
const user2Balance = await dfRewards.getAvailableRewards(
|
||||
user2,
|
||||
@ -219,6 +221,7 @@ describe('DFRewards tests', async () => {
|
||||
}
|
||||
type
|
||||
tx
|
||||
eventIndex
|
||||
}
|
||||
}
|
||||
}`
|
||||
@ -235,5 +238,6 @@ describe('DFRewards tests', async () => {
|
||||
)
|
||||
assert(info[0].history[0].amount === expectedReward)
|
||||
assert(info[0].history[0].type === 'Claimed')
|
||||
assert(info[0].history[0].eventIndex === tx.events.Claimed.logIndex)
|
||||
})
|
||||
})
|
||||
|
@ -1,3 +1,4 @@
|
||||
import 'mocha'
|
||||
import {
|
||||
DatatokenCreateParams,
|
||||
ProviderInstance,
|
||||
@ -135,7 +136,7 @@ describe('Datatoken tests', async () => {
|
||||
datatokenAddress = result.events.TokenCreated.returnValues[0].toLowerCase()
|
||||
|
||||
// Check values before updating metadata
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
const initialQuery = {
|
||||
query: `query {
|
||||
token(id: "${datatokenAddress}"){
|
||||
@ -161,8 +162,8 @@ describe('Datatoken tests', async () => {
|
||||
dispensers {id},
|
||||
createdTimestamp,
|
||||
tx,
|
||||
eventIndex,
|
||||
block,
|
||||
lastPriceToken,
|
||||
lastPriceValue
|
||||
}}`
|
||||
}
|
||||
@ -197,8 +198,10 @@ describe('Datatoken tests', async () => {
|
||||
dt.publishMarketFeeAmount === publishMarketFeeAmount,
|
||||
'incorrect value for: publishMarketFeeAmount'
|
||||
)
|
||||
|
||||
assert(dt.templateId === templateIndex, 'incorrect value for: templateId')
|
||||
assert(
|
||||
parseInt(dt.templateId) === templateIndex,
|
||||
'incorrect value for: templateId'
|
||||
)
|
||||
assert(dt.holderCount === '0', 'incorrect value for: holderCount')
|
||||
assert(dt.orderCount === '0', 'incorrect value for: orderCount')
|
||||
assert(dt.orders, 'incorrect value for: orders')
|
||||
@ -214,26 +217,30 @@ describe('Datatoken tests', async () => {
|
||||
assert(tx.blockNumber >= blockNumber, 'incorrect value for: tx')
|
||||
assert(dt.block >= blockNumber, 'incorrect value for: block')
|
||||
assert(dt.block < blockNumber + 50, 'incorrect value for: block')
|
||||
assert(
|
||||
dt.lastPriceToken === '0x0000000000000000000000000000000000000000',
|
||||
'incorrect value for: lastPriceToken'
|
||||
)
|
||||
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 () => {
|
||||
// create the files encrypted string
|
||||
let providerResponse = await ProviderInstance.encrypt(assetUrl, providerUrl)
|
||||
const chain = await web3.eth.getChainId()
|
||||
let providerResponse = await ProviderInstance.encrypt(
|
||||
assetUrl,
|
||||
chain,
|
||||
providerUrl
|
||||
)
|
||||
ddo.services[0].files = await providerResponse
|
||||
ddo.services[0].datatokenAddress = datatokenAddress
|
||||
// update ddo and set the right did
|
||||
ddo.nftAddress = erc721Address
|
||||
const chain = await web3.eth.getChainId()
|
||||
ddo.id =
|
||||
'did:op:' +
|
||||
SHA256(web3.utils.toChecksumAddress(erc721Address) + chain.toString(10))
|
||||
|
||||
providerResponse = await ProviderInstance.encrypt(ddo, providerUrl)
|
||||
providerResponse = await ProviderInstance.encrypt(ddo, chain, providerUrl)
|
||||
const encryptedResponse = await providerResponse
|
||||
const metadataHash = getHash(JSON.stringify(ddo))
|
||||
await nft.setMetadata(
|
||||
@ -248,7 +255,7 @@ describe('Datatoken tests', async () => {
|
||||
)
|
||||
|
||||
// Check values before updating metadata
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
const initialQuery = {
|
||||
query: `query {
|
||||
token(id: "${datatokenAddress}"){
|
||||
@ -274,8 +281,8 @@ describe('Datatoken tests', async () => {
|
||||
dispensers {id},
|
||||
createdTimestamp,
|
||||
tx,
|
||||
eventIndex,
|
||||
block,
|
||||
lastPriceToken,
|
||||
lastPriceValue
|
||||
}}`
|
||||
}
|
||||
@ -283,7 +290,7 @@ describe('Datatoken tests', async () => {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(initialQuery)
|
||||
})
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
const dt = (await initialResponse.json()).data.token
|
||||
|
||||
const tx: TransactionReceipt = await web3.eth.getTransactionReceipt(dt.tx)
|
||||
@ -310,7 +317,10 @@ describe('Datatoken tests', async () => {
|
||||
dt.publishMarketFeeAmount === publishMarketFeeAmount,
|
||||
'incorrect value for: publishMarketFeeAmount'
|
||||
)
|
||||
assert(dt.templateId === templateIndex, 'incorrect value for: templateId')
|
||||
assert(
|
||||
parseInt(dt.templateId) === templateIndex,
|
||||
'incorrect value for: templateId'
|
||||
)
|
||||
assert(dt.holderCount === '0', 'incorrect value for: holderCount')
|
||||
assert(dt.orderCount === '0', 'incorrect value for: orderCount')
|
||||
assert(dt.orders, 'incorrect value for: orders')
|
||||
@ -326,15 +336,42 @@ describe('Datatoken tests', async () => {
|
||||
assert(tx.blockNumber >= blockNumber, 'incorrect value for: tx')
|
||||
assert(dt.block >= blockNumber, 'incorrect value for: block')
|
||||
assert(dt.block < blockNumber + 50, 'incorrect value for: block')
|
||||
assert(
|
||||
dt.lastPriceToken === '0x0000000000000000000000000000000000000000',
|
||||
'incorrect value for: lastPriceToken'
|
||||
)
|
||||
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 () => {
|
||||
// Start with publishing a new datatoken
|
||||
it('Check datatoken orders are updated correctly after publishing & ordering a datatoken with fees', async () => {
|
||||
// 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 = {
|
||||
name: 'newNFT',
|
||||
symbol: 'newTST',
|
||||
@ -346,42 +383,76 @@ describe('Datatoken tests', async () => {
|
||||
const erc20Params: DatatokenCreateParams = {
|
||||
templateIndex,
|
||||
cap: '100000',
|
||||
feeAmount: '0',
|
||||
feeAmount: '0.2',
|
||||
paymentCollector: ZERO_ADDRESS,
|
||||
feeToken: ZERO_ADDRESS,
|
||||
feeToken: publishingTokenAddress,
|
||||
minter: publisher,
|
||||
mpFeeAddress: ZERO_ADDRESS
|
||||
mpFeeAddress: publisher
|
||||
}
|
||||
const result = await Factory.createNftWithDatatoken(
|
||||
publisher,
|
||||
nftParams,
|
||||
erc20Params
|
||||
)
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
const newDtAddress = result.events.TokenCreated.returnValues[0]
|
||||
|
||||
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 publishingDatatoken.mint(
|
||||
publishingTokenAddress,
|
||||
publisher,
|
||||
'100',
|
||||
user1
|
||||
)
|
||||
const user1balance = await datatoken.balance(newDtAddress, user1)
|
||||
const user2balance = await datatoken.balance(newDtAddress, user2)
|
||||
assert(Number(user1balance) === 100, 'Invalid user1 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 = {
|
||||
query: `query {token(id: "${newDtAddress.toLowerCase()}"){id,orderCount,orders {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, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(query)
|
||||
})
|
||||
|
||||
await sleep(3000)
|
||||
const initialToken = (await response.json()).data.token
|
||||
|
||||
assert(initialToken, 'Invalid initialToken')
|
||||
assert(initialToken.orderCount === '0', 'Invalid initial orderCount')
|
||||
assert(initialToken.orders.length === 0, 'Invalid initial orders')
|
||||
assert(
|
||||
initialToken.eventIndex !== null && initialToken.eventIndex > 0,
|
||||
'Invalid eventIndex'
|
||||
)
|
||||
|
||||
const providerData = JSON.stringify({ timeout: 0 })
|
||||
const providerFeeToken = ZERO_ADDRESS
|
||||
@ -406,27 +477,81 @@ describe('Datatoken tests', async () => {
|
||||
providerData: web3.utils.toHex(web3.utils.asciiToHex(providerData)),
|
||||
validUntil: providerValidUntil
|
||||
}
|
||||
const consumeMarketFees = {
|
||||
consumeMarketFeeAddress: publisher,
|
||||
consumeMarketFeeToken: publishingTokenAddress,
|
||||
consumeMarketFeeAmount: '20000'
|
||||
}
|
||||
assert(setProviderFee, 'Invalid setProviderFee')
|
||||
const orderTx = await datatoken.startOrder(
|
||||
newDtAddress,
|
||||
user1,
|
||||
user2,
|
||||
1,
|
||||
setProviderFee
|
||||
setProviderFee,
|
||||
consumeMarketFees
|
||||
)
|
||||
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, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(query)
|
||||
})
|
||||
await sleep(3000)
|
||||
|
||||
const token = (await response.json()).data.token
|
||||
|
||||
assert(token, 'Invalid token')
|
||||
assert(token.orderCount === '1', 'Invalid orderCount after order')
|
||||
assert(token.orders[0].id === orderId)
|
||||
assert(token.orders[0].lastPriceToken.id === ZERO_ADDRESS)
|
||||
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'
|
||||
)
|
||||
})
|
||||
})
|
||||
|
@ -110,6 +110,7 @@ describe('Dispenser tests', async () => {
|
||||
nftParams,
|
||||
erc20Params
|
||||
)
|
||||
const nftTemplate = await Factory.getNFTTemplate(nftParams.templateIndex)
|
||||
assert(tx.events.NFTCreated.event === 'NFTCreated')
|
||||
assert(tx.events.TokenCreated.event === 'TokenCreated')
|
||||
nftAddress = tx.events.NFTCreated.returnValues.newTokenAddress.toLowerCase()
|
||||
@ -125,8 +126,8 @@ describe('Dispenser tests', async () => {
|
||||
symbol,
|
||||
name,
|
||||
tokenUri,
|
||||
owner,
|
||||
creator,
|
||||
owner{id},
|
||||
creator{id},
|
||||
address,
|
||||
providerUrl,
|
||||
assetState,
|
||||
@ -138,6 +139,7 @@ describe('Dispenser tests', async () => {
|
||||
transferable,
|
||||
createdTimestamp,
|
||||
tx,
|
||||
eventIndex,
|
||||
block,
|
||||
orderCount}}`
|
||||
}
|
||||
@ -153,8 +155,8 @@ describe('Dispenser tests', async () => {
|
||||
assert(nft.symbol === nftSymbol, 'incorrect value for: symbol')
|
||||
assert(nft.name === nftName, 'incorrect value for: name')
|
||||
assert(nft.tokenUri === tokenURI, 'incorrect value for: tokenUri')
|
||||
assert(nft.owner === publisher, 'incorrect value for: owner')
|
||||
assert(nft.creator === publisher, 'incorrect value for: creator')
|
||||
assert(nft.owner.id === publisher, 'incorrect value for: owner')
|
||||
assert(nft.creator.id === publisher, 'incorrect value for: creator')
|
||||
assert(nft.managerRole[0] === publisher, 'incorrect value for: managerRole')
|
||||
assert(
|
||||
nft.erc20DeployerRole[0] === factoryAddress,
|
||||
@ -162,7 +164,10 @@ describe('Dispenser tests', async () => {
|
||||
)
|
||||
assert(nft.storeUpdateRole === null, 'incorrect value for: storeUpdateRole')
|
||||
assert(nft.metadataRole === null, 'incorrect value for: metadataRole')
|
||||
assert(nft.template === '', 'incorrect value for: template')
|
||||
assert(
|
||||
nft.template === nftTemplate.templateAddress.toLowerCase(),
|
||||
'incorrect value for: template'
|
||||
)
|
||||
assert(nft.transferable === true, 'incorrect value for: transferable')
|
||||
assert(nft.createdTimestamp >= time, 'incorrect value: createdTimestamp')
|
||||
assert(nft.createdTimestamp < time + 5, 'incorrect value: createdTimestamp')
|
||||
@ -172,6 +177,10 @@ describe('Dispenser tests', async () => {
|
||||
assert(nft.block >= blockNumber, 'incorrect value for: block')
|
||||
assert(nft.block < blockNumber + 50, 'incorrect value for: block')
|
||||
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 () => {
|
||||
@ -201,8 +210,8 @@ describe('Dispenser tests', async () => {
|
||||
dispensers {id},
|
||||
createdTimestamp,
|
||||
tx,
|
||||
eventIndex,
|
||||
block,
|
||||
lastPriceToken,
|
||||
lastPriceValue
|
||||
}}`
|
||||
}
|
||||
@ -238,7 +247,10 @@ describe('Dispenser tests', async () => {
|
||||
'incorrect value for: publishMarketFeeAmount'
|
||||
)
|
||||
|
||||
assert(dt.templateId === templateIndex, 'incorrect value for: templateId')
|
||||
assert(
|
||||
parseInt(dt.templateId) === templateIndex,
|
||||
'incorrect value for: templateId'
|
||||
)
|
||||
assert(dt.holderCount === '0', 'incorrect value for: holderCount')
|
||||
assert(dt.orderCount === '0', 'incorrect value for: orderCount')
|
||||
assert(dt.orders, 'incorrect value for: orders')
|
||||
@ -254,11 +266,11 @@ describe('Dispenser tests', async () => {
|
||||
assert(dtTx.blockNumber >= blockNumber, 'incorrect value for: tx')
|
||||
assert(dt.block >= blockNumber, 'incorrect value for: block')
|
||||
assert(dt.block < blockNumber + 50, 'incorrect value for: block')
|
||||
assert(
|
||||
dt.lastPriceToken === '0x0000000000000000000000000000000000000000',
|
||||
'incorrect value for: lastPriceToken'
|
||||
)
|
||||
assert(dt.lastPriceValue === '0', 'incorrect value for: lastPriceValue')
|
||||
assert(
|
||||
dt.eventIndex !== null && dt.eventIndex > 0,
|
||||
'incorrect value for: eventIndex'
|
||||
)
|
||||
})
|
||||
|
||||
it('Make user1 minter', async () => {
|
||||
@ -267,15 +279,16 @@ describe('Dispenser tests', async () => {
|
||||
assert((await datatoken.getPermissions(dtAddress, user1)).minter === true)
|
||||
await sleep(sleepMs)
|
||||
const minterQuery = {
|
||||
query: `query {token(id: "${dtAddress}"){minter{id}}}`
|
||||
query: `query {token(id: "${dtAddress}"){minter{id}, eventIndex}}`
|
||||
}
|
||||
|
||||
const minterResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(minterQuery)
|
||||
})
|
||||
const minter = (await minterResponse.json()).data.token.minter
|
||||
assert(minter[1] === user1, 'incorrect value for: minter')
|
||||
const dt = (await minterResponse.json()).data.token
|
||||
assert(dt.minter[1] === user1, 'incorrect value for: minter')
|
||||
assert(dt.eventIndex !== null, 'incorrect value for: eventIndex')
|
||||
})
|
||||
|
||||
it('Create dispenser', async () => {
|
||||
@ -315,6 +328,7 @@ describe('Dispenser tests', async () => {
|
||||
block
|
||||
createdTimestamp
|
||||
tx
|
||||
eventIndex
|
||||
dispenses {
|
||||
id
|
||||
}
|
||||
@ -341,13 +355,17 @@ describe('Dispenser tests', async () => {
|
||||
assert(response.createdTimestamp >= time, 'incorrect: createdTimestamp')
|
||||
assert(response.createdTimestamp < time + 15, 'incorrect: createdTimestamp')
|
||||
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.__typename === 'Dispenser', 'incorrect value: __typename')
|
||||
})
|
||||
|
||||
it('Deactivates dispenser', async () => {
|
||||
const deactiveQuery = {
|
||||
query: `query {dispenser(id: "${dispenserId}"){active}}`
|
||||
query: `query {dispenser(id: "${dispenserId}"){active, eventIndex}}`
|
||||
}
|
||||
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
@ -358,7 +376,7 @@ describe('Dispenser tests', async () => {
|
||||
assert(initialActive === true, 'incorrect value for: initialActive')
|
||||
|
||||
// Deactivate exchange
|
||||
await dispenser.deactivate(dtAddress, publisher)
|
||||
const tx = await dispenser.deactivate(dtAddress, publisher)
|
||||
const status = await dispenser.status(dtAddress)
|
||||
assert(status.active === false, 'Dispenser is still active')
|
||||
await sleep(sleepMs)
|
||||
@ -367,23 +385,29 @@ describe('Dispenser tests', async () => {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(deactiveQuery)
|
||||
})
|
||||
const updatedActive = (await updatedResponse.json()).data.dispenser.active
|
||||
assert(updatedActive === false, 'incorrect value for: updatedActive')
|
||||
const updatedActive = (await updatedResponse.json()).data.dispenser
|
||||
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 = {
|
||||
query: `query {dispenser(id: "${dispenserId}"){active}}`
|
||||
query: `query {dispenser(id: "${dispenserId}"){active, eventIndex}}`
|
||||
}
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(activeQuery)
|
||||
})
|
||||
const initialActive = (await initialResponse.json()).data.dispenser.active
|
||||
assert(initialActive === false, 'incorrect value for: initialActive')
|
||||
const initialActive = (await initialResponse.json()).data.dispenser
|
||||
assert(initialActive.active === false, 'incorrect value for: initialActive')
|
||||
assert(initialActive.eventIndex !== null, 'incorrect value for: eventIndex')
|
||||
|
||||
// Activate exchange
|
||||
await dispenser.activate(dtAddress, '100', '100', publisher)
|
||||
// Activate dispenser
|
||||
const tx = await dispenser.activate(dtAddress, '100', '100', publisher)
|
||||
await sleep(sleepMs)
|
||||
|
||||
// Check the updated value for active
|
||||
@ -391,8 +415,13 @@ describe('Dispenser tests', async () => {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(activeQuery)
|
||||
})
|
||||
const updatedActive = (await updatedResponse.json()).data.dispenser.active
|
||||
assert(updatedActive === true, 'incorrect value for: updatedActive')
|
||||
const updatedActive = (await updatedResponse.json()).data.dispenser
|
||||
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 () => {
|
||||
@ -407,6 +436,7 @@ describe('Dispenser tests', async () => {
|
||||
block
|
||||
createdTimestamp
|
||||
tx
|
||||
eventIndex
|
||||
__typename
|
||||
}}}`
|
||||
}
|
||||
@ -415,6 +445,7 @@ describe('Dispenser tests', async () => {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(dispenseQuery)
|
||||
})
|
||||
await sleep(sleepMs)
|
||||
const before = (await response1.json()).data.dispenser.dispenses
|
||||
assert(before.length === 0, 'incorrect value for: dispenses')
|
||||
|
||||
@ -428,7 +459,13 @@ describe('Dispenser tests', async () => {
|
||||
})
|
||||
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.user.id === user2, 'incorrect value for: user')
|
||||
assert(dispense.amount === amount, 'incorrect value for: user')
|
||||
@ -436,6 +473,7 @@ describe('Dispenser tests', async () => {
|
||||
assert(dispense.createdTimestamp >= time, 'incorrect: createdTimestamp')
|
||||
assert(dispense.createdTimestamp < time + 15, 'incorrect: createdTimestamp')
|
||||
assert(dispense.tx === tx.transactionHash, 'incorrect value for: tx')
|
||||
assert(dispense.eventIndex !== null, 'incorrect value for: eventIndex')
|
||||
assert(dispense.__typename === 'DispenserTransaction', 'wrong __typename')
|
||||
})
|
||||
|
||||
@ -445,21 +483,21 @@ describe('Dispenser tests', async () => {
|
||||
|
||||
// Check balance after owner withdraw
|
||||
const balanceQuery = {
|
||||
query: `query {dispenser(id: "${dispenserId}"){balance}}`
|
||||
query: `query {dispenser(id: "${dispenserId}"){balance, eventIndex}}`
|
||||
}
|
||||
|
||||
const response = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(balanceQuery)
|
||||
})
|
||||
const balance = (await response.json()).data.dispenser.balance
|
||||
|
||||
assert(balance === '0', 'incorrect value for: balance')
|
||||
const balance = (await response.json()).data.dispenser
|
||||
assert(balance.balance === '0', 'incorrect value for: balance')
|
||||
assert(balance.eventIndex !== null, 'incorrect value for: eventIndex')
|
||||
})
|
||||
|
||||
it('Updates allowed swapper', async () => {
|
||||
const swapperQuery = {
|
||||
query: `query {dispenser(id: "${dispenserId}"){allowedSwapper}}`
|
||||
query: `query {dispenser(id: "${dispenserId}"){allowedSwapper, eventIndex}}`
|
||||
}
|
||||
// Check initial allowedSwapper
|
||||
const swapperResponse1 = await fetch(subgraphUrl, {
|
||||
@ -473,7 +511,7 @@ describe('Dispenser tests', async () => {
|
||||
'incorrect value for: allowedSwapper'
|
||||
)
|
||||
|
||||
await dispenser.setAllowedSwapper(dtAddress, publisher, user1)
|
||||
const tx = await dispenser.setAllowedSwapper(dtAddress, publisher, user1)
|
||||
await sleep(sleepMs)
|
||||
|
||||
const swapperResponse2 = await fetch(subgraphUrl, {
|
||||
@ -481,8 +519,16 @@ describe('Dispenser tests', async () => {
|
||||
body: JSON.stringify(swapperQuery)
|
||||
})
|
||||
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'
|
||||
)
|
||||
})
|
||||
})
|
||||
|
165
test/integration/FactoryRouter.test.ts
Normal file
165
test/integration/FactoryRouter.test.ts
Normal file
@ -0,0 +1,165 @@
|
||||
import {
|
||||
Router,
|
||||
NftFactory,
|
||||
calculateEstimatedGas,
|
||||
sendTx,
|
||||
sleep
|
||||
} from '@oceanprotocol/lib'
|
||||
import { AbiItem } from 'web3-utils'
|
||||
import { assert } from 'chai'
|
||||
import Web3 from 'web3'
|
||||
import { homedir } from 'os'
|
||||
import fs from 'fs'
|
||||
import { fetch } from 'cross-fetch'
|
||||
|
||||
const data = JSON.parse(
|
||||
fs.readFileSync(
|
||||
process.env.ADDRESS_FILE ||
|
||||
`${homedir}/.ocean/ocean-contracts/artifacts/address.json`,
|
||||
'utf8'
|
||||
)
|
||||
)
|
||||
|
||||
const addresses = data.development
|
||||
const web3 = new Web3('http://127.0.0.1:8545')
|
||||
|
||||
const subgraphUrl =
|
||||
'http://127.0.0.1:9000/subgraphs/name/oceanprotocol/ocean-subgraph'
|
||||
|
||||
const minAbi = [
|
||||
{
|
||||
constant: false,
|
||||
inputs: [
|
||||
{ name: 'to', type: 'address' },
|
||||
{ name: 'value', type: 'uint256' }
|
||||
],
|
||||
name: 'mint',
|
||||
outputs: [{ name: '', type: 'bool' }],
|
||||
payable: false,
|
||||
stateMutability: 'nonpayable',
|
||||
type: 'function'
|
||||
}
|
||||
] as AbiItem[]
|
||||
|
||||
async function getSubgraphApprovedTokens() {
|
||||
const tokens: string[] = []
|
||||
const initialQuery = {
|
||||
query: `query{
|
||||
opcs{
|
||||
approvedTokens{
|
||||
id
|
||||
}
|
||||
}
|
||||
}`
|
||||
}
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(initialQuery)
|
||||
})
|
||||
const info = (await initialResponse.json()).data.opcs[0].approvedTokens
|
||||
for (let i = 0; i < info.length; i++) tokens.push(info[i].id)
|
||||
return tokens
|
||||
}
|
||||
|
||||
describe('FactoryRouter tests', async () => {
|
||||
let factory
|
||||
let router: Router
|
||||
let ownerAccount: string
|
||||
let Alice: string
|
||||
let Bob: string
|
||||
let datatokenAddress
|
||||
// let nft1, nft2, nft3
|
||||
// let chainId
|
||||
// const configHelper = new ConfigHelper()
|
||||
// const config = configHelper.getConfig('development')
|
||||
|
||||
before(async () => {
|
||||
const accounts = await web3.eth.getAccounts()
|
||||
// chainId = await web3.eth.getChainId()
|
||||
ownerAccount = accounts[0]
|
||||
Alice = accounts[1]
|
||||
Bob = accounts[2]
|
||||
|
||||
const tokenContract = new web3.eth.Contract(minAbi, addresses.Ocean)
|
||||
const estGas = await calculateEstimatedGas(
|
||||
ownerAccount,
|
||||
tokenContract.methods.mint,
|
||||
Alice,
|
||||
web3.utils.toWei('100000')
|
||||
)
|
||||
await sendTx(
|
||||
ownerAccount,
|
||||
estGas,
|
||||
web3,
|
||||
1,
|
||||
tokenContract.methods.mint,
|
||||
Alice,
|
||||
web3.utils.toWei('100000')
|
||||
)
|
||||
await sendTx(
|
||||
ownerAccount,
|
||||
estGas,
|
||||
web3,
|
||||
1,
|
||||
tokenContract.methods.mint,
|
||||
Bob,
|
||||
web3.utils.toWei('100000')
|
||||
)
|
||||
router = new Router(addresses.Router, web3)
|
||||
// nftFactory = new NftFactory(addresses.ERC721Factory, web3)
|
||||
factory = new NftFactory(addresses.ERC721Factory, web3)
|
||||
})
|
||||
|
||||
it('Ocean token should be in the approve token list', async () => {
|
||||
// since we can only lock once, we test if tx fails or not
|
||||
// so if there is already a lock, skip it
|
||||
const tokens = await getSubgraphApprovedTokens()
|
||||
assert(tokens.includes(addresses.Ocean.toLowerCase()))
|
||||
assert(tokens.length === 1)
|
||||
})
|
||||
it('Owner should add another token in the approved list', async () => {
|
||||
const nftName = 'testNFT'
|
||||
const nftSymbol = 'TST'
|
||||
const marketPlaceFeeAddress = '0x1230000000000000000000000000000000000000'
|
||||
const feeToken = '0x3210000000000000000000000000000000000000'
|
||||
const publishMarketFeeAmount = '0.1'
|
||||
const cap = '10000'
|
||||
const templateIndex = 1
|
||||
const result = await factory.createNftWithDatatoken(
|
||||
Alice,
|
||||
{
|
||||
name: nftName,
|
||||
symbol: nftSymbol,
|
||||
templateIndex,
|
||||
tokenURI: '',
|
||||
transferable: true,
|
||||
owner: Alice
|
||||
},
|
||||
{
|
||||
templateIndex,
|
||||
cap,
|
||||
feeAmount: publishMarketFeeAmount,
|
||||
paymentCollector: '0x0000000000000000000000000000000000000000',
|
||||
feeToken,
|
||||
minter: Alice,
|
||||
mpFeeAddress: marketPlaceFeeAddress,
|
||||
name: 'DT1',
|
||||
symbol: 'DT1'
|
||||
}
|
||||
)
|
||||
datatokenAddress = result.events.TokenCreated.returnValues[0].toLowerCase()
|
||||
await router.addApprovedToken(ownerAccount, datatokenAddress)
|
||||
await sleep(2000)
|
||||
const tokens = await getSubgraphApprovedTokens()
|
||||
assert(tokens.includes(datatokenAddress.toLowerCase()))
|
||||
assert(tokens.length === 2)
|
||||
})
|
||||
|
||||
it('Owner should remove token from the approved list', async () => {
|
||||
await router.removeApprovedToken(ownerAccount, datatokenAddress)
|
||||
await sleep(2000)
|
||||
const tokens = await getSubgraphApprovedTokens()
|
||||
assert(!tokens.includes(datatokenAddress.toLowerCase()))
|
||||
assert(tokens.length === 1)
|
||||
})
|
||||
})
|
@ -44,7 +44,7 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
const publishMarketSwapFee = '0.003'
|
||||
const templateIndex = 1
|
||||
const dtAmount = '10'
|
||||
const datatoken = new Datatoken(web3, 8996)
|
||||
// const datatoken = new Datatoken(web3, 8996)
|
||||
let datatokenAddress: string
|
||||
let fixedRateAddress: string
|
||||
let baseTokenAddress: string
|
||||
@ -108,7 +108,7 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
fixedRate: price,
|
||||
marketFee: publishMarketSwapFee,
|
||||
allowedConsumer: ZERO_ADDRESS,
|
||||
withMint: false
|
||||
withMint: true
|
||||
}
|
||||
|
||||
const result = await Factory.createNftWithDatatokenWithFixedRate(
|
||||
@ -127,6 +127,7 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
result.events.NewFixedRate.returnValues.exchangeId.toLowerCase()
|
||||
|
||||
fixedRateId = `${exchangeContract}-${exchangeId}`
|
||||
const nftTemplate = await Factory.getNFTTemplate(nftParams.templateIndex)
|
||||
|
||||
// Check NFT values
|
||||
await sleep(sleepMs)
|
||||
@ -138,8 +139,8 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
symbol,
|
||||
name,
|
||||
tokenUri,
|
||||
owner,
|
||||
creator,
|
||||
owner{id},
|
||||
creator{id},
|
||||
address,
|
||||
providerUrl,
|
||||
assetState,
|
||||
@ -151,6 +152,7 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
transferable,
|
||||
createdTimestamp,
|
||||
tx,
|
||||
eventIndex,
|
||||
block,
|
||||
orderCount}}`
|
||||
}
|
||||
@ -166,8 +168,8 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
assert(nft.symbol === nftSymbol, 'incorrect value for: symbol')
|
||||
assert(nft.name === nftName, 'incorrect value for: name')
|
||||
assert(nft.tokenUri === tokenURI, 'incorrect value for: tokenUri')
|
||||
assert(nft.owner === publisher, 'incorrect value for: owner')
|
||||
assert(nft.creator === publisher, 'incorrect value for: creator')
|
||||
assert(nft.owner.id === publisher, 'incorrect value for: owner')
|
||||
assert(nft.creator.id === publisher, 'incorrect value for: creator')
|
||||
assert(nft.managerRole[0] === publisher, 'incorrect value for: managerRole')
|
||||
assert(
|
||||
nft.erc20DeployerRole[0] === factoryAddress,
|
||||
@ -175,7 +177,10 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
)
|
||||
assert(nft.storeUpdateRole === null, 'incorrect value for: storeUpdateRole')
|
||||
assert(nft.metadataRole === null, 'incorrect value for: metadataRole')
|
||||
assert(nft.template === '', 'incorrect value for: template')
|
||||
assert(
|
||||
nft.template === nftTemplate.templateAddress.toLowerCase(),
|
||||
'incorrect value for: template'
|
||||
)
|
||||
assert(nft.transferable === true, 'incorrect value for: transferable')
|
||||
assert(
|
||||
nft.createdTimestamp >= time,
|
||||
@ -191,6 +196,10 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
assert(nft.block >= blockNumber, 'incorrect value for: block')
|
||||
assert(nft.block < blockNumber + 50, 'incorrect value for: block')
|
||||
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 () => {
|
||||
@ -220,6 +229,7 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
dispensers {id},
|
||||
createdTimestamp,
|
||||
tx,
|
||||
eventIndex,
|
||||
block,
|
||||
lastPriceToken,
|
||||
lastPriceValue
|
||||
@ -257,7 +267,10 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
'incorrect value for: publishMarketFeeAmount'
|
||||
)
|
||||
|
||||
assert(dt.templateId === templateIndex, 'incorrect value for: templateId')
|
||||
assert(
|
||||
parseInt(dt.templateId) === templateIndex,
|
||||
'incorrect value for: templateId'
|
||||
)
|
||||
assert(dt.holderCount === '0', 'incorrect value for: holderCount')
|
||||
assert(dt.orderCount === '0', 'incorrect value for: orderCount')
|
||||
assert(dt.orders, 'incorrect value for: orders')
|
||||
@ -273,11 +286,11 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
assert(dtTx.blockNumber >= blockNumber, 'incorrect value for: tx')
|
||||
assert(dt.block >= blockNumber, 'incorrect value for: block')
|
||||
assert(dt.block < blockNumber + 50, 'incorrect value for: block')
|
||||
assert(
|
||||
dt.lastPriceToken === '0x0000000000000000000000000000000000000000',
|
||||
'incorrect value for: lastPriceToken'
|
||||
)
|
||||
assert(dt.lastPriceValue === '0', 'incorrect value for: lastPriceValue')
|
||||
assert(
|
||||
dt.eventIndex !== null && dt.eventIndex > 0,
|
||||
'incorrect value for: eventIndex'
|
||||
)
|
||||
})
|
||||
|
||||
it('Test fixedRateExchanges Fields', async () => {
|
||||
@ -314,6 +327,7 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
}
|
||||
createdTimestamp
|
||||
tx
|
||||
eventIndex
|
||||
block
|
||||
publishMarketFeeAddress
|
||||
publishMarketSwapFee
|
||||
@ -342,7 +356,8 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
'incorrect value for: baseToken.id'
|
||||
)
|
||||
assert(
|
||||
fixed.datatokenSupply === '0',
|
||||
fixed.datatokenSupply ===
|
||||
'115792089237316195423570985008687900000000000000000000000000',
|
||||
'incorrect value for: datatokenSupply'
|
||||
)
|
||||
assert(
|
||||
@ -364,7 +379,7 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
fixed.allowedSwapper === ZERO_ADDRESS,
|
||||
'incorrect value for: allowedSwapper'
|
||||
)
|
||||
assert(fixed.withMint === null, 'incorrect value for: withMint')
|
||||
assert(fixed.withMint === true, 'incorrect value for: withMint')
|
||||
assert(fixed.isMinter === null, 'incorrect value for: isMinter')
|
||||
assert(fixed.updates, 'incorrect value for: updates.id')
|
||||
assert(fixed.swaps, 'incorrect value for: swaps')
|
||||
@ -389,6 +404,10 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
)
|
||||
assert(fixedTx.from === publisher, '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 () => {
|
||||
@ -402,6 +421,7 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
}
|
||||
oldPrice
|
||||
newPrice
|
||||
eventIndex
|
||||
}
|
||||
}}`
|
||||
}
|
||||
@ -426,7 +446,7 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
|
||||
// Update price
|
||||
const newPrice = '999'
|
||||
await fixedRate.setRate(publisher, exchangeId, newPrice)
|
||||
const tx = await fixedRate.setRate(publisher, exchangeId, newPrice)
|
||||
await sleep(sleepMs)
|
||||
|
||||
// Check price after first update
|
||||
@ -445,10 +465,14 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
)
|
||||
assert(updates2.oldPrice === price1, 'incorrect value: 2nd oldPrice')
|
||||
assert(updates2.newPrice === newPrice, 'incorrect value: 2nd newPrice')
|
||||
assert(
|
||||
updates2.eventIndex === tx.events.ExchangeRateChanged.logIndex,
|
||||
'incorrect value: 2nd eventIndex'
|
||||
)
|
||||
|
||||
// Update price a 2nd time
|
||||
const newPrice2 = '1' // '5.123'
|
||||
await fixedRate.setRate(publisher, exchangeId, newPrice2)
|
||||
const tx2 = await fixedRate.setRate(publisher, exchangeId, newPrice2)
|
||||
await sleep(sleepMs)
|
||||
|
||||
// Check price after 2nd update
|
||||
@ -468,112 +492,10 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
)
|
||||
assert(updates3.oldPrice === newPrice, 'incorrect value: 3rd oldPrice')
|
||||
assert(updates3.newPrice === newPrice2, 'incorrect value: 3rd newPrice')
|
||||
})
|
||||
it('Deactivates exchange', async () => {
|
||||
const deactiveQuery = {
|
||||
query: `query {fixedRateExchange(id: "${fixedRateId}"){active}}`
|
||||
}
|
||||
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(deactiveQuery)
|
||||
})
|
||||
const initialActive = (await initialResponse.json()).data.fixedRateExchange
|
||||
.active
|
||||
assert(initialActive === true, 'incorrect value for: initialActive')
|
||||
|
||||
// Deactivate exchange
|
||||
await fixedRate.deactivate(publisher, exchangeId)
|
||||
await sleep(sleepMs)
|
||||
|
||||
// Check the updated value for active
|
||||
const updatedResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(deactiveQuery)
|
||||
})
|
||||
const updatedActive = (await updatedResponse.json()).data.fixedRateExchange
|
||||
.active
|
||||
assert(updatedActive === false, 'incorrect value for: updatedActive')
|
||||
})
|
||||
|
||||
it('Activates exchange', async () => {
|
||||
const activeQuery = {
|
||||
query: `query {fixedRateExchange(id: "${fixedRateId}"){active}}`
|
||||
}
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(activeQuery)
|
||||
})
|
||||
const initialActive = (await initialResponse.json()).data.fixedRateExchange
|
||||
.active
|
||||
assert(initialActive === false, 'incorrect value for: initialActive')
|
||||
|
||||
// Activate exchange
|
||||
await fixedRate.activate(publisher, exchangeId)
|
||||
await sleep(sleepMs)
|
||||
|
||||
// Check the updated value for active
|
||||
const updatedResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(activeQuery)
|
||||
})
|
||||
const updatedActive = (await updatedResponse.json()).data.fixedRateExchange
|
||||
.active
|
||||
assert(updatedActive === true, 'incorrect value for: updatedActive')
|
||||
})
|
||||
|
||||
it('Activate Minting', async () => {
|
||||
const mintingQuery = {
|
||||
query: `query {fixedRateExchange(id: "${fixedRateId}"){withMint}}`
|
||||
}
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(mintingQuery)
|
||||
})
|
||||
const initialMint = (await initialResponse.json()).data.fixedRateExchange
|
||||
.withMint
|
||||
assert(initialMint === null, 'incorrect value for: initialMint')
|
||||
|
||||
// Activate minting
|
||||
await fixedRate.activateMint(publisher, exchangeId)
|
||||
await sleep(sleepMs)
|
||||
|
||||
// Check the updated value for active
|
||||
const updatedResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(mintingQuery)
|
||||
})
|
||||
|
||||
const updatedMint = (await updatedResponse.json()).data.fixedRateExchange
|
||||
.withMint
|
||||
assert(updatedMint === true, 'incorrect value for: updatedMint')
|
||||
})
|
||||
|
||||
it('Deactivate Minting', async () => {
|
||||
const mintingQuery = {
|
||||
query: `query {fixedRateExchange(id: "${fixedRateId}"){withMint}}`
|
||||
}
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(mintingQuery)
|
||||
})
|
||||
const initialMint = (await initialResponse.json()).data.fixedRateExchange
|
||||
.withMint
|
||||
assert(initialMint === true, 'incorrect value for: initialMint')
|
||||
|
||||
// Activate minting
|
||||
await fixedRate.deactivateMint(publisher, exchangeId)
|
||||
await sleep(sleepMs)
|
||||
|
||||
// Check the updated value for active
|
||||
const updatedResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(mintingQuery)
|
||||
})
|
||||
|
||||
const updatedMint = (await updatedResponse.json()).data.fixedRateExchange
|
||||
.withMint
|
||||
assert(updatedMint === false, 'incorrect value for: updatedMint')
|
||||
assert(
|
||||
updates3.eventIndex === tx2.events.ExchangeRateChanged.logIndex,
|
||||
'incorrect value: 3nd eventIndex'
|
||||
)
|
||||
})
|
||||
|
||||
it('User1 buys a datatoken', async () => {
|
||||
@ -588,6 +510,10 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
block
|
||||
createdTimestamp
|
||||
tx
|
||||
eventIndex
|
||||
oceanFeeAmount
|
||||
marketFeeAmount
|
||||
consumeMarketFeeAmount
|
||||
__typename
|
||||
}
|
||||
}}`
|
||||
@ -630,6 +556,17 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
const tx = (
|
||||
await fixedRate.buyDatatokens(user1, exchangeId, dtAmount, '100')
|
||||
).events?.Swapped
|
||||
|
||||
const oceanFeeAmount = web3.utils.fromWei(
|
||||
new BN(tx.returnValues.oceanFeeAmount)
|
||||
)
|
||||
const marketFeeAmount = web3.utils.fromWei(
|
||||
new BN(tx.returnValues.marketFeeAmount)
|
||||
)
|
||||
const consumeMarketFeeAmount = web3.utils.fromWei(
|
||||
new BN(tx.returnValues.consumeMarketFeeAmount)
|
||||
)
|
||||
|
||||
await sleep(sleepMs)
|
||||
user1Balance = await datatoken.balance(datatokenAddress, user1)
|
||||
// user1 has 1 datatoken
|
||||
@ -644,7 +581,11 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
const swappedAmount = web3.utils.fromWei(
|
||||
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.by.id === user1, 'incorrect value for: id')
|
||||
assert(swaps.baseTokenAmount === swappedAmount, 'incorrect baseTokenAmount')
|
||||
@ -652,54 +593,78 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
assert(swaps.block === tx.blockNumber, 'incorrect value for: block')
|
||||
assert(swaps.createdTimestamp >= time, 'incorrect: createdTimestamp')
|
||||
assert(swaps.createdTimestamp < time + 25, 'incorrect: createdTimestamp 2')
|
||||
assert(swaps.oceanFeeAmount === oceanFeeAmount, 'incorrect: oceanFeeAmount')
|
||||
assert(swaps.marketFeeAmount === marketFeeAmount, 'wrong marketFeeAmount')
|
||||
assert(
|
||||
swaps.consumeMarketFeeAmount === consumeMarketFeeAmount,
|
||||
'wrong consumeMarketFeeAmount'
|
||||
)
|
||||
assert(swaps.tx === tx.transactionHash, 'incorrect value for: tx')
|
||||
assert(swaps.eventIndex === tx.logIndex, 'incorrect value for: eventIndex')
|
||||
assert(swaps.__typename === 'FixedRateExchangeSwap', 'incorrect __typename')
|
||||
})
|
||||
it('User1 sells a datatoken', async () => {
|
||||
await datatoken.approve(datatokenAddress, fixedRateAddress, dtAmount, user1)
|
||||
const tx = (await fixedRate.sellDatatokens(user1, exchangeId, '10', '9'))
|
||||
.events?.Swapped
|
||||
assert(tx != null)
|
||||
await sleep(sleepMs)
|
||||
const swapsQuery = {
|
||||
query: `query {fixedRateExchange(id: "${fixedRateId}"){
|
||||
swaps(orderBy: createdTimestamp, orderDirection: desc){
|
||||
id
|
||||
exchangeId{id}
|
||||
by{id}
|
||||
baseTokenAmount
|
||||
dataTokenAmount
|
||||
block
|
||||
createdTimestamp
|
||||
tx
|
||||
__typename
|
||||
}
|
||||
}}`
|
||||
|
||||
it('Deactivate Minting', async () => {
|
||||
const mintingQuery = {
|
||||
query: `query {fixedRateExchange(id: "${fixedRateId}"){withMint, eventIndex}}`
|
||||
}
|
||||
// Check initial swaps
|
||||
const response = await fetch(subgraphUrl, {
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(swapsQuery)
|
||||
body: JSON.stringify(mintingQuery)
|
||||
})
|
||||
const swaps = (await response.json()).data.fixedRateExchange.swaps[0]
|
||||
const swappedAmount = web3.utils.fromWei(
|
||||
new BN(tx.returnValues.baseTokenSwappedAmount)
|
||||
const initialMint = (await initialResponse.json()).data.fixedRateExchange
|
||||
.withMint
|
||||
assert(initialMint === true, 'incorrect value for: initialMint')
|
||||
|
||||
// Activate minting
|
||||
const tx = await fixedRate.deactivateMint(publisher, exchangeId)
|
||||
await sleep(sleepMs)
|
||||
|
||||
// Check the updated value for active
|
||||
const updatedResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(mintingQuery)
|
||||
})
|
||||
|
||||
const updatedMint = (await updatedResponse.json()).data.fixedRateExchange
|
||||
assert(updatedMint.withMint === false, 'incorrect value for: updatedMint')
|
||||
assert(
|
||||
updatedMint.eventIndex === tx.events.ExchangeMintStateChanged.logIndex,
|
||||
'incorrect value for: eventIndex'
|
||||
)
|
||||
})
|
||||
it('Activate Minting', async () => {
|
||||
const mintingQuery = {
|
||||
query: `query {fixedRateExchange(id: "${fixedRateId}"){withMint, eventIndex}}`
|
||||
}
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(mintingQuery)
|
||||
})
|
||||
const initialMint = (await initialResponse.json()).data.fixedRateExchange
|
||||
.withMint
|
||||
assert(initialMint === false, 'incorrect value for: initialMint')
|
||||
|
||||
// Activate minting
|
||||
const tx = await fixedRate.activateMint(publisher, exchangeId)
|
||||
await sleep(sleepMs)
|
||||
|
||||
// Check the updated value for active
|
||||
const updatedResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(mintingQuery)
|
||||
})
|
||||
const updatedMint = (await updatedResponse.json()).data.fixedRateExchange
|
||||
assert(updatedMint.withMint === true, 'incorrect value for: updatedMint')
|
||||
assert(
|
||||
updatedMint.eventIndex === tx.events.ExchangeMintStateChanged.logIndex,
|
||||
'incorrect value for: eventIndex'
|
||||
)
|
||||
assert(swaps.id === `${tx.transactionHash}-${fixedRateId}`, 'incorrect: id')
|
||||
assert(swaps.exchangeId.id === fixedRateId, 'incorrect: exchangeId')
|
||||
assert(swaps.by.id === user1, 'incorrect value for: id')
|
||||
assert(swaps.baseTokenAmount === swappedAmount, 'incorrect baseTokenAmount')
|
||||
assert(swaps.dataTokenAmount === dtAmount, 'incorrect: dataTokenAmount')
|
||||
assert(swaps.block === tx.blockNumber, 'incorrect value for: block')
|
||||
assert(swaps.createdTimestamp >= time, 'incorrect: createdTimestamp')
|
||||
assert(swaps.createdTimestamp < time + 25, 'incorrect: createdTimestamp 2')
|
||||
assert(swaps.tx === tx.transactionHash, 'incorrect value for: tx')
|
||||
assert(swaps.__typename === 'FixedRateExchangeSwap', 'incorrect __typename')
|
||||
})
|
||||
|
||||
it('Updates allowed swapper', async () => {
|
||||
const swapperQuery = {
|
||||
query: `query {fixedRateExchange(id: "${fixedRateId}"){allowedSwapper}}`
|
||||
query: `query {fixedRateExchange(id: "${fixedRateId}"){allowedSwapper, eventIndex}}`
|
||||
}
|
||||
// Check initial allowedSwapper
|
||||
const swapperResponse1 = await fetch(subgraphUrl, {
|
||||
@ -713,7 +678,7 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
'incorrect value for: allowedSwapper'
|
||||
)
|
||||
|
||||
await fixedRate.setAllowedSwapper(publisher, exchangeId, user1)
|
||||
const tx = await fixedRate.setAllowedSwapper(publisher, exchangeId, user1)
|
||||
await sleep(sleepMs)
|
||||
|
||||
const swapperResponse2 = await fetch(subgraphUrl, {
|
||||
@ -721,8 +686,75 @@ describe('Fixed Rate Exchange tests', async () => {
|
||||
body: JSON.stringify(swapperQuery)
|
||||
})
|
||||
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'
|
||||
)
|
||||
})
|
||||
it('Deactivates exchange', async () => {
|
||||
const deactiveQuery = {
|
||||
query: `query {fixedRateExchange(id: "${fixedRateId}"){active, eventIndex}}`
|
||||
}
|
||||
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(deactiveQuery)
|
||||
})
|
||||
const initialActive = (await initialResponse.json()).data.fixedRateExchange
|
||||
.active
|
||||
assert(initialActive === true, 'incorrect value for: initialActive')
|
||||
|
||||
// Deactivate exchange
|
||||
await fixedRate.deactivate(publisher, exchangeId)
|
||||
await sleep(sleepMs)
|
||||
|
||||
// Check the updated value for active
|
||||
const updatedResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(deactiveQuery)
|
||||
})
|
||||
const updatedActive = (await updatedResponse.json()).data.fixedRateExchange
|
||||
|
||||
assert(updatedActive.active === false, 'incorrect value for: updatedActive')
|
||||
assert(
|
||||
updatedActive.eventIndex !== null && updatedActive.eventIndex >= 0,
|
||||
'incorrect value: eventIndex'
|
||||
)
|
||||
})
|
||||
|
||||
it('Activates exchange', async () => {
|
||||
const activeQuery = {
|
||||
query: `query {fixedRateExchange(id: "${fixedRateId}"){active, eventIndex}}`
|
||||
}
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(activeQuery)
|
||||
})
|
||||
const initialActive = (await initialResponse.json()).data.fixedRateExchange
|
||||
.active
|
||||
assert(initialActive === false, 'incorrect value for: initialActive')
|
||||
|
||||
// Activate exchange
|
||||
await fixedRate.activate(publisher, exchangeId)
|
||||
await sleep(sleepMs)
|
||||
|
||||
// Check the updated value for active
|
||||
const updatedResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(activeQuery)
|
||||
})
|
||||
const updatedActive = (await updatedResponse.json()).data.fixedRateExchange
|
||||
assert(updatedActive.active === true, 'incorrect value for: updatedActive')
|
||||
assert(
|
||||
updatedActive.eventIndex !== null && updatedActive.eventIndex >= 0,
|
||||
'incorrect value: eventIndex'
|
||||
)
|
||||
})
|
||||
})
|
||||
|
@ -66,6 +66,7 @@ const ddo = {
|
||||
}
|
||||
]
|
||||
}
|
||||
let nftTemplate
|
||||
|
||||
describe('NFT tests', async () => {
|
||||
const nftName = 'testNFT'
|
||||
@ -119,9 +120,9 @@ describe('NFT tests', async () => {
|
||||
)
|
||||
erc721Address = result.events.NFTCreated.returnValues[0]
|
||||
datatokenAddress = result.events.TokenCreated.returnValues[0]
|
||||
|
||||
nftTemplate = await Factory.getNFTTemplate(nftParams.templateIndex)
|
||||
// Check values before updating metadata
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
nftAddress = erc721Address.toLowerCase()
|
||||
const initialQuery = {
|
||||
query: `query {
|
||||
@ -130,8 +131,8 @@ describe('NFT tests', async () => {
|
||||
symbol,
|
||||
name,
|
||||
tokenUri,
|
||||
owner,
|
||||
creator,
|
||||
owner{id},
|
||||
creator{id},
|
||||
address,
|
||||
providerUrl,
|
||||
assetState,
|
||||
@ -143,6 +144,7 @@ describe('NFT tests', async () => {
|
||||
transferable,
|
||||
createdTimestamp,
|
||||
tx,
|
||||
eventIndex,
|
||||
block,
|
||||
orderCount}}`
|
||||
}
|
||||
@ -150,15 +152,15 @@ describe('NFT tests', async () => {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(initialQuery)
|
||||
})
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
const nft = (await initialResponse.json()).data.nft
|
||||
const tx: TransactionReceipt = await web3.eth.getTransactionReceipt(nft.tx)
|
||||
assert(nft.id === nftAddress, 'incorrect value for: id')
|
||||
assert(nft.symbol === nftSymbol, 'incorrect value for: symbol')
|
||||
assert(nft.name === nftName, 'incorrect value for: name')
|
||||
assert(nft.tokenUri === tokenURI, 'incorrect value for: tokenUri')
|
||||
assert(nft.owner === publisher, 'incorrect value for: owner')
|
||||
assert(nft.creator === publisher, 'incorrect value for: creator')
|
||||
assert(nft.owner.id === publisher, 'incorrect value for: owner')
|
||||
assert(nft.creator.id === publisher, 'incorrect value for: creator')
|
||||
assert(nft.managerRole[0] === publisher, 'incorrect value for: managerRole')
|
||||
assert(
|
||||
nft.erc20DeployerRole[0] === factoryAddress,
|
||||
@ -166,7 +168,10 @@ describe('NFT tests', async () => {
|
||||
)
|
||||
assert(nft.storeUpdateRole === null, 'incorrect value for: storeUpdateRole')
|
||||
assert(nft.metadataRole === null, 'incorrect value for: metadataRole')
|
||||
assert(nft.template === '', 'incorrect value for: template')
|
||||
assert(
|
||||
nft.template === nftTemplate.templateAddress.toLowerCase(),
|
||||
'incorrect value for: template'
|
||||
)
|
||||
assert(nft.transferable === true, 'incorrect value for: transferable')
|
||||
assert(
|
||||
nft.createdTimestamp >= time,
|
||||
@ -182,21 +187,29 @@ describe('NFT tests', async () => {
|
||||
assert(nft.block >= blockNumber, 'incorrect value for: block')
|
||||
assert(nft.block < blockNumber + 50, 'incorrect value for: block')
|
||||
assert(nft.orderCount === '0', 'incorrect value for: orderCount')
|
||||
assert(
|
||||
nft.eventIndex !== null && nft.eventIndex > 0,
|
||||
'Invalid eventIndex for NFT creation'
|
||||
)
|
||||
})
|
||||
|
||||
it('Update metadata', async () => {
|
||||
const chain = await web3.eth.getChainId()
|
||||
// create the files encrypted string
|
||||
let providerResponse = await ProviderInstance.encrypt(assetUrl, providerUrl)
|
||||
let providerResponse = await ProviderInstance.encrypt(
|
||||
assetUrl,
|
||||
chain,
|
||||
providerUrl
|
||||
)
|
||||
ddo.services[0].files = await providerResponse
|
||||
ddo.services[0].datatokenAddress = datatokenAddress
|
||||
// update ddo and set the right did
|
||||
ddo.nftAddress = erc721Address
|
||||
const chain = await web3.eth.getChainId()
|
||||
ddo.id =
|
||||
'did:op:' +
|
||||
SHA256(web3.utils.toChecksumAddress(erc721Address) + chain.toString(10))
|
||||
|
||||
providerResponse = await ProviderInstance.encrypt(ddo, providerUrl)
|
||||
providerResponse = await ProviderInstance.encrypt(ddo, chain, providerUrl)
|
||||
const encryptedResponse = await providerResponse
|
||||
const metadataHash = getHash(JSON.stringify(ddo))
|
||||
await nft.setMetadata(
|
||||
@ -211,7 +224,7 @@ describe('NFT tests', async () => {
|
||||
)
|
||||
|
||||
// graph tests here
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
const query = {
|
||||
query: `query {
|
||||
nft(id:"${nftAddress}"){
|
||||
@ -219,8 +232,8 @@ describe('NFT tests', async () => {
|
||||
symbol,
|
||||
name,
|
||||
tokenUri,
|
||||
owner,
|
||||
creator,
|
||||
owner{id},
|
||||
creator{id},
|
||||
address,
|
||||
providerUrl,
|
||||
assetState,
|
||||
@ -232,6 +245,7 @@ describe('NFT tests', async () => {
|
||||
transferable,
|
||||
createdTimestamp,
|
||||
tx,
|
||||
eventIndex,
|
||||
block,
|
||||
orderCount}}`
|
||||
}
|
||||
@ -239,6 +253,7 @@ describe('NFT tests', async () => {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(query)
|
||||
})
|
||||
await sleep(3000)
|
||||
const updatedNft = (await response.json()).data.nft
|
||||
const tx: TransactionReceipt = await web3.eth.getTransactionReceipt(
|
||||
updatedNft.tx
|
||||
@ -247,8 +262,8 @@ describe('NFT tests', async () => {
|
||||
assert(updatedNft.symbol === nftSymbol, 'incorrect value for: symbol')
|
||||
assert(updatedNft.name === nftName, 'incorrect value for: name')
|
||||
assert(updatedNft.tokenUri === tokenURI, 'incorrect value for: tokenUri')
|
||||
assert(updatedNft.owner === publisher, 'incorrect value for: owner')
|
||||
assert(updatedNft.creator === publisher, 'incorrect value for: creator')
|
||||
assert(updatedNft.owner.id === publisher, 'incorrect value for: owner')
|
||||
assert(updatedNft.creator.id === publisher, 'incorrect value for: creator')
|
||||
assert(
|
||||
updatedNft.managerRole[0] === publisher,
|
||||
'incorrect value for: managerRole'
|
||||
@ -265,7 +280,10 @@ describe('NFT tests', async () => {
|
||||
updatedNft.metadataRole === null,
|
||||
'incorrect value for: metadataRole'
|
||||
)
|
||||
assert(updatedNft.template === '', 'incorrect value for: template')
|
||||
assert(
|
||||
updatedNft.template === nftTemplate.templateAddress.toLowerCase(),
|
||||
'incorrect value for: template'
|
||||
)
|
||||
assert(
|
||||
updatedNft.transferable === true,
|
||||
'incorrect value for: transferable'
|
||||
@ -284,6 +302,10 @@ describe('NFT tests', async () => {
|
||||
assert(updatedNft.block >= blockNumber, 'incorrect value for: block')
|
||||
assert(updatedNft.block < blockNumber + 50, 'incorrect value for: block')
|
||||
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 () => {
|
||||
@ -297,6 +319,7 @@ describe('NFT tests', async () => {
|
||||
key
|
||||
value
|
||||
}
|
||||
eventIndex
|
||||
}
|
||||
}`
|
||||
}
|
||||
@ -306,5 +329,9 @@ describe('NFT tests', async () => {
|
||||
})
|
||||
const updatedNft = (await response.json()).data.nft
|
||||
assert(updatedNft.nftData.key !== null, 'incorrect value for key')
|
||||
assert(
|
||||
updatedNft.eventIndex !== null && updatedNft.eventIndex > 0,
|
||||
'Invalid eventIndex for NFT update'
|
||||
)
|
||||
})
|
||||
})
|
||||
|
@ -122,18 +122,22 @@ describe('Simple Publish & consume test', async () => {
|
||||
const erc721Address = result.events.NFTCreated.returnValues[0]
|
||||
datatokenAddress = result.events.TokenCreated.returnValues[0]
|
||||
|
||||
const chain = await web3.eth.getChainId()
|
||||
// create the files encrypted string
|
||||
let providerResponse = await ProviderInstance.encrypt(assetUrl, providerUrl)
|
||||
let providerResponse = await ProviderInstance.encrypt(
|
||||
assetUrl,
|
||||
chain,
|
||||
providerUrl
|
||||
)
|
||||
ddo.services[0].files = await providerResponse
|
||||
ddo.services[0].datatokenAddress = datatokenAddress
|
||||
// update ddo and set the right did
|
||||
ddo.nftAddress = erc721Address
|
||||
const chain = await web3.eth.getChainId()
|
||||
ddo.id =
|
||||
'did:op:' +
|
||||
SHA256(web3.utils.toChecksumAddress(erc721Address) + chain.toString(10))
|
||||
|
||||
providerResponse = await ProviderInstance.encrypt(ddo, providerUrl)
|
||||
providerResponse = await ProviderInstance.encrypt(ddo, chain, providerUrl)
|
||||
const encryptedResponse = await providerResponse
|
||||
const metadataHash = getHash(JSON.stringify(ddo))
|
||||
await nft.setMetadata(
|
||||
@ -148,18 +152,24 @@ describe('Simple Publish & consume test', async () => {
|
||||
)
|
||||
|
||||
// graph tests here
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
const graphNftToken = erc721Address.toLowerCase()
|
||||
const query = {
|
||||
query: `query {
|
||||
nft(id:"${graphNftToken}"){symbol,id}}`
|
||||
nft(id:"${graphNftToken}"){symbol,id,eventIndex}}`
|
||||
}
|
||||
const response = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(query)
|
||||
})
|
||||
await sleep(3000)
|
||||
const queryResult = await response.json()
|
||||
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 () => {
|
||||
const nftParams: NftCreateData = {
|
||||
@ -184,38 +194,48 @@ describe('Simple Publish & consume test', async () => {
|
||||
nftParams,
|
||||
erc20Params
|
||||
)
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
const erc721Address = result.events.NFTCreated.returnValues[0]
|
||||
const datatokenAddress = result.events.TokenCreated.returnValues[0]
|
||||
const graphNftToken = erc721Address.toLowerCase()
|
||||
|
||||
const queryOriginalOwner = {
|
||||
query: `query {
|
||||
nft(id:"${graphNftToken}"){symbol,id,owner}}`
|
||||
nft(id:"${graphNftToken}"){symbol,id,owner{id},eventIndex}}`
|
||||
}
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(queryOriginalOwner)
|
||||
})
|
||||
await sleep(3000)
|
||||
const initialResult = await initialResponse.json()
|
||||
// Checking original owner account has been set correctly
|
||||
assert(
|
||||
initialResult.data.nft.owner.toLowerCase() ===
|
||||
initialResult.data.nft.owner.id.toLowerCase() ===
|
||||
publisherAccount.toLowerCase()
|
||||
)
|
||||
assert(
|
||||
initialResult.data.nft.eventIndex !== null &&
|
||||
initialResult.data.nft.eventIndex > 0,
|
||||
'Invalid eventIndex for NFT creation'
|
||||
)
|
||||
|
||||
// create the files encrypted string
|
||||
let providerResponse = await ProviderInstance.encrypt(assetUrl, providerUrl)
|
||||
const chain = await web3.eth.getChainId()
|
||||
let providerResponse = await ProviderInstance.encrypt(
|
||||
assetUrl,
|
||||
chain,
|
||||
providerUrl
|
||||
)
|
||||
ddo.services[0].files = await providerResponse
|
||||
ddo.services[0].datatokenAddress = datatokenAddress
|
||||
// update ddo and set the right did
|
||||
ddo.nftAddress = erc721Address
|
||||
const chain = await web3.eth.getChainId()
|
||||
ddo.id =
|
||||
'did:op:' +
|
||||
SHA256(web3.utils.toChecksumAddress(erc721Address) + chain.toString(10))
|
||||
|
||||
providerResponse = await ProviderInstance.encrypt(ddo, providerUrl)
|
||||
providerResponse = await ProviderInstance.encrypt(ddo, chain, providerUrl)
|
||||
const encryptedResponse = await providerResponse
|
||||
const metadataHash = getHash(JSON.stringify(ddo))
|
||||
await nft.setMetadata(
|
||||
@ -228,21 +248,27 @@ describe('Simple Publish & consume test', async () => {
|
||||
encryptedResponse,
|
||||
'0x' + metadataHash
|
||||
)
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
|
||||
// Transfer the NFT
|
||||
await nft.transferNft(graphNftToken, publisherAccount, newOwnerAccount)
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
const query2 = {
|
||||
query: `query {
|
||||
nft(id:"${graphNftToken}"){symbol,id,owner, transferable}}`
|
||||
nft(id:"${graphNftToken}"){symbol,id,owner{id}, transferable, eventIndex}}`
|
||||
}
|
||||
const response = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(query2)
|
||||
})
|
||||
await sleep(3000)
|
||||
const queryResult = await response.json()
|
||||
assert(queryResult.data.nft.owner === 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 () => {
|
||||
@ -280,19 +306,26 @@ describe('Simple Publish & consume test', async () => {
|
||||
1,
|
||||
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 = {
|
||||
query: `query {order(id:"${orderId}"){id, providerFee, lastPriceToken{id}, eventIndex}}`
|
||||
}
|
||||
|
||||
const query = { query: `query {order(id:"${orderId}"){id, providerFee}}` }
|
||||
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
const response = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(query)
|
||||
})
|
||||
|
||||
await sleep(3000)
|
||||
const queryResult = await response.json()
|
||||
|
||||
const providerFeeJSON = JSON.parse(queryResult.data.order.providerFee)
|
||||
const lastPriceToken = queryResult.data.order.lastPriceToken.id
|
||||
|
||||
assert(lastPriceToken === ZERO_ADDRESS, 'Wrong lastPriceToken')
|
||||
|
||||
assert(
|
||||
providerFeeJSON.providerFeeAddress.toLowerCase() ===
|
||||
@ -309,6 +342,10 @@ describe('Simple Publish & consume test', async () => {
|
||||
setProviderFee.providerFeeToken.toLowerCase(),
|
||||
'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 () => {
|
||||
@ -349,21 +386,26 @@ describe('Simple Publish & consume test', async () => {
|
||||
assert(orderTx.transactionHash, 'Failed to start order')
|
||||
|
||||
// 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 = {
|
||||
query: `query {order(id:"${orderId}"){id, providerFee}}`
|
||||
query: `query {order(id:"${orderId}"){id, providerFee, lastPriceToken{id}, eventIndex}}`
|
||||
}
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(initialQuery)
|
||||
})
|
||||
await sleep(3000)
|
||||
const initialQueryResult = await initialResponse.json()
|
||||
const initialProviderFeeJSON = JSON.parse(
|
||||
initialQueryResult.data.order.providerFee
|
||||
)
|
||||
const lastPriceToken = initialQueryResult.data.order.lastPriceToken.id
|
||||
|
||||
assert(lastPriceToken === ZERO_ADDRESS, 'Wrong initial lastPriceToken set')
|
||||
assert(
|
||||
initialProviderFeeJSON.providerFeeAddress.toLowerCase() ===
|
||||
setInitialProviderFee.providerFeeAddress.toLowerCase(),
|
||||
@ -379,6 +421,10 @@ describe('Simple Publish & consume test', async () => {
|
||||
setInitialProviderFee.providerFeeToken.toLowerCase(),
|
||||
'Wrong initial providerFeeToken set'
|
||||
)
|
||||
assert(
|
||||
initialQueryResult.data.order.eventIndex !== null,
|
||||
'Invalid eventIndex for order'
|
||||
)
|
||||
|
||||
providerFeeAmount = '990000'
|
||||
providerValidUntil = '10000'
|
||||
@ -407,7 +453,7 @@ describe('Simple Publish & consume test', async () => {
|
||||
|
||||
const reusedOrder = await datatoken.reuseOrder(
|
||||
datatokenAddress,
|
||||
user2,
|
||||
user4,
|
||||
orderTx.transactionHash,
|
||||
setNewProviderFee
|
||||
)
|
||||
@ -419,7 +465,11 @@ describe('Simple Publish & consume test', async () => {
|
||||
// Check the new provider fee has been set in OrderReuse
|
||||
|
||||
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)
|
||||
@ -449,5 +499,17 @@ describe('Simple Publish & consume test', async () => {
|
||||
setNewProviderFee.providerFeeToken.toLowerCase(),
|
||||
'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'
|
||||
)
|
||||
})
|
||||
})
|
||||
|
@ -31,6 +31,7 @@ describe('Tests coverage without provider/aquarius', async () => {
|
||||
let accounts: string[]
|
||||
let publisherAccount: string
|
||||
let newOwnerAccount: string
|
||||
let time: number
|
||||
|
||||
before(async () => {
|
||||
nft = new Nft(web3)
|
||||
@ -38,6 +39,8 @@ describe('Tests coverage without provider/aquarius', async () => {
|
||||
accounts = await web3.eth.getAccounts()
|
||||
publisherAccount = accounts[0]
|
||||
newOwnerAccount = accounts[1].toLowerCase()
|
||||
const date = new Date()
|
||||
time = Math.floor(date.getTime() / 1000)
|
||||
})
|
||||
|
||||
it('should publish a dataset (create NFT + ERC20)', async () => {
|
||||
@ -66,18 +69,23 @@ describe('Tests coverage without provider/aquarius', async () => {
|
||||
const erc721Address = result.events.NFTCreated.returnValues[0]
|
||||
|
||||
// graph tests here
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
const graphNftToken = erc721Address.toLowerCase()
|
||||
const query = {
|
||||
query: `query {
|
||||
nft(id:"${graphNftToken}"){symbol,id}}`
|
||||
nft(id:"${graphNftToken}"){symbol,id,eventIndex}}`
|
||||
}
|
||||
const response = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(query)
|
||||
})
|
||||
await sleep(3000)
|
||||
const queryResult = await response.json()
|
||||
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 () => {
|
||||
@ -103,22 +111,53 @@ describe('Tests coverage without provider/aquarius', async () => {
|
||||
nftParams,
|
||||
erc20Params
|
||||
)
|
||||
await sleep(2000)
|
||||
await sleep(3000)
|
||||
const erc721Address = result.events.NFTCreated.returnValues[0]
|
||||
const graphNftToken = erc721Address.toLowerCase()
|
||||
const nftAddress = erc721Address.toLowerCase()
|
||||
|
||||
// Transfer the NFT
|
||||
await nft.transferNft(graphNftToken, publisherAccount, newOwnerAccount)
|
||||
await sleep(2000)
|
||||
const tx = await nft.transferNft(
|
||||
nftAddress,
|
||||
publisherAccount,
|
||||
newOwnerAccount
|
||||
)
|
||||
|
||||
await sleep(3000)
|
||||
const query2 = {
|
||||
query: `query {
|
||||
nft(id:"${graphNftToken}"){symbol,id,owner, transferable}}`
|
||||
nft(id:"${nftAddress}"){
|
||||
symbol,
|
||||
id,
|
||||
owner{id},
|
||||
transferable,
|
||||
transferHistory(orderBy: timestamp, orderDirection: desc){id,nft,oldOwner,newOwner,txId,eventIndex,timestamp,block}
|
||||
}}`
|
||||
}
|
||||
const response = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(query2)
|
||||
})
|
||||
await sleep(3000)
|
||||
const queryResult = await response.json()
|
||||
assert(queryResult.data.nft.owner === newOwnerAccount)
|
||||
const transferHistory = queryResult.data.nft.transferHistory[0]
|
||||
|
||||
assert(queryResult.data.nft.owner.id === newOwnerAccount)
|
||||
assert(
|
||||
transferHistory.id ===
|
||||
`${nftAddress}-${
|
||||
tx.transactionHash
|
||||
}-${tx.events.Transfer.logIndex.toFixed(1)}`,
|
||||
'Invalid transferHistory Id'
|
||||
)
|
||||
assert(transferHistory.txId === tx.transactionHash, 'invalid txId')
|
||||
assert(
|
||||
transferHistory.eventIndex === tx.events.Transfer.logIndex,
|
||||
'invalid eventIndex'
|
||||
)
|
||||
assert(transferHistory.timestamp)
|
||||
|
||||
assert(transferHistory.timestamp >= time - 500, 'incorrect value timestamp')
|
||||
assert(transferHistory.timestamp < time + 500, 'incorrect value timestamp')
|
||||
assert(transferHistory.block === tx.blockNumber, 'blockNumber')
|
||||
})
|
||||
})
|
||||
|
@ -16,6 +16,7 @@ import Web3 from 'web3'
|
||||
import { homedir } from 'os'
|
||||
import fs from 'fs'
|
||||
import { fetch } from 'cross-fetch'
|
||||
import veDelegation from '@oceanprotocol/contracts/artifacts/contracts/ve/veDelegation.vy/veDelegation.json'
|
||||
|
||||
const data = JSON.parse(
|
||||
fs.readFileSync(
|
||||
@ -69,6 +70,23 @@ function evmIncreaseTime(seconds) {
|
||||
})
|
||||
}
|
||||
|
||||
async function getTotalLockedOcean() {
|
||||
const initialQuery = {
|
||||
query: `query{
|
||||
globalStatistics{
|
||||
totalOceanLocked
|
||||
}
|
||||
}`
|
||||
}
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(initialQuery)
|
||||
})
|
||||
const data = (await initialResponse.json()).data.globalStatistics
|
||||
if (data.length == 0) return 0
|
||||
|
||||
return data[0].totalOceanLocked
|
||||
}
|
||||
const minAbi = [
|
||||
{
|
||||
constant: false,
|
||||
@ -87,6 +105,7 @@ const minAbi = [
|
||||
describe('veOcean tests', async () => {
|
||||
let nftFactory
|
||||
let veOcean: VeOcean
|
||||
let delegateContract
|
||||
let veAllocate: VeAllocate
|
||||
let veFeeDistributor: VeFeeDistributor
|
||||
let ownerAccount: string
|
||||
@ -103,6 +122,10 @@ describe('veOcean tests', async () => {
|
||||
ownerAccount = accounts[0]
|
||||
Alice = accounts[1]
|
||||
Bob = accounts[2]
|
||||
delegateContract = new web3.eth.Contract(
|
||||
veDelegation.abi as AbiItem[],
|
||||
addresses.veDelegation
|
||||
)
|
||||
|
||||
const tokenContract = new web3.eth.Contract(minAbi, addresses.Ocean)
|
||||
const estGas = await calculateEstimatedGas(
|
||||
@ -138,6 +161,7 @@ describe('veOcean tests', async () => {
|
||||
it('Alice should lock 100 Ocean', async () => {
|
||||
// since we can only lock once, we test if tx fails or not
|
||||
// so if there is already a lock, skip it
|
||||
const totalOceanLockedBefore = await getTotalLockedOcean()
|
||||
let currentBalance = await veOcean.getLockedAmount(Alice)
|
||||
let currentLock = await veOcean.lockEnd(Alice)
|
||||
const amount = '100'
|
||||
@ -166,6 +190,19 @@ describe('veOcean tests', async () => {
|
||||
currentBalance = await veOcean.getLockedAmount(Alice)
|
||||
currentLock = await veOcean.lockEnd(Alice)
|
||||
await sleep(2000)
|
||||
const totalOceanLockedAfter = await getTotalLockedOcean()
|
||||
assert(
|
||||
parseFloat(totalOceanLockedAfter) > parseFloat(totalOceanLockedBefore),
|
||||
'After (' +
|
||||
totalOceanLockedAfter +
|
||||
') shold be higher then ' +
|
||||
totalOceanLockedBefore
|
||||
)
|
||||
assert(
|
||||
parseFloat(totalOceanLockedAfter) ==
|
||||
parseFloat(totalOceanLockedBefore + amount),
|
||||
'Invalid totalOceanLockedAfter (' + totalOceanLockedAfter + ')'
|
||||
)
|
||||
const initialQuery = {
|
||||
query: `query {
|
||||
veOCEANs(id:"${Alice.toLowerCase()}"){
|
||||
@ -287,7 +324,7 @@ describe('veOcean tests', 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)
|
||||
await sleep(2000)
|
||||
let initialQuery = {
|
||||
@ -295,6 +332,7 @@ describe('veOcean tests', async () => {
|
||||
veAllocateUsers(id:"${Alice.toLowerCase()}"){
|
||||
id,
|
||||
allocatedTotal
|
||||
eventIndex
|
||||
}
|
||||
}`
|
||||
}
|
||||
@ -310,13 +348,15 @@ describe('veOcean tests', async () => {
|
||||
' to equal subgraph value ' +
|
||||
info[0].allocatedTotal
|
||||
)
|
||||
assert(info[0].eventIndex === tx.events.AllocationSet.logIndex)
|
||||
initialQuery = {
|
||||
query: `query {
|
||||
veAllocations(
|
||||
where: {allocationUser:"${Alice.toLowerCase()}", chainId:"${chainId}", nftAddress:"${nft1.toLowerCase()}"}
|
||||
){
|
||||
id,
|
||||
allocated
|
||||
allocated,
|
||||
eventIndex
|
||||
}
|
||||
}`
|
||||
}
|
||||
@ -330,10 +370,11 @@ describe('veOcean tests', async () => {
|
||||
'Expected totalAllocation 1000 to equal subgraph value ' +
|
||||
info[0].allocatedTotal
|
||||
)
|
||||
assert(info[0].eventIndex === tx.events.AllocationSet.logIndex)
|
||||
})
|
||||
|
||||
it('Alice should allocate 10% to NFT2 and 20% to NFT3', async () => {
|
||||
await veAllocate.setBatchAllocation(
|
||||
const tx = await veAllocate.setBatchAllocation(
|
||||
Alice,
|
||||
['1000', '2000'],
|
||||
[nft2, nft3],
|
||||
@ -346,7 +387,8 @@ describe('veOcean tests', async () => {
|
||||
query: `query {
|
||||
veAllocateUsers(id:"${Alice.toLowerCase()}"){
|
||||
id,
|
||||
allocatedTotal
|
||||
allocatedTotal,
|
||||
eventIndex
|
||||
}
|
||||
}`
|
||||
}
|
||||
@ -362,13 +404,15 @@ describe('veOcean tests', async () => {
|
||||
' to equal subgraph value ' +
|
||||
info[0].allocatedTotal
|
||||
)
|
||||
assert(info[0].eventIndex === tx.events.AllocationSetMultiple.logIndex)
|
||||
initialQuery = {
|
||||
query: `query {
|
||||
veAllocations(
|
||||
where: {allocationUser:"${Alice.toLowerCase()}", chainId:"${chainId}", nftAddress:"${nft2.toLowerCase()}"}
|
||||
){
|
||||
id,
|
||||
allocated
|
||||
allocated,
|
||||
eventIndex
|
||||
}
|
||||
}`
|
||||
}
|
||||
@ -382,6 +426,7 @@ describe('veOcean tests', async () => {
|
||||
'Expected totalAllocation 1000 to equal subgraph value ' +
|
||||
info[0].allocatedTotal
|
||||
)
|
||||
assert(info[0].eventIndex === tx.events.AllocationSetMultiple.logIndex)
|
||||
initialQuery = {
|
||||
query: `query {
|
||||
veAllocations(
|
||||
@ -544,6 +589,241 @@ describe('veOcean tests', async () => {
|
||||
})
|
||||
it('Alice should withdraw locked tokens', async () => {
|
||||
await evmIncreaseTime(60 * 60 * 24 * 7)
|
||||
const totalOceanLockedBefore = await getTotalLockedOcean()
|
||||
await veOcean.withdraw(Alice)
|
||||
await sleep(2000)
|
||||
const totalOceanLockedAfter = await getTotalLockedOcean()
|
||||
assert(
|
||||
parseFloat(totalOceanLockedAfter) < parseFloat(totalOceanLockedBefore),
|
||||
'After (' +
|
||||
totalOceanLockedAfter +
|
||||
') shold be lower then ' +
|
||||
totalOceanLockedBefore
|
||||
)
|
||||
})
|
||||
|
||||
it('Alice should lock 100 Ocean and Delegate them to Bob', async () => {
|
||||
// since we can only lock once, we test if tx fails or not
|
||||
// so if there is already a lock, skip it
|
||||
let currentBalance = await veOcean.getLockedAmount(Alice)
|
||||
let currentLock = await veOcean.lockEnd(Alice)
|
||||
const amount = '100'
|
||||
await approve(
|
||||
web3,
|
||||
config,
|
||||
Alice,
|
||||
addresses.Ocean,
|
||||
addresses.veOCEAN,
|
||||
amount
|
||||
)
|
||||
const timestamp = Math.floor(Date.now() / 1000)
|
||||
const unlockTime = timestamp + 30 * 86400
|
||||
|
||||
if (parseInt(currentBalance) > 0 || currentLock > 0) {
|
||||
// we already have some locked tokens, so our transaction should fail
|
||||
try {
|
||||
await veOcean.lockTokens(Alice, amount, unlockTime)
|
||||
assert(false, 'This should fail!')
|
||||
} catch (e) {
|
||||
// do nothing
|
||||
}
|
||||
} else {
|
||||
await veOcean.lockTokens(Alice, amount, unlockTime)
|
||||
}
|
||||
currentBalance = await veOcean.getLockedAmount(Alice)
|
||||
currentLock = await veOcean.lockEnd(Alice)
|
||||
await sleep(2000)
|
||||
const initialQuery = {
|
||||
query: `query {
|
||||
veOCEANs(id:"${Alice.toLowerCase()}"){
|
||||
id,
|
||||
lockedAmount,
|
||||
unlockTime
|
||||
}
|
||||
}`
|
||||
}
|
||||
await sleep(2000)
|
||||
|
||||
const initialResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(initialQuery)
|
||||
})
|
||||
await sleep(2000)
|
||||
const info = (await initialResponse.json()).data.veOCEANs
|
||||
assert(info[0].id === Alice.toLowerCase(), 'ID is incorrect')
|
||||
assert(info[0].lockedAmount === currentBalance, 'LockedAmount is incorrect')
|
||||
assert(info[0].unlockTime === currentLock, 'Unlock time is not correct')
|
||||
|
||||
const lockTime = await veOcean.lockEnd(Alice)
|
||||
const extLockTime = Number(lockTime) + 31556926
|
||||
|
||||
await delegateContract.methods.setApprovalForAll(Alice, true).send({
|
||||
from: Alice
|
||||
})
|
||||
|
||||
await veOcean.increaseUnlockTime(Alice, extLockTime)
|
||||
|
||||
const initalBoostExpiry = extLockTime - 100000
|
||||
let estGas = await calculateEstimatedGas(
|
||||
Alice,
|
||||
delegateContract.methods.create_boost,
|
||||
Alice,
|
||||
Bob,
|
||||
5000,
|
||||
0,
|
||||
initalBoostExpiry,
|
||||
0
|
||||
)
|
||||
|
||||
const tx3 = await sendTx(
|
||||
Alice,
|
||||
estGas,
|
||||
web3,
|
||||
1,
|
||||
delegateContract.methods.create_boost,
|
||||
Alice,
|
||||
Bob,
|
||||
5000,
|
||||
0,
|
||||
initalBoostExpiry,
|
||||
0
|
||||
)
|
||||
|
||||
assert(tx3, 'Transaction failed')
|
||||
assert(tx3.events.DelegateBoost, 'No Delegate boost event')
|
||||
const tokenId = tx3.events.DelegateBoost.returnValues._token_id
|
||||
await evmIncreaseTime(60)
|
||||
// extend boost
|
||||
estGas = await calculateEstimatedGas(
|
||||
Alice,
|
||||
delegateContract.methods.extend_boost,
|
||||
tokenId,
|
||||
10000,
|
||||
extLockTime,
|
||||
0
|
||||
)
|
||||
|
||||
const tx4 = await sendTx(
|
||||
Alice,
|
||||
estGas,
|
||||
web3,
|
||||
1,
|
||||
delegateContract.methods.extend_boost,
|
||||
tokenId,
|
||||
10000,
|
||||
extLockTime,
|
||||
0
|
||||
)
|
||||
|
||||
assert(tx4, 'Transaction failed')
|
||||
assert(tx4.events.ExtendBoost, 'No ExtendBoost event')
|
||||
await evmIncreaseTime(60)
|
||||
// burn it
|
||||
estGas = await calculateEstimatedGas(
|
||||
Alice,
|
||||
delegateContract.methods.cancel_boost,
|
||||
tokenId
|
||||
)
|
||||
|
||||
const tx5 = await sendTx(
|
||||
Alice,
|
||||
estGas,
|
||||
web3,
|
||||
1,
|
||||
delegateContract.methods.cancel_boost,
|
||||
tokenId
|
||||
)
|
||||
|
||||
assert(tx5, 'Transaction failed')
|
||||
assert(tx5.events.BurnBoost, 'No BurnBoost event')
|
||||
|
||||
await sleep(3000)
|
||||
const delegateQuery = {
|
||||
query: `query{
|
||||
veDelegations(where:{delegator:"${Alice.toLowerCase()}"}){
|
||||
id
|
||||
delegator {
|
||||
id
|
||||
}
|
||||
receiver{
|
||||
id
|
||||
}
|
||||
amount
|
||||
tokenId
|
||||
cancelTime
|
||||
expireTime
|
||||
updates(orderBy:timestamp orderDirection:asc){
|
||||
id
|
||||
block
|
||||
timestamp
|
||||
tx
|
||||
eventIndex
|
||||
sender
|
||||
amount
|
||||
cancelTime
|
||||
expireTime
|
||||
type
|
||||
}
|
||||
}
|
||||
}`
|
||||
}
|
||||
|
||||
const delegateResponse = await fetch(subgraphUrl, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(delegateQuery)
|
||||
})
|
||||
const resp = await delegateResponse.json()
|
||||
const delegations = resp.data.veDelegations
|
||||
|
||||
assert(delegations.length > 0, 'No veDelegations')
|
||||
assert(
|
||||
delegations[0].tokenId.toLowerCase() ==
|
||||
tx3.events.DelegateBoost.returnValues._token_id.toLowerCase(),
|
||||
'Invalid tokenID'
|
||||
)
|
||||
assert(delegations[0].amount == '0', 'Invalid amount, should be 0')
|
||||
assert(delegations[0].updates.length > 0, 'No updates')
|
||||
// check updates. first is create boost
|
||||
assert(
|
||||
delegations[0].updates[0].type == 0,
|
||||
'Invalid type. should be createBoost'
|
||||
)
|
||||
assert(
|
||||
delegations[0].updates[0].cancelTime ==
|
||||
tx3.events.DelegateBoost.returnValues._cancel_time,
|
||||
'Invalid cancelTime'
|
||||
)
|
||||
assert(
|
||||
delegations[0].updates[0].expireTime ==
|
||||
tx3.events.DelegateBoost.returnValues._expire_time,
|
||||
'Invalid expireTime'
|
||||
)
|
||||
assert(
|
||||
web3.utils.toWei(delegations[0].updates[0].amount) ==
|
||||
tx3.events.DelegateBoost.returnValues._amount,
|
||||
'Invalid amount'
|
||||
)
|
||||
// check extend boos update
|
||||
assert(
|
||||
delegations[0].updates[1].type == 1,
|
||||
'Invalid type. should be extend Boost'
|
||||
)
|
||||
assert(
|
||||
delegations[0].updates[1].cancelTime ==
|
||||
tx4.events.ExtendBoost.returnValues._cancel_time,
|
||||
'Invalid cancelTime for extend boost'
|
||||
)
|
||||
assert(
|
||||
delegations[0].updates[1].expireTime ==
|
||||
tx4.events.ExtendBoost.returnValues._expire_time,
|
||||
'Invalid expireTime for extend boost'
|
||||
)
|
||||
assert(
|
||||
web3.utils.toWei(delegations[0].updates[1].amount) ==
|
||||
tx4.events.ExtendBoost.returnValues._amount,
|
||||
'Invalid amount for extend boost'
|
||||
)
|
||||
// check burn
|
||||
assert(delegations[0].updates[2].type == 2, 'Invalid type. should be burn')
|
||||
})
|
||||
})
|
||||
|
@ -33,7 +33,7 @@ async function userQuery(user: string) {
|
||||
user(id:"${user}"){
|
||||
id
|
||||
tokenBalancesOwned {id}
|
||||
orders {id}
|
||||
orders {id, lastPriceToken{id}}
|
||||
freSwaps {id}
|
||||
totalOrders
|
||||
totalSales
|
||||
@ -64,7 +64,7 @@ describe('User tests', async () => {
|
||||
const publishMarketSwapFee = '0.003'
|
||||
const templateIndex = 1
|
||||
const dtAmount = '10'
|
||||
const datatoken = new Datatoken(web3, 8996)
|
||||
// const datatoken = new Datatoken(web3, 8996)
|
||||
let datatokenAddress: string
|
||||
let fixedRateAddress: string
|
||||
let baseTokenAddress: string
|
||||
@ -123,7 +123,7 @@ describe('User tests', async () => {
|
||||
fixedRate: price,
|
||||
marketFee: publishMarketSwapFee,
|
||||
allowedConsumer: ZERO_ADDRESS,
|
||||
withMint: false
|
||||
withMint: true
|
||||
}
|
||||
|
||||
const result = await Factory.createNftWithDatatokenWithFixedRate(
|
||||
@ -196,27 +196,6 @@ describe('User tests', async () => {
|
||||
assert(user.totalSales === '0', 'incorrect value for: totalSales')
|
||||
assert(user.__typename === 'User', 'incorrect value for: __typename')
|
||||
})
|
||||
it('User1 sells a datatoken', async () => {
|
||||
const initialUser = await userQuery(user1)
|
||||
await datatoken.approve(datatokenAddress, fixedRateAddress, dtAmount, user1)
|
||||
const tx = (await fixedRate.sellDatatokens(user1, exchangeId, '10', '9'))
|
||||
.events?.Swapped
|
||||
|
||||
assert(tx != null)
|
||||
const user = await userQuery(user1)
|
||||
|
||||
assert(user.id === user1, 'incorrect value for: id')
|
||||
assert(user.tokenBalancesOwned.length === 0, 'incorrect tokenBalancesOwned')
|
||||
assert(user.orders.length === 0, 'incorrect value for: orders')
|
||||
assert(
|
||||
user.freSwaps.length === initialUser.freSwaps.length,
|
||||
'incorrect value for: freSwaps'
|
||||
)
|
||||
assert(user.totalOrders === '0', 'incorrect value for: totalOrders')
|
||||
assert(user.totalSales === '0', 'incorrect value for: totalSales')
|
||||
assert(user.__typename === 'User', 'incorrect value for: __typename')
|
||||
})
|
||||
|
||||
it('Check user fields after publishing & ordering a datatoken', async () => {
|
||||
// Start with publishing a new datatoken
|
||||
const nftParams: NftCreateData = {
|
||||
@ -284,7 +263,6 @@ describe('User tests', async () => {
|
||||
await sleep(2000)
|
||||
|
||||
const user = await userQuery(user3)
|
||||
|
||||
assert(user.id === user3, 'incorrect value for: id')
|
||||
assert(user.tokenBalancesOwned.length === 0, 'incorrect tokenBalancesOwned')
|
||||
assert(user.orders.length === 1, 'incorrect value for: orders')
|
||||
@ -292,5 +270,9 @@ describe('User tests', async () => {
|
||||
assert(user.totalOrders === '1', 'incorrect value for: totalOrders')
|
||||
assert(user.totalSales === '0', 'incorrect value for: totalSales')
|
||||
assert(user.__typename === 'User', 'incorrect value for: __typename')
|
||||
assert(
|
||||
user.orders[0].lastPriceToken.id === ZERO_ADDRESS,
|
||||
'incorrect value for: lastPriceToken'
|
||||
)
|
||||
})
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user