mirror of
https://github.com/luxfi/uma.git
synced 2026-10-30 15:14:44 +00:00
153 lines
6.3 KiB
JavaScript
153 lines
6.3 KiB
JavaScript
const hre = require("hardhat");
|
|
const { getContract } = hre;
|
|
const { assert } = require("chai");
|
|
|
|
const AncillaryDataTest = getContract("AncillaryDataTest");
|
|
const { utf8ToHex, padRight } = web3.utils;
|
|
|
|
describe("AncillaryData", function () {
|
|
let ancillaryDataTest;
|
|
let accounts;
|
|
|
|
before(async function () {
|
|
accounts = await web3.eth.getAccounts();
|
|
ancillaryDataTest = await AncillaryDataTest.new().send({ from: accounts[0] });
|
|
});
|
|
|
|
it("toUtf8BytesAddress", async function () {
|
|
const utf8EncodedAddress = await ancillaryDataTest.methods
|
|
.toUtf8BytesAddress(ancillaryDataTest.options.address)
|
|
.call();
|
|
assert.equal(
|
|
utf8EncodedAddress,
|
|
utf8ToHex(ancillaryDataTest.options.address.substr(2).toLowerCase()),
|
|
"Should strip leading 0x and return in all lower case"
|
|
);
|
|
});
|
|
|
|
it("toUtf8BytesUint", async function () {
|
|
const utf8EncodedUint = await ancillaryDataTest.methods.toUtf8BytesUint("31337").call();
|
|
assert.equal(utf8EncodedUint, utf8ToHex("31337"));
|
|
});
|
|
|
|
it("constructPrefix", async function () {
|
|
const keyName = utf8ToHex("key");
|
|
let originalAncillaryData;
|
|
|
|
// Test 1: ancillary data is empty
|
|
originalAncillaryData = "0x";
|
|
assert.equal(
|
|
await ancillaryDataTest.methods.constructPrefix(originalAncillaryData, keyName).call(),
|
|
utf8ToHex("key:"),
|
|
"Should return key: with no leading comma"
|
|
);
|
|
|
|
// Test 2: ancillary data is not empty
|
|
originalAncillaryData = "0xab";
|
|
assert.equal(
|
|
await ancillaryDataTest.methods.constructPrefix(originalAncillaryData, keyName).call(),
|
|
utf8ToHex(",key:"),
|
|
"Should return key: with leading comma"
|
|
);
|
|
});
|
|
it("appendKeyValueBytes32", async function () {
|
|
let originalAncillaryData, appendedAncillaryData;
|
|
const keyName = utf8ToHex("bytes32");
|
|
const value = padRight(utf8ToHex("SOMETHING RANDOM"), 64); // Random bytes32 string
|
|
const keyValueLengthBytes = 9 + 64; // "," + "bytes32:" + <value> = 1 + 8 + 64 bytes.
|
|
|
|
// Test 1: append AFTER ancillary data:
|
|
originalAncillaryData = utf8ToHex("key:value");
|
|
assert.equal(
|
|
await ancillaryDataTest.methods.appendKeyValueBytes32(originalAncillaryData, keyName, value).call(),
|
|
utf8ToHex(`key:value,bytes32:${value.substr(2).toLowerCase()}`),
|
|
"Should append key:value to original ancillary data"
|
|
);
|
|
|
|
// Test 2: ancillary data is not utf8 decodeable:
|
|
originalAncillaryData = "0xab";
|
|
appendedAncillaryData = await ancillaryDataTest.methods
|
|
.appendKeyValueBytes32(originalAncillaryData, keyName, value)
|
|
.call();
|
|
assert.equal(
|
|
"0x" + appendedAncillaryData.substr(appendedAncillaryData.length - keyValueLengthBytes * 2),
|
|
utf8ToHex(`,bytes32:${value.substr(2).toLowerCase()}`),
|
|
"Should be able to decode appended ancillary data after stripping out non-utf8 decodeable component"
|
|
);
|
|
|
|
// Test 3: ancillary data is utf8 decodeable but not key:value syntax:
|
|
originalAncillaryData = utf8ToHex("ignore this syntax");
|
|
assert.equal(
|
|
await ancillaryDataTest.methods.appendKeyValueBytes32(originalAncillaryData, keyName, value).call(),
|
|
utf8ToHex(`ignore this syntax,bytes32:${value.substr(2).toLowerCase()}`),
|
|
"Should be able to utf8-decode the entire ancillary data"
|
|
);
|
|
});
|
|
it("appendKeyValueAddress", async function () {
|
|
let originalAncillaryData, appendedAncillaryData;
|
|
const keyName = utf8ToHex("address");
|
|
const value = ancillaryDataTest.options.address;
|
|
const keyValueLengthBytes = 9 + 40; // "," + "address:" + <address> = 1 + 8 + 49 bytes.
|
|
|
|
// Test 1: append AFTER ancillary data:
|
|
originalAncillaryData = utf8ToHex("key:value");
|
|
assert.equal(
|
|
await ancillaryDataTest.methods.appendKeyValueAddress(originalAncillaryData, keyName, value).call(),
|
|
utf8ToHex(`key:value,address:${value.substr(2).toLowerCase()}`),
|
|
"Should append key:valueAddress to original ancillary data"
|
|
);
|
|
|
|
// Test 2: ancillary data is not utf8 decodeable:
|
|
originalAncillaryData = "0xab";
|
|
appendedAncillaryData = await ancillaryDataTest.methods
|
|
.appendKeyValueAddress(originalAncillaryData, keyName, value)
|
|
.call();
|
|
assert.equal(
|
|
"0x" + appendedAncillaryData.substr(appendedAncillaryData.length - keyValueLengthBytes * 2),
|
|
utf8ToHex(`,address:${value.substr(2).toLowerCase()}`),
|
|
"Should be able to decode appended ancillary data after stripping out non-utf8 decodeable component"
|
|
);
|
|
|
|
// Test 3: ancillary data is utf8 decodeable but not key:value syntax:
|
|
originalAncillaryData = utf8ToHex("ignore this syntax");
|
|
assert.equal(
|
|
await ancillaryDataTest.methods.appendKeyValueAddress(originalAncillaryData, keyName, value).call(),
|
|
utf8ToHex(`ignore this syntax,address:${value.substr(2).toLowerCase()}`),
|
|
"Should be able to utf8-decode the entire ancillary data"
|
|
);
|
|
});
|
|
it("appendKeyValueUint", async function () {
|
|
let originalAncillaryData = utf8ToHex("key:value");
|
|
let appendedAncillaryData;
|
|
const keyName = utf8ToHex("chainId");
|
|
const value = "31337";
|
|
const keyValueLengthBytes = 9 + value.length; // "," + "chainId:" + "31337" = 1 + 8 + 5 = 14 bytes.
|
|
|
|
// Test 1: append AFTER ancillary data:
|
|
assert.equal(
|
|
await ancillaryDataTest.methods.appendKeyValueUint(originalAncillaryData, keyName, value).call(),
|
|
utf8ToHex("key:value,chainId:31337"),
|
|
"Should append chainId:<chainId> to original ancillary data"
|
|
);
|
|
|
|
// Test 2: ancillary data is not utf8 decodeable:
|
|
originalAncillaryData = "0xab";
|
|
appendedAncillaryData = await ancillaryDataTest.methods
|
|
.appendKeyValueUint(originalAncillaryData, keyName, value)
|
|
.call();
|
|
assert.equal(
|
|
"0x" + appendedAncillaryData.substr(appendedAncillaryData.length - keyValueLengthBytes * 2),
|
|
utf8ToHex(`,chainId:${value}`),
|
|
"Should be able to decode appended ancillary data after stripping out non-utf8 decodeable component"
|
|
);
|
|
|
|
// Test 3: ancillary data is utf8 decodeable but not key:value syntax:
|
|
originalAncillaryData = utf8ToHex("ignore this syntax");
|
|
assert.equal(
|
|
await ancillaryDataTest.methods.appendKeyValueUint(originalAncillaryData, keyName, value).call(),
|
|
utf8ToHex(`ignore this syntax,chainId:${value}`),
|
|
"Should be able to utf8-decode the entire ancillary data"
|
|
);
|
|
});
|
|
});
|