Skip to content

Commit 71d1d5f

Browse files
GMS-2051 Multi-caller v2 (#241)
* Multi-caller v2 * Update names * Use struct * Fix linting * Fix type hash * Improve testing * Add threat model and rename contract * Add more test cases * Check valid function signatures * Fix solidity version * Update tests * Fix threat doc * Add abi * Use encode in keccak256 * Address comments * Add param name to mapping * update threat model * Update threat model --------- Co-authored-by: Allan Almeida <[email protected]>
1 parent 63bd4db commit 71d1d5f

File tree

9 files changed

+1016
-1
lines changed

9 files changed

+1016
-1
lines changed

abi/generated.ts

+321
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,327 @@ export const guardedMulticallerAbi = [
362362
},
363363
] as const
364364

365+
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
366+
// GuardedMulticaller2
367+
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
368+
369+
export const guardedMulticaller2Abi = [
370+
{
371+
type: 'constructor',
372+
inputs: [
373+
{ name: '_owner', internalType: 'address', type: 'address' },
374+
{ name: '_name', internalType: 'string', type: 'string' },
375+
{ name: '_version', internalType: 'string', type: 'string' },
376+
],
377+
stateMutability: 'nonpayable',
378+
},
379+
{
380+
type: 'function',
381+
inputs: [],
382+
name: 'DEFAULT_ADMIN_ROLE',
383+
outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }],
384+
stateMutability: 'view',
385+
},
386+
{
387+
type: 'function',
388+
inputs: [],
389+
name: 'MULTICALL_SIGNER_ROLE',
390+
outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }],
391+
stateMutability: 'view',
392+
},
393+
{
394+
type: 'function',
395+
inputs: [],
396+
name: 'eip712Domain',
397+
outputs: [
398+
{ name: 'fields', internalType: 'bytes1', type: 'bytes1' },
399+
{ name: 'name', internalType: 'string', type: 'string' },
400+
{ name: 'version', internalType: 'string', type: 'string' },
401+
{ name: 'chainId', internalType: 'uint256', type: 'uint256' },
402+
{ name: 'verifyingContract', internalType: 'address', type: 'address' },
403+
{ name: 'salt', internalType: 'bytes32', type: 'bytes32' },
404+
{ name: 'extensions', internalType: 'uint256[]', type: 'uint256[]' },
405+
],
406+
stateMutability: 'view',
407+
},
408+
{
409+
type: 'function',
410+
inputs: [
411+
{ name: '_multicallSigner', internalType: 'address', type: 'address' },
412+
{ name: '_reference', internalType: 'bytes32', type: 'bytes32' },
413+
{
414+
name: '_calls',
415+
internalType: 'struct GuardedMulticaller2.Call[]',
416+
type: 'tuple[]',
417+
components: [
418+
{ name: 'target', internalType: 'address', type: 'address' },
419+
{ name: 'functionSignature', internalType: 'string', type: 'string' },
420+
{ name: 'data', internalType: 'bytes', type: 'bytes' },
421+
],
422+
},
423+
{ name: '_deadline', internalType: 'uint256', type: 'uint256' },
424+
{ name: '_signature', internalType: 'bytes', type: 'bytes' },
425+
],
426+
name: 'execute',
427+
outputs: [],
428+
stateMutability: 'nonpayable',
429+
},
430+
{
431+
type: 'function',
432+
inputs: [{ name: 'role', internalType: 'bytes32', type: 'bytes32' }],
433+
name: 'getRoleAdmin',
434+
outputs: [{ name: '', internalType: 'bytes32', type: 'bytes32' }],
435+
stateMutability: 'view',
436+
},
437+
{
438+
type: 'function',
439+
inputs: [{ name: '_user', internalType: 'address', type: 'address' }],
440+
name: 'grantMulticallSignerRole',
441+
outputs: [],
442+
stateMutability: 'nonpayable',
443+
},
444+
{
445+
type: 'function',
446+
inputs: [
447+
{ name: 'role', internalType: 'bytes32', type: 'bytes32' },
448+
{ name: 'account', internalType: 'address', type: 'address' },
449+
],
450+
name: 'grantRole',
451+
outputs: [],
452+
stateMutability: 'nonpayable',
453+
},
454+
{
455+
type: 'function',
456+
inputs: [{ name: '_reference', internalType: 'bytes32', type: 'bytes32' }],
457+
name: 'hasBeenExecuted',
458+
outputs: [{ name: '', internalType: 'bool', type: 'bool' }],
459+
stateMutability: 'view',
460+
},
461+
{
462+
type: 'function',
463+
inputs: [
464+
{ name: 'role', internalType: 'bytes32', type: 'bytes32' },
465+
{ name: 'account', internalType: 'address', type: 'address' },
466+
],
467+
name: 'hasRole',
468+
outputs: [{ name: '', internalType: 'bool', type: 'bool' }],
469+
stateMutability: 'view',
470+
},
471+
{
472+
type: 'function',
473+
inputs: [
474+
{ name: 'role', internalType: 'bytes32', type: 'bytes32' },
475+
{ name: 'account', internalType: 'address', type: 'address' },
476+
],
477+
name: 'renounceRole',
478+
outputs: [],
479+
stateMutability: 'nonpayable',
480+
},
481+
{
482+
type: 'function',
483+
inputs: [{ name: '_user', internalType: 'address', type: 'address' }],
484+
name: 'revokeMulticallSignerRole',
485+
outputs: [],
486+
stateMutability: 'nonpayable',
487+
},
488+
{
489+
type: 'function',
490+
inputs: [
491+
{ name: 'role', internalType: 'bytes32', type: 'bytes32' },
492+
{ name: 'account', internalType: 'address', type: 'address' },
493+
],
494+
name: 'revokeRole',
495+
outputs: [],
496+
stateMutability: 'nonpayable',
497+
},
498+
{
499+
type: 'function',
500+
inputs: [{ name: 'interfaceId', internalType: 'bytes4', type: 'bytes4' }],
501+
name: 'supportsInterface',
502+
outputs: [{ name: '', internalType: 'bool', type: 'bool' }],
503+
stateMutability: 'view',
504+
},
505+
{ type: 'event', anonymous: false, inputs: [], name: 'EIP712DomainChanged' },
506+
{
507+
type: 'event',
508+
anonymous: false,
509+
inputs: [
510+
{
511+
name: '_multicallSigner',
512+
internalType: 'address',
513+
type: 'address',
514+
indexed: true,
515+
},
516+
{
517+
name: '_reference',
518+
internalType: 'bytes32',
519+
type: 'bytes32',
520+
indexed: true,
521+
},
522+
{
523+
name: '_calls',
524+
internalType: 'struct GuardedMulticaller2.Call[]',
525+
type: 'tuple[]',
526+
components: [
527+
{ name: 'target', internalType: 'address', type: 'address' },
528+
{ name: 'functionSignature', internalType: 'string', type: 'string' },
529+
{ name: 'data', internalType: 'bytes', type: 'bytes' },
530+
],
531+
indexed: false,
532+
},
533+
{
534+
name: '_deadline',
535+
internalType: 'uint256',
536+
type: 'uint256',
537+
indexed: false,
538+
},
539+
],
540+
name: 'Multicalled',
541+
},
542+
{
543+
type: 'event',
544+
anonymous: false,
545+
inputs: [
546+
{ name: 'role', internalType: 'bytes32', type: 'bytes32', indexed: true },
547+
{
548+
name: 'previousAdminRole',
549+
internalType: 'bytes32',
550+
type: 'bytes32',
551+
indexed: true,
552+
},
553+
{
554+
name: 'newAdminRole',
555+
internalType: 'bytes32',
556+
type: 'bytes32',
557+
indexed: true,
558+
},
559+
],
560+
name: 'RoleAdminChanged',
561+
},
562+
{
563+
type: 'event',
564+
anonymous: false,
565+
inputs: [
566+
{ name: 'role', internalType: 'bytes32', type: 'bytes32', indexed: true },
567+
{
568+
name: 'account',
569+
internalType: 'address',
570+
type: 'address',
571+
indexed: true,
572+
},
573+
{
574+
name: 'sender',
575+
internalType: 'address',
576+
type: 'address',
577+
indexed: true,
578+
},
579+
],
580+
name: 'RoleGranted',
581+
},
582+
{
583+
type: 'event',
584+
anonymous: false,
585+
inputs: [
586+
{ name: 'role', internalType: 'bytes32', type: 'bytes32', indexed: true },
587+
{
588+
name: 'account',
589+
internalType: 'address',
590+
type: 'address',
591+
indexed: true,
592+
},
593+
{
594+
name: 'sender',
595+
internalType: 'address',
596+
type: 'address',
597+
indexed: true,
598+
},
599+
],
600+
name: 'RoleRevoked',
601+
},
602+
{ type: 'error', inputs: [], name: 'EmptyCallArray' },
603+
{
604+
type: 'error',
605+
inputs: [{ name: '_deadline', internalType: 'uint256', type: 'uint256' }],
606+
name: 'Expired',
607+
},
608+
{
609+
type: 'error',
610+
inputs: [
611+
{
612+
name: '_call',
613+
internalType: 'struct GuardedMulticaller2.Call',
614+
type: 'tuple',
615+
components: [
616+
{ name: 'target', internalType: 'address', type: 'address' },
617+
{ name: 'functionSignature', internalType: 'string', type: 'string' },
618+
{ name: 'data', internalType: 'bytes', type: 'bytes' },
619+
],
620+
},
621+
],
622+
name: 'FailedCall',
623+
},
624+
{
625+
type: 'error',
626+
inputs: [
627+
{
628+
name: '_call',
629+
internalType: 'struct GuardedMulticaller2.Call',
630+
type: 'tuple',
631+
components: [
632+
{ name: 'target', internalType: 'address', type: 'address' },
633+
{ name: 'functionSignature', internalType: 'string', type: 'string' },
634+
{ name: 'data', internalType: 'bytes', type: 'bytes' },
635+
],
636+
},
637+
],
638+
name: 'InvalidFunctionSignature',
639+
},
640+
{
641+
type: 'error',
642+
inputs: [{ name: '_reference', internalType: 'bytes32', type: 'bytes32' }],
643+
name: 'InvalidReference',
644+
},
645+
{ type: 'error', inputs: [], name: 'InvalidShortString' },
646+
{
647+
type: 'error',
648+
inputs: [
649+
{
650+
name: '_call',
651+
internalType: 'struct GuardedMulticaller2.Call',
652+
type: 'tuple',
653+
components: [
654+
{ name: 'target', internalType: 'address', type: 'address' },
655+
{ name: 'functionSignature', internalType: 'string', type: 'string' },
656+
{ name: 'data', internalType: 'bytes', type: 'bytes' },
657+
],
658+
},
659+
],
660+
name: 'NonContractAddress',
661+
},
662+
{
663+
type: 'error',
664+
inputs: [{ name: '_reference', internalType: 'bytes32', type: 'bytes32' }],
665+
name: 'ReusedReference',
666+
},
667+
{
668+
type: 'error',
669+
inputs: [{ name: 'str', internalType: 'string', type: 'string' }],
670+
name: 'StringTooLong',
671+
},
672+
{
673+
type: 'error',
674+
inputs: [{ name: '_signature', internalType: 'bytes', type: 'bytes' }],
675+
name: 'UnauthorizedSignature',
676+
},
677+
{
678+
type: 'error',
679+
inputs: [
680+
{ name: '_multicallSigner', internalType: 'address', type: 'address' },
681+
],
682+
name: 'UnauthorizedSigner',
683+
},
684+
] as const
685+
365686
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
366687
// ImmutableERC1155
367688
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

abi/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
immutableErc721MintByIdAbi as ImmutableERC721MintByIdAbi,
55
immutableErc1155Abi as ImmutableERC1155Abi,
66
paymentSplitterAbi as PaymentSplitterAbi,
7+
guardedMulticaller2Abi as GuardedMulticaller2Abi,
78
} from "./generated";
89

910
export {
@@ -12,4 +13,5 @@ export {
1213
ImmutableERC721MintByIdAbi,
1314
ImmutableERC1155Abi,
1415
PaymentSplitterAbi,
16+
GuardedMulticaller2Abi,
1517
};

0 commit comments

Comments
 (0)