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:
@ -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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user