Skip to content
This repository has been archived by the owner on Feb 26, 2024. It is now read-only.

Commit

Permalink
Merge a7131b7 into 2f1271f
Browse files Browse the repository at this point in the history
  • Loading branch information
eggplantzzz committed Nov 6, 2019
2 parents 2f1271f + a7131b7 commit a27ae4c
Show file tree
Hide file tree
Showing 18 changed files with 769 additions and 139 deletions.
5 changes: 5 additions & 0 deletions packages/config/src/configDefaults.ts
Expand Up @@ -38,6 +38,10 @@ export const getInitialConfig = ({
registry: "0x8011df4830b4f696cd81393997e5371b93338878",
install_provider_uri: "https://ropsten.infura.io/truffle"
},
ens: {
enabled: false,
registryAddress: null
},
compilers: {
solc: {
settings: {
Expand Down Expand Up @@ -83,6 +87,7 @@ export const configProps = ({
ethpm() {},
logger() {},
compilers() {},
ens() {},

build_directory: {
default: () => path.join(configObject.working_directory, "build"),
Expand Down
57 changes: 34 additions & 23 deletions packages/contract/lib/execute.js
@@ -1,14 +1,13 @@
const debug = require("debug")("contract:execute"); // eslint-disable-line no-unused-vars
var PromiEvent = require("./promievent");
var EventEmitter = require("events");
var utils = require("./utils");
var StatusError = require("./statuserror");
var Reason = require("./reason");
var handlers = require("./handlers");
var override = require("./override");
var reformat = require("./reformat");

var execute = {
const PromiEvent = require("./promievent");
const EventEmitter = require("events");
const utils = require("./utils");
const StatusError = require("./statuserror");
const Reason = require("./reason");
const handlers = require("./handlers");
const override = require("./override");
const reformat = require("./reformat");
const execute = {
// ----------------------------------- Helpers --------------------------------------------------
/**
* Retrieves gas estimate multiplied by the set gas multiplier for a `sendTransaction` call.
Expand Down Expand Up @@ -55,15 +54,27 @@ var execute = {
* @param {Array} _arguments Arguments passed to method invocation
* @return {Promise} Resolves object w/ tx params disambiguated from arguments
*/
prepareCall: function(constructor, methodABI, _arguments) {
var args = Array.prototype.slice.call(_arguments);
var params = utils.getTxParams.call(constructor, methodABI, args);
prepareCall: async function(constructor, methodABI, _arguments) {
let args = Array.prototype.slice.call(_arguments);
let params = utils.getTxParams.call(constructor, methodABI, args);

args = utils.convertToEthersBN(args);

return constructor.detectNetwork().then(network => {
return { args: args, params: params, network: network };
});
if (constructor.ens && constructor.ens.enabled) {
const { web3 } = constructor;
const processedValues = await utils.ens.convertENSNames({
ensSettings: constructor.ens,
inputArgs: args,
inputParams: params,
methodABI,
web3
});
args = processedValues.args;
params = processedValues.params;
}

const network = await constructor.detectNetwork();
return { args, params, network };
},

/**
Expand Down Expand Up @@ -100,13 +111,13 @@ var execute = {
* @return {Promise} Return value of the call.
*/
call: function(fn, methodABI, address) {
var constructor = this;
const constructor = this;

return function() {
var defaultBlock = "latest";
var args = Array.prototype.slice.call(arguments);
var lastArg = args[args.length - 1];
var promiEvent = PromiEvent();
let defaultBlock = "latest";
let args = Array.prototype.slice.call(arguments);
const lastArg = args[args.length - 1];
let promiEvent = PromiEvent();

// Extract defaultBlock parameter
if (execute.hasDefaultBlock(args, lastArg, methodABI.inputs)) {
Expand Down Expand Up @@ -150,8 +161,8 @@ var execute = {
* @return {PromiEvent} Resolves a transaction receipt (via the receipt handler)
*/
send: function(fn, methodABI, address) {
var constructor = this;
var web3 = constructor.web3;
const constructor = this;
const web3 = constructor.web3;

return function() {
var deferred;
Expand Down
75 changes: 75 additions & 0 deletions packages/contract/lib/utils/ens.js
@@ -0,0 +1,75 @@
const ENSJS = require("ethereum-ens");

module.exports = {
convertENSNames: async function({
ensSettings,
inputArgs,
methodABI,
inputParams,
web3
}) {
const { registryAddress } = ensSettings;
let args;
if (inputArgs.length && methodABI) {
args = await this.convertENSArgsNames(
inputArgs,
methodABI,
web3,
registryAddress
);
} else {
args = inputArgs;
}
const params = await this.convertENSParamsNames(
inputParams,
web3,
registryAddress
);
return { args, params };
},

getNewENSJS: function({ provider, registryAddress }) {
return new ENSJS(provider, registryAddress);
},

resolveNameToAddress: function(name, ensjs) {
return ensjs.resolver(name).addr();
},

convertENSArgsNames: function(inputArgs, methodABI, web3, registryAddress) {
if (methodABI.inputs.length === 0) return inputArgs;
const { isAddress } = web3.utils;
const ensjs = this.getNewENSJS({
provider: web3.currentProvider,
registryAddress
});

const convertedNames = inputArgs.map((argument, index) => {
if (index + 1 > methodABI.inputs.length) {
return argument;
} else if (methodABI.inputs[index].type === "address") {
// Check all address arguments for ENS names
const argIsAddress = isAddress(argument);
if (argIsAddress) return argument;
return this.resolveNameToAddress(argument, ensjs);
} else {
return argument;
}
});
return Promise.all(convertedNames);
},

convertENSParamsNames: async function(params, web3, registryAddress) {
const { isAddress } = web3.utils;
if (params.from && !isAddress(params.from)) {
const ensjs = this.getNewENSJS({
provider: web3.currentProvider,
registryAddress
});
const newFrom = await this.resolveNameToAddress(params.from, ensjs);
return Object.assign({}, params, { from: newFrom });
} else {
return params;
}
}
};
@@ -1,9 +1,10 @@
const debug = require("debug")("contract:utils"); // eslint-disable-line no-unused-vars
const debug = require("debug")("contract:utils");
const web3Utils = require("web3-utils");
const bigNumberify = require("ethers/utils/bignumber").bigNumberify;
const abi = require("web3-eth-abi");
const BlockchainUtils = require("@truffle/blockchain-utils");
const reformat = require("./reformat");
const reformat = require("../reformat");
const ens = require("./ens");

const Utils = {
is_object(val) {
Expand Down Expand Up @@ -50,18 +51,14 @@ const Utils = {
.map(log => {
const logABI = constructor.events[log.topics[0]];

if (logABI == null) {
return null;
}
if (logABI == null) return null;

const copy = Utils.merge({}, log);

copy.event = logABI.name;
copy.topics = logABI.anonymous ? copy.topics : copy.topics.slice(1);

if (copy.data === "0x") {
copy.data = "";
}
if (copy.data === "0x") copy.data = "";

let logArgs;
try {
Expand Down Expand Up @@ -123,6 +120,7 @@ const Utils = {

return merged;
},

parallel(arr, callback = () => {}) {
if (!arr.length) {
return callback(null, []);
Expand Down Expand Up @@ -232,8 +230,6 @@ const Utils = {
return converted;
},

bigNumberify,

/**
* Multiplies an ethers.js BigNumber and a number with decimal places using
* integer math rather than using an arbitrary floating-point library like
Expand Down Expand Up @@ -356,4 +352,7 @@ const Utils = {
}
};

Utils.ens = ens;
Utils.bigNumberify = bigNumberify;

module.exports = Utils;
2 changes: 2 additions & 0 deletions packages/contract/package.json
Expand Up @@ -25,6 +25,7 @@
"@truffle/error": "^0.0.8-next.1",
"@truffle/interface-adapter": "^0.3.2-next.1",
"bignumber.js": "^7.2.1",
"ethereum-ens": "^0.7.7",
"ethers": "^4.0.0-beta.1",
"web3": "1.2.1",
"web3-core-promievent": "1.2.1",
Expand All @@ -39,6 +40,7 @@
"debug": "^4.1.0",
"ganache-core": "2.7.0",
"mocha": "5.2.0",
"sinon": "^7.3.2",
"temp": "^0.8.3",
"uglify-es": "^3.3.9"
},
Expand Down
62 changes: 62 additions & 0 deletions packages/contract/test/lib/utils/index.js
@@ -0,0 +1,62 @@
const ens = require("../../../lib/utils/ens");
const assert = require("assert");
const sinon = require("sinon");
const Web3 = require("web3");
const methodABI = {
constant: true,
inputs: [
{
name: "firstInput",
type: "address"
},
{
name: "secondInput",
type: "uint256"
}
],
name: "myMethod",
outputs: [
{
name: "",
type: "bool"
}
],
payable: false,
stateMutability: "pure",
type: "function"
};
const args = ["my.ens.name", 555, { from: "the.other.name" }];

describe("convertENSNames", () => {
beforeEach(() => {
const expectedInput1 = "my.ens.name";
const expectedInput2 = "the.other.name";
sinon.stub(ens, "getNewENSJS").returns({
resolver: input => {
if (input === expectedInput1) {
return { addr: () => Promise.resolve("0x123") };
}
if (input === expectedInput2) {
return { addr: () => Promise.resolve("0x987") };
}
return Promise.reject("The input was not what was expected");
}
});
});
afterEach(() => {
ens.getNewENSJS.restore();
});

it("converts ens names in address fields to addresses", async () => {
let result = await ens.convertENSNames(args, methodABI, Web3);
assert(result[0] === "0x123");
});
it("does not change non-address arguments", async () => {
let result = await ens.convertENSNames(args, methodABI, Web3);
assert(result[1] === 555);
});
it("converts ens names in the from field of the tx object", async () => {
let result = await ens.convertENSNames(args, methodABI, Web3);
assert(result[2].from === "0x987");
});
});
3 changes: 1 addition & 2 deletions packages/decoder/typings/abi-decoder/index.d.ts
@@ -1,6 +1,5 @@

declare module "abi-decoder" {
function addABI(abi: any): void;
function decodeMethod(data: any): any;
function decodeLogs(logs: any[]): any;
}
}
21 changes: 17 additions & 4 deletions packages/decoder/typings/async-eventemitter/index.d.ts
Expand Up @@ -4,8 +4,21 @@ declare module "async-eventemitter" {
public once(type: any, listener: Function): AsyncEventEmitter;
public first(event: any, listener: Function): AsyncEventEmitter;
public at(event: any, index: any, listener: Function): AsyncEventEmitter;
public before(event: any, target: any, listener: Function): AsyncEventEmitter;
public after(event: any, target: any, listener: Function): AsyncEventEmitter;
public _beforeOrAfter(event: any, target: any, listener: Function, beforeOrAfter?: string): AsyncEventEmitter;
public before(
event: any,
target: any,
listener: Function
): AsyncEventEmitter;
public after(
event: any,
target: any,
listener: Function
): AsyncEventEmitter;
public _beforeOrAfter(
event: any,
target: any,
listener: Function,
beforeOrAfter?: string
): AsyncEventEmitter;
}
}
}

0 comments on commit a27ae4c

Please sign in to comment.