@ethersproject/contracts
Advanced tools
Comparing version 5.0.0-beta.154 to 5.0.0-beta.155
@@ -1,1 +0,1 @@ | ||
export declare const version = "contracts/5.0.0-beta.154"; | ||
export declare const version = "contracts/5.0.0-beta.155"; |
@@ -1,1 +0,1 @@ | ||
export const version = "contracts/5.0.0-beta.154"; | ||
export const version = "contracts/5.0.0-beta.155"; |
@@ -6,3 +6,2 @@ import { Fragment, Indexed, Interface, JsonFragment, Result } from "@ethersproject/abi"; | ||
import { BytesLike } from "@ethersproject/bytes"; | ||
import { UnsignedTransaction } from "@ethersproject/transactions"; | ||
export interface Overrides { | ||
@@ -20,2 +19,12 @@ gasLimit?: BigNumberish | Promise<BigNumberish>; | ||
} | ||
export interface PopulatedTransaction { | ||
to?: string; | ||
from?: string; | ||
nonce?: number; | ||
gasLimit?: BigNumber; | ||
gasPrice?: BigNumber; | ||
data?: string; | ||
value?: BigNumber; | ||
chainId?: number; | ||
} | ||
export declare type EventFilter = { | ||
@@ -73,3 +82,3 @@ address?: string; | ||
readonly populateTransaction: { | ||
[name: string]: ContractFunction<UnsignedTransaction>; | ||
[name: string]: ContractFunction<PopulatedTransaction>; | ||
}; | ||
@@ -89,3 +98,3 @@ readonly filters: { | ||
}; | ||
constructor(addressOrName: string, contractInterface: ContractInterface, signerOrProvider: Signer | Provider); | ||
constructor(addressOrName: string, contractInterface: ContractInterface, signerOrProvider?: Signer | Provider); | ||
static getContractAddress(transaction: { | ||
@@ -124,3 +133,3 @@ from: string; | ||
}, signer?: Signer); | ||
getDeployTransaction(...args: Array<any>): UnsignedTransaction; | ||
getDeployTransaction(...args: Array<any>): TransactionRequest; | ||
deploy(...args: Array<any>): Promise<Contract>; | ||
@@ -127,0 +136,0 @@ attach(address: string): Contract; |
@@ -14,9 +14,13 @@ "use strict"; | ||
import { Signer, VoidSigner } from "@ethersproject/abstract-signer"; | ||
import { getContractAddress } from "@ethersproject/address"; | ||
import { getAddress, getContractAddress } from "@ethersproject/address"; | ||
import { BigNumber } from "@ethersproject/bignumber"; | ||
import { concat, hexlify, isBytes, isHexString } from "@ethersproject/bytes"; | ||
//import { AddressZero } from "@ethersproject/constants"; | ||
import { defineReadOnly, deepCopy, getStatic, resolveProperties, shallowCopy } from "@ethersproject/properties"; | ||
// @TOOD remove dependences transactions | ||
import { Logger } from "@ethersproject/logger"; | ||
import { version } from "./_version"; | ||
const logger = new Logger(version); | ||
; | ||
; | ||
/////////////////////////////// | ||
@@ -26,14 +30,30 @@ const allowedTransactionKeys = { | ||
}; | ||
function resolveName(resolver, nameOrPromise) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
const name = yield nameOrPromise; | ||
// If it is already an address, just use it (after adding checksum) | ||
try { | ||
return getAddress(name); | ||
} | ||
catch (error) { } | ||
if (!resolver) { | ||
logger.throwError("a provider or signer is needed to resolve ENS names", Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "resolveName" | ||
}); | ||
} | ||
return yield resolver.resolveName(name); | ||
}); | ||
} | ||
// Recursively replaces ENS names with promises to resolve the name and resolves all properties | ||
function resolveAddresses(signerOrProvider, value, paramType) { | ||
function resolveAddresses(resolver, value, paramType) { | ||
if (Array.isArray(paramType)) { | ||
return Promise.all(paramType.map((paramType, index) => { | ||
return resolveAddresses(signerOrProvider, ((Array.isArray(value)) ? value[index] : value[paramType.name]), paramType); | ||
return resolveAddresses(resolver, ((Array.isArray(value)) ? value[index] : value[paramType.name]), paramType); | ||
})); | ||
} | ||
if (paramType.type === "address") { | ||
return signerOrProvider.resolveName(value); | ||
return resolveName(resolver, value); | ||
} | ||
if (paramType.type === "tuple") { | ||
return resolveAddresses(signerOrProvider, value, paramType.components); | ||
return resolveAddresses(resolver, value, paramType.components); | ||
} | ||
@@ -44,10 +64,44 @@ if (paramType.baseType === "array") { | ||
} | ||
return Promise.all(value.map((v) => resolveAddresses(signerOrProvider, v, paramType.arrayChildren))); | ||
return Promise.all(value.map((v) => resolveAddresses(resolver, v, paramType.arrayChildren))); | ||
} | ||
return Promise.resolve(value); | ||
} | ||
function _populateTransaction(contract, fragment, args, overrides) { | ||
function populateTransaction(contract, fragment, args) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
overrides = shallowCopy(overrides); | ||
// Wait for all dependency addresses to be resolved (prefer the signer over the provider) | ||
// If an extra argument is given, it is overrides | ||
let overrides = {}; | ||
if (args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { | ||
overrides = shallowCopy(args.pop()); | ||
} | ||
// Make sure the parameter count matches | ||
logger.checkArgumentCount(args.length, fragment.inputs.length, "passed to contract"); | ||
// Populate "from" override (allow promises) | ||
if (contract.signer) { | ||
if (overrides.from) { | ||
// Contracts with a Signer are from the Signer's frame-of-reference; | ||
// but we allow overriding "from" if it matches the signer | ||
overrides.from = resolveProperties({ | ||
override: resolveName(contract.signer, overrides.from), | ||
signer: contract.signer.getAddress() | ||
}).then((check) => __awaiter(this, void 0, void 0, function* () { | ||
if (getAddress(check.signer) !== check.override) { | ||
logger.throwError("Contract with a Signer cannot override from", Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "overrides.from" | ||
}); | ||
} | ||
return check.override; | ||
})); | ||
} | ||
else { | ||
overrides.from = contract.signer.getAddress(); | ||
} | ||
} | ||
else if (overrides.from) { | ||
overrides.from = resolveName(contract.provider, overrides.from); | ||
//} else { | ||
// Contracts without a signer can override "from", and if | ||
// unspecified the zero address is used | ||
//overrides.from = AddressZero; | ||
} | ||
// Wait for all dependencies to be resolved (prefer the signer over the provider) | ||
const resolved = yield resolveProperties({ | ||
@@ -65,2 +119,3 @@ args: resolveAddresses(contract.signer || contract.provider, args, fragment.inputs), | ||
const ro = resolved.overrides; | ||
// Populate simple overrides | ||
if (ro.nonce != null) { | ||
@@ -75,6 +130,20 @@ tx.nonce = BigNumber.from(ro.nonce).toNumber(); | ||
} | ||
// If there was no gasLimit override, but the ABI specifies one use it | ||
if (ro.from != null) { | ||
tx.from = ro.from; | ||
} | ||
// If there was no "gasLimit" override, but the ABI specifies a default, use it | ||
if (tx.gasLimit == null && fragment.gas != null) { | ||
tx.gasLimit = BigNumber.from(fragment.gas).add(21000); | ||
} | ||
// Populate "value" override | ||
if (ro.value) { | ||
const roValue = BigNumber.from(ro.value); | ||
if (!roValue.isZero() && !fragment.payable) { | ||
logger.throwError("non-payable method cannot override value", Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "overrides.value", | ||
value: overrides.value | ||
}); | ||
} | ||
tx.value = roValue; | ||
} | ||
// Remvoe the overrides | ||
@@ -84,3 +153,4 @@ delete overrides.nonce; | ||
delete overrides.gasPrice; | ||
// @TODO: Maybe move all tx property validation to the Signer and Provider? | ||
delete overrides.from; | ||
delete overrides.value; | ||
// Make sure there are no stray overrides, which may indicate a | ||
@@ -92,3 +162,3 @@ // typo or using an unsupported key. | ||
operation: "overrides", | ||
keys: leftovers | ||
overrides: leftovers | ||
}); | ||
@@ -99,59 +169,6 @@ } | ||
} | ||
function populateTransaction(contract, fragment, args, overrides) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
overrides = shallowCopy(overrides); | ||
// If the contract was just deployed, wait until it is minded | ||
if (contract.deployTransaction != null) { | ||
yield contract._deployed(); | ||
} | ||
// Resolved Overrides (keep value for errors) | ||
const ro = yield resolveProperties(overrides); | ||
const value = overrides.value; | ||
delete overrides.value; | ||
const tx = yield _populateTransaction(contract, fragment, args, overrides); | ||
if (ro.value) { | ||
const roValue = BigNumber.from(ro.value); | ||
if (!roValue.isZero() && !fragment.payable) { | ||
logger.throwError("non-payable method cannot override value", Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "overrides.value", | ||
value: value | ||
}); | ||
} | ||
tx.value = roValue; | ||
} | ||
return tx; | ||
}); | ||
} | ||
function populateCallTransaction(contract, fragment, args, overrides) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
overrides = shallowCopy(overrides); | ||
// If the contract was just deployed, wait until it is minded | ||
if (contract.deployTransaction != null) { | ||
let blockTag = undefined; | ||
if (overrides.blockTag) { | ||
blockTag = yield overrides.blockTag; | ||
} | ||
yield contract._deployed(blockTag); | ||
} | ||
// Resolved Overrides | ||
delete overrides.blockTag; | ||
const ro = yield resolveProperties(overrides); | ||
delete overrides.from; | ||
const tx = yield populateTransaction(contract, fragment, args, overrides); | ||
if (ro.from) { | ||
tx.from = this.interface.constructor.getAddress(ro.from); | ||
} | ||
return tx; | ||
}); | ||
} | ||
function buildPopulate(contract, fragment) { | ||
const populate = (fragment.constant) ? populateCallTransaction : populateTransaction; | ||
return function (...args) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
let overrides = null; | ||
if (args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { | ||
overrides = args.pop(); | ||
} | ||
logger.checkArgumentCount(args.length, fragment.inputs.length, "passed to contract"); | ||
return populate(contract, fragment, args, overrides); | ||
return populateTransaction(contract, fragment, args); | ||
}); | ||
@@ -162,14 +179,10 @@ }; | ||
const signerOrProvider = (contract.signer || contract.provider); | ||
const populate = (fragment.constant) ? populateCallTransaction : populateTransaction; | ||
return function (...args) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
let overrides = null; | ||
if (args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { | ||
overrides = args.pop(); | ||
} | ||
logger.checkArgumentCount(args.length, fragment.inputs.length, "passed to contract"); | ||
if (!signerOrProvider) { | ||
logger.throwError("estimate require a provider or signer", Logger.errors.UNSUPPORTED_OPERATION, { operation: "estimateGas" }); | ||
logger.throwError("estimate require a provider or signer", Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "estimateGas" | ||
}); | ||
} | ||
const tx = yield populate(contract, fragment, args, overrides); | ||
const tx = yield populateTransaction(contract, fragment, args); | ||
return yield signerOrProvider.estimateGas(tx); | ||
@@ -181,9 +194,8 @@ }); | ||
const signerOrProvider = (contract.signer || contract.provider); | ||
const populate = (fragment.constant) ? populateCallTransaction : populateTransaction; | ||
return function (...args) { | ||
return __awaiter(this, void 0, void 0, function* () { | ||
let overrides = null; | ||
// Extract the "blockTag" override if present | ||
let blockTag = undefined; | ||
if (args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { | ||
overrides = shallowCopy(args.pop()); | ||
const overrides = shallowCopy(args.pop()); | ||
if (overrides.blockTag) { | ||
@@ -193,12 +205,17 @@ blockTag = yield overrides.blockTag; | ||
} | ||
args.push(overrides); | ||
} | ||
logger.checkArgumentCount(args.length, fragment.inputs.length, "passed to contract"); | ||
const tx = yield populate(contract, fragment, args, overrides); | ||
const value = yield signerOrProvider.call(tx, blockTag); | ||
// If the contract was just deployed, wait until it is mined | ||
if (contract.deployTransaction != null) { | ||
yield contract._deployed(blockTag); | ||
} | ||
// Call a node and get the result | ||
const tx = yield populateTransaction(contract, fragment, args); | ||
const result = yield signerOrProvider.call(tx, blockTag); | ||
try { | ||
let result = contract.interface.decodeFunctionResult(fragment, value); | ||
let value = contract.interface.decodeFunctionResult(fragment, result); | ||
if (collapseSimple && fragment.outputs.length === 1) { | ||
result = result[0]; | ||
value = value[0]; | ||
} | ||
return result; | ||
return value; | ||
} | ||
@@ -220,14 +237,11 @@ catch (error) { | ||
if (!contract.signer) { | ||
logger.throwError("sending a transaction requires a signer", Logger.errors.UNSUPPORTED_OPERATION, { operation: "sendTransaction" }); | ||
logger.throwError("sending a transaction requires a signer", Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "sendTransaction" | ||
}); | ||
} | ||
// We allow CallOverrides, since the Signer can accept from | ||
let overrides = null; | ||
if (args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { | ||
overrides = shallowCopy(args.pop()); | ||
if (overrides.blockTag != null) { | ||
logger.throwArgumentError(`cannot override "blockTag" in transaction`, "overrides", overrides); | ||
} | ||
// If the contract was just deployed, wait until it is minded | ||
if (contract.deployTransaction != null) { | ||
yield contract._deployed(); | ||
} | ||
logger.checkArgumentCount(args.length, fragment.inputs.length, "passed to contract"); | ||
const txRequest = yield populateCallTransaction(contract, fragment, args, overrides); | ||
const txRequest = yield populateTransaction(contract, fragment, args); | ||
const tx = yield contract.signer.sendTransaction(txRequest); | ||
@@ -427,3 +441,7 @@ // Tweak the tw.wait so the receipt has extra properties | ||
defineReadOnly(this, "interface", getStatic((new.target), "getInterface")(contractInterface)); | ||
if (Signer.isSigner(signerOrProvider)) { | ||
if (signerOrProvider == null) { | ||
defineReadOnly(this, "provider", null); | ||
defineReadOnly(this, "signer", null); | ||
} | ||
else if (Signer.isSigner(signerOrProvider)) { | ||
defineReadOnly(this, "provider", signerOrProvider.provider || null); | ||
@@ -485,7 +503,9 @@ defineReadOnly(this, "signer", signerOrProvider); | ||
try { | ||
defineReadOnly(this, "resolvedAddress", Promise.resolve((this.interface.constructor).getAddress(addressOrName))); | ||
defineReadOnly(this, "resolvedAddress", Promise.resolve(getAddress(addressOrName))); | ||
} | ||
catch (error) { | ||
// Without a provider, we cannot use ENS names | ||
logger.throwArgumentError("provider is required to use non-address contract address", "addressOrName", addressOrName); | ||
logger.throwError("provider is required to use ENS name as contract address", Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "new Contract" | ||
}); | ||
} | ||
@@ -492,0 +512,0 @@ } |
@@ -1,1 +0,1 @@ | ||
export declare const version = "contracts/5.0.0-beta.154"; | ||
export declare const version = "contracts/5.0.0-beta.155"; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.version = "contracts/5.0.0-beta.154"; | ||
exports.version = "contracts/5.0.0-beta.155"; |
@@ -6,3 +6,2 @@ import { Fragment, Indexed, Interface, JsonFragment, Result } from "@ethersproject/abi"; | ||
import { BytesLike } from "@ethersproject/bytes"; | ||
import { UnsignedTransaction } from "@ethersproject/transactions"; | ||
export interface Overrides { | ||
@@ -20,2 +19,12 @@ gasLimit?: BigNumberish | Promise<BigNumberish>; | ||
} | ||
export interface PopulatedTransaction { | ||
to?: string; | ||
from?: string; | ||
nonce?: number; | ||
gasLimit?: BigNumber; | ||
gasPrice?: BigNumber; | ||
data?: string; | ||
value?: BigNumber; | ||
chainId?: number; | ||
} | ||
export declare type EventFilter = { | ||
@@ -73,3 +82,3 @@ address?: string; | ||
readonly populateTransaction: { | ||
[name: string]: ContractFunction<UnsignedTransaction>; | ||
[name: string]: ContractFunction<PopulatedTransaction>; | ||
}; | ||
@@ -89,3 +98,3 @@ readonly filters: { | ||
}; | ||
constructor(addressOrName: string, contractInterface: ContractInterface, signerOrProvider: Signer | Provider); | ||
constructor(addressOrName: string, contractInterface: ContractInterface, signerOrProvider?: Signer | Provider); | ||
static getContractAddress(transaction: { | ||
@@ -124,3 +133,3 @@ from: string; | ||
}, signer?: Signer); | ||
getDeployTransaction(...args: Array<any>): UnsignedTransaction; | ||
getDeployTransaction(...args: Array<any>): TransactionRequest; | ||
deploy(...args: Array<any>): Promise<Contract>; | ||
@@ -127,0 +136,0 @@ attach(address: string): Contract; |
255
lib/index.js
@@ -65,6 +65,10 @@ "use strict"; | ||
var bytes_1 = require("@ethersproject/bytes"); | ||
//import { AddressZero } from "@ethersproject/constants"; | ||
var properties_1 = require("@ethersproject/properties"); | ||
// @TOOD remove dependences transactions | ||
var logger_1 = require("@ethersproject/logger"); | ||
var _version_1 = require("./_version"); | ||
var logger = new logger_1.Logger(_version_1.version); | ||
; | ||
; | ||
/////////////////////////////// | ||
@@ -74,14 +78,38 @@ var allowedTransactionKeys = { | ||
}; | ||
function resolveName(resolver, nameOrPromise) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var name; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: return [4 /*yield*/, nameOrPromise]; | ||
case 1: | ||
name = _a.sent(); | ||
// If it is already an address, just use it (after adding checksum) | ||
try { | ||
return [2 /*return*/, address_1.getAddress(name)]; | ||
} | ||
catch (error) { } | ||
if (!resolver) { | ||
logger.throwError("a provider or signer is needed to resolve ENS names", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "resolveName" | ||
}); | ||
} | ||
return [4 /*yield*/, resolver.resolveName(name)]; | ||
case 2: return [2 /*return*/, _a.sent()]; | ||
} | ||
}); | ||
}); | ||
} | ||
// Recursively replaces ENS names with promises to resolve the name and resolves all properties | ||
function resolveAddresses(signerOrProvider, value, paramType) { | ||
function resolveAddresses(resolver, value, paramType) { | ||
if (Array.isArray(paramType)) { | ||
return Promise.all(paramType.map(function (paramType, index) { | ||
return resolveAddresses(signerOrProvider, ((Array.isArray(value)) ? value[index] : value[paramType.name]), paramType); | ||
return resolveAddresses(resolver, ((Array.isArray(value)) ? value[index] : value[paramType.name]), paramType); | ||
})); | ||
} | ||
if (paramType.type === "address") { | ||
return signerOrProvider.resolveName(value); | ||
return resolveName(resolver, value); | ||
} | ||
if (paramType.type === "tuple") { | ||
return resolveAddresses(signerOrProvider, value, paramType.components); | ||
return resolveAddresses(resolver, value, paramType.components); | ||
} | ||
@@ -92,13 +120,49 @@ if (paramType.baseType === "array") { | ||
} | ||
return Promise.all(value.map(function (v) { return resolveAddresses(signerOrProvider, v, paramType.arrayChildren); })); | ||
return Promise.all(value.map(function (v) { return resolveAddresses(resolver, v, paramType.arrayChildren); })); | ||
} | ||
return Promise.resolve(value); | ||
} | ||
function _populateTransaction(contract, fragment, args, overrides) { | ||
function populateTransaction(contract, fragment, args) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var resolved, tx, ro, leftovers; | ||
var overrides, resolved, tx, ro, roValue, leftovers; | ||
var _this = this; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
overrides = properties_1.shallowCopy(overrides); | ||
overrides = {}; | ||
if (args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { | ||
overrides = properties_1.shallowCopy(args.pop()); | ||
} | ||
// Make sure the parameter count matches | ||
logger.checkArgumentCount(args.length, fragment.inputs.length, "passed to contract"); | ||
// Populate "from" override (allow promises) | ||
if (contract.signer) { | ||
if (overrides.from) { | ||
// Contracts with a Signer are from the Signer's frame-of-reference; | ||
// but we allow overriding "from" if it matches the signer | ||
overrides.from = properties_1.resolveProperties({ | ||
override: resolveName(contract.signer, overrides.from), | ||
signer: contract.signer.getAddress() | ||
}).then(function (check) { return __awaiter(_this, void 0, void 0, function () { | ||
return __generator(this, function (_a) { | ||
if (address_1.getAddress(check.signer) !== check.override) { | ||
logger.throwError("Contract with a Signer cannot override from", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "overrides.from" | ||
}); | ||
} | ||
return [2 /*return*/, check.override]; | ||
}); | ||
}); }); | ||
} | ||
else { | ||
overrides.from = contract.signer.getAddress(); | ||
} | ||
} | ||
else if (overrides.from) { | ||
overrides.from = resolveName(contract.provider, overrides.from); | ||
//} else { | ||
// Contracts without a signer can override "from", and if | ||
// unspecified the zero address is used | ||
//overrides.from = AddressZero; | ||
} | ||
return [4 /*yield*/, properties_1.resolveProperties({ | ||
@@ -116,2 +180,3 @@ args: resolveAddresses(contract.signer || contract.provider, args, fragment.inputs), | ||
ro = resolved.overrides; | ||
// Populate simple overrides | ||
if (ro.nonce != null) { | ||
@@ -126,42 +191,10 @@ tx.nonce = bignumber_1.BigNumber.from(ro.nonce).toNumber(); | ||
} | ||
// If there was no gasLimit override, but the ABI specifies one use it | ||
if (ro.from != null) { | ||
tx.from = ro.from; | ||
} | ||
// If there was no "gasLimit" override, but the ABI specifies a default, use it | ||
if (tx.gasLimit == null && fragment.gas != null) { | ||
tx.gasLimit = bignumber_1.BigNumber.from(fragment.gas).add(21000); | ||
} | ||
// Remvoe the overrides | ||
delete overrides.nonce; | ||
delete overrides.gasLimit; | ||
delete overrides.gasPrice; | ||
leftovers = Object.keys(overrides); | ||
if (leftovers.length) { | ||
logger.throwError("cannot override " + leftovers.map(function (l) { return JSON.stringify(l); }).join(","), logger_1.Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "overrides", | ||
keys: leftovers | ||
}); | ||
} | ||
return [2 /*return*/, tx]; | ||
} | ||
}); | ||
}); | ||
} | ||
function populateTransaction(contract, fragment, args, overrides) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var ro, value, tx, roValue; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
overrides = properties_1.shallowCopy(overrides); | ||
if (!(contract.deployTransaction != null)) return [3 /*break*/, 2]; | ||
return [4 /*yield*/, contract._deployed()]; | ||
case 1: | ||
_a.sent(); | ||
_a.label = 2; | ||
case 2: return [4 /*yield*/, properties_1.resolveProperties(overrides)]; | ||
case 3: | ||
ro = _a.sent(); | ||
value = overrides.value; | ||
delete overrides.value; | ||
return [4 /*yield*/, _populateTransaction(contract, fragment, args, overrides)]; | ||
case 4: | ||
tx = _a.sent(); | ||
// Populate "value" override | ||
if (ro.value) { | ||
@@ -172,3 +205,3 @@ roValue = bignumber_1.BigNumber.from(ro.value); | ||
operation: "overrides.value", | ||
value: value | ||
value: overrides.value | ||
}); | ||
@@ -178,37 +211,14 @@ } | ||
} | ||
return [2 /*return*/, tx]; | ||
} | ||
}); | ||
}); | ||
} | ||
function populateCallTransaction(contract, fragment, args, overrides) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var blockTag, ro, tx; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
overrides = properties_1.shallowCopy(overrides); | ||
if (!(contract.deployTransaction != null)) return [3 /*break*/, 4]; | ||
blockTag = undefined; | ||
if (!overrides.blockTag) return [3 /*break*/, 2]; | ||
return [4 /*yield*/, overrides.blockTag]; | ||
case 1: | ||
blockTag = _a.sent(); | ||
_a.label = 2; | ||
case 2: return [4 /*yield*/, contract._deployed(blockTag)]; | ||
case 3: | ||
_a.sent(); | ||
_a.label = 4; | ||
case 4: | ||
// Resolved Overrides | ||
delete overrides.blockTag; | ||
return [4 /*yield*/, properties_1.resolveProperties(overrides)]; | ||
case 5: | ||
ro = _a.sent(); | ||
// Remvoe the overrides | ||
delete overrides.nonce; | ||
delete overrides.gasLimit; | ||
delete overrides.gasPrice; | ||
delete overrides.from; | ||
return [4 /*yield*/, populateTransaction(contract, fragment, args, overrides)]; | ||
case 6: | ||
tx = _a.sent(); | ||
if (ro.from) { | ||
tx.from = this.interface.constructor.getAddress(ro.from); | ||
delete overrides.value; | ||
leftovers = Object.keys(overrides); | ||
if (leftovers.length) { | ||
logger.throwError("cannot override " + leftovers.map(function (l) { return JSON.stringify(l); }).join(","), logger_1.Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "overrides", | ||
overrides: leftovers | ||
}); | ||
} | ||
@@ -221,3 +231,2 @@ return [2 /*return*/, tx]; | ||
function buildPopulate(contract, fragment) { | ||
var populate = (fragment.constant) ? populateCallTransaction : populateTransaction; | ||
return function () { | ||
@@ -229,10 +238,4 @@ var args = []; | ||
return __awaiter(this, void 0, void 0, function () { | ||
var overrides; | ||
return __generator(this, function (_a) { | ||
overrides = null; | ||
if (args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { | ||
overrides = args.pop(); | ||
} | ||
logger.checkArgumentCount(args.length, fragment.inputs.length, "passed to contract"); | ||
return [2 /*return*/, populate(contract, fragment, args, overrides)]; | ||
return [2 /*return*/, populateTransaction(contract, fragment, args)]; | ||
}); | ||
@@ -244,3 +247,2 @@ }); | ||
var signerOrProvider = (contract.signer || contract.provider); | ||
var populate = (fragment.constant) ? populateCallTransaction : populateTransaction; | ||
return function () { | ||
@@ -252,15 +254,12 @@ var args = []; | ||
return __awaiter(this, void 0, void 0, function () { | ||
var overrides, tx; | ||
var tx; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
overrides = null; | ||
if (args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { | ||
overrides = args.pop(); | ||
} | ||
logger.checkArgumentCount(args.length, fragment.inputs.length, "passed to contract"); | ||
if (!signerOrProvider) { | ||
logger.throwError("estimate require a provider or signer", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: "estimateGas" }); | ||
logger.throwError("estimate require a provider or signer", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "estimateGas" | ||
}); | ||
} | ||
return [4 /*yield*/, populate(contract, fragment, args, overrides)]; | ||
return [4 /*yield*/, populateTransaction(contract, fragment, args)]; | ||
case 1: | ||
@@ -277,3 +276,2 @@ tx = _a.sent(); | ||
var signerOrProvider = (contract.signer || contract.provider); | ||
var populate = (fragment.constant) ? populateCallTransaction : populateTransaction; | ||
return function () { | ||
@@ -285,9 +283,8 @@ var args = []; | ||
return __awaiter(this, void 0, void 0, function () { | ||
var overrides, blockTag, tx, value, result; | ||
var blockTag, overrides, tx, result, value; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
overrides = null; | ||
blockTag = undefined; | ||
if (!(args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object")) return [3 /*break*/, 2]; | ||
if (!(args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object")) return [3 /*break*/, 3]; | ||
overrides = properties_1.shallowCopy(args.pop()); | ||
@@ -301,15 +298,22 @@ if (!overrides.blockTag) return [3 /*break*/, 2]; | ||
case 2: | ||
logger.checkArgumentCount(args.length, fragment.inputs.length, "passed to contract"); | ||
return [4 /*yield*/, populate(contract, fragment, args, overrides)]; | ||
args.push(overrides); | ||
_a.label = 3; | ||
case 3: | ||
if (!(contract.deployTransaction != null)) return [3 /*break*/, 5]; | ||
return [4 /*yield*/, contract._deployed(blockTag)]; | ||
case 4: | ||
_a.sent(); | ||
_a.label = 5; | ||
case 5: return [4 /*yield*/, populateTransaction(contract, fragment, args)]; | ||
case 6: | ||
tx = _a.sent(); | ||
return [4 /*yield*/, signerOrProvider.call(tx, blockTag)]; | ||
case 4: | ||
value = _a.sent(); | ||
case 7: | ||
result = _a.sent(); | ||
try { | ||
result = contract.interface.decodeFunctionResult(fragment, value); | ||
value = contract.interface.decodeFunctionResult(fragment, result); | ||
if (collapseSimple && fragment.outputs.length === 1) { | ||
result = result[0]; | ||
value = value[0]; | ||
} | ||
return [2 /*return*/, result]; | ||
return [2 /*return*/, value]; | ||
} | ||
@@ -337,3 +341,3 @@ catch (error) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var overrides, txRequest, tx, wait; | ||
var txRequest, tx, wait; | ||
var _this = this; | ||
@@ -344,17 +348,16 @@ return __generator(this, function (_a) { | ||
if (!contract.signer) { | ||
logger.throwError("sending a transaction requires a signer", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { operation: "sendTransaction" }); | ||
logger.throwError("sending a transaction requires a signer", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "sendTransaction" | ||
}); | ||
} | ||
overrides = null; | ||
if (args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { | ||
overrides = properties_1.shallowCopy(args.pop()); | ||
if (overrides.blockTag != null) { | ||
logger.throwArgumentError("cannot override \"blockTag\" in transaction", "overrides", overrides); | ||
} | ||
} | ||
logger.checkArgumentCount(args.length, fragment.inputs.length, "passed to contract"); | ||
return [4 /*yield*/, populateCallTransaction(contract, fragment, args, overrides)]; | ||
if (!(contract.deployTransaction != null)) return [3 /*break*/, 2]; | ||
return [4 /*yield*/, contract._deployed()]; | ||
case 1: | ||
_a.sent(); | ||
_a.label = 2; | ||
case 2: return [4 /*yield*/, populateTransaction(contract, fragment, args)]; | ||
case 3: | ||
txRequest = _a.sent(); | ||
return [4 /*yield*/, contract.signer.sendTransaction(txRequest)]; | ||
case 2: | ||
case 4: | ||
tx = _a.sent(); | ||
@@ -570,3 +573,7 @@ wait = tx.wait.bind(tx); | ||
properties_1.defineReadOnly(this, "interface", properties_1.getStatic((_newTarget), "getInterface")(contractInterface)); | ||
if (abstract_signer_1.Signer.isSigner(signerOrProvider)) { | ||
if (signerOrProvider == null) { | ||
properties_1.defineReadOnly(this, "provider", null); | ||
properties_1.defineReadOnly(this, "signer", null); | ||
} | ||
else if (abstract_signer_1.Signer.isSigner(signerOrProvider)) { | ||
properties_1.defineReadOnly(this, "provider", signerOrProvider.provider || null); | ||
@@ -632,7 +639,9 @@ properties_1.defineReadOnly(this, "signer", signerOrProvider); | ||
try { | ||
properties_1.defineReadOnly(this, "resolvedAddress", Promise.resolve((this.interface.constructor).getAddress(addressOrName))); | ||
properties_1.defineReadOnly(this, "resolvedAddress", Promise.resolve(address_1.getAddress(addressOrName))); | ||
} | ||
catch (error) { | ||
// Without a provider, we cannot use ENS names | ||
logger.throwArgumentError("provider is required to use non-address contract address", "addressOrName", addressOrName); | ||
logger.throwError("provider is required to use ENS name as contract address", logger_1.Logger.errors.UNSUPPORTED_OPERATION, { | ||
operation: "new Contract" | ||
}); | ||
} | ||
@@ -639,0 +648,0 @@ } |
@@ -12,4 +12,3 @@ { | ||
"@ethersproject/logger": ">=5.0.0-beta.137", | ||
"@ethersproject/properties": ">=5.0.0-beta.140", | ||
"@ethersproject/transactions": ">=5.0.0-beta.135" | ||
"@ethersproject/properties": ">=5.0.0-beta.140" | ||
}, | ||
@@ -36,5 +35,5 @@ "description": "Contract abstraction meta-class for ethers.", | ||
}, | ||
"tarballHash": "0xc7210dbd8a387e8ee1b090ba36f5393ab7167a7a5fbb2dea34fc938b2e5c67e6", | ||
"tarballHash": "0xccc2bced42f75b771c52745a7f9736b37b1adbb9d4e67c694c143422fe1e6ad4", | ||
"types": "./lib/index.d.ts", | ||
"version": "5.0.0-beta.154" | ||
"version": "5.0.0-beta.155" | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
106798
9
2355