Skip to content

Commit

Permalink
Merge pull request #170 from JoinColony/feature/contract-loader-fs
Browse files Browse the repository at this point in the history
Feature: contract-loader-fs
  • Loading branch information
JamesLefrere committed Jun 7, 2018
2 parents 07e847e + 9bfa371 commit 5eff426
Show file tree
Hide file tree
Showing 36 changed files with 683 additions and 174 deletions.
8 changes: 5 additions & 3 deletions packages/colony-js-adapter-ethers/src/EthersAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,15 @@ import type {
Signature,
Transaction,
} from '@colony/colony-js-adapter';
import type { IContractLoader, Query } from '@colony/colony-js-contract-loader';
import type { Query } from '@colony/colony-js-contract-loader';

import ContractLoader from '@colony/colony-js-contract-loader';

import EthersContract from './EthersContract';
import type { ConstructorArgs } from './flowtypes';
import EthersContract from './EthersContract';

export default class EthersAdapter implements IAdapter {
loader: IContractLoader;
loader: ContractLoader;
provider: IProvider;
wallet: IWallet;
static getEventPromises({
Expand Down
4 changes: 2 additions & 2 deletions packages/colony-js-adapter-ethers/src/flowtypes.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
/* @flow */

import type { Event, IProvider, IWallet } from '@colony/colony-js-adapter';
import type { IContractLoader } from '@colony/colony-js-contract-loader';
import ContractLoader from '@colony/colony-js-contract-loader';

export type ConstructorArgs = {
loader: IContractLoader,
loader: ContractLoader,
provider: IProvider,
wallet: IWallet,
};
Expand Down
7 changes: 4 additions & 3 deletions packages/colony-js-adapter/interface/Adapter.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
/* @flow */

import type { IContractLoader, Query } from '@colony/colony-js-contract-loader';

import type { Query } from '@colony/colony-js-contract-loader';
import type { Contract } from './Contract';
import type { EventHandlers } from './EventHandlers';
import type { Provider } from './Provider';
Expand All @@ -10,8 +9,10 @@ import type { Transaction } from './Transaction';
import type { TransactionReceipt } from './TransactionReceipt';
import type { Wallet } from './Wallet';

import ContractLoader from '@colony/colony-js-contract-loader';

export interface Adapter {
loader: IContractLoader;
loader: ContractLoader;
provider: Provider;
wallet: Wallet;
ecRecover(digest: Array<number>, signature: Signature): string;
Expand Down
2 changes: 1 addition & 1 deletion packages/colony-js-client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@
"@colony/colony-js-contract-client": "^1.2.1",
"@colony/colony-js-contract-loader": "^1.2.1",
"@colony/colony-js-utils": "^1.2.1",
"assert": "^1.4.1",
"babel-runtime": "^6.26.0",
"bn.js": "^4.11.6",
"browser-assert": "^1.2.1",
"web3-utils": "^1.0.0-beta.34"
},
"engines": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* @flow */
/* eslint-disable no-underscore-dangle */

import assert from 'browser-assert';
import assert from 'assert';
import BigNumber from 'bn.js';
import ContractClient from '@colony/colony-js-contract-client';
import { isBigNumber } from '@colony/colony-js-utils';
Expand Down
2 changes: 1 addition & 1 deletion packages/colony-js-client/src/ColonyClient/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* @flow */

import assert from 'browser-assert';
import assert from 'assert';

import type BigNumber from 'bn.js';

Expand Down
2 changes: 1 addition & 1 deletion packages/colony-js-client/src/ColonyNetworkClient/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* @flow */

import assert from 'browser-assert';
import assert from 'assert';
import { utf8ToHex } from 'web3-utils';
import { isValidAddress } from '@colony/colony-js-utils';
import BigNumber from 'bn.js';
Expand Down
2 changes: 1 addition & 1 deletion packages/colony-js-contract-client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@
"@colony/colony-js-adapter": "^1.2.1",
"@colony/colony-js-contract-loader": "^1.2.1",
"@colony/colony-js-utils": "^1.2.1",
"assert": "^1.4.1",
"babel-runtime": "^6.26.0",
"bn.js": "^4.11.6",
"browser-assert": "^1.2.1",
"bs58": "^4.0.1",
"lodash.isequal": "^4.5.0",
"lodash.isplainobject": "^4.0.6",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
/* eslint-disable no-underscore-dangle */

import createSandbox from 'jest-sandbox';
import assert from 'browser-assert';
import assert from 'assert';
import {
hexToBytes,
isAddress,
Expand All @@ -16,7 +16,7 @@ import isEqual from 'lodash.isequal';

import MultisigOperation from '../classes/MultisigOperation';

jest.mock('browser-assert', () => jest.fn().mockReturnValue(true));
jest.mock('assert', () => jest.fn().mockReturnValue(true));

jest.mock('lodash.isplainobject', () => jest.fn().mockReturnValue(true));

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* @flow */

import assert from 'browser-assert';
import assert from 'assert';
import { isBigNumber, isValidAddress } from '@colony/colony-js-utils';
import type { TransactionOptions } from '@colony/colony-js-adapter';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
/* eslint-disable no-underscore-dangle */

import { padLeft, soliditySha3, isHexStrict, hexToBytes } from 'web3-utils';
import defaultAssert from 'browser-assert';
import defaultAssert from 'assert';
import { isValidAddress, makeAssert } from '@colony/colony-js-utils';
import isPlainObject from 'lodash.isplainobject';
import isEqual from 'lodash.isequal';
Expand Down
23 changes: 23 additions & 0 deletions packages/colony-js-contract-loader-fs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# colonyJS Contract Loader for Node.js using the filesystem

This package provides a means to load Ethereum smart contracts simply via
the node `fs` module, for local testing and in dev environments

## Installation

```
yarn add @colony/colony-js-contract-loader-fs
```


## Usage

// TODO DOCS
Please see [the full documentation](https://joincolony.github.io/colonyjs/api-loaders/#INSERTCORRECTANCHORHERE).


## Contributing

This package is part of the [colonyJS monorepo](https://github.com/JoinColony/colonyJS).

Please read our [contributing guidelines](https://github.com/JoinColony/colonyJS/blob/master/CONTRIBUTING.md).
10 changes: 10 additions & 0 deletions packages/colony-js-contract-loader-fs/jest.conf.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"rootDir": "src",
"collectCoverageFrom" : ["*.{js}", "**/*.{js}"],
"coverageDirectory": "../coverage",
"coverageThreshold": {
"global": {
"branches": 0
}
}
}
59 changes: 59 additions & 0 deletions packages/colony-js-contract-loader-fs/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
{
"name": "@colony/colony-js-contract-loader-fs",
"version": "1.0.0",
"description": "Load Ethereum smart contract definitions/metadata from the filesystem (in node.js)",
"main": "lib/index.js",
"files": [
"lib",
"README.md"
],
"scripts": {
"build": "yarn run build:flow && yarn run build:lib",
"build:flow": "flow-copy-source src lib --ignore '__tests__/*.js'",
"build:lib": "flow-remove-types --out-dir lib/ src/",
"dev": "nodemon",
"flow": "flow check",
"lint": "eslint src",
"precommit": "lint-staged",
"test": "yarn run flow && yarn run lint && yarn run test:unit",
"test:unit": "jest --coverage --config=jest.conf.json"
},
"lint-staged": {
"src/{,**/}*.js": [
"lint --fix",
"git add"
]
},
"repository": {
"type": "git",
"url": "git+https://github.com/JoinColony/colonyJS.git"
},
"contributors": [
"Christian Maniewski <[email protected]>",
"Griffin Hotchkiss <[email protected]>",
"James Lefrère <[email protected]>",
"Jan Kaßel <[email protected]>",
"Raul Glogovetan <[email protected]>"
],
"license": "MIT",
"bugs": {
"url": "https://github.com/JoinColony/colonyJS/issues"
},
"homepage": "https://github.com/JoinColony/colonyJS#readme",
"dependencies": {
"@colony/colony-js-contract-loader": "^1.2.0",
"jsonfile": "^4.0.0"
},
"devDependencies": {
"flow-bin": "^0.72.0",
"flow-copy-source": "^2.0.0",
"flow-remove-types": "^1.2.3",
"jest": "^22.4.0",
"jest-sandbox": "^1.1.2",
"nodemon": "^1.17.5"
},
"engines": {
"node": ">=8.2.1",
"yarn": ">=1.3.2"
}
}
44 changes: 44 additions & 0 deletions packages/colony-js-contract-loader-fs/src/__tests__/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/* eslint-env jest */
/* eslint no-underscore-dangle: 0 */

import createSandbox from 'jest-sandbox';
import FSLoader from '../loaders/FSLoader';

jest.mock('jsonfile', () => ({
readFile: jest.fn((file, cb) =>
cb(null, {
address: '0x123',
abi: [{ myData: 123 }],
}),
),
}));

describe('ContractFsLoader', () => {
const sandbox = createSandbox();
const setupLoader = () => new FSLoader({ contractDir: '/tmp' });

const requiredProps = {
address: true,
abi: true,
bytecode: false,
};

beforeEach(() => {
sandbox.clear();
});

test('Default implementation', async () => {
const loader = setupLoader();

const query = { contractName: 'MyCoolContract' };
const { address, abi } = await loader.load(query, requiredProps);
expect(address).toEqual('0x123');
expect(abi).toEqual([{ myData: 123 }]);
});

test('Throws if contract name not given', async () => {
const loader = setupLoader();
const query = { contractAddress: '0xdeafbeef' };
expect(loader.load(query, requiredProps)).rejects.toThrow();
});
});
18 changes: 18 additions & 0 deletions packages/colony-js-contract-loader-fs/src/flowtypes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/* @flow */

import type { Transform } from '@colony/colony-js-contract-loader';

export type ConstructorArgs = {
contractDir: string,
transform: Transform,
};

export type TruffleArtifact = {
abi: Array<{}>,
bytecode: string,
networks: {
[networkId: number]: {
address: string,
},
},
};
7 changes: 7 additions & 0 deletions packages/colony-js-contract-loader-fs/src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/* @flow */

const TruffleLoader = require('./loaders/TruffleLoader');
const FSLoader = require('./loaders/FSLoader');

exports.TruffleLoader = TruffleLoader;
exports.FSLoader = FSLoader;
53 changes: 53 additions & 0 deletions packages/colony-js-contract-loader-fs/src/loaders/FSLoader.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/* @flow */

import type {
ContractDefinition,
IContractLoader,
RequiredContractProps,
Query,
} from '@colony/colony-js-contract-loader';

import type { ConstructorArgs } from '../flowtypes';

const assert = require('assert');
const path = require('path');
const jsonfile = require('jsonfile');

const ContractLoader = require('@colony/colony-js-contract-loader').default;

class FSLoader extends ContractLoader implements IContractLoader {
_contractDir: string;

constructor({ contractDir, transform }: ConstructorArgs = {}) {
super({ transform });
assert(
typeof contractDir === 'string' && contractDir,
'A `contractDir` option must be provided',
);
this._contractDir = contractDir;
}
async _load(
query: Query = {},
requiredProps?: RequiredContractProps,
): Promise<?ContractDefinition> {
const { contractName = '' } = query;

assert(!!contractName, 'A `contractName` option must be provided');

const file = path.resolve(this._contractDir, `${contractName}.json`);
return new Promise((resolve, reject) => {
jsonfile.readFile(file, (error, contents) => {
let transformed;
if (error) return reject(error);
try {
transformed = this._transform(contents, query, requiredProps);
} catch (transformError) {
return reject(transformError);
}
return resolve(transformed);
});
});
}
}

module.exports = FSLoader;
15 changes: 15 additions & 0 deletions packages/colony-js-contract-loader-fs/src/loaders/TruffleLoader.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/* @flow */

import type { ConstructorArgs } from '../flowtypes';

const FSLoader = require('./FSLoader');

const { truffleTransform } = require('@colony/colony-js-contract-loader');

class TruffleLoader extends FSLoader {
constructor({ contractDir }: ConstructorArgs = {}) {
super({ transform: truffleTransform, contractDir });
}
}

module.exports = TruffleLoader;
2 changes: 1 addition & 1 deletion packages/colony-js-contract-loader-http/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@
"homepage": "https://github.com/JoinColony/colonyJS#readme",
"dependencies": {
"@colony/colony-js-contract-loader": "^1.2.1",
"assert": "^1.4.1",
"babel-runtime": "^6.26.0",
"browser-assert": "^1.2.1",
"isomorphic-fetch": "^2.2.1"
},
"devDependencies": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
/* eslint no-underscore-dangle: 0 */

import createSandbox from 'jest-sandbox';
import ContractHttpLoader from '../loaders/ContractHttpLoader';
import ContractHttpLoader from '../loaders/HttpLoader';
import TrufflepigLoader from '../loaders/TrufflepigLoader';
import EtherscanLoader from '../loaders/EtherscanLoader';
import MetaCoin from '../__mocks__/MetaCoin.json';
Expand Down
Loading

0 comments on commit 5eff426

Please sign in to comment.