Migrate utils to ethersjs v6 (#4736)

Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com>
Co-authored-by: ernestognw <ernestognw@gmail.com>
This commit is contained in:
Renan Souza
2023-11-24 01:32:30 +00:00
committed by GitHub
parent 330c39b662
commit 78d5708340
13 changed files with 497 additions and 602 deletions

View File

@ -1,19 +1,27 @@
const { ethers } = require('hardhat');
const { expect } = require('chai');
const { expectRevertCustomError } = require('../helpers/customError');
const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');
const ShortStrings = artifacts.require('$ShortStrings');
const FALLBACK_SENTINEL = ethers.zeroPadValue('0xFF', 32);
function length(sstr) {
return parseInt(sstr.slice(64), 16);
const length = sstr => parseInt(sstr.slice(64), 16);
const decode = sstr => ethers.toUtf8String(sstr).slice(0, length(sstr));
const encode = str =>
str.length < 32
? ethers.concat([
ethers.encodeBytes32String(str).slice(0, -2),
ethers.zeroPadValue(ethers.toBeArray(str.length), 1),
])
: FALLBACK_SENTINEL;
async function fixture() {
const mock = await ethers.deployContract('$ShortStrings');
return { mock };
}
function decode(sstr) {
return web3.utils.toUtf8(sstr).slice(0, length(sstr));
}
contract('ShortStrings', function () {
before(async function () {
this.mock = await ShortStrings.new();
describe('ShortStrings', function () {
beforeEach(async function () {
Object.assign(this, await loadFixture(fixture));
});
for (const str of [0, 1, 16, 31, 32, 64, 1024].map(length => 'a'.repeat(length))) {
@ -21,34 +29,35 @@ contract('ShortStrings', function () {
it('encode / decode', async function () {
if (str.length < 32) {
const encoded = await this.mock.$toShortString(str);
expect(decode(encoded)).to.be.equal(str);
expect(encoded).to.equal(encode(str));
expect(decode(encoded)).to.equal(str);
const length = await this.mock.$byteLength(encoded);
expect(length.toNumber()).to.be.equal(str.length);
const decoded = await this.mock.$toString(encoded);
expect(decoded).to.be.equal(str);
expect(await this.mock.$byteLength(encoded)).to.equal(str.length);
expect(await this.mock.$toString(encoded)).to.equal(str);
} else {
await expectRevertCustomError(this.mock.$toShortString(str), 'StringTooLong', [str]);
await expect(this.mock.$toShortString(str))
.to.be.revertedWithCustomError(this.mock, 'StringTooLong')
.withArgs(str);
}
});
it('set / get with fallback', async function () {
const { logs } = await this.mock.$toShortStringWithFallback(str, 0);
const { ret0 } = logs.find(({ event }) => event == 'return$toShortStringWithFallback').args;
const short = await this.mock
.$toShortStringWithFallback(str, 0)
.then(tx => tx.wait())
.then(receipt => receipt.logs.find(ev => ev.fragment.name == 'return$toShortStringWithFallback').args[0]);
const promise = this.mock.$toString(ret0);
expect(short).to.equal(encode(str));
const promise = this.mock.$toString(short);
if (str.length < 32) {
expect(await promise).to.be.equal(str);
expect(await promise).to.equal(str);
} else {
await expectRevertCustomError(promise, 'InvalidShortString', []);
await expect(promise).to.be.revertedWithCustomError(this.mock, 'InvalidShortString');
}
const length = await this.mock.$byteLengthWithFallback(ret0, 0);
expect(length.toNumber()).to.be.equal(str.length);
const recovered = await this.mock.$toStringWithFallback(ret0, 0);
expect(recovered).to.be.equal(str);
expect(await this.mock.$byteLengthWithFallback(short, 0)).to.equal(str.length);
expect(await this.mock.$toStringWithFallback(short, 0)).to.equal(str);
});
});
}