(a: ApprovalSignature, domainHash: string, gasReceipt?: GasReceipt | null, sigType?: string)
| 288 | |
| 289 | // Encode data that is passed to safeTransferFrom() for metaTransfers |
| 290 | export async function encodeMetaApprovalData(a: ApprovalSignature, domainHash: string, gasReceipt?: GasReceipt | null, sigType?: string) |
| 291 | { |
| 292 | const META_APPROVAL_TYPEHASH = "0xf5d4c820494c8595de274c7ff619bead38aac4fbc3d143b5bf956aa4b84fa524"; |
| 293 | |
| 294 | let sigData: string; // Data to sign |
| 295 | let txDataTypes: string[]; // Types of data to encode |
| 296 | let sig: string; // Signature |
| 297 | |
| 298 | const approved_hex = a.approved ? '0x1' : '0x0' |
| 299 | const is_gas_Fee_hex = a.isGasFee ? '0x1' : '0x0' |
| 300 | |
| 301 | // Struct Data type |
| 302 | const sigArgTypes = [ |
| 303 | 'bytes32', // META_TX_TYPEHASH |
| 304 | 'uint256', // _owner: uint256(address) |
| 305 | 'uint256', // _operator: uint256(address) |
| 306 | 'uint256', // _approved: uint256(bool) |
| 307 | 'uint256', // _isGasFee: uint256(bool) |
| 308 | 'uint256', // nonce |
| 309 | ]; |
| 310 | |
| 311 | // Get signer |
| 312 | const signer = a.owner ? a.owner : await a.signerWallet.getAddress() |
| 313 | |
| 314 | // Packed encoding of transfer signature message |
| 315 | sigData = ethers.utils.solidityPack(sigArgTypes, [ |
| 316 | META_APPROVAL_TYPEHASH, |
| 317 | signer, |
| 318 | a.operator, |
| 319 | approved_hex, |
| 320 | is_gas_Fee_hex, |
| 321 | a.nonce, |
| 322 | ]) |
| 323 | |
| 324 | txDataTypes = ['bytes', 'bytes']; // (sig, (gasReceipt)) |
| 325 | |
| 326 | // When gas receipt is included |
| 327 | if (gasReceipt && gasReceipt !== null) { |
| 328 | const gasData = utils.defaultAbiCoder.encode([GasReceiptType], [gasReceipt]) |
| 329 | sigData = ethers.utils.keccak256(ethers.utils.solidityPack( |
| 330 | ['bytes', 'bytes32'], |
| 331 | [sigData, ethers.utils.keccak256(gasData)] //Hash of _data |
| 332 | )) |
| 333 | sig = await ethSignTypedData(a.signerWallet, domainHash, sigData, a.nonce, sigType) |
| 334 | return utils.defaultAbiCoder.encode(txDataTypes, [sig, gasData]) |
| 335 | |
| 336 | } else { |
| 337 | const emptyTransferData = [] |
| 338 | sigData = ethers.utils.keccak256(ethers.utils.solidityPack( |
| 339 | ['bytes', 'bytes32'], |
| 340 | [sigData, ethers.utils.keccak256(emptyTransferData)] //Hash of _data |
| 341 | )) |
| 342 | sig = await ethSignTypedData(a.signerWallet, domainHash, sigData, a.nonce, sigType) |
| 343 | return utils.defaultAbiCoder.encode(txDataTypes, [sig, emptyTransferData]) |
| 344 | } |
| 345 | |
| 346 | } |
| 347 |
no test coverage detected