Compare commits

..

9 Commits

Author SHA1 Message Date
Richard Moore
b288ad9ba7 Updated dist files. 2020-01-10 21:14:46 -05:00
Richard Moore
6da5c53120 Fixed Contract and Interface constructor abi paramter type; should be a Fragment not a ParamType (#602). 2020-01-10 21:12:58 -05:00
Richard Moore
26d3271643 Add missing chainId to transaction responses (#700). 2020-01-10 20:59:28 -05:00
Richard Moore
12da07579a Updated dist files. 2020-01-07 20:06:25 -05:00
Richard Moore
bd066b8542 Fix resolveName when name is an address with an invalid checksum (#694). 2020-01-07 20:04:58 -05:00
Richard Moore
4478896ca5 Fixed testcases for PhantomJS syntax. 2020-01-03 19:43:27 -05:00
Richard Moore
f996ec0c32 Updated dist files. 2020-01-03 19:01:29 -05:00
Richard Moore
c76e01e61f Properly handle errors in the IpcProvider (#695). 2020-01-03 18:56:07 -05:00
Richard Moore
f8087ae39c Added utility function to compute CREATE2 addresses (#697). 2020-01-03 18:20:15 -05:00
27 changed files with 273 additions and 37 deletions

View File

@@ -1,6 +1,12 @@
CHANGELOG
=========
ethers/v4.0.42 (2020-01-03 18:35)
---------------------------------
- Properly handle errors in the IpcProvider ([#695](https://github.com/ethers-io/ethers.js/issues/695); [c76e01e](https://github.com/ethers-io/ethers.js/commit/c76e01e61fd52692f58c516842f7ed3b252b0f83))
- Added utility function to compute CREATE2 addresses ([#697](https://github.com/ethers-io/ethers.js/issues/697); [f8087ae](https://github.com/ethers-io/ethers.js/commit/f8087ae39ce7631425b6b4763347a4f9618f9730))
ethers/v4.0.41 (2019-12-21 01:05)
---------------------------------

2
_version.d.ts vendored
View File

@@ -1 +1 @@
export declare const version = "4.0.41";
export declare const version = "4.0.43";

View File

@@ -1,3 +1,3 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.version = "4.0.41";
exports.version = "4.0.43";

6
contract.d.ts vendored
View File

@@ -4,7 +4,7 @@ import { UnsignedTransaction } from './utils/transaction';
import { BlockTag, Provider } from './providers/abstract-provider';
import { Signer } from './abstract-signer';
import { Arrayish } from './utils/bytes';
import { ParamType } from './utils/abi-coder';
import { EventFragment, FunctionFragment } from './utils/abi-coder';
import { Block, Listener, Log, TransactionReceipt, TransactionRequest, TransactionResponse } from './providers/abstract-provider';
export declare type ContractFunction = (...params: Array<any>) => Promise<any>;
export declare type EventFilter = {
@@ -51,7 +51,7 @@ export declare class Contract {
readonly addressPromise: Promise<string>;
readonly deployTransaction: TransactionResponse;
private _deployedPromise;
constructor(addressOrName: string, contractInterface: Array<string | ParamType> | string | Interface, signerOrProvider: Signer | Provider);
constructor(addressOrName: string, contractInterface: Array<string | FunctionFragment | EventFragment> | string | Interface, signerOrProvider: Signer | Provider);
deployed(): Promise<Contract>;
_deployed(blockTag?: BlockTag): Promise<Contract>;
fallback(overrides?: TransactionRequest): Promise<TransactionResponse>;
@@ -74,7 +74,7 @@ export declare class ContractFactory {
readonly interface: Interface;
readonly bytecode: string;
readonly signer: Signer;
constructor(contractInterface: Array<string | ParamType> | string | Interface, bytecode: Arrayish | string | {
constructor(contractInterface: Array<string | FunctionFragment | EventFragment> | string | Interface, bytecode: Arrayish | string | {
object: string;
}, signer?: Signer);
getDeployTransaction(...args: Array<any>): UnsignedTransaction;

48
dist/ethers.js vendored
View File

@@ -1,7 +1,7 @@
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ethers = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.version = "4.0.41";
exports.version = "4.0.43";
},{}],2:[function(require,module,exports){
"use strict";
@@ -10295,6 +10295,9 @@ function checkTransactionResponse(transaction) {
networkId = 0;
}
result.networkId = networkId;
if (result.chainId == null && networkId != null) {
result.chainId = networkId;
}
// 0x0000... should actually be null
if (result.blockHash && result.blockHash.replace(/0/g, '') === 'x') {
result.blockHash = null;
@@ -11115,7 +11118,12 @@ var BaseProvider = /** @class */ (function (_super) {
try {
return Promise.resolve(address_1.getAddress(name));
}
catch (error) { }
catch (error) {
// See #694
if (bytes_1.isHexString(name)) {
throw error;
}
}
var self = this;
var nodeHash = hash_1.namehash(name);
// Get the addr from the resovler
@@ -13460,6 +13468,41 @@ function getContractAddress(transaction) {
])).substring(26));
}
exports.getContractAddress = getContractAddress;
// See: https://eips.ethereum.org/EIPS/eip-1014
function getCreate2Address(options) {
var initCodeHash = options.initCodeHash;
if (options.initCode) {
if (initCodeHash) {
if (keccak256_1.keccak256(options.initCode) !== initCodeHash) {
errors.throwError("initCode/initCodeHash mismatch", errors.INVALID_ARGUMENT, {
arg: "options", value: options
});
}
}
else {
initCodeHash = keccak256_1.keccak256(options.initCode);
}
}
if (!initCodeHash) {
errors.throwError("missing initCode or initCodeHash", errors.INVALID_ARGUMENT, {
arg: "options", value: options
});
}
var from = getAddress(options.from);
var salt = bytes_1.arrayify(options.salt);
if (salt.length !== 32) {
errors.throwError("invalid salt", errors.INVALID_ARGUMENT, {
arg: "options", value: options
});
}
return getAddress("0x" + keccak256_1.keccak256(bytes_1.concat([
"0xff",
from,
salt,
initCodeHash
])).substring(26));
}
exports.getCreate2Address = getCreate2Address;
},{"../errors":5,"./bytes":64,"./keccak256":71,"./rlp":76,"bn.js":9}],61:[function(require,module,exports){
'use strict';
@@ -14505,6 +14548,7 @@ exports.parseParamType = abi_coder_1.parseParamType;
var address_1 = require("./address");
exports.getAddress = address_1.getAddress;
exports.getContractAddress = address_1.getContractAddress;
exports.getCreate2Address = address_1.getCreate2Address;
exports.getIcapAddress = address_1.getIcapAddress;
var base64 = __importStar(require("./base64"));
exports.base64 = base64;

2
dist/ethers.min.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

23
dist/ethers.types.txt vendored
View File

@@ -29,7 +29,7 @@ declare module 'ethers/contract' {
import { BlockTag, Provider } from 'ethers/providers/abstract-provider';
import { Signer } from 'ethers/abstract-signer';
import { Arrayish } from 'ethers/utils/bytes';
import { ParamType } from 'ethers/utils/abi-coder';
import { EventFragment, FunctionFragment } from 'ethers/utils/abi-coder';
import { Block, Listener, Log, TransactionReceipt, TransactionRequest, TransactionResponse } from 'ethers/providers/abstract-provider';
export type ContractFunction = (...params: Array<any>) => Promise<any>;
export type EventFilter = {
@@ -75,7 +75,7 @@ declare module 'ethers/contract' {
readonly [name: string]: ContractFunction | any;
readonly addressPromise: Promise<string>;
readonly deployTransaction: TransactionResponse;
constructor(addressOrName: string, contractInterface: Array<string | ParamType> | string | Interface, signerOrProvider: Signer | Provider);
constructor(addressOrName: string, contractInterface: Array<string | FunctionFragment | EventFragment> | string | Interface, signerOrProvider: Signer | Provider);
deployed(): Promise<Contract>;
_deployed(blockTag?: BlockTag): Promise<Contract>;
fallback(overrides?: TransactionRequest): Promise<TransactionResponse>;
@@ -95,7 +95,7 @@ declare module 'ethers/contract' {
readonly interface: Interface;
readonly bytecode: string;
readonly signer: Signer;
constructor(contractInterface: Array<string | ParamType> | string | Interface, bytecode: Arrayish | string | {
constructor(contractInterface: Array<string | FunctionFragment | EventFragment> | string | Interface, bytecode: Arrayish | string | {
object: string;
}, signer?: Signer);
getDeployTransaction(...args: Array<any>): UnsignedTransaction;
@@ -211,7 +211,7 @@ declare module 'ethers/providers' {
declare module 'ethers/utils' {
import { AbiCoder, defaultAbiCoder, formatSignature, formatParamType, parseSignature, parseParamType } from 'ethers/utils/abi-coder';
import { getAddress, getContractAddress, getIcapAddress } from 'ethers/utils/address';
import { getAddress, getContractAddress, getCreate2Address, getIcapAddress } from 'ethers/utils/address';
import * as base64 from 'ethers/utils/base64';
import { BigNumber, bigNumberify } from 'ethers/utils/bignumber';
import { arrayify, concat, hexDataSlice, hexDataLength, hexlify, hexStripZeros, hexZeroPad, isHexString, joinSignature, padZeros, splitSignature, stripZeros } from 'ethers/utils/bytes';
@@ -244,7 +244,7 @@ declare module 'ethers/utils' {
import { ConnectionInfo, OnceBlockable, PollOptions } from 'ethers/utils/web';
import { EncryptOptions, ProgressCallback } from 'ethers/utils/secret-storage';
import { Wordlist } from 'ethers/utils/wordlist';
export { AbiCoder, defaultAbiCoder, formatSignature, formatParamType, parseSignature, parseParamType, RLP, fetchJson, getNetwork, checkProperties, deepCopy, defineReadOnly, resolveProperties, shallowCopy, arrayify, concat, padZeros, stripZeros, HDNode, SigningKey, Interface, base64, BigNumber, bigNumberify, hexlify, isHexString, hexStripZeros, hexZeroPad, hexDataLength, hexDataSlice, toUtf8Bytes, toUtf8String, formatBytes32String, parseBytes32String, hashMessage, namehash, id, getAddress, getIcapAddress, getContractAddress, formatEther, parseEther, formatUnits, parseUnits, commify, keccak256, sha256, randomBytes, solidityPack, solidityKeccak256, soliditySha256, splitSignature, joinSignature, parseTransaction, populateTransaction, serializeTransaction, getJsonWalletAddress, computeAddress, computePublicKey, recoverAddress, recoverPublicKey, verifyMessage, poll, SupportedAlgorithms, UnicodeNormalizationForm, CoerceFunc, EventFragment, FunctionFragment, ParamType, BigNumberish, Arrayish, Hexable, Signature, Indexed, DeployDescription, EventDescription, FunctionDescription, LogDescription, TransactionDescription, Network, Networkish, Transaction, UnsignedTransaction, ConnectionInfo, OnceBlockable, PollOptions, EncryptOptions, ProgressCallback, Wordlist, };
export { AbiCoder, defaultAbiCoder, formatSignature, formatParamType, parseSignature, parseParamType, RLP, fetchJson, getNetwork, checkProperties, deepCopy, defineReadOnly, resolveProperties, shallowCopy, arrayify, concat, padZeros, stripZeros, HDNode, SigningKey, Interface, base64, BigNumber, bigNumberify, hexlify, isHexString, hexStripZeros, hexZeroPad, hexDataLength, hexDataSlice, toUtf8Bytes, toUtf8String, formatBytes32String, parseBytes32String, hashMessage, namehash, id, getAddress, getIcapAddress, getContractAddress, getCreate2Address, formatEther, parseEther, formatUnits, parseUnits, commify, keccak256, sha256, randomBytes, solidityPack, solidityKeccak256, soliditySha256, splitSignature, joinSignature, parseTransaction, populateTransaction, serializeTransaction, getJsonWalletAddress, computeAddress, computePublicKey, recoverAddress, recoverPublicKey, verifyMessage, poll, SupportedAlgorithms, UnicodeNormalizationForm, CoerceFunc, EventFragment, FunctionFragment, ParamType, BigNumberish, Arrayish, Hexable, Signature, Indexed, DeployDescription, EventDescription, FunctionDescription, LogDescription, TransactionDescription, Network, Networkish, Transaction, UnsignedTransaction, ConnectionInfo, OnceBlockable, PollOptions, EncryptOptions, ProgressCallback, Wordlist, };
}
declare module 'ethers/wordlists' {
@@ -266,7 +266,7 @@ declare module 'ethers/utils/shims' {
}
declare module 'ethers/_version' {
export const version = "4.0.41";
export const version = "4.0.43";
}
declare module 'ethers/utils/bignumber' {
@@ -400,7 +400,7 @@ declare module 'ethers/utils/interface' {
[name: string]: _EventDescription;
};
readonly deployFunction: _DeployDescription;
constructor(abi: Array<string | ParamType> | string);
constructor(abi: Array<string | FunctionFragment | EventFragment> | string);
parseTransaction(tx: {
data: string;
value?: BigNumberish;
@@ -614,7 +614,7 @@ declare module 'ethers/utils/abi-coder' {
outputs: Array<ParamType>;
payable: boolean;
stateMutability: string;
gas: BigNumber;
gas?: BigNumber;
};
export const defaultCoerceFunc: CoerceFunc;
export function parseParamType(type: string): ParamType;
@@ -898,6 +898,13 @@ declare module 'ethers/utils/address' {
from: string;
nonce: Arrayish | BigNumber | number;
}): string;
export type Create2Options = {
from: string;
salt: Arrayish;
initCode?: Arrayish;
initCodeHash?: Arrayish;
};
export function getCreate2Address(options: Create2Options): string;
}
declare module 'ethers/utils/base64' {

View File

@@ -1,6 +1,6 @@
{
"name": "ethers",
"version": "4.0.41",
"version": "4.0.43",
"description": "Ethereum wallet library.",
"main": "./index.js",
"types": "./index.d.ts",

View File

@@ -227,6 +227,9 @@ function checkTransactionResponse(transaction) {
networkId = 0;
}
result.networkId = networkId;
if (result.chainId == null && networkId != null) {
result.chainId = networkId;
}
// 0x0000... should actually be null
if (result.blockHash && result.blockHash.replace(/0/g, '') === 'x') {
result.blockHash = null;
@@ -1047,7 +1050,12 @@ var BaseProvider = /** @class */ (function (_super) {
try {
return Promise.resolve(address_1.getAddress(name));
}
catch (error) { }
catch (error) {
// See #694
if (bytes_1.isHexString(name)) {
throw error;
}
}
var self = this;
var nodeHash = hash_1.namehash(name);
// Get the addr from the resovler

View File

@@ -59,8 +59,16 @@ var IpcProvider = /** @class */ (function (_super) {
});
stream.on("end", function () {
try {
resolve(JSON.parse(response.toString('utf8')).result);
// @TODO: Better pull apart the error
var payload_1 = JSON.parse(response.toString('utf8'));
if (payload_1.error) {
var error = new Error(payload_1.error.message);
error.code = payload_1.error.code;
error.data = payload_1.error.data;
reject(error);
}
else {
resolve(payload_1.result);
}
stream.destroy();
}
catch (error) {

View File

@@ -1 +1 @@
export const version = "4.0.41";
export const version = "4.0.43";

View File

@@ -24,7 +24,7 @@ import { Signer } from './abstract-signer';
import { Arrayish } from './utils/bytes';
import { EventDescription } from './utils/interface';
import { ParamType } from './utils/abi-coder';
import { EventFragment, FunctionFragment, ParamType } from './utils/abi-coder';
import { Block, Listener, Log, TransactionReceipt, TransactionRequest, TransactionResponse } from './providers/abstract-provider';
///////////////////////////////
@@ -364,7 +364,7 @@ export class Contract {
// Once this issue is resolved (there are open PR) we can do this nicer
// by making addressOrName default to null for 2 operand calls. :)
constructor(addressOrName: string, contractInterface: Array<string | ParamType> | string | Interface, signerOrProvider: Signer | Provider) {
constructor(addressOrName: string, contractInterface: Array<string | FunctionFragment | EventFragment> | string | Interface, signerOrProvider: Signer | Provider) {
errors.checkNew(this, Contract);
// @TODO: Maybe still check the addressOrName looks like a valid address or name?
@@ -744,7 +744,7 @@ export class ContractFactory {
readonly bytecode: string;
readonly signer: Signer;
constructor(contractInterface: Array<string | ParamType> | string | Interface, bytecode: Arrayish | string | { object: string }, signer?: Signer) {
constructor(contractInterface: Array<string | FunctionFragment | EventFragment> | string | Interface, bytecode: Arrayish | string | { object: string }, signer?: Signer) {
let bytecodeHex: string = null;

View File

@@ -247,6 +247,9 @@ function checkTransactionResponse(transaction: any): TransactionResponse {
if (typeof(networkId) !== 'number') { networkId = 0; }
result.networkId = networkId;
if (result.chainId == null && networkId != null) {
result.chainId = networkId;
}
// 0x0000... should actually be null
if (result.blockHash && result.blockHash.replace(/0/g, '') === 'x') {
@@ -1178,7 +1181,10 @@ export class BaseProvider extends Provider {
// If it is already an address, nothing to resolve
try {
return Promise.resolve(getAddress(name));
} catch (error) { }
} catch (error) {
// See #694
if (isHexString(name)) { throw error; }
}
let self = this;

View File

@@ -54,8 +54,15 @@ export class IpcProvider extends JsonRpcProvider {
stream.on("end", () => {
try {
resolve(JSON.parse(response.toString('utf8')).result);
// @TODO: Better pull apart the error
const payload = JSON.parse(response.toString('utf8'));
if (payload.error) {
const error: any = new Error(payload.error.message);
error.code = payload.error.code;
error.data = payload.error.data;
reject(error);
} else {
resolve(payload.result);
}
stream.destroy();
} catch (error) {
reject(error);

View File

@@ -54,7 +54,7 @@ export type FunctionFragment = {
payable: boolean,
stateMutability: string,
gas: BigNumber
gas?: BigNumber
};
///////////////////////////////

View File

@@ -3,7 +3,7 @@
// We use this for base 36 maths
import BN from 'bn.js';
import { arrayify, stripZeros, hexlify } from './bytes';
import { arrayify, concat, stripZeros, hexlify } from './bytes';
import { BigNumber } from './bignumber';
import { keccak256 } from './keccak256';
import { encode } from './rlp';
@@ -140,3 +140,47 @@ export function getContractAddress(transaction: { from: string, nonce: Arrayish
])).substring(26));
}
export type Create2Options = {
from: string,
salt: Arrayish,
initCode?: Arrayish,
initCodeHash?: Arrayish,
};
// See: https://eips.ethereum.org/EIPS/eip-1014
export function getCreate2Address(options: Create2Options): string {
let initCodeHash = options.initCodeHash;
if (options.initCode) {
if (initCodeHash) {
if (keccak256(options.initCode) !== initCodeHash) {
errors.throwError("initCode/initCodeHash mismatch", errors.INVALID_ARGUMENT, {
arg: "options", value: options
});
}
} else {
initCodeHash = keccak256(options.initCode);
}
}
if (!initCodeHash) {
errors.throwError("missing initCode or initCodeHash", errors.INVALID_ARGUMENT, {
arg: "options", value: options
});
}
const from = getAddress(options.from);
const salt = arrayify(options.salt);
if (salt.length !== 32) {
errors.throwError("invalid salt", errors.INVALID_ARGUMENT, {
arg: "options", value: options
});
}
return getAddress("0x" + keccak256(concat([
"0xff",
from,
salt,
initCodeHash
])).substring(26));
}

View File

@@ -1,7 +1,7 @@
'use strict';
import { AbiCoder, defaultAbiCoder, formatSignature, formatParamType, parseSignature, parseParamType } from './abi-coder';
import { getAddress, getContractAddress, getIcapAddress } from './address';
import { getAddress, getContractAddress, getCreate2Address, getIcapAddress } from './address';
import * as base64 from './base64';
import { BigNumber, bigNumberify } from './bignumber';
import { arrayify, concat, hexDataSlice, hexDataLength, hexlify, hexStripZeros, hexZeroPad, isHexString, joinSignature, padZeros, splitSignature, stripZeros } from './bytes';
@@ -103,6 +103,7 @@ export {
getAddress,
getIcapAddress,
getContractAddress,
getCreate2Address,
formatEther,
parseEther,

View File

@@ -390,7 +390,7 @@ export class Interface {
readonly events: { [ name: string ]: _EventDescription };
readonly deployFunction: _DeployDescription;
constructor(abi: Array<string | ParamType> | string) {
constructor(abi: Array<string | FunctionFragment | EventFragment> | string) {
errors.checkNew(this, Interface);
if (typeof(abi) === 'string') {

View File

@@ -36,3 +36,64 @@ describe('Checksum and ICAP address generation', function() {
});
});
});
describe("Create2 Address Generation", function() {
var tests = [
{
name: "Example 0",
from: "0x0000000000000000000000000000000000000000",
salt: "0x0000000000000000000000000000000000000000000000000000000000000000",
initCode: "0x00",
expected: "0x4D1A2e2bB4F88F0250f26Ffff098B0b30B26BF38"
},
{
name: "Example 1",
from: "0xdeadbeef00000000000000000000000000000000",
salt: "0x0000000000000000000000000000000000000000000000000000000000000000",
initCode: "0x00",
expected: "0xB928f69Bb1D91Cd65274e3c79d8986362984fDA3"
},
{
name: "Example 2",
from: "0xdeadbeef00000000000000000000000000000000",
salt: "0x000000000000000000000000feed000000000000000000000000000000000000",
initCode: "0x00",
expected: "0xD04116cDd17beBE565EB2422F2497E06cC1C9833"
},
{
name: "Example 3",
from: "0x0000000000000000000000000000000000000000",
salt: "0x0000000000000000000000000000000000000000000000000000000000000000",
initCode: "0xdeadbeef",
expected: "0x70f2b2914A2a4b783FaEFb75f459A580616Fcb5e"
},
{
name: "Example 4",
from: "0x00000000000000000000000000000000deadbeef",
salt: "0x00000000000000000000000000000000000000000000000000000000cafebabe",
initCode: "0xdeadbeef",
expected: "0x60f3f640a8508fC6a86d45DF051962668E1e8AC7"
},
{
name: "Example 5",
from: "0x00000000000000000000000000000000deadbeef",
salt: "0x00000000000000000000000000000000000000000000000000000000cafebabe",
initCode: "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef",
expected: "0x1d8bfDC5D46DC4f61D6b6115972536eBE6A8854C"
},
{
name: "Example 6",
from: "0x0000000000000000000000000000000000000000",
salt: "0x0000000000000000000000000000000000000000000000000000000000000000",
initCode: "0x",
expected: "0xE33C0C7F7df4809055C3ebA6c09CFe4BaF1BD9e0"
},
];
tests.forEach(function(test) {
it("correctly computes the Create2 address - " + test.name, function() {
var address = ethers.utils.getCreate2Address(test);
assert.equal(address, test.expected, "correctly computes Create2 address");
});
});
});

View File

@@ -46,7 +46,8 @@ var blockchainData = {
v: 38,
creates: null,
raw: '0xf8d2808504a817c8008303d090946fc21092da55b392b045ed78f4732bff3c580e2c880186cc6acd4b0000b864f2c298be000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000067269636d6f6f000000000000000000000000000000000000000000000000000026a01e5605197a03e3f0a168f14749168dfeefc44c9228312dacbffdcbbb13263265a0269c3e5b3558267ad91b0a887d51f9f10098771c67b82ea6cb74f29638754f54',
networkId: 1
networkId: 1,
chainId: 1
},
transactionReceipt: {
blockHash: "0x36b4af7f0538559e581c8588f16477df0f676439ea67fe8d7a2ae4abb20e2566",

View File

@@ -21,7 +21,7 @@ export declare type FunctionFragment = {
outputs: Array<ParamType>;
payable: boolean;
stateMutability: string;
gas: BigNumber;
gas?: BigNumber;
};
export declare const defaultCoerceFunc: CoerceFunc;
export declare function parseParamType(type: string): ParamType;

7
utils/address.d.ts vendored
View File

@@ -6,3 +6,10 @@ export declare function getContractAddress(transaction: {
from: string;
nonce: Arrayish | BigNumber | number;
}): string;
export declare type Create2Options = {
from: string;
salt: Arrayish;
initCode?: Arrayish;
initCodeHash?: Arrayish;
};
export declare function getCreate2Address(options: Create2Options): string;

View File

@@ -123,3 +123,38 @@ function getContractAddress(transaction) {
])).substring(26));
}
exports.getContractAddress = getContractAddress;
// See: https://eips.ethereum.org/EIPS/eip-1014
function getCreate2Address(options) {
var initCodeHash = options.initCodeHash;
if (options.initCode) {
if (initCodeHash) {
if (keccak256_1.keccak256(options.initCode) !== initCodeHash) {
errors.throwError("initCode/initCodeHash mismatch", errors.INVALID_ARGUMENT, {
arg: "options", value: options
});
}
}
else {
initCodeHash = keccak256_1.keccak256(options.initCode);
}
}
if (!initCodeHash) {
errors.throwError("missing initCode or initCodeHash", errors.INVALID_ARGUMENT, {
arg: "options", value: options
});
}
var from = getAddress(options.from);
var salt = bytes_1.arrayify(options.salt);
if (salt.length !== 32) {
errors.throwError("invalid salt", errors.INVALID_ARGUMENT, {
arg: "options", value: options
});
}
return getAddress("0x" + keccak256_1.keccak256(bytes_1.concat([
"0xff",
from,
salt,
initCodeHash
])).substring(26));
}
exports.getCreate2Address = getCreate2Address;

4
utils/index.d.ts vendored
View File

@@ -1,5 +1,5 @@
import { AbiCoder, defaultAbiCoder, formatSignature, formatParamType, parseSignature, parseParamType } from './abi-coder';
import { getAddress, getContractAddress, getIcapAddress } from './address';
import { getAddress, getContractAddress, getCreate2Address, getIcapAddress } from './address';
import * as base64 from './base64';
import { BigNumber, bigNumberify } from './bignumber';
import { arrayify, concat, hexDataSlice, hexDataLength, hexlify, hexStripZeros, hexZeroPad, isHexString, joinSignature, padZeros, splitSignature, stripZeros } from './bytes';
@@ -32,4 +32,4 @@ import { Transaction, UnsignedTransaction } from './transaction';
import { ConnectionInfo, OnceBlockable, PollOptions } from './web';
import { EncryptOptions, ProgressCallback } from './secret-storage';
import { Wordlist } from './wordlist';
export { AbiCoder, defaultAbiCoder, formatSignature, formatParamType, parseSignature, parseParamType, RLP, fetchJson, getNetwork, checkProperties, deepCopy, defineReadOnly, resolveProperties, shallowCopy, arrayify, concat, padZeros, stripZeros, HDNode, SigningKey, Interface, base64, BigNumber, bigNumberify, hexlify, isHexString, hexStripZeros, hexZeroPad, hexDataLength, hexDataSlice, toUtf8Bytes, toUtf8String, formatBytes32String, parseBytes32String, hashMessage, namehash, id, getAddress, getIcapAddress, getContractAddress, formatEther, parseEther, formatUnits, parseUnits, commify, keccak256, sha256, randomBytes, solidityPack, solidityKeccak256, soliditySha256, splitSignature, joinSignature, parseTransaction, populateTransaction, serializeTransaction, getJsonWalletAddress, computeAddress, computePublicKey, recoverAddress, recoverPublicKey, verifyMessage, poll, SupportedAlgorithms, UnicodeNormalizationForm, CoerceFunc, EventFragment, FunctionFragment, ParamType, BigNumberish, Arrayish, Hexable, Signature, Indexed, DeployDescription, EventDescription, FunctionDescription, LogDescription, TransactionDescription, Network, Networkish, Transaction, UnsignedTransaction, ConnectionInfo, OnceBlockable, PollOptions, EncryptOptions, ProgressCallback, Wordlist, };
export { AbiCoder, defaultAbiCoder, formatSignature, formatParamType, parseSignature, parseParamType, RLP, fetchJson, getNetwork, checkProperties, deepCopy, defineReadOnly, resolveProperties, shallowCopy, arrayify, concat, padZeros, stripZeros, HDNode, SigningKey, Interface, base64, BigNumber, bigNumberify, hexlify, isHexString, hexStripZeros, hexZeroPad, hexDataLength, hexDataSlice, toUtf8Bytes, toUtf8String, formatBytes32String, parseBytes32String, hashMessage, namehash, id, getAddress, getIcapAddress, getContractAddress, getCreate2Address, formatEther, parseEther, formatUnits, parseUnits, commify, keccak256, sha256, randomBytes, solidityPack, solidityKeccak256, soliditySha256, splitSignature, joinSignature, parseTransaction, populateTransaction, serializeTransaction, getJsonWalletAddress, computeAddress, computePublicKey, recoverAddress, recoverPublicKey, verifyMessage, poll, SupportedAlgorithms, UnicodeNormalizationForm, CoerceFunc, EventFragment, FunctionFragment, ParamType, BigNumberish, Arrayish, Hexable, Signature, Indexed, DeployDescription, EventDescription, FunctionDescription, LogDescription, TransactionDescription, Network, Networkish, Transaction, UnsignedTransaction, ConnectionInfo, OnceBlockable, PollOptions, EncryptOptions, ProgressCallback, Wordlist, };

View File

@@ -17,6 +17,7 @@ exports.parseParamType = abi_coder_1.parseParamType;
var address_1 = require("./address");
exports.getAddress = address_1.getAddress;
exports.getContractAddress = address_1.getContractAddress;
exports.getCreate2Address = address_1.getCreate2Address;
exports.getIcapAddress = address_1.getIcapAddress;
var base64 = __importStar(require("./base64"));
exports.base64 = base64;

View File

@@ -98,7 +98,7 @@ export declare class Interface {
[name: string]: _EventDescription;
};
readonly deployFunction: _DeployDescription;
constructor(abi: Array<string | ParamType> | string);
constructor(abi: Array<string | FunctionFragment | EventFragment> | string);
parseTransaction(tx: {
data: string;
value?: BigNumberish;