before dangerous ops

Signed-off-by: T-Hax <>
This commit is contained in:
T-Hax 2023-05-06 23:59:38 +00:00
parent 4065d89909
commit 704648ed2c
41 changed files with 31021 additions and 460 deletions

View file

@ -1,13 +0,0 @@
# RPC URLs
ETH_MAINNET_TEST_RPC=
# debug (debug events are logged to console)
DEBUG=
# use tor (torify tests)
TORIFY=
# tor port (regular = 9050, browser = 9150)
TOR_PORT=
# relayer DOMAIN (the example.xyz in https://example.xyz) for testing
TEST_RELAYER_DOMAIN=

View file

@ -0,0 +1 @@
TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false.

View file

@ -47,13 +47,14 @@
"ganache": "^7.7.7",
"mocha": "^10.2.0",
"prettier": "^2.3.0",
"rimraf": "^4.4.0",
"rimraf": "^5.0.0",
"source-map-support": "^0.5.19",
"ts-essentials": "^9.3.1",
"ts-node": "^10.9.1",
"tsc-alias": "^1.2.11",
"tsconfig-paths": "^4.1.2",
"typechain": "^8.1.1",
"typedoc": "^0.24.6",
"typescript": "^5.0.4"
},
"scripts": {
@ -65,7 +66,7 @@
"postversion": "git push --follow-tags && npm publish",
"lint": "eslint --ext ts,js --fix src",
"build-live": "tsc -w && tsc-alias -w",
"clean": "rm -rf --interactive=never cache/*",
"clean": "rm -rf --interactive=never docs/*",
"format": "prettier src/**/*.ts -w"
},
"files": [

View file

@ -70,23 +70,39 @@ export class Chain {
public signer?: Signer
public provider: Provider
private _emptySigner: VoidSigner
public chainId?: number
public symbol?: string
private _chainId?: number
private _symbol?: string
private _fetched: boolean
constructor(provider: Provider, signer?: Signer) {
this.provider = provider
this.signer = signer
this._emptySigner = new VoidSigner('0x' + randomBytes(20).toString('hex'), provider)
this._fetched = false
}
async getChainId(): Promise<number> {
if (!this.chainId) this.chainId = (await this.provider.getNetwork()).chainId
return this.chainId
async fetchChainData(): Promise<void> {
const network = await this.provider.getNetwork()
this._chainId = network.chainId
this._symbol = await Onchain.getNetworkSymbol(String(network.chainId))
this._fetched = true
}
async getChainSymbol(): Promise<string> {
if (!this.symbol) this.symbol = await Onchain.getNetworkSymbol(String(await this.getChainId()))
return this.symbol
private _propertiesFetched(parentCallName: string): void {
if (!this._fetched)
throw ErrorUtils.getError(
`Chain.${parentCallName}: properties must be fetched first with \`fetchProperties\`.`
)
}
get id(): number {
this._propertiesFetched('id')
return this._chainId!
}
get symbol(): string {
this._propertiesFetched('symbol')
return this._symbol!
}
latestBlockNum(): Promise<number> {
@ -127,12 +143,12 @@ export class Chain {
): Promise<TransactionRequest> {
if (callStruct[0].value)
return await Multicall3Contract__factory.connect(
await Onchain.getMulticall3Address(String(this.chainId)),
await Onchain.getMulticall3Address(String(this.id)),
this.provider
).populateTransaction.aggregate3Value(callStruct as Array<Multicall3.Call3ValueStruct>)
return await Multicall3Contract__factory.connect(
await Onchain.getMulticall3Address(String(this.chainId)),
await Onchain.getMulticall3Address(String(this.id)),
this.provider
).populateTransaction.aggregate3(callStruct)
}
@ -143,12 +159,12 @@ export class Chain {
if (this.signer)
if (callStruct[0].value)
return await Multicall3Contract__factory.connect(
await Onchain.getMulticall3Address(String(this.chainId)),
await Onchain.getMulticall3Address(String(this.id)),
this.signer
).aggregate3Value(callStruct as Array<Multicall3.Call3ValueStruct>)
else {
return await Multicall3Contract__factory.connect(
await Onchain.getMulticall3Address(String(this.chainId)),
await Onchain.getMulticall3Address(String(this.id)),
this.provider
).aggregate3(callStruct)
}
@ -181,33 +197,30 @@ export namespace Contracts {
type Path = string
const contractMap: Map<Path, BaseContract> = new Map<Path, BaseContract>()
export async function getProxy(
network: string,
signerOrProvider: Signer | Provider
): Promise<TornadoProxy> {
export function getProxy(network: string, signerOrProvider: Signer | Provider): TornadoProxy {
const key = `TornadoProxy${network}`
if (!contractMap.has(key)) {
contractMap.set(
key,
_getContract<TornadoProxy>('TornadoProxy', await Onchain.getProxyAddress(network), signerOrProvider)
_getContract<TornadoProxy>('TornadoProxy', Onchain.getProxyAddressSync(network), signerOrProvider)
)
}
return contractMap.get(`TornadoProxy${network}`) as TornadoProxy
}
export async function getInstance(
export function getInstance(
network: string,
token: string,
denomination: string,
signerOrProvider: Signer | Provider
): Promise<TornadoInstance> {
): TornadoInstance {
const key = `TornadoInstance${network}${token}${denomination}`
if (!contractMap.has(key)) {
contractMap.set(
key,
_getContract<TornadoInstance>(
'TornadoInstance',
await Onchain.getInstanceAddress(network, token, denomination),
Onchain.getInstanceAddressSync(network, token, denomination),
signerOrProvider
)
)
@ -235,7 +248,8 @@ export namespace Contracts {
export abstract class Synchronizer extends EventEmitter {
async sync(
event: EventFilter,
eventName: string,
filter: EventFilter,
contract: BaseContract,
cache: Cache.Syncable<Docs.Base>,
options?: Options.Sync
@ -301,11 +315,7 @@ export abstract class Synchronizer extends EventEmitter {
this.emit('sync', 'synced')
// Immediately start listening if we're doing this
if (_options.listenForEvents) {
contract = contract.on(event, (...eventArgs) => {
this.emit(cache.name, 'received', cache.db.put(cache.buildDoc(eventArgs[eventArgs.length - 1])))
})
}
if (_options.listenForEvents) this.listenForEvents(eventName, contract, filter, cache)
// Then wait for all pooler requests to resolve
let results = await cache.pooler!.all()
@ -325,5 +335,21 @@ export abstract class Synchronizer extends EventEmitter {
})
}
listenForEvents(
name: string,
contract: BaseContract,
filter: EventFilter,
cache: Cache.Syncable<Docs.Base>
) {
contract.on(filter, (...eventArgs) => {
this.emit(name, cache.name, cache.db.put(cache.buildDoc(eventArgs[eventArgs.length - 1])))
})
}
clearListenerByIndex(contract: BaseContract, event: EventFilter, listenerIndex: number = 0): void {
const listeners = contract.listeners()
contract.off(event, listeners[listenerIndex])
}
protected abstract _populateSyncOptions(options?: Options.Sync): Promise<DeepRequired<Options.Sync>>
}