aboutsummaryrefslogtreecommitdiffstats
path: root/packages/deployer/src/utils
diff options
context:
space:
mode:
Diffstat (limited to 'packages/deployer/src/utils')
-rw-r--r--packages/deployer/src/utils/compiler.ts65
-rw-r--r--packages/deployer/src/utils/contract.ts4
-rw-r--r--packages/deployer/src/utils/encoder.ts4
-rw-r--r--packages/deployer/src/utils/types.ts19
4 files changed, 74 insertions, 18 deletions
diff --git a/packages/deployer/src/utils/compiler.ts b/packages/deployer/src/utils/compiler.ts
index d5137d394..600495693 100644
--- a/packages/deployer/src/utils/compiler.ts
+++ b/packages/deployer/src/utils/compiler.ts
@@ -1,3 +1,4 @@
+import { AbiType, ContractAbi, MethodAbi } from '@0xproject/types';
import { logUtils } from '@0xproject/utils';
import * as _ from 'lodash';
import * as path from 'path';
@@ -5,9 +6,49 @@ import * as solc from 'solc';
import { constants } from './constants';
import { fsWrapper } from './fs_wrapper';
-import { ContractArtifact, ContractSources } from './types';
+import { ContractArtifact, ContractSources, FunctionNameToSeenCount } from './types';
/**
+ * Constructs a system-wide unique identifier for a source file.
+ * @param directoryNamespace Namespace of the source file's root contract directory.
+ * @param sourceFilePath Path to a source file, relative to contractBaseDir.
+ * @return sourceFileId A system-wide unique identifier for the source file.
+ */
+export function constructUniqueSourceFileId(directoryNamespace: string, sourceFilePath: string): string {
+ const namespacePrefix = !_.isEmpty(directoryNamespace) ? `/${directoryNamespace}` : '';
+ const sourceFilePathNoLeadingSlash = sourceFilePath.replace(/^\/+/g, '');
+ const sourceFileId = `${namespacePrefix}/${sourceFilePathNoLeadingSlash}`;
+ return sourceFileId;
+}
+/**
+ * Constructs a system-wide unique identifier for a dependency file.
+ * @param dependencyFilePath Path from a sourceFile to a dependency.
+ * @param contractBaseDir Base contracts directory of search tree.
+ * @return sourceFileId A system-wide unique identifier for the source file.
+ */
+export function constructDependencyFileId(dependencyFilePath: string, sourceFilePath: string): string {
+ if (_.startsWith(dependencyFilePath, '/')) {
+ // Path of the form /namespace/path/to/dependency.sol
+ return dependencyFilePath;
+ } else {
+ // Dependency is relative to the source file: ./dependency.sol, ../../some/path/dependency.sol, etc.
+ // Join the two paths to construct a valid source file id: /namespace/path/to/dependency.sol
+ return path.join(path.dirname(sourceFilePath), dependencyFilePath);
+ }
+}
+/**
+ * Constructs a system-wide unique identifier for a contract.
+ * @param directoryNamespace Namespace of the source file's root contract directory.
+ * @param sourceFilePath Path to a source file, relative to contractBaseDir.
+ * @return sourceFileId A system-wide unique identifier for contract.
+ */
+export function constructContractId(directoryNamespace: string, sourceFilePath: string): string {
+ const namespacePrefix = !_.isEmpty(directoryNamespace) ? `${directoryNamespace}:` : '';
+ const sourceFileName = path.basename(sourceFilePath, constants.SOLIDITY_FILE_EXTENSION);
+ const contractId = `${namespacePrefix}${sourceFileName}`;
+ return contractId;
+}
+/**
* Gets contract data on network or returns if an artifact does not exist.
* @param artifactsDir Path to the artifacts directory.
* @param fileName Name of contract file.
@@ -82,9 +123,10 @@ export function getNormalizedErrMsg(errMsg: string): string {
/**
* Parses the contract source code and extracts the dendencies
* @param source Contract source code
+ * @param sourceFilePath File path of the source code.
* @return List of dependendencies
*/
-export function parseDependencies(source: string): string[] {
+export function parseDependencies(source: string, sourceFileId: string): string[] {
// TODO: Use a proper parser
const IMPORT_REGEX = /(import\s)/;
const DEPENDENCY_PATH_REGEX = /"([^"]+)"/; // Source: https://github.com/BlockChainCompany/soljitsu/blob/master/lib/shared.js
@@ -95,8 +137,8 @@ export function parseDependencies(source: string): string[] {
const dependencyMatch = line.match(DEPENDENCY_PATH_REGEX);
if (!_.isNull(dependencyMatch)) {
const dependencyPath = dependencyMatch[1];
- const basenName = path.basename(dependencyPath);
- dependencies.push(basenName);
+ const dependencyId = constructDependencyFileId(dependencyPath, sourceFileId);
+ dependencies.push(dependencyId);
}
}
});
@@ -107,14 +149,19 @@ export function parseDependencies(source: string): string[] {
* Callback to resolve dependencies with `solc.compile`.
* Throws error if contractSources not yet initialized.
* @param contractSources Source codes of contracts.
- * @param importPath Path to an imported dependency.
+ * @param sourceFileId ID of the source file.
+ * @param importPath Path of dependency source file.
* @return Import contents object containing source code of dependency.
*/
-export function findImportIfExist(contractSources: ContractSources, importPath: string): solc.ImportContents {
- const fileName = path.basename(importPath);
- const source = contractSources[fileName];
+export function findImportIfExist(
+ contractSources: ContractSources,
+ sourceFileId: string,
+ importPath: string,
+): solc.ImportContents {
+ const dependencyFileId = constructDependencyFileId(importPath, sourceFileId);
+ const source = contractSources[dependencyFileId];
if (_.isUndefined(source)) {
- throw new Error(`Contract source not found for ${fileName}`);
+ throw new Error(`Contract source not found for ${dependencyFileId}`);
}
const importContents: solc.ImportContents = {
contents: source,
diff --git a/packages/deployer/src/utils/contract.ts b/packages/deployer/src/utils/contract.ts
index 9b7baac11..e8dd5218a 100644
--- a/packages/deployer/src/utils/contract.ts
+++ b/packages/deployer/src/utils/contract.ts
@@ -1,11 +1,9 @@
import { schemas, SchemaValidator } from '@0xproject/json-schemas';
-import { ContractAbi, EventAbi, FunctionAbi, MethodAbi, TxData } from '@0xproject/types';
+import { AbiType, ContractAbi, EventAbi, FunctionAbi, MethodAbi, TxData } from '@0xproject/types';
import { promisify } from '@0xproject/utils';
import * as _ from 'lodash';
import * as Web3 from 'web3';
-import { AbiType } from './types';
-
export class Contract implements Web3.ContractInstance {
public address: string;
public abi: ContractAbi;
diff --git a/packages/deployer/src/utils/encoder.ts b/packages/deployer/src/utils/encoder.ts
index 4f62662e1..806efbbca 100644
--- a/packages/deployer/src/utils/encoder.ts
+++ b/packages/deployer/src/utils/encoder.ts
@@ -1,9 +1,7 @@
-import { AbiDefinition, ContractAbi, DataItem } from '@0xproject/types';
+import { AbiDefinition, AbiType, ContractAbi, DataItem } from '@0xproject/types';
import * as _ from 'lodash';
import * as web3Abi from 'web3-eth-abi';
-import { AbiType } from './types';
-
export const encoder = {
encodeConstructorArgsFromAbi(args: any[], abi: ContractAbi): string {
const constructorTypes: string[] = [];
diff --git a/packages/deployer/src/utils/types.ts b/packages/deployer/src/utils/types.ts
index 7d131f5ce..1a866b873 100644
--- a/packages/deployer/src/utils/types.ts
+++ b/packages/deployer/src/utils/types.ts
@@ -18,6 +18,11 @@ export interface ContractNetworks {
[key: number]: ContractNetworkData;
}
+export interface ContractDirectory {
+ path: string;
+ namespace: string;
+}
+
export interface ContractNetworkData {
solc_version: string;
optimizer_enabled: boolean;
@@ -40,7 +45,7 @@ export interface SolcErrors {
export interface CliOptions extends yargs.Arguments {
artifactsDir: string;
- contractsDir: string;
+ contractDirs: string;
jsonrpcUrl: string;
networkId: number;
shouldOptimize: boolean;
@@ -51,7 +56,7 @@ export interface CliOptions extends yargs.Arguments {
}
export interface CompilerOptions {
- contractsDir: string;
+ contractDirs: Set<ContractDirectory>;
networkId: number;
optimizerEnabled: boolean;
artifactsDir: string;
@@ -78,7 +83,11 @@ export interface ContractSources {
[key: string]: string;
}
-export interface ContractSourceData {
+export interface ContractIdToSourceFileId {
+ [key: string]: string;
+}
+
+export interface ContractSourceDataByFileId {
[key: string]: ContractSpecificSourceData;
}
@@ -98,4 +107,8 @@ export interface Token {
swarmHash: string;
}
+export interface FunctionNameToSeenCount {
+ [key: string]: number;
+}
+
export type DoneCallback = (err?: Error) => void;