* Compute the EIP-712 struct hash for TransferWithAuthorization.
(authorization: {
from: string
to: string
value: string
validAfter: string
validBefore: string
nonce: string
})
| 184 | * Compute the EIP-712 struct hash for TransferWithAuthorization. |
| 185 | */ |
| 186 | function computeStructHash(authorization: { |
| 187 | from: string |
| 188 | to: string |
| 189 | value: string |
| 190 | validAfter: string |
| 191 | validBefore: string |
| 192 | nonce: string |
| 193 | }): Buffer { |
| 194 | // ABI encode all fields as 32-byte words |
| 195 | const encoded = Buffer.alloc(7 * 32) |
| 196 | |
| 197 | TRANSFER_WITH_AUTHORIZATION_TYPEHASH.copy(encoded, 0) |
| 198 | |
| 199 | // from address |
| 200 | const fromBuf = Buffer.alloc(32) |
| 201 | Buffer.from(authorization.from.replace('0x', ''), 'hex').copy(fromBuf, 12) |
| 202 | fromBuf.copy(encoded, 32) |
| 203 | |
| 204 | // to address |
| 205 | const toBuf = Buffer.alloc(32) |
| 206 | Buffer.from(authorization.to.replace('0x', ''), 'hex').copy(toBuf, 12) |
| 207 | toBuf.copy(encoded, 64) |
| 208 | |
| 209 | // value as uint256 |
| 210 | const valueBuf = Buffer.alloc(32) |
| 211 | const value = BigInt(authorization.value) |
| 212 | valueBuf.writeBigUInt64BE(value >> 192n, 0) |
| 213 | valueBuf.writeBigUInt64BE((value >> 128n) & 0xffffffffffffffffn, 8) |
| 214 | valueBuf.writeBigUInt64BE((value >> 64n) & 0xffffffffffffffffn, 16) |
| 215 | valueBuf.writeBigUInt64BE(value & 0xffffffffffffffffn, 24) |
| 216 | valueBuf.copy(encoded, 96) |
| 217 | |
| 218 | // validAfter as uint256 |
| 219 | const validAfterBuf = Buffer.alloc(32) |
| 220 | validAfterBuf.writeBigUInt64BE(BigInt(authorization.validAfter), 24) |
| 221 | validAfterBuf.copy(encoded, 128) |
| 222 | |
| 223 | // validBefore as uint256 |
| 224 | const validBeforeBuf = Buffer.alloc(32) |
| 225 | validBeforeBuf.writeBigUInt64BE(BigInt(authorization.validBefore), 24) |
| 226 | validBeforeBuf.copy(encoded, 160) |
| 227 | |
| 228 | // nonce as bytes32 |
| 229 | const nonceBuf = Buffer.from(authorization.nonce.replace('0x', ''), 'hex') |
| 230 | const noncePadded = Buffer.alloc(32) |
| 231 | nonceBuf.copy(noncePadded, 32 - nonceBuf.length) |
| 232 | noncePadded.copy(encoded, 192) |
| 233 | |
| 234 | return createHash('sha3-256').update(encoded).digest() |
| 235 | } |
| 236 | |
| 237 | /** |
| 238 | * Sign an EIP-712 typed data hash with a secp256k1 private key. |