accesslist.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import { getAddress } from "../address/index.js";
  2. import { assertArgument, isHexString } from "../utils/index.js";
  3. function accessSetify(addr, storageKeys) {
  4. return {
  5. address: getAddress(addr),
  6. storageKeys: storageKeys.map((storageKey, index) => {
  7. assertArgument(isHexString(storageKey, 32), "invalid slot", `storageKeys[${index}]`, storageKey);
  8. return storageKey.toLowerCase();
  9. })
  10. };
  11. }
  12. /**
  13. * Returns a [[AccessList]] from any ethers-supported access-list structure.
  14. */
  15. export function accessListify(value) {
  16. if (Array.isArray(value)) {
  17. return value.map((set, index) => {
  18. if (Array.isArray(set)) {
  19. assertArgument(set.length === 2, "invalid slot set", `value[${index}]`, set);
  20. return accessSetify(set[0], set[1]);
  21. }
  22. assertArgument(set != null && typeof (set) === "object", "invalid address-slot set", "value", value);
  23. return accessSetify(set.address, set.storageKeys);
  24. });
  25. }
  26. assertArgument(value != null && typeof (value) === "object", "invalid access list", "value", value);
  27. const result = Object.keys(value).map((addr) => {
  28. const storageKeys = value[addr].reduce((accum, storageKey) => {
  29. accum[storageKey] = true;
  30. return accum;
  31. }, {});
  32. return accessSetify(addr, Object.keys(storageKeys).sort());
  33. });
  34. result.sort((a, b) => (a.address.localeCompare(b.address)));
  35. return result;
  36. }
  37. //# sourceMappingURL=accesslist.js.map