Bump typechain version to fix bug (#517)

* Bump typechain version to fix bug

* Use latest typechain and rm copy types

* Rename Common to Mailbox in solidity

* Update core tests with typechain updates

* Update sdk with new typechain events

* Depend on deploy in hardhat
pull/522/head
Yorke Rhodes 3 years ago committed by GitHub
parent 5050eee9a4
commit 5a3f627586
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      solidity/app/package.json
  2. 12
      solidity/core/contracts/Inbox.sol
  3. 8
      solidity/core/contracts/Mailbox.sol
  4. 8
      solidity/core/contracts/Outbox.sol
  5. 8
      solidity/core/contracts/test/TestMailbox.sol
  6. 9
      solidity/core/interfaces/IInbox.sol
  7. 4
      solidity/core/interfaces/IMailbox.sol
  8. 8
      solidity/core/interfaces/IOutbox.sol
  9. 9
      solidity/core/package.json
  10. 38
      solidity/core/test/common.test.ts
  11. 19
      solidity/core/test/inbox.test.ts
  12. 11
      solidity/core/test/merkle.test.ts
  13. 15
      solidity/core/test/validator-manager/outboxValidatorManager.test.ts
  14. 4
      solidity/core/test/validator-manager/utils.ts
  15. 3
      solidity/core/tsconfig.json
  16. 1
      typescript/deploy/package.json
  17. 14
      typescript/hardhat/hardhat.config.ts
  18. 3
      typescript/hardhat/package.json
  19. 3
      typescript/infra/package.json
  20. 40
      typescript/sdk/src/core/events.ts
  21. 16
      typescript/sdk/src/core/message.ts
  22. 72
      typescript/sdk/src/events.ts
  23. 36
      typescript/utils/src/types.ts
  24. 6
      typescript/utils/src/validator.ts
  25. 229
      yarn.lock

@ -10,8 +10,8 @@
"devDependencies": {
"@nomiclabs/hardhat-ethers": "^2.0.1",
"@nomiclabs/hardhat-waffle": "^2.0.1",
"@typechain/ethers-v5": "~7.0.0",
"@typechain/hardhat": "^2.0.1",
"@typechain/ethers-v5": "^10.0.0",
"@typechain/hardhat": "^6.0.0",
"@types/mocha": "^9.1.0",
"chai": "^4.3.0",
"ethereum-waffle": "^3.2.2",
@ -22,7 +22,7 @@
"solhint-plugin-prettier": "^0.0.5",
"solidity-coverage": "^0.7.14",
"ts-node": "^10.8.0",
"typechain": "^5.0.0",
"typechain": "^8.0.0",
"typescript": "^4.7.2"
},
"directories": {
@ -37,8 +37,7 @@
"main": "dist/index.js",
"repository": "https://github.com/abacus-network/abacus-monorepo",
"scripts": {
"build": "hardhat compile && hardhat typechain && tsc && npm run copy-types",
"copy-types": "cp types/*.d.ts dist/",
"build": "hardhat compile && hardhat typechain && tsc",
"coverage": "hardhat coverage",
"prettier": "prettier --write ./contracts ./test",
"test": "hardhat test"

@ -3,7 +3,7 @@ pragma solidity >=0.8.0;
// ============ Internal Imports ============
import {Version0} from "./Version0.sol";
import {Common} from "./Common.sol";
import {Mailbox} from "./Mailbox.sol";
import {MerkleLib} from "../libs/Merkle.sol";
import {Message} from "../libs/Message.sol";
import {TypeCasts} from "../libs/TypeCasts.sol";
@ -16,7 +16,7 @@ import {IInbox} from "../interfaces/IInbox.sol";
* @notice Track root updates on Outbox, prove and dispatch messages to end
* recipients.
*/
contract Inbox is IInbox, Version0, Common {
contract Inbox is IInbox, Version0, Mailbox {
// ============ Libraries ============
using MerkleLib for MerkleLib.Tree;
@ -66,7 +66,7 @@ contract Inbox is IInbox, Version0, Common {
// ============ Constructor ============
// solhint-disable-next-line no-empty-blocks
constructor(uint32 _localDomain) Common(_localDomain) {}
constructor(uint32 _localDomain) Mailbox(_localDomain) {}
// ============ Initializer ============
@ -74,7 +74,7 @@ contract Inbox is IInbox, Version0, Common {
public
initializer
{
__Common_initialize(_validatorManager);
__Mailbox_initialize(_validatorManager);
entered = 1;
remoteDomain = _remoteDomain;
}
@ -105,7 +105,7 @@ contract Inbox is IInbox, Version0, Common {
* @dev Reverts if verification of the message fails.
* @dev Includes the eventual function signature for Sovereign Consensus,
* but comments out the name to suppress compiler warning
* @param _message Formatted message (refer to Common.sol Message library)
* @param _message Formatted message (refer to Mailbox.sol Message library)
* @param _proof Merkle proof of inclusion for message's leaf
* @param _index Index of leaf in outbox's merkle tree
*/
@ -144,7 +144,7 @@ contract Inbox is IInbox, Version0, Common {
/**
* @notice Marks a message as processed and calls handle on the recipient
* @dev Internal function that can be called by contracts like TestInbox
* @param _message Formatted message (refer to Common.sol Message library)
* @param _message Formatted message (refer to Mailbox.sol Message library)
* @param _messageHash keccak256 hash of the message
*/
function _process(bytes calldata _message, bytes32 _messageHash) internal {

@ -2,17 +2,17 @@
pragma solidity >=0.8.0;
// ============ Internal Imports ============
import {ICommon} from "../interfaces/ICommon.sol";
import {IMailbox} from "../interfaces/IMailbox.sol";
// ============ External Imports ============
import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
/**
* @title Common
* @title Mailbox
* @author Celo Labs Inc.
* @notice Shared utilities between Outbox and Inbox.
*/
abstract contract Common is ICommon, OwnableUpgradeable {
abstract contract Mailbox is IMailbox, OwnableUpgradeable {
// ============ Immutable Variables ============
// Domain of chain on which the contract is deployed
@ -67,7 +67,7 @@ abstract contract Common is ICommon, OwnableUpgradeable {
// ============ Initializer ============
function __Common_initialize(address _validatorManager)
function __Mailbox_initialize(address _validatorManager)
internal
onlyInitializing
{

@ -3,7 +3,7 @@ pragma solidity >=0.8.0;
// ============ Internal Imports ============
import {Version0} from "./Version0.sol";
import {Common} from "./Common.sol";
import {Mailbox} from "./Mailbox.sol";
import {MerkleLib} from "../libs/Merkle.sol";
import {Message} from "../libs/Message.sol";
import {TypeCasts} from "../libs/TypeCasts.sol";
@ -20,7 +20,7 @@ import {IOutbox} from "../interfaces/IOutbox.sol";
* Accepts submissions of fraudulent signatures
* by the Validator and slashes the Validator in this case.
*/
contract Outbox is IOutbox, Version0, MerkleTreeManager, Common {
contract Outbox is IOutbox, Version0, MerkleTreeManager, Mailbox {
// ============ Libraries ============
using MerkleLib for MerkleLib.Tree;
@ -76,12 +76,12 @@ contract Outbox is IOutbox, Version0, MerkleTreeManager, Common {
// ============ Constructor ============
constructor(uint32 _localDomain) Common(_localDomain) {} // solhint-disable-line no-empty-blocks
constructor(uint32 _localDomain) Mailbox(_localDomain) {} // solhint-disable-line no-empty-blocks
// ============ Initializer ============
function initialize(address _validatorManager) public initializer {
__Common_initialize(_validatorManager);
__Mailbox_initialize(_validatorManager);
state = States.Active;
}

@ -1,13 +1,13 @@
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.8.0;
import "../Common.sol";
import "../Mailbox.sol";
contract TestCommon is Common {
constructor(uint32 _localDomain) Common(_localDomain) {}
contract TestMailbox is Mailbox {
constructor(uint32 _localDomain) Mailbox(_localDomain) {}
function initialize(address _validatorManager) external initializer {
__Common_initialize(_validatorManager);
__Mailbox_initialize(_validatorManager);
}
function cacheCheckpoint(bytes32 _root, uint256 _index) external {

@ -1,13 +1,10 @@
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.6.11;
import {ICommon} from "./ICommon.sol";
import {IMailbox} from "./IMailbox.sol";
interface IInbox is ICommon {
function cacheCheckpoint(
bytes32 _root,
uint256 _index
) external;
interface IInbox is IMailbox {
function cacheCheckpoint(bytes32 _root, uint256 _index) external;
function remoteDomain() external returns (uint32);

@ -1,9 +1,11 @@
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.6.11;
interface ICommon {
interface IMailbox {
function localDomain() external view returns (uint32);
function cachedCheckpoints(bytes32) external view returns (uint256);
function latestCachedCheckpoint()
external
view

@ -1,16 +1,20 @@
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.6.11;
import {ICommon} from "./ICommon.sol";
import {IMailbox} from "./IMailbox.sol";
interface IOutbox is ICommon {
interface IOutbox is IMailbox {
function dispatch(
uint32 _destinationDomain,
bytes32 _recipientAddress,
bytes calldata _messageBody
) external returns (uint256);
function cacheCheckpoint() external;
function latestCheckpoint() external view returns (bytes32, uint256);
function count() external returns (uint256);
function fail() external;
}

@ -11,8 +11,8 @@
"devDependencies": {
"@nomiclabs/hardhat-ethers": "^2.0.1",
"@nomiclabs/hardhat-waffle": "^2.0.1",
"@typechain/ethers-v5": "~7.0.0",
"@typechain/hardhat": "^2.0.1",
"@typechain/ethers-v5": "^10.0.0",
"@typechain/hardhat": "^6.0.0",
"chai": "^4.3.0",
"ethereum-waffle": "^3.2.2",
"ethers": "^5.4.4",
@ -22,7 +22,7 @@
"solhint-plugin-prettier": "^0.0.5",
"solidity-coverage": "^0.7.14",
"ts-generator": "^0.1.1",
"typechain": "^5.0.0",
"typechain": "^8.0.0",
"typescript": "^4.7.2"
},
"directories": {
@ -37,8 +37,7 @@
"main": "dist/index.js",
"repository": "https://github.com/abacus-network/abacus-monorepo",
"scripts": {
"build": "hardhat compile && hardhat typechain && tsc && npm run copy-types",
"copy-types": "cp types/*.d.ts dist/",
"build": "hardhat compile && hardhat typechain && tsc",
"coverage": "hardhat coverage",
"prettier": "prettier --write ./contracts ./libs ./test",
"test": "hardhat test"

@ -2,45 +2,47 @@ import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers';
import { expect } from 'chai';
import { ethers } from 'hardhat';
import { TestCommon, TestCommon__factory } from '../types';
import { TestMailbox, TestMailbox__factory } from '../types';
const localDomain = 1000;
const ONLY_OWNER_REVERT_MSG = 'Ownable: caller is not the owner';
describe('Common', async () => {
let owner: SignerWithAddress, nonowner: SignerWithAddress, common: TestCommon;
describe('Mailbox', async () => {
let owner: SignerWithAddress,
nonowner: SignerWithAddress,
mailbox: TestMailbox;
before(async () => {
[owner, nonowner] = await ethers.getSigners();
});
beforeEach(async () => {
const commonFactory = new TestCommon__factory(owner);
common = await commonFactory.deploy(localDomain);
const mailboxFactory = new TestMailbox__factory(owner);
mailbox = await mailboxFactory.deploy(localDomain);
// The ValidatorManager is unused in these tests *but* needs to be a
// contract.
await common.initialize(common.address);
expect(await common.validatorManager()).to.equal(common.address);
await mailbox.initialize(mailbox.address);
expect(await mailbox.validatorManager()).to.equal(mailbox.address);
});
it('Cannot be initialized twice', async () => {
await expect(common.initialize(common.address)).to.be.revertedWith(
await expect(mailbox.initialize(mailbox.address)).to.be.revertedWith(
'Initializable: contract is already initialized',
);
});
it('Allows owner to update the ValidatorManager', async () => {
const commonFactory = new TestCommon__factory(owner);
const newValidatorManager = await commonFactory.deploy(localDomain);
await common.setValidatorManager(newValidatorManager.address);
expect(await common.validatorManager()).to.equal(
const mailboxFactory = new TestMailbox__factory(owner);
const newValidatorManager = await mailboxFactory.deploy(localDomain);
await mailbox.setValidatorManager(newValidatorManager.address);
expect(await mailbox.validatorManager()).to.equal(
newValidatorManager.address,
);
});
it('Does not allow nonowner to update the ValidatorManager', async () => {
await expect(
common.connect(nonowner).setValidatorManager(common.address),
mailbox.connect(nonowner).setValidatorManager(mailbox.address),
).to.be.revertedWith(ONLY_OWNER_REVERT_MSG);
});
@ -48,10 +50,10 @@ describe('Common', async () => {
const root =
'0x9c7a007113f829cfd019a91e4ca5e7f6760589fd6bc7925c877f6971ffee1647';
const index = 1;
await common.cacheCheckpoint(root, index);
expect(await common.latestCachedRoot()).to.equal(root);
expect(await common.cachedCheckpoints(root)).to.equal(index);
const [actualRoot, actualIndex] = await common.latestCachedCheckpoint();
await mailbox.cacheCheckpoint(root, index);
expect(await mailbox.latestCachedRoot()).to.equal(root);
expect(await mailbox.cachedCheckpoints(root)).to.equal(index);
const [actualRoot, actualIndex] = await mailbox.latestCachedCheckpoint();
expect(actualRoot).to.equal(root);
expect(actualIndex).to.equal(index);
});
@ -60,7 +62,7 @@ describe('Common', async () => {
const root =
'0x9c7a007113f829cfd019a91e4ca5e7f6760589fd6bc7925c877f6971ffee1647';
const index = 0;
await expect(common.cacheCheckpoint(root, index)).to.be.revertedWith(
await expect(mailbox.cacheCheckpoint(root, index)).to.be.revertedWith(
'!index',
);
});

@ -6,6 +6,8 @@ import { ethers } from 'hardhat';
import { types, utils } from '@abacus-network/utils';
import { MessageStatus } from '@abacus-network/utils/dist/src/types';
import messageWithProof from '../../../vectors/messageWithProof.json';
import proveAndProcessTestCases from '../../../vectors/proveAndProcess.json';
import {
BadRecipient1__factory,
BadRecipient3__factory,
@ -19,9 +21,6 @@ import {
TestValidatorManager__factory,
} from '../types';
const proveAndProcessTestCases = require('../../../vectors/proveAndProcess.json');
const messageWithProof = require('../../../vectors/messageWithProof.json');
const localDomain = 3000;
const remoteDomain = 1000;
@ -132,9 +131,9 @@ describe('Inbox', async () => {
await inbox.setCachedCheckpoint(root, 1);
expect(
inbox.process(message, newProof as types.BytesArray, index, '0x'),
).to.be.revertedWith('!cache');
expect(inbox.process(message, newProof, index, '0x')).to.be.revertedWith(
'!cache',
);
expect(await inbox.messages(leaf)).to.equal(types.MessageStatus.NONE);
});
@ -259,14 +258,10 @@ describe('Inbox', async () => {
// simply verifies leaf is in tree but because it is cryptographically
// impossible to find the inputs that create a pre-determined root, we
// simply recalculate root with the leaf using branchRoot)
const proofRoot = await inbox.testBranchRoot(
hash,
path as types.BytesArray,
index,
);
const proofRoot = await inbox.testBranchRoot(hash, path, index);
await inbox.setCachedCheckpoint(proofRoot, 1);
await inbox.process(abacusMessage, path as types.BytesArray, index, '0x');
await inbox.process(abacusMessage, path, index, '0x');
expect(await inbox.messages(hash)).to.equal(types.MessageStatus.PROCESSED);
});

@ -1,12 +1,9 @@
import { expect } from 'chai';
import { ethers } from 'hardhat';
import { types } from '@abacus-network/utils';
import merkleTestCases from '../../../vectors/merkle.json';
import { TestMerkle, TestMerkle__factory } from '../types';
const merkleTestCases = require('../../../vectors/merkle.json');
describe('Merkle', async () => {
for (const testCase of merkleTestCases) {
const { testName, leaves, expectedRoot, proofs } = testCase;
@ -40,11 +37,7 @@ describe('Merkle', async () => {
for (const proof of proofs) {
const { leaf, path, index } = proof;
const proofRoot = await merkle.branchRoot(
leaf,
path as types.BytesArray,
index,
);
const proofRoot = await merkle.branchRoot(leaf, path, index);
expect(proofRoot).to.equal(expectedRoot);
}
});

@ -1,9 +1,9 @@
import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers';
import { expect } from 'chai';
import { BigNumber } from 'ethers';
import { ethers } from 'hardhat';
import { Validator, types, utils } from '@abacus-network/utils';
import { BytesArray } from '@abacus-network/utils/dist/src/types';
import {
OutboxValidatorManager,
@ -11,6 +11,7 @@ import {
TestOutbox,
TestOutbox__factory,
} from '../../types';
import { DispatchEvent } from '../../types/contracts/Outbox';
import { signCheckpoint } from './utils';
@ -20,9 +21,9 @@ const QUORUM_THRESHOLD = 2;
interface MerkleProof {
root: string;
proof: BytesArray;
proof: string[];
leaf: string;
index: number;
index: BigNumber;
}
describe('OutboxValidatorManager', () => {
@ -42,7 +43,7 @@ describe('OutboxValidatorManager', () => {
ethers.utils.formatBytes32String(message),
);
const receipt = await tx.wait();
const dispatch = receipt.events![0];
const dispatch = receipt.events![0] as DispatchEvent;
expect(dispatch.event).to.equal('Dispatch');
return dispatch.args!;
};
@ -50,7 +51,7 @@ describe('OutboxValidatorManager', () => {
const dispatchMessageAndReturnProof = async (
outbox: TestOutbox,
messageStr: string,
) => {
): Promise<MerkleProof> => {
const { messageHash, leafIndex } = await dispatchMessage(
outbox,
messageStr,
@ -343,7 +344,7 @@ describe('OutboxValidatorManager', () => {
await outbox.cacheCheckpoint();
const signatures = await signCheckpoint(
fraudulent.root,
fraudulent.index - 1,
fraudulent.index.sub(1),
[validator0, validator1], // 2/2 signers is a quorum
);
@ -351,7 +352,7 @@ describe('OutboxValidatorManager', () => {
validatorManager.fraudulentCheckpoint(
outbox.address,
fraudulent.root,
fraudulent.index - 1,
fraudulent.index.sub(1),
signatures,
fraudulent.leaf,
fraudulent.proof,

@ -1,10 +1,12 @@
import { BigNumberish } from 'ethers';
import { Validator, types } from '@abacus-network/utils';
// Signs a checkpoint with the provided validators and returns
// the signatures sorted by validator addresses in ascending order
export async function signCheckpoint(
root: types.HexString,
index: number,
index: BigNumberish,
unsortedValidators: Validator[],
): Promise<string[]> {
const validators = unsortedValidators.sort((a, b) => {

@ -1,7 +1,8 @@
{
"compilerOptions": {
"outDir": "./dist/",
"rootDir": "./types/"
"rootDir": "./types/",
"resolveJsonModule": true
},
"exclude": ["./node_modules/", "./dist/", "./types/hardhat.d.ts"],
"extends": "../../tsconfig.json",

@ -11,7 +11,6 @@
"yargs": "^17.4.1"
},
"devDependencies": {
"@typechain/ethers-v5": "~7.0.0",
"@types/debug": "^4.1.7",
"@types/node": "^16.9.1",
"@types/yargs": "^17.0.10",

@ -1,13 +1,12 @@
import "@typechain/hardhat";
import "@nomiclabs/hardhat-ethers";
import "@nomiclabs/hardhat-waffle";
import '@nomiclabs/hardhat-ethers';
import '@nomiclabs/hardhat-waffle';
/**
* @type import('hardhat/config').HardhatUserConfig
*/
module.exports = {
solidity: {
version: "0.7.6",
version: '0.7.6',
settings: {
optimizer: {
enabled: true,
@ -16,12 +15,7 @@ module.exports = {
},
},
gasReporter: {
currency: "USD",
},
typechain: {
outDir: "./types",
target: "ethers-v5",
alwaysGenerateOverloads: false, // should overloads with full signatures like deposit(uint256) be generated always, even if there are no overloads?
currency: 'USD',
},
mocha: {
bail: true,

@ -4,16 +4,15 @@
"version": "0.1.1",
"dependencies": {
"@abacus-network/core": "^0.1.1",
"@abacus-network/deploy": "^0.1.1",
"@abacus-network/sdk": "^0.1.1",
"@abacus-network/utils": "^0.1.1",
"@nomiclabs/hardhat-ethers": "^2.0.5",
"@nomiclabs/hardhat-waffle": "^2.0.2",
"@typechain/hardhat": "^2.0.1",
"ethereum-waffle": "^3.2.2",
"ethers": "^5.4.7",
"hardhat": "^2.8.4",
"ts-node": "^10.8.0",
"typechain": "^5.0.0",
"typescript": "^4.7.2"
},
"directories": {

@ -23,14 +23,11 @@
"devDependencies": {
"@nomiclabs/hardhat-ethers": "^2.0.5",
"@nomiclabs/hardhat-waffle": "^2.0.2",
"@typechain/ethers-v5": "~7.0.0",
"@typechain/hardhat": "^2.0.1",
"@types/chai": "^4.2.21",
"ethereum-waffle": "^3.2.2",
"ethers": "^5.4.7",
"hardhat": "^2.8.4",
"ts-node": "^10.8.0",
"typechain": "^5.0.0",
"typescript": "^4.7.2"
},
"homepage": "https://www.useabacus.network",

@ -1,41 +1,21 @@
import { BigNumber } from '@ethersproject/bignumber';
import { TypedEvent } from '@abacus-network/core/dist/commons';
import type {
CheckpointCachedEvent,
ProcessEvent,
} from '@abacus-network/core/types/contracts/Inbox';
import type { DispatchEvent } from '@abacus-network/core/types/contracts/Outbox';
import { Annotated } from '../events';
// copied from the Outbox.d.ts
export type DispatchTypes = [string, BigNumber, number, string];
export type DispatchArgs = {
messageHash: string;
leafIndex: BigNumber;
destination: number;
message: string;
};
export type DispatchEvent = TypedEvent<DispatchTypes & DispatchArgs>;
// copied from the Inbox.d.ts
export type CheckpointTypes = [string, BigNumber];
export type CheckpointArgs = { root: string; index: BigNumber };
export type CheckpointEvent = TypedEvent<CheckpointTypes & CheckpointArgs>;
// copied from the Inbox.d.ts
export type ProcessTypes = [string, boolean, string];
export type ProcessArgs = {
messageHash: string;
success: boolean;
returnData: string;
};
export type ProcessEvent = TypedEvent<ProcessTypes & ProcessArgs>;
export { DispatchEvent, CheckpointCachedEvent, ProcessEvent };
export type AbacusLifecyleEvent =
| ProcessEvent
| CheckpointEvent
| CheckpointCachedEvent
| DispatchEvent;
export type AnnotatedDispatch = Annotated<DispatchTypes, DispatchEvent>;
export type AnnotatedCheckpoint = Annotated<CheckpointTypes, CheckpointEvent>;
export type AnnotatedProcess = Annotated<ProcessTypes, ProcessEvent>;
export type AnnotatedDispatch = Annotated<DispatchEvent>;
export type AnnotatedCheckpoint = Annotated<CheckpointCachedEvent>;
export type AnnotatedProcess = Annotated<ProcessEvent>;
export type AnnotatedLifecycleEvent =
| AnnotatedDispatch

@ -21,12 +21,9 @@ import {
AnnotatedDispatch,
AnnotatedLifecycleEvent,
AnnotatedProcess,
CheckpointArgs,
CheckpointTypes,
CheckpointCachedEvent,
DispatchEvent,
DispatchTypes,
ProcessArgs,
ProcessTypes,
ProcessEvent,
} from './events';
// I didn't want to override the existing ParsedMessage in message.ts as that would include having to type AbacusMessage and more and it's not clear to me that we will keep those.
@ -170,7 +167,7 @@ export class AbacusMessage {
provider.getTransactionReceipt(log.transactionHash),
} as unknown as DispatchEvent;
const annotated = new Annotated<DispatchTypes, DispatchEvent>(
const annotated = new Annotated<DispatchEvent>(
resolveId(nameOrDomain),
receipt,
dispatch,
@ -302,7 +299,7 @@ export class AbacusMessage {
checkpointIndex,
);
const checkpointLogs: AnnotatedCheckpoint[] =
await findAnnotatedSingleEvent<CheckpointTypes, CheckpointArgs>(
await findAnnotatedSingleEvent<CheckpointCachedEvent>(
this.multiProvider,
this.destinationName,
this.inbox,
@ -331,10 +328,7 @@ export class AbacusMessage {
}
// if not, attempt to query the event
const processFilter = this.inbox.filters.Process(this.leaf);
const processLogs = await findAnnotatedSingleEvent<
ProcessTypes,
ProcessArgs
>(
const processLogs = await findAnnotatedSingleEvent<ProcessEvent>(
this.multiProvider,
this.destinationName,
this.inbox,

@ -1,16 +1,12 @@
import { Result } from '@ethersproject/abi';
import { TransactionReceipt } from '@ethersproject/abstract-provider';
import {
TypedEvent,
TypedEventFilter,
} from '@abacus-network/core/dist/commons';
import { TypedEvent, TypedEventFilter } from '@abacus-network/core/dist/common';
import { chainMetadata } from './chain-metadata';
import { MultiProvider } from './provider';
import { ChainName } from './types';
export class Annotated<U extends Result, T extends TypedEvent<U>> {
export class Annotated<T extends TypedEvent> {
readonly domain: number;
readonly eventName?: string;
readonly event: T;
@ -31,18 +27,18 @@ export class Annotated<U extends Result, T extends TypedEvent<U>> {
this.event = event;
}
static async fromEvent<U extends Result, T extends TypedEvent<U>>(
static async fromEvent<T extends TypedEvent>(
domain: number,
event: T,
): Promise<Annotated<U, T>> {
): Promise<Annotated<T>> {
const receipt = await event.getTransactionReceipt();
return new Annotated(domain, receipt, event, true);
}
static async fromEvents<U extends Result, T extends TypedEvent<U>>(
static async fromEvents<T extends TypedEvent>(
domain: number,
events: T[],
): Promise<Annotated<U, T>[]> {
): Promise<Annotated<T>[]> {
return Promise.all(
events.map(async (event) => Annotated.fromEvent(domain, event)),
);
@ -72,22 +68,22 @@ export class Annotated<U extends Result, T extends TypedEvent<U>> {
}
// specifies an interface shared by the TS generated contracts
export interface TSContract<T extends Result, U> {
export interface TSContract<T extends TypedEvent> {
queryFilter(
event: TypedEventFilter<T, U>,
event: TypedEventFilter<T>,
fromBlockOrBlockhash?: number | undefined,
toBlock?: number | undefined,
): Promise<Array<TypedEvent<T & U>>>;
): Promise<Array<T>>;
}
export async function queryAnnotatedEvents<T extends Result, U>(
export async function queryAnnotatedEvents<T extends TypedEvent>(
multiprovider: MultiProvider<any>,
chain: ChainName,
contract: TSContract<T, U>,
filter: TypedEventFilter<T, U>,
contract: TSContract<T>,
filter: TypedEventFilter<T>,
startBlock?: number,
endBlock?: number,
): Promise<Array<Annotated<T, TypedEvent<T & U>>>> {
): Promise<Array<Annotated<T>>> {
const events = await getEvents(
multiprovider,
chain,
@ -99,13 +95,13 @@ export async function queryAnnotatedEvents<T extends Result, U>(
return Annotated.fromEvents(chainMetadata[chain].id, events);
}
export async function findAnnotatedSingleEvent<T extends Result, U>(
export async function findAnnotatedSingleEvent<T extends TypedEvent>(
multiprovider: MultiProvider<any>,
chain: ChainName,
contract: TSContract<T, U>,
filter: TypedEventFilter<T, U>,
contract: TSContract<T>,
filter: TypedEventFilter<T>,
startBlock?: number,
): Promise<Array<Annotated<T, TypedEvent<T & U>>>> {
): Promise<Array<Annotated<T>>> {
const events = await findEvent(
multiprovider,
chain,
@ -116,14 +112,14 @@ export async function findAnnotatedSingleEvent<T extends Result, U>(
return Annotated.fromEvents(chainMetadata[chain].id, events);
}
export async function getEvents<T extends Result, U>(
export async function getEvents<T extends TypedEvent>(
multiprovider: MultiProvider<any>,
chain: ChainName,
contract: TSContract<T, U>,
filter: TypedEventFilter<T, U>,
contract: TSContract<T>,
filter: TypedEventFilter<T>,
startBlock?: number,
endBlock?: number,
): Promise<Array<TypedEvent<T & U>>> {
): Promise<Array<T>> {
const domain = chainMetadata[chain];
if (domain.paginate) {
return getPaginatedEvents(
@ -138,13 +134,13 @@ export async function getEvents<T extends Result, U>(
return contract.queryFilter(filter, startBlock, endBlock);
}
export async function findEvent<T extends Result, U>(
export async function findEvent<T extends TypedEvent>(
multiprovider: MultiProvider<any>,
chain: ChainName,
contract: TSContract<T, U>,
filter: TypedEventFilter<T, U>,
contract: TSContract<T>,
filter: TypedEventFilter<T>,
startBlock?: number,
): Promise<Array<TypedEvent<T & U>>> {
): Promise<Array<T>> {
const domain = chainMetadata[chain];
if (domain.paginate) {
return findFromPaginatedEvents(
@ -158,14 +154,14 @@ export async function findEvent<T extends Result, U>(
return contract.queryFilter(filter, startBlock);
}
async function getPaginatedEvents<T extends Result, U>(
async function getPaginatedEvents<T extends TypedEvent>(
multiprovider: MultiProvider<any>,
chain: ChainName,
contract: TSContract<T, U>,
filter: TypedEventFilter<T, U>,
contract: TSContract<T>,
filter: TypedEventFilter<T>,
startBlock?: number,
endBlock?: number,
): Promise<Array<TypedEvent<T & U>>> {
): Promise<Array<T>> {
const domain = chainMetadata[chain];
if (!domain.paginate) {
throw new Error('Domain need not be paginated');
@ -198,21 +194,21 @@ async function getPaginatedEvents<T extends Result, U>(
}
// await promises & concatenate results
const eventArrays = await Promise.all(eventArrayPromises);
let events: Array<TypedEvent<T & U>> = [];
let events: Array<T> = [];
for (const eventArray of eventArrays) {
events = events.concat(eventArray);
}
return events;
}
async function findFromPaginatedEvents<T extends Result, U>(
async function findFromPaginatedEvents<T extends TypedEvent>(
multiprovider: MultiProvider<any>,
chain: ChainName,
contract: TSContract<T, U>,
filter: TypedEventFilter<T, U>,
contract: TSContract<T>,
filter: TypedEventFilter<T>,
startBlock?: number,
endBlock?: number,
): Promise<Array<TypedEvent<T & U>>> {
): Promise<Array<T>> {
const domain = chainMetadata[chain];
if (!domain.paginate) {
throw new Error('Domain need not be paginated');

@ -1,44 +1,8 @@
import { BytesLike } from 'ethers';
/********* BASIC TYPES *********/
export type Domain = number;
export type Address = string;
export type AddressBytes32 = string;
export type HexString = string;
export type BytesArray = [
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
BytesLike,
];
/********* ABACUS CORE *********/
export type Checkpoint = {

@ -1,4 +1,4 @@
import { ethers } from 'ethers';
import { BigNumberish, ethers } from 'ethers';
import { types, utils } from '@abacus-network/utils';
@ -29,14 +29,14 @@ export class Validator {
return utils.domainHash(this.localDomain);
}
message(root: types.HexString, index: number) {
message(root: types.HexString, index: BigNumberish) {
return ethers.utils.solidityPack(
['bytes32', 'bytes32', 'uint256'],
[this.domainHash(), root, index],
);
}
async signCheckpoint(root: types.HexString, index: number) {
async signCheckpoint(root: types.HexString, index: BigNumberish) {
const message = this.message(root, index);
const msgHash = ethers.utils.arrayify(ethers.utils.keccak256(message));
const signature = await this.signer.signMessage(msgHash);

@ -14,8 +14,8 @@ __metadata:
"@nomiclabs/hardhat-ethers": ^2.0.1
"@nomiclabs/hardhat-waffle": ^2.0.1
"@openzeppelin/contracts-upgradeable": ^4.5.0
"@typechain/ethers-v5": ~7.0.0
"@typechain/hardhat": ^2.0.1
"@typechain/ethers-v5": ^10.0.0
"@typechain/hardhat": ^6.0.0
"@types/mocha": ^9.1.0
chai: ^4.3.0
ethereum-waffle: ^3.2.2
@ -26,7 +26,7 @@ __metadata:
solhint-plugin-prettier: ^0.0.5
solidity-coverage: ^0.7.14
ts-node: ^10.8.0
typechain: ^5.0.0
typechain: ^8.0.0
typescript: ^4.7.2
languageName: unknown
linkType: soft
@ -41,8 +41,8 @@ __metadata:
"@openzeppelin/contracts": ^4.6.0
"@openzeppelin/contracts-upgradeable": ^4.6.0
"@summa-tx/memview-sol": ^2.0.0
"@typechain/ethers-v5": ~7.0.0
"@typechain/hardhat": ^2.0.1
"@typechain/ethers-v5": ^10.0.0
"@typechain/hardhat": ^6.0.0
chai: ^4.3.0
ethereum-waffle: ^3.2.2
ethers: ^5.4.4
@ -52,7 +52,7 @@ __metadata:
solhint-plugin-prettier: ^0.0.5
solidity-coverage: ^0.7.14
ts-generator: ^0.1.1
typechain: ^5.0.0
typechain: ^8.0.0
typescript: ^4.7.2
languageName: unknown
linkType: soft
@ -64,7 +64,6 @@ __metadata:
"@abacus-network/core": ^0.1.1
"@abacus-network/sdk": ^0.1.1
"@abacus-network/utils": ^0.1.1
"@typechain/ethers-v5": ~7.0.0
"@types/debug": ^4.1.7
"@types/node": ^16.9.1
"@types/yargs": ^17.0.10
@ -82,16 +81,15 @@ __metadata:
resolution: "@abacus-network/hardhat@workspace:typescript/hardhat"
dependencies:
"@abacus-network/core": ^0.1.1
"@abacus-network/deploy": ^0.1.1
"@abacus-network/sdk": ^0.1.1
"@abacus-network/utils": ^0.1.1
"@nomiclabs/hardhat-ethers": ^2.0.5
"@nomiclabs/hardhat-waffle": ^2.0.2
"@typechain/hardhat": ^2.0.1
ethereum-waffle: ^3.2.2
ethers: ^5.4.7
hardhat: ^2.8.4
ts-node: ^10.8.0
typechain: ^5.0.0
typescript: ^4.7.2
languageName: unknown
linkType: soft
@ -110,8 +108,6 @@ __metadata:
"@nomiclabs/hardhat-ethers": ^2.0.5
"@nomiclabs/hardhat-etherscan": ^3.0.3
"@nomiclabs/hardhat-waffle": ^2.0.2
"@typechain/ethers-v5": ~7.0.0
"@typechain/hardhat": ^2.0.1
"@types/chai": ^4.2.21
"@types/mocha": ^9.1.0
"@types/node": ^16.9.1
@ -124,7 +120,6 @@ __metadata:
ethers: ^5.4.7
hardhat: ^2.8.4
ts-node: ^10.8.0
typechain: ^5.0.0
typescript: ^4.7.2
yargs: ^17.3.1
languageName: unknown
@ -3344,6 +3339,23 @@ __metadata:
languageName: node
linkType: hard
"@typechain/ethers-v5@npm:^10.0.0":
version: 10.0.0
resolution: "@typechain/ethers-v5@npm:10.0.0"
dependencies:
lodash: ^4.17.15
ts-essentials: ^7.0.1
peerDependencies:
"@ethersproject/abi": ^5.0.0
"@ethersproject/bytes": ^5.0.0
"@ethersproject/providers": ^5.0.0
ethers: ^5.1.3
typechain: ^8.0.0
typescript: ">=4.3.0"
checksum: f89a442829398d00e6c10c4cdebb16af3195cfbf6b0c062f24503ee1befc01c121a6d46edfd7b54aaf00c81b2e845730d2b556ecbaa6e15f360456f42fedb44d
languageName: node
linkType: hard
"@typechain/ethers-v5@npm:^2.0.0":
version: 2.0.0
resolution: "@typechain/ethers-v5@npm:2.0.0"
@ -3356,30 +3368,20 @@ __metadata:
languageName: node
linkType: hard
"@typechain/ethers-v5@npm:~7.0.0":
version: 7.0.1
resolution: "@typechain/ethers-v5@npm:7.0.1"
peerDependencies:
"@ethersproject/abi": ^5.0.0
"@ethersproject/bytes": ^5.0.0
"@ethersproject/providers": ^5.0.0
ethers: ^5.1.3
typechain: ^5.0.0
typescript: ">=4.0.0"
checksum: 5d09eb6969f7a9dc3d8b4748d63bcdb4b0c54e4397c186c331cbb4c91bba76467b6b5b8e694f00bb5f4656bb97fc5a07b8e1ff73529b7eb7a5ce0b158cab0487
languageName: node
linkType: hard
"@typechain/hardhat@npm:^2.0.1":
version: 2.3.1
resolution: "@typechain/hardhat@npm:2.3.1"
"@typechain/hardhat@npm:^6.0.0":
version: 6.0.0
resolution: "@typechain/hardhat@npm:6.0.0"
dependencies:
fs-extra: ^9.1.0
lodash: ^4.17.15
peerDependencies:
"@ethersproject/abi": ^5.4.7
"@ethersproject/providers": ^5.4.7
"@typechain/ethers-v5": ^10.0.0
ethers: ^5.4.7
hardhat: ^2.0.10
lodash: ^4.17.15
typechain: ^5.1.2
checksum: f6090b80e3c75e47bb02c9b2c669258e976ccf06502c168b851ad7ca20f53cb554dcb8104bc7ca608f2111baa047ee8e52ce6153eb80450edb9736ba5ebfb12f
typechain: ^8.0.0
checksum: 9011ad633cf96ccbf29c3ce458f2f7cd058f0635493d179dfe1fa47512cceaad7597f051525379edcd5db48910a79b910fbe58bd75e5ae43979833bbf34d5a15
languageName: node
linkType: hard
@ -4216,6 +4218,20 @@ __metadata:
languageName: node
linkType: hard
"array-back@npm:^3.0.1, array-back@npm:^3.1.0":
version: 3.1.0
resolution: "array-back@npm:3.1.0"
checksum: 7205004fcd0f9edd926db921af901b083094608d5b265738d0290092f9822f73accb468e677db74c7c94ef432d39e5ed75a7b1786701e182efb25bbba9734209
languageName: node
linkType: hard
"array-back@npm:^4.0.1, array-back@npm:^4.0.2":
version: 4.0.2
resolution: "array-back@npm:4.0.2"
checksum: f30603270771eeb54e5aad5f54604c62b3577a18b6db212a7272b2b6c32049121b49431f656654790ed1469411e45f387e7627c0de8fd0515995cc40df9b9294
languageName: node
linkType: hard
"array-flatten@npm:1.1.1":
version: 1.1.1
resolution: "array-flatten@npm:1.1.1"
@ -6003,6 +6019,30 @@ __metadata:
languageName: node
linkType: hard
"command-line-args@npm:^5.1.1":
version: 5.2.1
resolution: "command-line-args@npm:5.2.1"
dependencies:
array-back: ^3.1.0
find-replace: ^3.0.0
lodash.camelcase: ^4.3.0
typical: ^4.0.0
checksum: e759519087be3cf2e86af8b9a97d3058b4910cd11ee852495be881a067b72891f6a32718fb685ee6d41531ab76b2b7bfb6602f79f882cd4b7587ff1e827982c7
languageName: node
linkType: hard
"command-line-usage@npm:^6.1.0":
version: 6.1.3
resolution: "command-line-usage@npm:6.1.3"
dependencies:
array-back: ^4.0.2
chalk: ^2.4.2
table-layout: ^1.0.2
typical: ^5.2.0
checksum: 8261d4e5536eb0bcddee0ec5e89c05bb2abd18e5760785c8078ede5020bc1c612cbe28eb6586f5ed4a3660689748e5aaad4a72f21566f4ef39393694e2fa1a0b
languageName: node
linkType: hard
"commander@npm:2.18.0":
version: 2.18.0
resolution: "commander@npm:2.18.0"
@ -6335,7 +6375,7 @@ __metadata:
languageName: node
linkType: hard
"debug@npm:4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4":
"debug@npm:4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4":
version: 4.3.4
resolution: "debug@npm:4.3.4"
dependencies:
@ -6421,6 +6461,13 @@ __metadata:
languageName: node
linkType: hard
"deep-extend@npm:~0.6.0":
version: 0.6.0
resolution: "deep-extend@npm:0.6.0"
checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7
languageName: node
linkType: hard
"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3":
version: 0.1.4
resolution: "deep-is@npm:0.1.4"
@ -8122,6 +8169,15 @@ __metadata:
languageName: node
linkType: hard
"find-replace@npm:^3.0.0":
version: 3.0.0
resolution: "find-replace@npm:3.0.0"
dependencies:
array-back: ^3.0.1
checksum: 6b04bcfd79027f5b84aa1dfe100e3295da989bdac4b4de6b277f4d063e78f5c9e92ebc8a1fec6dd3b448c924ba404ee051cc759e14a3ee3e825fa1361025df08
languageName: node
linkType: hard
"find-up@npm:3.0.0, find-up@npm:^3.0.0":
version: 3.0.0
resolution: "find-up@npm:3.0.0"
@ -8714,7 +8770,21 @@ __metadata:
languageName: node
linkType: hard
"glob@npm:7.2.0, glob@npm:^7.0.0, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:~7.2.0":
"glob@npm:7.1.7":
version: 7.1.7
resolution: "glob@npm:7.1.7"
dependencies:
fs.realpath: ^1.0.0
inflight: ^1.0.4
inherits: 2
minimatch: ^3.0.4
once: ^1.3.0
path-is-absolute: ^1.0.0
checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8
languageName: node
linkType: hard
"glob@npm:7.2.0, glob@npm:^7.0.0, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:~7.2.0":
version: 7.2.0
resolution: "glob@npm:7.2.0"
dependencies:
@ -10770,6 +10840,13 @@ __metadata:
languageName: node
linkType: hard
"lodash.camelcase@npm:^4.3.0":
version: 4.3.0
resolution: "lodash.camelcase@npm:4.3.0"
checksum: cb9227612f71b83e42de93eccf1232feeb25e705bdb19ba26c04f91e885bfd3dd5c517c4a97137658190581d3493ea3973072ca010aab7e301046d90740393d1
languageName: node
linkType: hard
"lodash.get@npm:^4.4.2":
version: 4.4.2
resolution: "lodash.get@npm:4.4.2"
@ -12585,7 +12662,7 @@ __metadata:
languageName: node
linkType: hard
"prettier@npm:^2.1.2, prettier@npm:^2.4.1":
"prettier@npm:^2.1.2, prettier@npm:^2.3.1, prettier@npm:^2.4.1":
version: 2.6.2
resolution: "prettier@npm:2.6.2"
bin:
@ -12982,6 +13059,13 @@ __metadata:
languageName: node
linkType: hard
"reduce-flatten@npm:^2.0.0":
version: 2.0.0
resolution: "reduce-flatten@npm:2.0.0"
checksum: 64393ef99a16b20692acfd60982d7fdbd7ff8d9f8f185c6023466444c6dd2abb929d67717a83cec7f7f8fb5f46a25d515b3b2bf2238fdbfcdbfd01d2a9e73cb8
languageName: node
linkType: hard
"regenerate@npm:^1.2.1":
version: 1.4.2
resolution: "regenerate@npm:1.4.2"
@ -14279,6 +14363,13 @@ __metadata:
languageName: node
linkType: hard
"string-format@npm:^2.0.0":
version: 2.0.0
resolution: "string-format@npm:2.0.0"
checksum: dada2ef95f6d36c66562c673d95315f80457fa7dce2f3609a2e75d1190b98c88319028cf0a5b6c043d01c18d581b2641579f79480584ba030d6ac6fceb30bc55
languageName: node
linkType: hard
"string-width@npm:^1.0.1":
version: 1.0.2
resolution: "string-width@npm:1.0.2"
@ -14578,6 +14669,18 @@ __metadata:
languageName: node
linkType: hard
"table-layout@npm:^1.0.2":
version: 1.0.2
resolution: "table-layout@npm:1.0.2"
dependencies:
array-back: ^4.0.1
deep-extend: ~0.6.0
typical: ^5.2.0
wordwrapjs: ^4.0.0
checksum: 8f41b5671f101a5195747ec1727b1d35ea2cd5bf85addda11cc2f4b36892db9696ce3c2c7334b5b8a122505b34d19135fede50e25678df71b0439e0704fd953f
languageName: node
linkType: hard
"table@npm:^5.2.3":
version: 5.4.6
resolution: "table@npm:5.4.6"
@ -14828,6 +14931,20 @@ __metadata:
languageName: node
linkType: hard
"ts-command-line-args@npm:^2.2.0":
version: 2.3.1
resolution: "ts-command-line-args@npm:2.3.1"
dependencies:
chalk: ^4.1.0
command-line-args: ^5.1.1
command-line-usage: ^6.1.0
string-format: ^2.0.0
bin:
write-markdown: dist/write-markdown.js
checksum: f74a3461891c2a52cc3fd850ad53e983972ba8208410c441a4491f66d15e5d5ea6bed696cbdb54427d6b798b902f841f0c9d3ed13468c2e179285b7507df7a0d
languageName: node
linkType: hard
"ts-essentials@npm:^1.0.0":
version: 1.0.4
resolution: "ts-essentials@npm:1.0.4"
@ -15059,25 +15176,25 @@ __metadata:
languageName: node
linkType: hard
"typechain@npm:^5.0.0":
version: 5.2.0
resolution: "typechain@npm:5.2.0"
"typechain@npm:^8.0.0":
version: 8.0.0
resolution: "typechain@npm:8.0.0"
dependencies:
"@types/prettier": ^2.1.1
command-line-args: ^4.0.7
debug: ^4.1.1
debug: ^4.3.1
fs-extra: ^7.0.0
glob: ^7.1.6
glob: 7.1.7
js-sha3: ^0.8.0
lodash: ^4.17.15
mkdirp: ^1.0.4
prettier: ^2.1.2
prettier: ^2.3.1
ts-command-line-args: ^2.2.0
ts-essentials: ^7.0.1
peerDependencies:
typescript: ">=4.1.0"
typescript: ">=4.3.0"
bin:
typechain: dist/cli/cli.js
checksum: 1116e835a355b0d9dc9be77ebbfe972e1fe93eec6dc71cabaaada9e606c2bbaa18c786a22388e41ea3d2745fee1479b542b45dd9ebab4f60b2773524668a5d05
checksum: c049cc84ac3cf3a5ed8374db750b7b9adcfc523bb1940e1b8bafef063297aed081a5378560c3fbccd1f5d130d32c9ba9678654dfe00d97fb1dfa17d04a933450
languageName: node
linkType: hard
@ -15147,6 +15264,20 @@ __metadata:
languageName: node
linkType: hard
"typical@npm:^4.0.0":
version: 4.0.0
resolution: "typical@npm:4.0.0"
checksum: a242081956825328f535e6195a924240b34daf6e7fdb573a1809a42b9f37fb8114fa99c7ab89a695e0cdb419d4149d067f6723e4b95855ffd39c6c4ca378efb3
languageName: node
linkType: hard
"typical@npm:^5.2.0":
version: 5.2.0
resolution: "typical@npm:5.2.0"
checksum: ccaeb151a9a556291b495571ca44c4660f736fb49c29314bbf773c90fad92e9485d3cc2b074c933866c1595abbbc962f2b8bfc6e0f52a8c6b0cdd205442036ac
languageName: node
linkType: hard
"uglify-js@npm:^3.1.4":
version: 3.15.4
resolution: "uglify-js@npm:3.15.4"
@ -16214,6 +16345,16 @@ __metadata:
languageName: node
linkType: hard
"wordwrapjs@npm:^4.0.0":
version: 4.0.1
resolution: "wordwrapjs@npm:4.0.1"
dependencies:
reduce-flatten: ^2.0.0
typical: ^5.2.0
checksum: 3d927f3c95d0ad990968da54c0ad8cde2801d8e91006cd7474c26e6b742cc8557250ce495c9732b2f9db1f903601cb74ec282e0f122ee0d02d7abe81e150eea8
languageName: node
linkType: hard
"workerpool@npm:6.2.0":
version: 6.2.0
resolution: "workerpool@npm:6.2.0"

Loading…
Cancel
Save