@waku/rln 0.1.5-861a776.0 → 0.1.5-a824fff.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/bundle/index.js +4 -3
- package/bundle/packages/rln/dist/contract/constants.js +2 -1
- package/bundle/packages/rln/dist/contract/{rln_light_contract.js → rln_base_contract.js} +191 -186
- package/bundle/packages/rln/dist/contract/rln_contract.js +10 -420
- package/bundle/packages/rln/dist/contract/types.js +9 -0
- package/bundle/packages/rln/dist/create.js +1 -1
- package/bundle/packages/rln/dist/{rln_light.js → credentials_manager.js} +114 -48
- package/bundle/packages/rln/dist/identity.js +0 -9
- package/bundle/packages/rln/dist/keystore/keystore.js +31 -17
- package/bundle/packages/rln/dist/rln.js +56 -166
- package/bundle/packages/rln/dist/utils/metamask.js +2 -2
- package/bundle/packages/rln/dist/zerokit.js +5 -5
- package/dist/.tsbuildinfo +1 -1
- package/dist/contract/constants.d.ts +1 -1
- package/dist/contract/constants.js +1 -1
- package/dist/contract/constants.js.map +1 -1
- package/dist/contract/index.d.ts +1 -0
- package/dist/contract/index.js +1 -0
- package/dist/contract/index.js.map +1 -1
- package/dist/contract/{rln_light_contract.d.ts → rln_base_contract.d.ts} +24 -58
- package/dist/contract/{rln_light_contract.js → rln_base_contract.js} +189 -184
- package/dist/contract/rln_base_contract.js.map +1 -0
- package/dist/contract/rln_contract.d.ts +5 -122
- package/dist/contract/rln_contract.js +8 -417
- package/dist/contract/rln_contract.js.map +1 -1
- package/dist/contract/types.d.ts +45 -0
- package/dist/contract/types.js +8 -0
- package/dist/contract/types.js.map +1 -0
- package/dist/create.js +1 -1
- package/dist/create.js.map +1 -1
- package/dist/credentials_manager.d.ts +44 -0
- package/dist/credentials_manager.js +197 -0
- package/dist/credentials_manager.js.map +1 -0
- package/dist/identity.d.ts +0 -1
- package/dist/identity.js +0 -9
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/keystore/keystore.d.ts +1 -0
- package/dist/keystore/keystore.js +31 -17
- package/dist/keystore/keystore.js.map +1 -1
- package/dist/keystore/types.d.ts +2 -2
- package/dist/rln.d.ts +9 -52
- package/dist/rln.js +54 -163
- package/dist/rln.js.map +1 -1
- package/dist/types.d.ts +27 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/zerokit.d.ts +3 -3
- package/dist/zerokit.js +5 -5
- package/dist/zerokit.js.map +1 -1
- package/package.json +1 -1
- package/src/contract/constants.ts +1 -1
- package/src/contract/index.ts +1 -0
- package/src/contract/{rln_light_contract.ts → rln_base_contract.ts} +312 -323
- package/src/contract/rln_contract.ts +9 -663
- package/src/contract/types.ts +53 -0
- package/src/create.ts +1 -1
- package/src/credentials_manager.ts +282 -0
- package/src/identity.ts +0 -10
- package/src/index.ts +7 -5
- package/src/keystore/keystore.ts +57 -31
- package/src/keystore/types.ts +2 -2
- package/src/rln.ts +67 -258
- package/src/types.ts +31 -0
- package/src/zerokit.ts +3 -3
- package/bundle/_virtual/__node-resolve_empty.js +0 -6
- package/bundle/_virtual/_node-resolve_empty.js +0 -3
- package/bundle/_virtual/bn.js +0 -3
- package/bundle/_virtual/common.js +0 -3
- package/bundle/_virtual/common2.js +0 -3
- package/bundle/_virtual/hash.js +0 -3
- package/bundle/_virtual/inherits_browser.js +0 -3
- package/bundle/_virtual/ripemd.js +0 -3
- package/bundle/_virtual/sha.js +0 -3
- package/bundle/_virtual/sha3.js +0 -3
- package/bundle/_virtual/utils3.js +0 -3
- package/bundle/node_modules/@ethersproject/abi/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/abi/lib.esm/abi-coder.js +0 -96
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js +0 -148
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/address.js +0 -26
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/anonymous.js +0 -20
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/array.js +0 -210
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/boolean.js +0 -18
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/bytes.js +0 -30
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/fixed-bytes.js +0 -26
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/null.js +0 -22
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/number.js +0 -43
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/string.js +0 -19
- package/bundle/node_modules/@ethersproject/abi/lib.esm/coders/tuple.js +0 -58
- package/bundle/node_modules/@ethersproject/abi/lib.esm/fragments.js +0 -854
- package/bundle/node_modules/@ethersproject/abi/lib.esm/interface.js +0 -609
- package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/abstract-provider/lib.esm/index.js +0 -66
- package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/abstract-signer/lib.esm/index.js +0 -302
- package/bundle/node_modules/@ethersproject/address/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/address/lib.esm/index.js +0 -110
- package/bundle/node_modules/@ethersproject/base64/lib.esm/base64.js +0 -20
- package/bundle/node_modules/@ethersproject/basex/lib.esm/index.js +0 -120
- package/bundle/node_modules/@ethersproject/bignumber/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/bignumber/lib.esm/bignumber.js +0 -287
- package/bundle/node_modules/@ethersproject/bytes/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/bytes/lib.esm/index.js +0 -402
- package/bundle/node_modules/@ethersproject/constants/lib.esm/addresses.js +0 -3
- package/bundle/node_modules/@ethersproject/constants/lib.esm/bignumbers.js +0 -8
- package/bundle/node_modules/@ethersproject/constants/lib.esm/hashes.js +0 -3
- package/bundle/node_modules/@ethersproject/contracts/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/contracts/lib.esm/index.js +0 -893
- package/bundle/node_modules/@ethersproject/hash/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/decoder.js +0 -256
- package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/include.js +0 -36
- package/bundle/node_modules/@ethersproject/hash/lib.esm/ens-normalize/lib.js +0 -135
- package/bundle/node_modules/@ethersproject/hash/lib.esm/id.js +0 -8
- package/bundle/node_modules/@ethersproject/hash/lib.esm/namehash.js +0 -64
- package/bundle/node_modules/@ethersproject/hash/lib.esm/typed-data.js +0 -443
- package/bundle/node_modules/@ethersproject/keccak256/lib.esm/index.js +0 -8
- package/bundle/node_modules/@ethersproject/keccak256/node_modules/js-sha3/src/sha3.js +0 -660
- package/bundle/node_modules/@ethersproject/logger/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/logger/lib.esm/index.js +0 -352
- package/bundle/node_modules/@ethersproject/networks/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/networks/lib.esm/index.js +0 -248
- package/bundle/node_modules/@ethersproject/properties/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/properties/lib.esm/index.js +0 -127
- package/bundle/node_modules/@ethersproject/providers/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/providers/lib.esm/base-provider.js +0 -2007
- package/bundle/node_modules/@ethersproject/providers/lib.esm/formatter.js +0 -422
- package/bundle/node_modules/@ethersproject/providers/lib.esm/json-rpc-provider.js +0 -674
- package/bundle/node_modules/@ethersproject/providers/lib.esm/web3-provider.js +0 -132
- package/bundle/node_modules/@ethersproject/rlp/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/rlp/lib.esm/index.js +0 -120
- package/bundle/node_modules/@ethersproject/sha2/lib.esm/sha2.js +0 -8
- package/bundle/node_modules/@ethersproject/signing-key/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/signing-key/lib.esm/elliptic.js +0 -2430
- package/bundle/node_modules/@ethersproject/signing-key/lib.esm/index.js +0 -76
- package/bundle/node_modules/@ethersproject/strings/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/strings/lib.esm/utf8.js +0 -219
- package/bundle/node_modules/@ethersproject/transactions/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/transactions/lib.esm/index.js +0 -279
- package/bundle/node_modules/@ethersproject/web/lib.esm/_version.js +0 -3
- package/bundle/node_modules/@ethersproject/web/lib.esm/geturl.js +0 -69
- package/bundle/node_modules/@ethersproject/web/lib.esm/index.js +0 -404
- package/bundle/node_modules/bech32/index.js +0 -187
- package/bundle/node_modules/bn.js/lib/bn.js +0 -3361
- package/bundle/node_modules/hash.js/lib/hash/common.js +0 -97
- package/bundle/node_modules/hash.js/lib/hash/hmac.js +0 -51
- package/bundle/node_modules/hash.js/lib/hash/ripemd.js +0 -152
- package/bundle/node_modules/hash.js/lib/hash/sha/1.js +0 -81
- package/bundle/node_modules/hash.js/lib/hash/sha/224.js +0 -33
- package/bundle/node_modules/hash.js/lib/hash/sha/256.js +0 -113
- package/bundle/node_modules/hash.js/lib/hash/sha/384.js +0 -39
- package/bundle/node_modules/hash.js/lib/hash/sha/512.js +0 -336
- package/bundle/node_modules/hash.js/lib/hash/sha/common.js +0 -53
- package/bundle/node_modules/hash.js/lib/hash/sha.js +0 -14
- package/bundle/node_modules/hash.js/lib/hash/utils.js +0 -282
- package/bundle/node_modules/hash.js/lib/hash.js +0 -33
- package/bundle/node_modules/inherits/inherits_browser.js +0 -33
- package/bundle/node_modules/minimalistic-assert/index.js +0 -13
- package/dist/contract/rln_light_contract.js.map +0 -1
- package/dist/rln_light.d.ts +0 -64
- package/dist/rln_light.js +0 -144
- package/dist/rln_light.js.map +0 -1
- package/src/rln_light.ts +0 -235
@@ -1,443 +0,0 @@
|
|
1
|
-
import { getAddress } from '../../address/lib.esm/index.js';
|
2
|
-
import { hexConcat, isHexString, hexlify, arrayify, hexZeroPad } from '../../bytes/lib.esm/index.js';
|
3
|
-
import { keccak256 } from '../../keccak256/lib.esm/index.js';
|
4
|
-
import { defineReadOnly, deepCopy, shallowCopy } from '../../properties/lib.esm/index.js';
|
5
|
-
import { Logger } from '../../logger/lib.esm/index.js';
|
6
|
-
import { version } from './_version.js';
|
7
|
-
import { id } from './id.js';
|
8
|
-
import { BigNumber } from '../../bignumber/lib.esm/bignumber.js';
|
9
|
-
|
10
|
-
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
|
11
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
12
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
13
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
14
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
15
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
16
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
17
|
-
});
|
18
|
-
};
|
19
|
-
const logger = new Logger(version);
|
20
|
-
const padding = new Uint8Array(32);
|
21
|
-
padding.fill(0);
|
22
|
-
const NegativeOne = BigNumber.from(-1);
|
23
|
-
const Zero = BigNumber.from(0);
|
24
|
-
const One = BigNumber.from(1);
|
25
|
-
const MaxUint256 = BigNumber.from("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
26
|
-
function hexPadRight(value) {
|
27
|
-
const bytes = arrayify(value);
|
28
|
-
const padOffset = bytes.length % 32;
|
29
|
-
if (padOffset) {
|
30
|
-
return hexConcat([bytes, padding.slice(padOffset)]);
|
31
|
-
}
|
32
|
-
return hexlify(bytes);
|
33
|
-
}
|
34
|
-
const hexTrue = hexZeroPad(One.toHexString(), 32);
|
35
|
-
const hexFalse = hexZeroPad(Zero.toHexString(), 32);
|
36
|
-
const domainFieldTypes = {
|
37
|
-
name: "string",
|
38
|
-
version: "string",
|
39
|
-
chainId: "uint256",
|
40
|
-
verifyingContract: "address",
|
41
|
-
salt: "bytes32"
|
42
|
-
};
|
43
|
-
const domainFieldNames = [
|
44
|
-
"name", "version", "chainId", "verifyingContract", "salt"
|
45
|
-
];
|
46
|
-
function checkString(key) {
|
47
|
-
return function (value) {
|
48
|
-
if (typeof (value) !== "string") {
|
49
|
-
logger.throwArgumentError(`invalid domain value for ${JSON.stringify(key)}`, `domain.${key}`, value);
|
50
|
-
}
|
51
|
-
return value;
|
52
|
-
};
|
53
|
-
}
|
54
|
-
const domainChecks = {
|
55
|
-
name: checkString("name"),
|
56
|
-
version: checkString("version"),
|
57
|
-
chainId: function (value) {
|
58
|
-
try {
|
59
|
-
return BigNumber.from(value).toString();
|
60
|
-
}
|
61
|
-
catch (error) { }
|
62
|
-
return logger.throwArgumentError(`invalid domain value for "chainId"`, "domain.chainId", value);
|
63
|
-
},
|
64
|
-
verifyingContract: function (value) {
|
65
|
-
try {
|
66
|
-
return getAddress(value).toLowerCase();
|
67
|
-
}
|
68
|
-
catch (error) { }
|
69
|
-
return logger.throwArgumentError(`invalid domain value "verifyingContract"`, "domain.verifyingContract", value);
|
70
|
-
},
|
71
|
-
salt: function (value) {
|
72
|
-
try {
|
73
|
-
const bytes = arrayify(value);
|
74
|
-
if (bytes.length !== 32) {
|
75
|
-
throw new Error("bad length");
|
76
|
-
}
|
77
|
-
return hexlify(bytes);
|
78
|
-
}
|
79
|
-
catch (error) { }
|
80
|
-
return logger.throwArgumentError(`invalid domain value "salt"`, "domain.salt", value);
|
81
|
-
}
|
82
|
-
};
|
83
|
-
function getBaseEncoder(type) {
|
84
|
-
// intXX and uintXX
|
85
|
-
{
|
86
|
-
const match = type.match(/^(u?)int(\d*)$/);
|
87
|
-
if (match) {
|
88
|
-
const signed = (match[1] === "");
|
89
|
-
const width = parseInt(match[2] || "256");
|
90
|
-
if (width % 8 !== 0 || width > 256 || (match[2] && match[2] !== String(width))) {
|
91
|
-
logger.throwArgumentError("invalid numeric width", "type", type);
|
92
|
-
}
|
93
|
-
const boundsUpper = MaxUint256.mask(signed ? (width - 1) : width);
|
94
|
-
const boundsLower = signed ? boundsUpper.add(One).mul(NegativeOne) : Zero;
|
95
|
-
return function (value) {
|
96
|
-
const v = BigNumber.from(value);
|
97
|
-
if (v.lt(boundsLower) || v.gt(boundsUpper)) {
|
98
|
-
logger.throwArgumentError(`value out-of-bounds for ${type}`, "value", value);
|
99
|
-
}
|
100
|
-
return hexZeroPad(v.toTwos(256).toHexString(), 32);
|
101
|
-
};
|
102
|
-
}
|
103
|
-
}
|
104
|
-
// bytesXX
|
105
|
-
{
|
106
|
-
const match = type.match(/^bytes(\d+)$/);
|
107
|
-
if (match) {
|
108
|
-
const width = parseInt(match[1]);
|
109
|
-
if (width === 0 || width > 32 || match[1] !== String(width)) {
|
110
|
-
logger.throwArgumentError("invalid bytes width", "type", type);
|
111
|
-
}
|
112
|
-
return function (value) {
|
113
|
-
const bytes = arrayify(value);
|
114
|
-
if (bytes.length !== width) {
|
115
|
-
logger.throwArgumentError(`invalid length for ${type}`, "value", value);
|
116
|
-
}
|
117
|
-
return hexPadRight(value);
|
118
|
-
};
|
119
|
-
}
|
120
|
-
}
|
121
|
-
switch (type) {
|
122
|
-
case "address": return function (value) {
|
123
|
-
return hexZeroPad(getAddress(value), 32);
|
124
|
-
};
|
125
|
-
case "bool": return function (value) {
|
126
|
-
return ((!value) ? hexFalse : hexTrue);
|
127
|
-
};
|
128
|
-
case "bytes": return function (value) {
|
129
|
-
return keccak256(value);
|
130
|
-
};
|
131
|
-
case "string": return function (value) {
|
132
|
-
return id(value);
|
133
|
-
};
|
134
|
-
}
|
135
|
-
return null;
|
136
|
-
}
|
137
|
-
function encodeType(name, fields) {
|
138
|
-
return `${name}(${fields.map(({ name, type }) => (type + " " + name)).join(",")})`;
|
139
|
-
}
|
140
|
-
class TypedDataEncoder {
|
141
|
-
constructor(types) {
|
142
|
-
defineReadOnly(this, "types", Object.freeze(deepCopy(types)));
|
143
|
-
defineReadOnly(this, "_encoderCache", {});
|
144
|
-
defineReadOnly(this, "_types", {});
|
145
|
-
// Link struct types to their direct child structs
|
146
|
-
const links = {};
|
147
|
-
// Link structs to structs which contain them as a child
|
148
|
-
const parents = {};
|
149
|
-
// Link all subtypes within a given struct
|
150
|
-
const subtypes = {};
|
151
|
-
Object.keys(types).forEach((type) => {
|
152
|
-
links[type] = {};
|
153
|
-
parents[type] = [];
|
154
|
-
subtypes[type] = {};
|
155
|
-
});
|
156
|
-
for (const name in types) {
|
157
|
-
const uniqueNames = {};
|
158
|
-
types[name].forEach((field) => {
|
159
|
-
// Check each field has a unique name
|
160
|
-
if (uniqueNames[field.name]) {
|
161
|
-
logger.throwArgumentError(`duplicate variable name ${JSON.stringify(field.name)} in ${JSON.stringify(name)}`, "types", types);
|
162
|
-
}
|
163
|
-
uniqueNames[field.name] = true;
|
164
|
-
// Get the base type (drop any array specifiers)
|
165
|
-
const baseType = field.type.match(/^([^\x5b]*)(\x5b|$)/)[1];
|
166
|
-
if (baseType === name) {
|
167
|
-
logger.throwArgumentError(`circular type reference to ${JSON.stringify(baseType)}`, "types", types);
|
168
|
-
}
|
169
|
-
// Is this a base encoding type?
|
170
|
-
const encoder = getBaseEncoder(baseType);
|
171
|
-
if (encoder) {
|
172
|
-
return;
|
173
|
-
}
|
174
|
-
if (!parents[baseType]) {
|
175
|
-
logger.throwArgumentError(`unknown type ${JSON.stringify(baseType)}`, "types", types);
|
176
|
-
}
|
177
|
-
// Add linkage
|
178
|
-
parents[baseType].push(name);
|
179
|
-
links[name][baseType] = true;
|
180
|
-
});
|
181
|
-
}
|
182
|
-
// Deduce the primary type
|
183
|
-
const primaryTypes = Object.keys(parents).filter((n) => (parents[n].length === 0));
|
184
|
-
if (primaryTypes.length === 0) {
|
185
|
-
logger.throwArgumentError("missing primary type", "types", types);
|
186
|
-
}
|
187
|
-
else if (primaryTypes.length > 1) {
|
188
|
-
logger.throwArgumentError(`ambiguous primary types or unused types: ${primaryTypes.map((t) => (JSON.stringify(t))).join(", ")}`, "types", types);
|
189
|
-
}
|
190
|
-
defineReadOnly(this, "primaryType", primaryTypes[0]);
|
191
|
-
// Check for circular type references
|
192
|
-
function checkCircular(type, found) {
|
193
|
-
if (found[type]) {
|
194
|
-
logger.throwArgumentError(`circular type reference to ${JSON.stringify(type)}`, "types", types);
|
195
|
-
}
|
196
|
-
found[type] = true;
|
197
|
-
Object.keys(links[type]).forEach((child) => {
|
198
|
-
if (!parents[child]) {
|
199
|
-
return;
|
200
|
-
}
|
201
|
-
// Recursively check children
|
202
|
-
checkCircular(child, found);
|
203
|
-
// Mark all ancestors as having this decendant
|
204
|
-
Object.keys(found).forEach((subtype) => {
|
205
|
-
subtypes[subtype][child] = true;
|
206
|
-
});
|
207
|
-
});
|
208
|
-
delete found[type];
|
209
|
-
}
|
210
|
-
checkCircular(this.primaryType, {});
|
211
|
-
// Compute each fully describe type
|
212
|
-
for (const name in subtypes) {
|
213
|
-
const st = Object.keys(subtypes[name]);
|
214
|
-
st.sort();
|
215
|
-
this._types[name] = encodeType(name, types[name]) + st.map((t) => encodeType(t, types[t])).join("");
|
216
|
-
}
|
217
|
-
}
|
218
|
-
getEncoder(type) {
|
219
|
-
let encoder = this._encoderCache[type];
|
220
|
-
if (!encoder) {
|
221
|
-
encoder = this._encoderCache[type] = this._getEncoder(type);
|
222
|
-
}
|
223
|
-
return encoder;
|
224
|
-
}
|
225
|
-
_getEncoder(type) {
|
226
|
-
// Basic encoder type (address, bool, uint256, etc)
|
227
|
-
{
|
228
|
-
const encoder = getBaseEncoder(type);
|
229
|
-
if (encoder) {
|
230
|
-
return encoder;
|
231
|
-
}
|
232
|
-
}
|
233
|
-
// Array
|
234
|
-
const match = type.match(/^(.*)(\x5b(\d*)\x5d)$/);
|
235
|
-
if (match) {
|
236
|
-
const subtype = match[1];
|
237
|
-
const subEncoder = this.getEncoder(subtype);
|
238
|
-
const length = parseInt(match[3]);
|
239
|
-
return (value) => {
|
240
|
-
if (length >= 0 && value.length !== length) {
|
241
|
-
logger.throwArgumentError("array length mismatch; expected length ${ arrayLength }", "value", value);
|
242
|
-
}
|
243
|
-
let result = value.map(subEncoder);
|
244
|
-
if (this._types[subtype]) {
|
245
|
-
result = result.map(keccak256);
|
246
|
-
}
|
247
|
-
return keccak256(hexConcat(result));
|
248
|
-
};
|
249
|
-
}
|
250
|
-
// Struct
|
251
|
-
const fields = this.types[type];
|
252
|
-
if (fields) {
|
253
|
-
const encodedType = id(this._types[type]);
|
254
|
-
return (value) => {
|
255
|
-
const values = fields.map(({ name, type }) => {
|
256
|
-
const result = this.getEncoder(type)(value[name]);
|
257
|
-
if (this._types[type]) {
|
258
|
-
return keccak256(result);
|
259
|
-
}
|
260
|
-
return result;
|
261
|
-
});
|
262
|
-
values.unshift(encodedType);
|
263
|
-
return hexConcat(values);
|
264
|
-
};
|
265
|
-
}
|
266
|
-
return logger.throwArgumentError(`unknown type: ${type}`, "type", type);
|
267
|
-
}
|
268
|
-
encodeType(name) {
|
269
|
-
const result = this._types[name];
|
270
|
-
if (!result) {
|
271
|
-
logger.throwArgumentError(`unknown type: ${JSON.stringify(name)}`, "name", name);
|
272
|
-
}
|
273
|
-
return result;
|
274
|
-
}
|
275
|
-
encodeData(type, value) {
|
276
|
-
return this.getEncoder(type)(value);
|
277
|
-
}
|
278
|
-
hashStruct(name, value) {
|
279
|
-
return keccak256(this.encodeData(name, value));
|
280
|
-
}
|
281
|
-
encode(value) {
|
282
|
-
return this.encodeData(this.primaryType, value);
|
283
|
-
}
|
284
|
-
hash(value) {
|
285
|
-
return this.hashStruct(this.primaryType, value);
|
286
|
-
}
|
287
|
-
_visit(type, value, callback) {
|
288
|
-
// Basic encoder type (address, bool, uint256, etc)
|
289
|
-
{
|
290
|
-
const encoder = getBaseEncoder(type);
|
291
|
-
if (encoder) {
|
292
|
-
return callback(type, value);
|
293
|
-
}
|
294
|
-
}
|
295
|
-
// Array
|
296
|
-
const match = type.match(/^(.*)(\x5b(\d*)\x5d)$/);
|
297
|
-
if (match) {
|
298
|
-
const subtype = match[1];
|
299
|
-
const length = parseInt(match[3]);
|
300
|
-
if (length >= 0 && value.length !== length) {
|
301
|
-
logger.throwArgumentError("array length mismatch; expected length ${ arrayLength }", "value", value);
|
302
|
-
}
|
303
|
-
return value.map((v) => this._visit(subtype, v, callback));
|
304
|
-
}
|
305
|
-
// Struct
|
306
|
-
const fields = this.types[type];
|
307
|
-
if (fields) {
|
308
|
-
return fields.reduce((accum, { name, type }) => {
|
309
|
-
accum[name] = this._visit(type, value[name], callback);
|
310
|
-
return accum;
|
311
|
-
}, {});
|
312
|
-
}
|
313
|
-
return logger.throwArgumentError(`unknown type: ${type}`, "type", type);
|
314
|
-
}
|
315
|
-
visit(value, callback) {
|
316
|
-
return this._visit(this.primaryType, value, callback);
|
317
|
-
}
|
318
|
-
static from(types) {
|
319
|
-
return new TypedDataEncoder(types);
|
320
|
-
}
|
321
|
-
static getPrimaryType(types) {
|
322
|
-
return TypedDataEncoder.from(types).primaryType;
|
323
|
-
}
|
324
|
-
static hashStruct(name, types, value) {
|
325
|
-
return TypedDataEncoder.from(types).hashStruct(name, value);
|
326
|
-
}
|
327
|
-
static hashDomain(domain) {
|
328
|
-
const domainFields = [];
|
329
|
-
for (const name in domain) {
|
330
|
-
const type = domainFieldTypes[name];
|
331
|
-
if (!type) {
|
332
|
-
logger.throwArgumentError(`invalid typed-data domain key: ${JSON.stringify(name)}`, "domain", domain);
|
333
|
-
}
|
334
|
-
domainFields.push({ name, type });
|
335
|
-
}
|
336
|
-
domainFields.sort((a, b) => {
|
337
|
-
return domainFieldNames.indexOf(a.name) - domainFieldNames.indexOf(b.name);
|
338
|
-
});
|
339
|
-
return TypedDataEncoder.hashStruct("EIP712Domain", { EIP712Domain: domainFields }, domain);
|
340
|
-
}
|
341
|
-
static encode(domain, types, value) {
|
342
|
-
return hexConcat([
|
343
|
-
"0x1901",
|
344
|
-
TypedDataEncoder.hashDomain(domain),
|
345
|
-
TypedDataEncoder.from(types).hash(value)
|
346
|
-
]);
|
347
|
-
}
|
348
|
-
static hash(domain, types, value) {
|
349
|
-
return keccak256(TypedDataEncoder.encode(domain, types, value));
|
350
|
-
}
|
351
|
-
// Replaces all address types with ENS names with their looked up address
|
352
|
-
static resolveNames(domain, types, value, resolveName) {
|
353
|
-
return __awaiter(this, void 0, void 0, function* () {
|
354
|
-
// Make a copy to isolate it from the object passed in
|
355
|
-
domain = shallowCopy(domain);
|
356
|
-
// Look up all ENS names
|
357
|
-
const ensCache = {};
|
358
|
-
// Do we need to look up the domain's verifyingContract?
|
359
|
-
if (domain.verifyingContract && !isHexString(domain.verifyingContract, 20)) {
|
360
|
-
ensCache[domain.verifyingContract] = "0x";
|
361
|
-
}
|
362
|
-
// We are going to use the encoder to visit all the base values
|
363
|
-
const encoder = TypedDataEncoder.from(types);
|
364
|
-
// Get a list of all the addresses
|
365
|
-
encoder.visit(value, (type, value) => {
|
366
|
-
if (type === "address" && !isHexString(value, 20)) {
|
367
|
-
ensCache[value] = "0x";
|
368
|
-
}
|
369
|
-
return value;
|
370
|
-
});
|
371
|
-
// Lookup each name
|
372
|
-
for (const name in ensCache) {
|
373
|
-
ensCache[name] = yield resolveName(name);
|
374
|
-
}
|
375
|
-
// Replace the domain verifyingContract if needed
|
376
|
-
if (domain.verifyingContract && ensCache[domain.verifyingContract]) {
|
377
|
-
domain.verifyingContract = ensCache[domain.verifyingContract];
|
378
|
-
}
|
379
|
-
// Replace all ENS names with their address
|
380
|
-
value = encoder.visit(value, (type, value) => {
|
381
|
-
if (type === "address" && ensCache[value]) {
|
382
|
-
return ensCache[value];
|
383
|
-
}
|
384
|
-
return value;
|
385
|
-
});
|
386
|
-
return { domain, value };
|
387
|
-
});
|
388
|
-
}
|
389
|
-
static getPayload(domain, types, value) {
|
390
|
-
// Validate the domain fields
|
391
|
-
TypedDataEncoder.hashDomain(domain);
|
392
|
-
// Derive the EIP712Domain Struct reference type
|
393
|
-
const domainValues = {};
|
394
|
-
const domainTypes = [];
|
395
|
-
domainFieldNames.forEach((name) => {
|
396
|
-
const value = domain[name];
|
397
|
-
if (value == null) {
|
398
|
-
return;
|
399
|
-
}
|
400
|
-
domainValues[name] = domainChecks[name](value);
|
401
|
-
domainTypes.push({ name, type: domainFieldTypes[name] });
|
402
|
-
});
|
403
|
-
const encoder = TypedDataEncoder.from(types);
|
404
|
-
const typesWithDomain = shallowCopy(types);
|
405
|
-
if (typesWithDomain.EIP712Domain) {
|
406
|
-
logger.throwArgumentError("types must not contain EIP712Domain type", "types.EIP712Domain", types);
|
407
|
-
}
|
408
|
-
else {
|
409
|
-
typesWithDomain.EIP712Domain = domainTypes;
|
410
|
-
}
|
411
|
-
// Validate the data structures and types
|
412
|
-
encoder.encode(value);
|
413
|
-
return {
|
414
|
-
types: typesWithDomain,
|
415
|
-
domain: domainValues,
|
416
|
-
primaryType: encoder.primaryType,
|
417
|
-
message: encoder.visit(value, (type, value) => {
|
418
|
-
// bytes
|
419
|
-
if (type.match(/^bytes(\d*)/)) {
|
420
|
-
return hexlify(arrayify(value));
|
421
|
-
}
|
422
|
-
// uint or int
|
423
|
-
if (type.match(/^u?int/)) {
|
424
|
-
return BigNumber.from(value).toString();
|
425
|
-
}
|
426
|
-
switch (type) {
|
427
|
-
case "address":
|
428
|
-
return value.toLowerCase();
|
429
|
-
case "bool":
|
430
|
-
return !!value;
|
431
|
-
case "string":
|
432
|
-
if (typeof (value) !== "string") {
|
433
|
-
logger.throwArgumentError(`invalid string`, "value", value);
|
434
|
-
}
|
435
|
-
return value;
|
436
|
-
}
|
437
|
-
return logger.throwArgumentError("unsupported type", "type", type);
|
438
|
-
})
|
439
|
-
};
|
440
|
-
}
|
441
|
-
}
|
442
|
-
|
443
|
-
export { TypedDataEncoder };
|