@nomicfoundation/hardhat-ethers-chai-matchers 3.0.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +9 -0
- package/README.md +52 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +16 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/internal/add-chai-matchers.d.ts +2 -0
- package/dist/src/internal/add-chai-matchers.d.ts.map +1 -0
- package/dist/src/internal/add-chai-matchers.js +41 -0
- package/dist/src/internal/add-chai-matchers.js.map +1 -0
- package/dist/src/internal/constants.d.ts +13 -0
- package/dist/src/internal/constants.d.ts.map +1 -0
- package/dist/src/internal/constants.js +13 -0
- package/dist/src/internal/constants.js.map +1 -0
- package/dist/src/internal/hook-handlers/network.d.ts +4 -0
- package/dist/src/internal/hook-handlers/network.d.ts.map +1 -0
- package/dist/src/internal/hook-handlers/network.js +15 -0
- package/dist/src/internal/hook-handlers/network.js.map +1 -0
- package/dist/src/internal/matchers/addressable.d.ts +2 -0
- package/dist/src/internal/matchers/addressable.d.ts.map +1 -0
- package/dist/src/internal/matchers/addressable.js +53 -0
- package/dist/src/internal/matchers/addressable.js.map +1 -0
- package/dist/src/internal/matchers/big-number.d.ts +2 -0
- package/dist/src/internal/matchers/big-number.d.ts.map +1 -0
- package/dist/src/internal/matchers/big-number.js +178 -0
- package/dist/src/internal/matchers/big-number.js.map +1 -0
- package/dist/src/internal/matchers/changeEtherBalance.d.ts +7 -0
- package/dist/src/internal/matchers/changeEtherBalance.d.ts.map +1 -0
- package/dist/src/internal/matchers/changeEtherBalance.js +77 -0
- package/dist/src/internal/matchers/changeEtherBalance.js.map +1 -0
- package/dist/src/internal/matchers/changeEtherBalances.d.ts +7 -0
- package/dist/src/internal/matchers/changeEtherBalances.d.ts.map +1 -0
- package/dist/src/internal/matchers/changeEtherBalances.js +96 -0
- package/dist/src/internal/matchers/changeEtherBalances.js.map +1 -0
- package/dist/src/internal/matchers/changeTokenBalance.d.ts +16 -0
- package/dist/src/internal/matchers/changeTokenBalance.d.ts.map +1 -0
- package/dist/src/internal/matchers/changeTokenBalance.js +148 -0
- package/dist/src/internal/matchers/changeTokenBalance.js.map +1 -0
- package/dist/src/internal/matchers/emit.d.ts +5 -0
- package/dist/src/internal/matchers/emit.d.ts.map +1 -0
- package/dist/src/internal/matchers/emit.js +122 -0
- package/dist/src/internal/matchers/emit.js.map +1 -0
- package/dist/src/internal/matchers/hexEqual.d.ts +2 -0
- package/dist/src/internal/matchers/hexEqual.d.ts.map +1 -0
- package/dist/src/internal/matchers/hexEqual.js +19 -0
- package/dist/src/internal/matchers/hexEqual.js.map +1 -0
- package/dist/src/internal/matchers/properAddress.d.ts +2 -0
- package/dist/src/internal/matchers/properAddress.d.ts.map +1 -0
- package/dist/src/internal/matchers/properAddress.js +7 -0
- package/dist/src/internal/matchers/properAddress.js.map +1 -0
- package/dist/src/internal/matchers/properHex.d.ts +2 -0
- package/dist/src/internal/matchers/properHex.d.ts.map +1 -0
- package/dist/src/internal/matchers/properHex.js +13 -0
- package/dist/src/internal/matchers/properHex.js.map +1 -0
- package/dist/src/internal/matchers/properPrivateKey.d.ts +2 -0
- package/dist/src/internal/matchers/properPrivateKey.d.ts.map +1 -0
- package/dist/src/internal/matchers/properPrivateKey.js +7 -0
- package/dist/src/internal/matchers/properPrivateKey.js.map +1 -0
- package/dist/src/internal/matchers/reverted/panic.d.ts +13 -0
- package/dist/src/internal/matchers/reverted/panic.d.ts.map +1 -0
- package/dist/src/internal/matchers/reverted/panic.js +36 -0
- package/dist/src/internal/matchers/reverted/panic.js.map +1 -0
- package/dist/src/internal/matchers/reverted/reverted.d.ts +2 -0
- package/dist/src/internal/matchers/reverted/reverted.d.ts.map +1 -0
- package/dist/src/internal/matchers/reverted/reverted.js +112 -0
- package/dist/src/internal/matchers/reverted/reverted.js.map +1 -0
- package/dist/src/internal/matchers/reverted/revertedWith.d.ts +2 -0
- package/dist/src/internal/matchers/reverted/revertedWith.d.ts.map +1 -0
- package/dist/src/internal/matchers/reverted/revertedWith.js +56 -0
- package/dist/src/internal/matchers/reverted/revertedWith.js.map +1 -0
- package/dist/src/internal/matchers/reverted/revertedWithCustomError.d.ts +5 -0
- package/dist/src/internal/matchers/reverted/revertedWithCustomError.d.ts.map +1 -0
- package/dist/src/internal/matchers/reverted/revertedWithCustomError.js +120 -0
- package/dist/src/internal/matchers/reverted/revertedWithCustomError.js.map +1 -0
- package/dist/src/internal/matchers/reverted/revertedWithPanic.d.ts +2 -0
- package/dist/src/internal/matchers/reverted/revertedWithPanic.d.ts.map +1 -0
- package/dist/src/internal/matchers/reverted/revertedWithPanic.js +74 -0
- package/dist/src/internal/matchers/reverted/revertedWithPanic.js.map +1 -0
- package/dist/src/internal/matchers/reverted/revertedWithoutReason.d.ts +2 -0
- package/dist/src/internal/matchers/reverted/revertedWithoutReason.d.ts.map +1 -0
- package/dist/src/internal/matchers/reverted/revertedWithoutReason.js +41 -0
- package/dist/src/internal/matchers/reverted/revertedWithoutReason.js.map +1 -0
- package/dist/src/internal/matchers/reverted/utils.d.ts +39 -0
- package/dist/src/internal/matchers/reverted/utils.d.ts.map +1 -0
- package/dist/src/internal/matchers/reverted/utils.js +108 -0
- package/dist/src/internal/matchers/reverted/utils.js.map +1 -0
- package/dist/src/internal/matchers/withArgs.d.ts +16 -0
- package/dist/src/internal/matchers/withArgs.d.ts.map +1 -0
- package/dist/src/internal/matchers/withArgs.js +88 -0
- package/dist/src/internal/matchers/withArgs.js.map +1 -0
- package/dist/src/internal/utils/account.d.ts +3 -0
- package/dist/src/internal/utils/account.d.ts.map +1 -0
- package/dist/src/internal/utils/account.js +15 -0
- package/dist/src/internal/utils/account.js.map +1 -0
- package/dist/src/internal/utils/asserts.d.ts +5 -0
- package/dist/src/internal/utils/asserts.d.ts.map +1 -0
- package/dist/src/internal/utils/asserts.js +73 -0
- package/dist/src/internal/utils/asserts.js.map +1 -0
- package/dist/src/internal/utils/balance.d.ts +8 -0
- package/dist/src/internal/utils/balance.d.ts.map +1 -0
- package/dist/src/internal/utils/balance.js +19 -0
- package/dist/src/internal/utils/balance.js.map +1 -0
- package/dist/src/internal/utils/bigint.d.ts +2 -0
- package/dist/src/internal/utils/bigint.d.ts.map +1 -0
- package/dist/src/internal/utils/bigint.js +4 -0
- package/dist/src/internal/utils/bigint.js.map +1 -0
- package/dist/src/internal/utils/build-assert.d.ts +19 -0
- package/dist/src/internal/utils/build-assert.d.ts.map +1 -0
- package/dist/src/internal/utils/build-assert.js +39 -0
- package/dist/src/internal/utils/build-assert.js.map +1 -0
- package/dist/src/internal/utils/ordinal.d.ts +8 -0
- package/dist/src/internal/utils/ordinal.d.ts.map +1 -0
- package/dist/src/internal/utils/ordinal.js +21 -0
- package/dist/src/internal/utils/ordinal.js.map +1 -0
- package/dist/src/internal/utils/prevent-chaining.d.ts +2 -0
- package/dist/src/internal/utils/prevent-chaining.d.ts.map +1 -0
- package/dist/src/internal/utils/prevent-chaining.js +17 -0
- package/dist/src/internal/utils/prevent-chaining.js.map +1 -0
- package/dist/src/internal/utils/ssfi.d.ts +4 -0
- package/dist/src/internal/utils/ssfi.d.ts.map +1 -0
- package/dist/src/internal/utils/ssfi.js +2 -0
- package/dist/src/internal/utils/ssfi.js.map +1 -0
- package/dist/src/internal/utils/typed.d.ts +2 -0
- package/dist/src/internal/utils/typed.d.ts.map +1 -0
- package/dist/src/internal/utils/typed.js +10 -0
- package/dist/src/internal/utils/typed.js.map +1 -0
- package/dist/src/panic.d.ts +2 -0
- package/dist/src/panic.d.ts.map +1 -0
- package/dist/src/panic.js +2 -0
- package/dist/src/panic.js.map +1 -0
- package/dist/src/type-extensions.d.ts +45 -0
- package/dist/src/type-extensions.d.ts.map +1 -0
- package/dist/src/type-extensions.js +2 -0
- package/dist/src/type-extensions.js.map +1 -0
- package/dist/src/withArgs.d.ts +2 -0
- package/dist/src/withArgs.d.ts.map +1 -0
- package/dist/src/withArgs.js +2 -0
- package/dist/src/withArgs.js.map +1 -0
- package/package.json +85 -0
- package/src/index.ts +21 -0
- package/src/internal/add-chai-matchers.ts +46 -0
- package/src/internal/constants.ts +13 -0
- package/src/internal/hook-handlers/network.ts +24 -0
- package/src/internal/matchers/addressable.ts +86 -0
- package/src/internal/matchers/big-number.ts +279 -0
- package/src/internal/matchers/changeEtherBalance.ts +138 -0
- package/src/internal/matchers/changeEtherBalances.ts +188 -0
- package/src/internal/matchers/changeTokenBalance.ts +295 -0
- package/src/internal/matchers/emit.ts +232 -0
- package/src/internal/matchers/hexEqual.ts +29 -0
- package/src/internal/matchers/properAddress.ts +12 -0
- package/src/internal/matchers/properHex.ts +29 -0
- package/src/internal/matchers/properPrivateKey.ts +12 -0
- package/src/internal/matchers/reverted/panic.ts +36 -0
- package/src/internal/matchers/reverted/reverted.ts +165 -0
- package/src/internal/matchers/reverted/revertedWith.ts +100 -0
- package/src/internal/matchers/reverted/revertedWithCustomError.ts +243 -0
- package/src/internal/matchers/reverted/revertedWithPanic.ts +118 -0
- package/src/internal/matchers/reverted/revertedWithoutReason.ts +73 -0
- package/src/internal/matchers/reverted/utils.ts +147 -0
- package/src/internal/matchers/withArgs.ts +139 -0
- package/src/internal/utils/account.ts +24 -0
- package/src/internal/utils/asserts.ts +156 -0
- package/src/internal/utils/balance.ts +39 -0
- package/src/internal/utils/bigint.ts +3 -0
- package/src/internal/utils/build-assert.ts +54 -0
- package/src/internal/utils/ordinal.ts +24 -0
- package/src/internal/utils/prevent-chaining.ts +33 -0
- package/src/internal/utils/ssfi.ts +6 -0
- package/src/internal/utils/typed.ts +9 -0
- package/src/panic.ts +1 -0
- package/src/type-extensions.ts +82 -0
- package/src/withArgs.ts +1 -0
@@ -0,0 +1,96 @@
|
|
1
|
+
import { HardhatError } from "@nomicfoundation/hardhat-errors";
|
2
|
+
import { toBigInt } from "ethers/utils";
|
3
|
+
import { CHANGE_ETHER_BALANCES_MATCHER } from "../constants.js";
|
4
|
+
import { getAddressOf } from "../utils/account.js";
|
5
|
+
import { assertIsNotNull } from "../utils/asserts.js";
|
6
|
+
import { getAddresses, getBalances } from "../utils/balance.js";
|
7
|
+
import { buildAssert } from "../utils/build-assert.js";
|
8
|
+
import { ordinal } from "../utils/ordinal.js";
|
9
|
+
import { preventAsyncMatcherChaining } from "../utils/prevent-chaining.js";
|
10
|
+
export function supportChangeEtherBalances(Assertion, chaiUtils) {
|
11
|
+
Assertion.addMethod(CHANGE_ETHER_BALANCES_MATCHER, function (provider, accounts, balanceChanges, options) {
|
12
|
+
// capture negated flag before async code executes; see buildAssert's jsdoc
|
13
|
+
const negated = this.__flags.negate;
|
14
|
+
let subject = this._obj;
|
15
|
+
if (typeof subject === "function") {
|
16
|
+
subject = subject();
|
17
|
+
}
|
18
|
+
preventAsyncMatcherChaining(this, CHANGE_ETHER_BALANCES_MATCHER, chaiUtils);
|
19
|
+
validateInput(this._obj, accounts, balanceChanges);
|
20
|
+
const checkBalanceChanges = ([actualChanges, accountAddresses]) => {
|
21
|
+
const assert = buildAssert(negated, checkBalanceChanges);
|
22
|
+
if (typeof balanceChanges === "function") {
|
23
|
+
assert(balanceChanges(actualChanges), "Expected the balance changes of the accounts to satisfy the predicate, but they didn't", "Expected the balance changes of the accounts to NOT satisfy the predicate, but they did");
|
24
|
+
}
|
25
|
+
else {
|
26
|
+
assert(actualChanges.every((change, ind) => change === toBigInt(balanceChanges[ind])), () => {
|
27
|
+
const lines = [];
|
28
|
+
actualChanges.forEach((change, i) => {
|
29
|
+
if (change !== toBigInt(balanceChanges[i])) {
|
30
|
+
lines.push(`Expected the ether balance of ${accountAddresses[i]} (the ${ordinal(i + 1)} address in the list) to change by ${balanceChanges[i].toString()} wei, but it changed by ${change.toString()} wei`);
|
31
|
+
}
|
32
|
+
});
|
33
|
+
return lines.join("\n");
|
34
|
+
}, () => {
|
35
|
+
const lines = [];
|
36
|
+
actualChanges.forEach((change, i) => {
|
37
|
+
if (change === toBigInt(balanceChanges[i])) {
|
38
|
+
lines.push(`Expected the ether balance of ${accountAddresses[i]} (the ${ordinal(i + 1)} address in the list) NOT to change by ${balanceChanges[i].toString()} wei, but it did`);
|
39
|
+
}
|
40
|
+
});
|
41
|
+
return lines.join("\n");
|
42
|
+
});
|
43
|
+
}
|
44
|
+
};
|
45
|
+
const derivedPromise = Promise.all([
|
46
|
+
getBalanceChanges(provider, subject, accounts, options),
|
47
|
+
getAddresses(accounts),
|
48
|
+
]).then(checkBalanceChanges);
|
49
|
+
this.then = derivedPromise.then.bind(derivedPromise);
|
50
|
+
this.catch = derivedPromise.catch.bind(derivedPromise);
|
51
|
+
this.promise = derivedPromise;
|
52
|
+
return this;
|
53
|
+
});
|
54
|
+
}
|
55
|
+
function validateInput(obj, accounts, balanceChanges) {
|
56
|
+
try {
|
57
|
+
if (Array.isArray(balanceChanges) &&
|
58
|
+
accounts.length !== balanceChanges.length) {
|
59
|
+
throw new HardhatError(HardhatError.ERRORS.CHAI_MATCHERS.ACCOUNTS_NUMBER_DIFFERENT_FROM_BALANCE_CHANGES, {
|
60
|
+
accounts: accounts.length,
|
61
|
+
balanceChanges: balanceChanges.length,
|
62
|
+
});
|
63
|
+
}
|
64
|
+
}
|
65
|
+
catch (e) {
|
66
|
+
// if the input validation fails, we discard the subject since it could
|
67
|
+
// potentially be a rejected promise
|
68
|
+
Promise.resolve(obj).catch(() => { });
|
69
|
+
throw e;
|
70
|
+
}
|
71
|
+
}
|
72
|
+
export async function getBalanceChanges(provider, transaction, accounts, options) {
|
73
|
+
const txResponse = await transaction;
|
74
|
+
const txReceipt = await txResponse.wait();
|
75
|
+
assertIsNotNull(txReceipt, "txReceipt");
|
76
|
+
const txBlockNumber = txReceipt.blockNumber;
|
77
|
+
const balancesAfter = await getBalances(provider, accounts, txBlockNumber);
|
78
|
+
const balancesBefore = await getBalances(provider, accounts, txBlockNumber - 1);
|
79
|
+
const txFees = await getTxFees(accounts, txResponse, options);
|
80
|
+
return balancesAfter.map((balance, ind) => balance + txFees[ind] - balancesBefore[ind]);
|
81
|
+
}
|
82
|
+
async function getTxFees(accounts, txResponse, options) {
|
83
|
+
return Promise.all(accounts.map(async (account) => {
|
84
|
+
if (options?.includeFee !== true &&
|
85
|
+
(await getAddressOf(account)) === txResponse.from) {
|
86
|
+
const txReceipt = await txResponse.wait();
|
87
|
+
assertIsNotNull(txReceipt, "txReceipt");
|
88
|
+
const gasPrice = txReceipt.gasPrice ?? txResponse.gasPrice;
|
89
|
+
const gasUsed = txReceipt.gasUsed;
|
90
|
+
const txFee = gasPrice * gasUsed;
|
91
|
+
return txFee;
|
92
|
+
}
|
93
|
+
return 0n;
|
94
|
+
}));
|
95
|
+
}
|
96
|
+
//# sourceMappingURL=changeEtherBalances.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"changeEtherBalances.js","sourceRoot":"","sources":["../../../../src/internal/matchers/changeEtherBalances.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import type { Addressable, BaseContract, BaseContractMethod, BigNumberish, ContractTransactionResponse } from "ethers";
|
2
|
+
import type { TransactionResponse } from "ethers/providers";
|
3
|
+
import type { EthereumProvider } from "hardhat/types/providers";
|
4
|
+
export type Token = BaseContract & {
|
5
|
+
balanceOf: BaseContractMethod<[string], bigint, bigint>;
|
6
|
+
name: BaseContractMethod<[], string, string>;
|
7
|
+
transfer: BaseContractMethod<[
|
8
|
+
string,
|
9
|
+
BigNumberish
|
10
|
+
], boolean, ContractTransactionResponse>;
|
11
|
+
symbol: BaseContractMethod<[], string, string>;
|
12
|
+
};
|
13
|
+
export declare function supportChangeTokenBalance(Assertion: Chai.AssertionStatic, chaiUtils: Chai.ChaiUtils): void;
|
14
|
+
export declare function getBalanceChange(provider: EthereumProvider, transaction: TransactionResponse | Promise<TransactionResponse>, token: Token, account: Addressable | string): Promise<bigint>;
|
15
|
+
export declare function clearTokenDescriptionsCache(): void;
|
16
|
+
//# sourceMappingURL=changeTokenBalance.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"changeTokenBalance.d.ts","sourceRoot":"","sources":["../../../../src/internal/matchers/changeTokenBalance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,2BAA2B,EAC5B,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAkBhE,MAAM,MAAM,KAAK,GAAG,YAAY,GAAG;IACjC,SAAS,EAAE,kBAAkB,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,IAAI,EAAE,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,QAAQ,EAAE,kBAAkB,CAC1B;QAAC,MAAM;QAAE,YAAY;KAAC,EACtB,OAAO,EACP,2BAA2B,CAC5B,CAAC;IACF,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,IAAI,CAAC,eAAe,EAC/B,SAAS,EAAE,IAAI,CAAC,SAAS,GACxB,IAAI,CAyIN;AAqDD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,EAC/D,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,WAAW,GAAG,MAAM,GAC5B,OAAO,CAAC,MAAM,CAAC,CA8BjB;AA2BD,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
|
@@ -0,0 +1,148 @@
|
|
1
|
+
import { assertHardhatInvariant, HardhatError, } from "@nomicfoundation/hardhat-errors";
|
2
|
+
import { isObject } from "@nomicfoundation/hardhat-utils/lang";
|
3
|
+
import { toBigInt } from "ethers/utils";
|
4
|
+
import { CHANGE_TOKEN_BALANCES_MATCHER, CHANGE_TOKEN_BALANCE_MATCHER, } from "../constants.js";
|
5
|
+
import { getAddressOf } from "../utils/account.js";
|
6
|
+
import { assertIsNotNull } from "../utils/asserts.js";
|
7
|
+
import { buildAssert } from "../utils/build-assert.js";
|
8
|
+
import { preventAsyncMatcherChaining } from "../utils/prevent-chaining.js";
|
9
|
+
export function supportChangeTokenBalance(Assertion, chaiUtils) {
|
10
|
+
Assertion.addMethod(CHANGE_TOKEN_BALANCE_MATCHER, function (provider, token, account, balanceChange) {
|
11
|
+
// capture negated flag before async code executes; see buildAssert's jsdoc
|
12
|
+
const negated = this.__flags.negate;
|
13
|
+
let subject = this._obj;
|
14
|
+
if (typeof subject === "function") {
|
15
|
+
subject = subject();
|
16
|
+
}
|
17
|
+
preventAsyncMatcherChaining(this, CHANGE_TOKEN_BALANCE_MATCHER, chaiUtils);
|
18
|
+
checkToken(token, CHANGE_TOKEN_BALANCE_MATCHER);
|
19
|
+
const checkBalanceChange = ([actualChange, address, tokenDescription]) => {
|
20
|
+
const assert = buildAssert(negated, checkBalanceChange);
|
21
|
+
if (typeof balanceChange === "function") {
|
22
|
+
assert(balanceChange(actualChange), `Expected the balance of ${tokenDescription} tokens for "${address}" to satisfy the predicate, but it didn't (token balance change: ${actualChange.toString()} wei)`, `Expected the balance of ${tokenDescription} tokens for "${address}" to NOT satisfy the predicate, but it did (token balance change: ${actualChange.toString()} wei)`);
|
23
|
+
}
|
24
|
+
else {
|
25
|
+
assert(actualChange === toBigInt(balanceChange), `Expected the balance of ${tokenDescription} tokens for "${address}" to change by ${balanceChange.toString()}, but it changed by ${actualChange.toString()}`, `Expected the balance of ${tokenDescription} tokens for "${address}" NOT to change by ${balanceChange.toString()}, but it did`);
|
26
|
+
}
|
27
|
+
};
|
28
|
+
const derivedPromise = Promise.all([
|
29
|
+
getBalanceChange(provider, subject, token, account),
|
30
|
+
getAddressOf(account),
|
31
|
+
getTokenDescription(token),
|
32
|
+
]).then(checkBalanceChange);
|
33
|
+
this.then = derivedPromise.then.bind(derivedPromise);
|
34
|
+
this.catch = derivedPromise.catch.bind(derivedPromise);
|
35
|
+
return this;
|
36
|
+
});
|
37
|
+
Assertion.addMethod(CHANGE_TOKEN_BALANCES_MATCHER, function (provider, token, accounts, balanceChanges) {
|
38
|
+
// capture negated flag before async code executes; see buildAssert's jsdoc
|
39
|
+
const negated = this.__flags.negate;
|
40
|
+
let subject = this._obj;
|
41
|
+
if (typeof subject === "function") {
|
42
|
+
subject = subject();
|
43
|
+
}
|
44
|
+
preventAsyncMatcherChaining(this, CHANGE_TOKEN_BALANCES_MATCHER, chaiUtils);
|
45
|
+
validateInput(this._obj, token, accounts, balanceChanges);
|
46
|
+
const balanceChangesPromise = Promise.all(accounts.map((account) => getBalanceChange(provider, subject, token, account)));
|
47
|
+
const addressesPromise = Promise.all(accounts.map(getAddressOf));
|
48
|
+
const checkBalanceChanges = ([actualChanges, addresses, tokenDescription,]) => {
|
49
|
+
const assert = buildAssert(negated, checkBalanceChanges);
|
50
|
+
if (typeof balanceChanges === "function") {
|
51
|
+
assert(balanceChanges(actualChanges), `Expected the balance changes of ${tokenDescription} to satisfy the predicate, but they didn't`, `Expected the balance changes of ${tokenDescription} to NOT satisfy the predicate, but they did`);
|
52
|
+
}
|
53
|
+
else {
|
54
|
+
assert(actualChanges.every((change, ind) => change === toBigInt(balanceChanges[ind])), `Expected the balances of ${tokenDescription} tokens for ${addresses.join(", ")} to change by ${balanceChanges.join(", ")}, respectively, but they changed by ${actualChanges.join(", ")}`, `Expected the balances of ${tokenDescription} tokens for ${addresses.join(", ")} NOT to change by ${balanceChanges.join(", ")}, respectively, but they did`);
|
55
|
+
}
|
56
|
+
};
|
57
|
+
const derivedPromise = Promise.all([
|
58
|
+
balanceChangesPromise,
|
59
|
+
addressesPromise,
|
60
|
+
getTokenDescription(token),
|
61
|
+
]).then(checkBalanceChanges);
|
62
|
+
this.then = derivedPromise.then.bind(derivedPromise);
|
63
|
+
this.catch = derivedPromise.catch.bind(derivedPromise);
|
64
|
+
return this;
|
65
|
+
});
|
66
|
+
}
|
67
|
+
function validateInput(obj, token, accounts, balanceChanges) {
|
68
|
+
try {
|
69
|
+
checkToken(token, CHANGE_TOKEN_BALANCES_MATCHER);
|
70
|
+
if (Array.isArray(balanceChanges) &&
|
71
|
+
accounts.length !== balanceChanges.length) {
|
72
|
+
throw new HardhatError(HardhatError.ERRORS.CHAI_MATCHERS.ACCOUNTS_NUMBER_DIFFERENT_FROM_BALANCE_CHANGES, {
|
73
|
+
accounts: accounts.length,
|
74
|
+
balanceChanges: balanceChanges.length,
|
75
|
+
});
|
76
|
+
}
|
77
|
+
}
|
78
|
+
catch (e) {
|
79
|
+
// if the input validation fails, we discard the subject since it could
|
80
|
+
// potentially be a rejected promise
|
81
|
+
Promise.resolve(obj).catch(() => { });
|
82
|
+
throw e;
|
83
|
+
}
|
84
|
+
}
|
85
|
+
function checkToken(token, method) {
|
86
|
+
if (!isObject(token) || token === null || !("interface" in token)) {
|
87
|
+
throw new HardhatError(HardhatError.ERRORS.CHAI_MATCHERS.FIRST_ARGUMENT_MUST_BE_A_CONTRACT_INSTANCE, {
|
88
|
+
method,
|
89
|
+
});
|
90
|
+
}
|
91
|
+
else if (isObject(token) &&
|
92
|
+
"interface" in token &&
|
93
|
+
isObject(token.interface) &&
|
94
|
+
"getFunction" in token.interface &&
|
95
|
+
typeof token.interface.getFunction === "function" &&
|
96
|
+
token.interface.getFunction("balanceOf") === null) {
|
97
|
+
throw new HardhatError(HardhatError.ERRORS.CHAI_MATCHERS.CONTRACT_IS_NOT_AN_ERC20_TOKEN);
|
98
|
+
}
|
99
|
+
}
|
100
|
+
export async function getBalanceChange(provider, transaction, token, account) {
|
101
|
+
const txResponse = await transaction;
|
102
|
+
const txReceipt = await txResponse.wait();
|
103
|
+
assertIsNotNull(txReceipt, "txReceipt");
|
104
|
+
const txBlockNumber = txReceipt.blockNumber;
|
105
|
+
const block = await provider.request({
|
106
|
+
method: "eth_getBlockByHash",
|
107
|
+
params: [txReceipt.blockHash, false],
|
108
|
+
});
|
109
|
+
assertHardhatInvariant(isObject(block) &&
|
110
|
+
Array.isArray(block.transactions) &&
|
111
|
+
block.transactions.length === 1, "There should be only 1 transaction in the block");
|
112
|
+
const address = await getAddressOf(account);
|
113
|
+
const balanceAfter = await token.balanceOf(address, {
|
114
|
+
blockTag: txBlockNumber,
|
115
|
+
});
|
116
|
+
const balanceBefore = await token.balanceOf(address, {
|
117
|
+
blockTag: txBlockNumber - 1,
|
118
|
+
});
|
119
|
+
return toBigInt(balanceAfter) - balanceBefore;
|
120
|
+
}
|
121
|
+
let tokenDescriptionsCache = {};
|
122
|
+
/**
|
123
|
+
* Get a description for the given token. Use the symbol of the token if
|
124
|
+
* possible; if it doesn't exist, the name is used; if the name doesn't
|
125
|
+
* exist, the address of the token is used.
|
126
|
+
*/
|
127
|
+
async function getTokenDescription(token) {
|
128
|
+
const tokenAddress = await token.getAddress();
|
129
|
+
if (tokenDescriptionsCache[tokenAddress] === undefined) {
|
130
|
+
let tokenDescription = `<token at ${tokenAddress}>`;
|
131
|
+
try {
|
132
|
+
tokenDescription = await token.symbol();
|
133
|
+
}
|
134
|
+
catch (e) {
|
135
|
+
try {
|
136
|
+
tokenDescription = await token.name();
|
137
|
+
}
|
138
|
+
catch (e2) { }
|
139
|
+
}
|
140
|
+
tokenDescriptionsCache[tokenAddress] = tokenDescription;
|
141
|
+
}
|
142
|
+
return tokenDescriptionsCache[tokenAddress];
|
143
|
+
}
|
144
|
+
// only used by tests
|
145
|
+
export function clearTokenDescriptionsCache() {
|
146
|
+
tokenDescriptionsCache = {};
|
147
|
+
}
|
148
|
+
//# sourceMappingURL=changeTokenBalance.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"changeTokenBalance.js","sourceRoot":"","sources":["../../../../src/internal/matchers/changeTokenBalance.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
import type { Ssfi } from "../utils/ssfi.js";
|
2
|
+
export declare const EMIT_CALLED = "emitAssertionCalled";
|
3
|
+
export declare function supportEmit(Assertion: Chai.AssertionStatic, chaiUtils: Chai.ChaiUtils): void;
|
4
|
+
export declare function emitWithArgs(context: any, Assertion: Chai.AssertionStatic, chaiUtils: Chai.ChaiUtils, expectedArgs: any[], ssfi: Ssfi): Promise<void>;
|
5
|
+
//# sourceMappingURL=emit.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../../src/internal/matchers/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAgB7D,eAAO,MAAM,WAAW,wBAAwB,CAAC;AAyBjD,wBAAgB,WAAW,CACzB,SAAS,EAAE,IAAI,CAAC,eAAe,EAC/B,SAAS,EAAE,IAAI,CAAC,SAAS,GACxB,IAAI,CAuGN;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,IAAI,CAAC,eAAe,EAC/B,SAAS,EAAE,IAAI,CAAC,SAAS,EACzB,YAAY,EAAE,GAAG,EAAE,EACnB,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,IAAI,CAAC,CAaf"}
|
@@ -0,0 +1,122 @@
|
|
1
|
+
import util from "node:util";
|
2
|
+
import { HardhatError } from "@nomicfoundation/hardhat-errors";
|
3
|
+
import { AssertionError } from "chai";
|
4
|
+
import { ASSERTION_ABORTED, EMIT_MATCHER } from "../constants.js";
|
5
|
+
import { assertArgsArraysEqual, assertIsNotNull } from "../utils/asserts.js";
|
6
|
+
import { buildAssert } from "../utils/build-assert.js";
|
7
|
+
import { preventAsyncMatcherChaining } from "../utils/prevent-chaining.js";
|
8
|
+
export const EMIT_CALLED = "emitAssertionCalled";
|
9
|
+
async function waitForPendingTransaction(tx, provider) {
|
10
|
+
let hash;
|
11
|
+
if (tx instanceof Promise) {
|
12
|
+
({ hash } = await tx);
|
13
|
+
}
|
14
|
+
else if (typeof tx === "string") {
|
15
|
+
hash = tx;
|
16
|
+
}
|
17
|
+
else {
|
18
|
+
({ hash } = tx);
|
19
|
+
}
|
20
|
+
if (hash === null) {
|
21
|
+
throw new HardhatError(HardhatError.ERRORS.CHAI_MATCHERS.INVALID_TRANSACTION, { transaction: JSON.stringify(tx) });
|
22
|
+
}
|
23
|
+
return provider.getTransactionReceipt(hash);
|
24
|
+
}
|
25
|
+
export function supportEmit(Assertion, chaiUtils) {
|
26
|
+
Assertion.addMethod(EMIT_MATCHER, function (contract, eventName, ...args) {
|
27
|
+
// capture negated flag before async code executes; see buildAssert's jsdoc
|
28
|
+
const negated = this.__flags.negate;
|
29
|
+
const tx = this._obj;
|
30
|
+
preventAsyncMatcherChaining(this, EMIT_MATCHER, chaiUtils, true);
|
31
|
+
const promise = this.then === undefined ? Promise.resolve() : this;
|
32
|
+
const onSuccess = (receipt) => {
|
33
|
+
// abort if the assertion chain was aborted, for example because
|
34
|
+
// a `.not` was combined with a `.withArgs`
|
35
|
+
if (chaiUtils.flag(this, ASSERTION_ABORTED) === true) {
|
36
|
+
return;
|
37
|
+
}
|
38
|
+
const assert = buildAssert(negated, onSuccess);
|
39
|
+
let eventFragment = null;
|
40
|
+
try {
|
41
|
+
eventFragment = contract.interface.getEvent(eventName, []);
|
42
|
+
}
|
43
|
+
catch (e) {
|
44
|
+
if (e instanceof TypeError) {
|
45
|
+
const errorMessage = e.message.split(" (argument=")[0];
|
46
|
+
// eslint-disable-next-line no-restricted-syntax -- keep the original chai error structure
|
47
|
+
throw new AssertionError(errorMessage);
|
48
|
+
}
|
49
|
+
}
|
50
|
+
if (eventFragment === null) {
|
51
|
+
// eslint-disable-next-line no-restricted-syntax -- keep the original chai error structure
|
52
|
+
throw new AssertionError(`Event "${eventName}" doesn't exist in the contract`);
|
53
|
+
}
|
54
|
+
const topic = eventFragment.topicHash;
|
55
|
+
const contractAddress = contract.target;
|
56
|
+
if (typeof contractAddress !== "string") {
|
57
|
+
throw new HardhatError(HardhatError.ERRORS.CHAI_MATCHERS.CONTRACT_TARGET_MUST_BE_A_STRING);
|
58
|
+
}
|
59
|
+
if (args.length > 0) {
|
60
|
+
throw new HardhatError(HardhatError.ERRORS.CHAI_MATCHERS.EMIT_EXPECTS_TWO_ARGUMENTS);
|
61
|
+
}
|
62
|
+
this.logs = receipt.logs
|
63
|
+
.filter((log) => log.topics.includes(topic))
|
64
|
+
.filter((log) => log.address.toLowerCase() === contractAddress.toLowerCase());
|
65
|
+
assert(this.logs.length > 0, `Expected event "${eventName}" to be emitted, but it wasn't`, `Expected event "${eventName}" NOT to be emitted, but it was`);
|
66
|
+
chaiUtils.flag(this, "eventName", eventName);
|
67
|
+
chaiUtils.flag(this, "contract", contract);
|
68
|
+
};
|
69
|
+
const derivedPromise = promise.then(() => {
|
70
|
+
// abort if the assertion chain was aborted, for example because
|
71
|
+
// a `.not` was combined with a `.withArgs`
|
72
|
+
if (chaiUtils.flag(this, ASSERTION_ABORTED) === true) {
|
73
|
+
return;
|
74
|
+
}
|
75
|
+
if (contract.runner === null || contract.runner.provider === null) {
|
76
|
+
throw new HardhatError(HardhatError.ERRORS.CHAI_MATCHERS.CONTRACT_RUNNER_PROVIDER_NOT_NULL);
|
77
|
+
}
|
78
|
+
return waitForPendingTransaction(tx, contract.runner.provider).then((receipt) => {
|
79
|
+
assertIsNotNull(receipt, "receipt");
|
80
|
+
return onSuccess(receipt);
|
81
|
+
});
|
82
|
+
});
|
83
|
+
chaiUtils.flag(this, EMIT_CALLED, true);
|
84
|
+
this.then = derivedPromise.then.bind(derivedPromise);
|
85
|
+
this.catch = derivedPromise.catch.bind(derivedPromise);
|
86
|
+
this.promise = derivedPromise;
|
87
|
+
return this;
|
88
|
+
});
|
89
|
+
}
|
90
|
+
export async function emitWithArgs(context, Assertion, chaiUtils, expectedArgs, ssfi) {
|
91
|
+
const negated = false; // .withArgs cannot be negated
|
92
|
+
const assert = buildAssert(negated, ssfi);
|
93
|
+
tryAssertArgsArraysEqual(context, Assertion, chaiUtils, expectedArgs, context.logs, assert, ssfi);
|
94
|
+
}
|
95
|
+
const tryAssertArgsArraysEqual = (context, Assertion, chaiUtils, expectedArgs, logs, assert, ssfi) => {
|
96
|
+
const eventName = chaiUtils.flag(context, "eventName");
|
97
|
+
if (logs.length === 1) {
|
98
|
+
const parsedLog = chaiUtils
|
99
|
+
.flag(context, "contract")
|
100
|
+
.interface.parseLog(logs[0]);
|
101
|
+
assertIsNotNull(parsedLog, "parsedLog");
|
102
|
+
return assertArgsArraysEqual(Assertion, expectedArgs, parsedLog.args, `"${eventName}" event`, "event", assert, ssfi);
|
103
|
+
}
|
104
|
+
for (const index in logs) {
|
105
|
+
if (index === undefined) {
|
106
|
+
break;
|
107
|
+
}
|
108
|
+
else {
|
109
|
+
try {
|
110
|
+
const parsedLog = chaiUtils
|
111
|
+
.flag(context, "contract")
|
112
|
+
.interface.parseLog(logs[index]);
|
113
|
+
assertIsNotNull(parsedLog, "parsedLog");
|
114
|
+
assertArgsArraysEqual(Assertion, expectedArgs, parsedLog.args, `"${eventName}" event`, "event", assert, ssfi);
|
115
|
+
return;
|
116
|
+
}
|
117
|
+
catch { }
|
118
|
+
}
|
119
|
+
}
|
120
|
+
assert(false, `The specified arguments (${util.inspect(expectedArgs)}) were not included in any of the ${context.logs.length} emitted "${eventName}" events`);
|
121
|
+
};
|
122
|
+
//# sourceMappingURL=emit.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../../../src/internal/matchers/emit.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"hexEqual.d.ts","sourceRoot":"","sources":["../../../../src/internal/matchers/hexEqual.ts"],"names":[],"mappings":"AAAA,wBAAgB,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CA4BrE"}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
export function supportHexEqual(Assertion) {
|
2
|
+
Assertion.addMethod("hexEqual", function (other) {
|
3
|
+
const subject = this._obj;
|
4
|
+
const isNegated = this.__flags.negate === true;
|
5
|
+
// check that both values are proper hex strings
|
6
|
+
const isHex = (a) => /^0x[0-9a-fA-F]*$/.test(a);
|
7
|
+
for (const element of [subject, other]) {
|
8
|
+
if (!isHex(element)) {
|
9
|
+
this.assert(isNegated, // trick to make this assertion always fail
|
10
|
+
`Expected "${subject}" to be a hex string equal to "${other}", but "${element}" is not a valid hex string`, `Expected "${subject}" not to be a hex string equal to "${other}", but "${element}" is not a valid hex string`);
|
11
|
+
}
|
12
|
+
}
|
13
|
+
// compare values
|
14
|
+
const extractNumeric = (hex) => hex.replace(/^0x0*/, "");
|
15
|
+
this.assert(extractNumeric(subject.toLowerCase()) ===
|
16
|
+
extractNumeric(other.toLowerCase()), `Expected "${subject}" to be a hex string equal to "${other}"`, `Expected "${subject}" NOT to be a hex string equal to "${other}", but it was`, `Hex string representing the same number as ${other}`, subject);
|
17
|
+
});
|
18
|
+
}
|
19
|
+
//# sourceMappingURL=hexEqual.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"hexEqual.js","sourceRoot":"","sources":["../../../../src/internal/matchers/hexEqual.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAC,SAA+B;IAC7D,SAAS,CAAC,SAAS,CAAC,UAAU,EAAE,UAAqB,KAAa;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC;QAE/C,gDAAgD;QAChD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxD,KAAK,MAAM,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpB,IAAI,CAAC,MAAM,CACT,SAAS,EAAE,2CAA2C;gBACtD,aAAa,OAAO,kCAAkC,KAAK,WAAW,OAAO,6BAA6B,EAC1G,aAAa,OAAO,sCAAsC,KAAK,WAAW,OAAO,6BAA6B,CAC/G,CAAC;YACJ,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CACT,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACnC,cAAc,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EACrC,aAAa,OAAO,kCAAkC,KAAK,GAAG,EAC9D,aAAa,OAAO,sCAAsC,KAAK,eAAe,EAC9E,8CAA8C,KAAK,EAAE,EACrD,OAAO,CACR,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"properAddress.d.ts","sourceRoot":"","sources":["../../../../src/internal/matchers/properAddress.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAW1E"}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
export function supportProperAddress(Assertion) {
|
2
|
+
Assertion.addProperty("properAddress", function () {
|
3
|
+
const subject = this._obj;
|
4
|
+
this.assert(/^0x[0-9a-fA-F]{40}$/.test(subject), `Expected "${subject}" to be a proper address`, `Expected "${subject}" NOT to be a proper address`, "proper address (eg.: 0x1234567890123456789012345678901234567890)", subject);
|
5
|
+
});
|
6
|
+
}
|
7
|
+
//# sourceMappingURL=properAddress.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"properAddress.js","sourceRoot":"","sources":["../../../../src/internal/matchers/properAddress.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB,CAAC,SAA+B;IAClE,SAAS,CAAC,WAAW,CAAC,eAAe,EAAE;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,MAAM,CACT,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EACnC,aAAa,OAAO,0BAA0B,EAC9C,aAAa,OAAO,8BAA8B,EAClD,kEAAkE,EAClE,OAAO,CACR,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"properHex.d.ts","sourceRoot":"","sources":["../../../../src/internal/matchers/properHex.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CA4BtE"}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
export function supportProperHex(Assertion) {
|
2
|
+
Assertion.addMethod("properHex", function (length) {
|
3
|
+
const subject = this._obj;
|
4
|
+
const isNegated = this.__flags.negate === true;
|
5
|
+
const isHex = (a) => /^0x[0-9a-fA-F]*$/.test(a);
|
6
|
+
if (!isHex(subject)) {
|
7
|
+
this.assert(isNegated, // trick to make this assertion always fail
|
8
|
+
`Expected "${subject}" to be a proper hex string, but it contains invalid (non-hex) characters`, `Expected "${subject}" NOT to be a proper hex string, but it contains only valid hex characters`);
|
9
|
+
}
|
10
|
+
this.assert(subject.length === length + 2, `Expected "${subject}" to be a hex string of length ${length + 2} (the provided ${length} plus 2 more for the "0x" prefix), but its length is ${subject.length}`, `Expected "${subject}" NOT to be a hex string of length ${length + 2} (the provided ${length} plus 2 more for the "0x" prefix), but its length is ${subject.length}`);
|
11
|
+
});
|
12
|
+
}
|
13
|
+
//# sourceMappingURL=properHex.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"properHex.js","sourceRoot":"","sources":["../../../../src/internal/matchers/properHex.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,SAA+B;IAC9D,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,UAAqB,MAAc;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC;QAE/C,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CACT,SAAS,EAAE,2CAA2C;YACtD,aAAa,OAAO,2EAA2E,EAC/F,aAAa,OAAO,4EAA4E,CACjG,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CACT,OAAO,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,EAC7B,aAAa,OAAO,kCAClB,MAAM,GAAG,CACX,kBAAkB,MAAM,wDACtB,OAAO,CAAC,MACV,EAAE,EACF,aAAa,OAAO,sCAClB,MAAM,GAAG,CACX,kBAAkB,MAAM,wDACtB,OAAO,CAAC,MACV,EAAE,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"properPrivateKey.d.ts","sourceRoot":"","sources":["../../../../src/internal/matchers/properPrivateKey.ts"],"names":[],"mappings":"AAAA,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAW7E"}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
export function supportProperPrivateKey(Assertion) {
|
2
|
+
Assertion.addProperty("properPrivateKey", function () {
|
3
|
+
const subject = this._obj;
|
4
|
+
this.assert(/^0x[0-9a-fA-F]{64}$/.test(subject), `Expected "${subject}" to be a proper private key`, `Expected "${subject}" NOT to be a proper private key`, "proper private key (eg.: 0x1010101010101010101010101010101010101010101010101010101010101010)", subject);
|
5
|
+
});
|
6
|
+
}
|
7
|
+
//# sourceMappingURL=properPrivateKey.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"properPrivateKey.js","sourceRoot":"","sources":["../../../../src/internal/matchers/properPrivateKey.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,uBAAuB,CAAC,SAA+B;IACrE,SAAS,CAAC,WAAW,CAAC,kBAAkB,EAAE;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,MAAM,CACT,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EACnC,aAAa,OAAO,8BAA8B,EAClD,aAAa,OAAO,kCAAkC,EACtD,8FAA8F,EAC9F,OAAO,CACR,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
export declare const PANIC_CODES: {
|
2
|
+
ASSERTION_ERROR: number;
|
3
|
+
ARITHMETIC_OVERFLOW: number;
|
4
|
+
DIVISION_BY_ZERO: number;
|
5
|
+
ENUM_CONVERSION_OUT_OF_BOUNDS: number;
|
6
|
+
INCORRECTLY_ENCODED_STORAGE_BYTE_ARRAY: number;
|
7
|
+
POP_ON_EMPTY_ARRAY: number;
|
8
|
+
ARRAY_ACCESS_OUT_OF_BOUNDS: number;
|
9
|
+
TOO_MUCH_MEMORY_ALLOCATED: number;
|
10
|
+
ZERO_INITIALIZED_VARIABLE: number;
|
11
|
+
};
|
12
|
+
export declare function panicErrorCodeToReason(errorCode: bigint): string | undefined;
|
13
|
+
//# sourceMappingURL=panic.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"panic.d.ts","sourceRoot":"","sources":["../../../../../src/internal/matchers/reverted/panic.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;;;;;;;;;;CAUvB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAuB5E"}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
export const PANIC_CODES = {
|
2
|
+
ASSERTION_ERROR: 0x1,
|
3
|
+
ARITHMETIC_OVERFLOW: 0x11,
|
4
|
+
DIVISION_BY_ZERO: 0x12,
|
5
|
+
ENUM_CONVERSION_OUT_OF_BOUNDS: 0x21,
|
6
|
+
INCORRECTLY_ENCODED_STORAGE_BYTE_ARRAY: 0x22,
|
7
|
+
POP_ON_EMPTY_ARRAY: 0x31,
|
8
|
+
ARRAY_ACCESS_OUT_OF_BOUNDS: 0x32,
|
9
|
+
TOO_MUCH_MEMORY_ALLOCATED: 0x41,
|
10
|
+
ZERO_INITIALIZED_VARIABLE: 0x51,
|
11
|
+
};
|
12
|
+
export function panicErrorCodeToReason(errorCode) {
|
13
|
+
switch (errorCode) {
|
14
|
+
case 0x1n:
|
15
|
+
return "Assertion error";
|
16
|
+
case 0x11n:
|
17
|
+
return "Arithmetic operation overflowed outside of an unchecked block";
|
18
|
+
case 0x12n:
|
19
|
+
return "Division or modulo division by zero";
|
20
|
+
case 0x21n:
|
21
|
+
return "Tried to convert a value into an enum, but the value was too big or negative";
|
22
|
+
case 0x22n:
|
23
|
+
return "Incorrectly encoded storage byte array";
|
24
|
+
case 0x31n:
|
25
|
+
return ".pop() was called on an empty array";
|
26
|
+
case 0x32n:
|
27
|
+
return "Array accessed at an out-of-bounds or negative index";
|
28
|
+
case 0x41n:
|
29
|
+
return "Too much memory was allocated, or an array was created that is too large";
|
30
|
+
case 0x51n:
|
31
|
+
return "Called a zero-initialized variable of internal function type";
|
32
|
+
default:
|
33
|
+
return undefined;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
//# sourceMappingURL=panic.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"panic.js","sourceRoot":"","sources":["../../../../../src/internal/matchers/reverted/panic.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,eAAe,EAAE,GAAG;IACpB,mBAAmB,EAAE,IAAI;IACzB,gBAAgB,EAAE,IAAI;IACtB,6BAA6B,EAAE,IAAI;IACnC,sCAAsC,EAAE,IAAI;IAC5C,kBAAkB,EAAE,IAAI;IACxB,0BAA0B,EAAE,IAAI;IAChC,yBAAyB,EAAE,IAAI;IAC/B,yBAAyB,EAAE,IAAI;CAChC,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,QAAQ,SAAS,EAAE,CAAC;QAClB,KAAK,IAAI;YACP,OAAO,iBAAiB,CAAC;QAC3B,KAAK,KAAK;YACR,OAAO,+DAA+D,CAAC;QACzE,KAAK,KAAK;YACR,OAAO,qCAAqC,CAAC;QAC/C,KAAK,KAAK;YACR,OAAO,8EAA8E,CAAC;QACxF,KAAK,KAAK;YACR,OAAO,wCAAwC,CAAC;QAClD,KAAK,KAAK;YACR,OAAO,qCAAqC,CAAC;QAC/C,KAAK,KAAK;YACR,OAAO,sDAAsD,CAAC;QAChE,KAAK,KAAK;YACR,OAAO,0EAA0E,CAAC;QACpF,KAAK,KAAK;YACR,OAAO,8DAA8D,CAAC;QACxE;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"reverted.d.ts","sourceRoot":"","sources":["../../../../../src/internal/matchers/reverted/reverted.ts"],"names":[],"mappings":"AAgBA,wBAAgB,eAAe,CAC7B,SAAS,EAAE,IAAI,CAAC,eAAe,EAC/B,SAAS,EAAE,IAAI,CAAC,SAAS,GACxB,IAAI,CA2GN"}
|