mirror of
https://github.com/cerc-io/watcher-ts
synced 2024-11-19 20:36:19 +00:00
Watch pool initialize event (#123)
* Script to init pool. * Watch pool initialize event.
This commit is contained in:
parent
aec9281fb8
commit
194d079d5e
16
packages/uni-watcher/README.md
Normal file
16
packages/uni-watcher/README.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# Uniswap Watcher
|
||||||
|
|
||||||
|
Run the server:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ yarn server
|
||||||
|
```
|
||||||
|
|
||||||
|
Start watching the factory contract:
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ npx ts-node src/cli/watch-contract.ts --configFile environments/local.toml --address 0xfE0034a874c2707c23F91D7409E9036F5e08ac34 --kind factory --startingBlock 100
|
||||||
|
```
|
||||||
|
|
@ -15,6 +15,7 @@ import { Contract, KIND_FACTORY, KIND_POOL } from './entity/Contract';
|
|||||||
import { Config } from './config';
|
import { Config } from './config';
|
||||||
|
|
||||||
import factoryABI from './artifacts/factory.json';
|
import factoryABI from './artifacts/factory.json';
|
||||||
|
import poolABI from './artifacts/pool.json';
|
||||||
|
|
||||||
const log = debug('vulcanize:indexer');
|
const log = debug('vulcanize:indexer');
|
||||||
|
|
||||||
@ -33,6 +34,7 @@ export class Indexer {
|
|||||||
_getStorageAt: GetStorageAt
|
_getStorageAt: GetStorageAt
|
||||||
|
|
||||||
_factoryContract: ethers.utils.Interface
|
_factoryContract: ethers.utils.Interface
|
||||||
|
_poolContract: ethers.utils.Interface
|
||||||
|
|
||||||
constructor (config: Config, db: Database, ethClient: EthClient, pubsub: PubSub) {
|
constructor (config: Config, db: Database, ethClient: EthClient, pubsub: PubSub) {
|
||||||
assert(config);
|
assert(config);
|
||||||
@ -47,6 +49,7 @@ export class Indexer {
|
|||||||
this._getStorageAt = this._ethClient.getStorageAt.bind(this._ethClient);
|
this._getStorageAt = this._ethClient.getStorageAt.bind(this._ethClient);
|
||||||
|
|
||||||
this._factoryContract = new ethers.utils.Interface(factoryABI);
|
this._factoryContract = new ethers.utils.Interface(factoryABI);
|
||||||
|
this._poolContract = new ethers.utils.Interface(poolABI);
|
||||||
}
|
}
|
||||||
|
|
||||||
getEventIterator (): AsyncIterator<any> {
|
getEventIterator (): AsyncIterator<any> {
|
||||||
@ -138,12 +141,35 @@ export class Indexer {
|
|||||||
let eventName;
|
let eventName;
|
||||||
let eventProps = {};
|
let eventProps = {};
|
||||||
|
|
||||||
if (uniContract.kind === KIND_FACTORY) {
|
switch (uniContract.kind) {
|
||||||
const logDescription = this._factoryContract.parseLog({ data, topics });
|
case KIND_FACTORY: {
|
||||||
const { token0, token1, fee, tickSpacing, pool } = logDescription.args;
|
const logDescription = this._factoryContract.parseLog({ data, topics });
|
||||||
|
switch (logDescription.name) {
|
||||||
|
case 'PoolCreated': {
|
||||||
|
eventName = logDescription.name;
|
||||||
|
const { token0, token1, fee, tickSpacing, pool } = logDescription.args;
|
||||||
|
eventProps = { token0, token1, fee, tickSpacing, pool };
|
||||||
|
|
||||||
eventName = logDescription.name;
|
break;
|
||||||
eventProps = { token0, token1, fee, tickSpacing, pool };
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case KIND_POOL: {
|
||||||
|
const logDescription = this._poolContract.parseLog({ data, topics });
|
||||||
|
switch (logDescription.name) {
|
||||||
|
case 'Initialize': {
|
||||||
|
eventName = logDescription.name;
|
||||||
|
const { sqrtPriceX96, tick } = logDescription.args;
|
||||||
|
eventProps = { sqrtPriceX96: sqrtPriceX96.toString(), tick };
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let event: DeepPartial<Event> | undefined;
|
let event: DeepPartial<Event> | undefined;
|
||||||
|
@ -42,14 +42,16 @@ $ yarn deploy:token --network localhost --name Token0 --symbol TK0
|
|||||||
|
|
||||||
* **lint:schema**
|
* **lint:schema**
|
||||||
|
|
||||||
Lint schema graphql files.
|
Lint schema graphql files:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ yarn lint:schema schema/frontend.graphql
|
$ yarn lint:schema schema/frontend.graphql
|
||||||
```
|
```
|
||||||
|
|
||||||
* **deploy:factory**
|
* **deploy:factory**
|
||||||
|
|
||||||
Deploy Factory contract.
|
Deploy Factory contract:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ yarn deploy:factory
|
$ yarn deploy:factory
|
||||||
|
|
||||||
@ -59,18 +61,28 @@ $ yarn deploy:token --network localhost --name Token0 --symbol TK0
|
|||||||
|
|
||||||
* **deploy:token**
|
* **deploy:token**
|
||||||
|
|
||||||
Deploy Token contract.
|
Deploy Token contract:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ yarn deploy:token --name TokenName --symbol TKS
|
$ yarn deploy:token --name TokenName --symbol TKS
|
||||||
```
|
```
|
||||||
|
|
||||||
* **create:pool**
|
* **create:pool**
|
||||||
|
|
||||||
Create pool with factory contract and tokens.
|
Create pool with factory contract and tokens:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ yarn create:pool --factory 0xFactoryAddress --token0 0xToken0Address --token1 0xToken1Address --fee 500
|
$ yarn create:pool --factory 0xFactoryAddress --token0 0xToken0Address --token1 0xToken1Address --fee 500
|
||||||
```
|
```
|
||||||
|
|
||||||
|
* **initialize:pool**
|
||||||
|
|
||||||
|
Initialize a pool with price:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ yarn initialize:pool --pool 0xPoolAddress --sqrt-price 4295128739
|
||||||
|
```
|
||||||
|
|
||||||
## References
|
## References
|
||||||
|
|
||||||
* https://github.com/Uniswap/uniswap-v3-core
|
* https://github.com/Uniswap/uniswap-v3-core
|
||||||
|
@ -2,10 +2,11 @@ import 'dotenv/config';
|
|||||||
import { HardhatUserConfig } from "hardhat/config";
|
import { HardhatUserConfig } from "hardhat/config";
|
||||||
import "@nomiclabs/hardhat-waffle";
|
import "@nomiclabs/hardhat-waffle";
|
||||||
|
|
||||||
import './tasks/accounts'
|
import './tasks/accounts';
|
||||||
import './tasks/deploy-factory'
|
import './tasks/deploy-factory';
|
||||||
import './tasks/deploy-token'
|
import './tasks/deploy-token';
|
||||||
import './tasks/create-pool'
|
import './tasks/create-pool';
|
||||||
|
import './tasks/initialize-pool';
|
||||||
|
|
||||||
const config: HardhatUserConfig = {
|
const config: HardhatUserConfig = {
|
||||||
solidity: "0.8.0",
|
solidity: "0.8.0",
|
||||||
|
@ -8,7 +8,8 @@
|
|||||||
"lint:schema": "graphql-schema-linter",
|
"lint:schema": "graphql-schema-linter",
|
||||||
"deploy:factory": "hardhat deploy-factory",
|
"deploy:factory": "hardhat deploy-factory",
|
||||||
"deploy:token": "hardhat deploy-token",
|
"deploy:token": "hardhat deploy-token",
|
||||||
"create:pool": "hardhat create-pool"
|
"create:pool": "hardhat create-pool",
|
||||||
|
"initialize:pool": "hardhat initialize-pool"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nomiclabs/hardhat-ethers": "^2.0.2",
|
"@nomiclabs/hardhat-ethers": "^2.0.2",
|
||||||
|
26
packages/uniswap/tasks/initialize-pool.ts
Normal file
26
packages/uniswap/tasks/initialize-pool.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { task, types } from "hardhat/config";
|
||||||
|
import {
|
||||||
|
abi as POOL_ABI,
|
||||||
|
} from '@uniswap/v3-core/artifacts/contracts/UniswapV3Pool.sol/UniswapV3Pool.json'
|
||||||
|
import { ContractTransaction } from "ethers";
|
||||||
|
import '@nomiclabs/hardhat-ethers';
|
||||||
|
|
||||||
|
task("initialize-pool", "Initializes a pool")
|
||||||
|
.addParam('pool', 'Address of pool contract', undefined, types.string)
|
||||||
|
.addParam('sqrtPrice', 'Initial sqrtPriceX96', undefined, types.int)
|
||||||
|
.setAction(async (args, hre) => {
|
||||||
|
const { pool: poolAddress, sqrtPrice } = args
|
||||||
|
const [signer] = await hre.ethers.getSigners();
|
||||||
|
const pool = new hre.ethers.Contract(poolAddress, POOL_ABI, signer);
|
||||||
|
const transaction: ContractTransaction = await pool.initialize(sqrtPrice);
|
||||||
|
const receipt = await transaction.wait();
|
||||||
|
|
||||||
|
if (receipt.events) {
|
||||||
|
const poolInitializeEvent = receipt.events.find(el => el.event === 'Initialize');
|
||||||
|
|
||||||
|
if (poolInitializeEvent && poolInitializeEvent.args) {
|
||||||
|
const { sqrtPriceX96, tick } = poolInitializeEvent.args;
|
||||||
|
console.log('Pool initialized:', sqrtPriceX96.toString(), tick);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user