diff --git a/pkg/signatory/signatory_test.go b/pkg/signatory/signatory_test.go index 77a44d31..0b48e4a9 100644 --- a/pkg/signatory/signatory_test.go +++ b/pkg/signatory/signatory_test.go @@ -261,6 +261,63 @@ func TestPolicy(t *testing.T) { }, expected: "operation `vdf_revelation' is not allowed", }, + { + title: "Update consensus key", + msg: mustHex("03ebcaec6ed8ab1a8a515164df37f47be175fb92851249f2b83fb96b7434ec57d3720079cae4c9a1885f17d3995619bf28636c4394458bf102f31fcc08000202d56e7b5258aa58eeb61701476c46863e2f9f31b4b467ca3175fb2f1fed6b4106"), + policy: signatory.Policy{ + AllowedRequests: []string{"generic", "block", "endorsement"}, + AllowedOps: []string{"endorsement", "seed_nonce_revelation", "activate_account", "ballot", "reveal", "origination", "delegation", "update_consensus_key"}, + LogPayloads: true, + }, + }, + { + title: "Update consensus key not allowed", + msg: mustHex("03ebcaec6ed8ab1a8a515164df37f47be175fb92851249f2b83fb96b7434ec57d3720079cae4c9a1885f17d3995619bf28636c4394458bf102f31fcc08000202d56e7b5258aa58eeb61701476c46863e2f9f31b4b467ca3175fb2f1fed6b4106"), + policy: signatory.Policy{ + AllowedRequests: []string{"generic", "block", "endorsement"}, + AllowedOps: []string{"endorsement", "seed_nonce_revelation", "activate_account", "ballot", "reveal", "origination", "delegation"}, + LogPayloads: true, + }, + expected: "operation `update_consensus_key' is not allowed", + }, + { + title: "Drain delegate", + msg: mustHex("0375959f80af0577302c9ed036371bc6c18644eeabf441fbad257c1a67d36a57fe090244cd5d0b4cb5a18d926b25bc37e58105e6786f0802f846b9ed8834c257a6f0c3cebeab4f58508b20ad0244cd5d0b4cb5a18d926b25bc37e58105e6786f08"), + policy: signatory.Policy{ + AllowedRequests: []string{"generic", "block", "endorsement"}, + AllowedOps: []string{"endorsement", "seed_nonce_revelation", "activate_account", "ballot", "reveal", "origination", "delegation", "drain_delegate"}, + LogPayloads: true, + }, + }, + { + title: "Drain delegate not allowed", + msg: mustHex("0375959f80af0577302c9ed036371bc6c18644eeabf441fbad257c1a67d36a57fe090244cd5d0b4cb5a18d926b25bc37e58105e6786f0802f846b9ed8834c257a6f0c3cebeab4f58508b20ad0244cd5d0b4cb5a18d926b25bc37e58105e6786f08"), + policy: signatory.Policy{ + AllowedRequests: []string{"generic", "block", "endorsement"}, + AllowedOps: []string{"endorsement", "seed_nonce_revelation", "activate_account", "ballot", "reveal", "origination", "delegation", "update_consensus_key"}, + LogPayloads: true, + }, + expected: "operation `drain_delegate' is not allowed", + }, + { + title: "Delegate with consesus key", + msg: mustHex("03f6622bc2e0b99604f1f103f1cbda4fa1b07ad8a993838c4f62855bfe36e8fb6a6b02f846b9ed8834c257a6f0c3cebeab4f58508b20ade60215e807000202dbc1715493e74def32a7d219df06accd6ca75d775d4177dd09471f9a9a2302826e02f846b9ed8834c257a6f0c3cebeab4f58508b20adfa0116e80700ff02f846b9ed8834c257a6f0c3cebeab4f58508b20ad7202f846b9ed8834c257a6f0c3cebeab4f58508b20ad900217cc08000202ce4ab1f214186fc04b06383e012357ccf7b67f9bddbd5818dba80f704b3a79f4"), + policy: signatory.Policy{ + AllowedRequests: []string{"generic", "block", "endorsement"}, + AllowedOps: []string{"endorsement", "seed_nonce_revelation", "activate_account", "ballot", "reveal", "origination", "delegation", "update_consensus_key"}, + LogPayloads: true, + }, + }, + { + title: "Delegate with consesus key not allowed", + msg: mustHex("03f6622bc2e0b99604f1f103f1cbda4fa1b07ad8a993838c4f62855bfe36e8fb6a6b02f846b9ed8834c257a6f0c3cebeab4f58508b20ade60215e807000202dbc1715493e74def32a7d219df06accd6ca75d775d4177dd09471f9a9a2302826e02f846b9ed8834c257a6f0c3cebeab4f58508b20adfa0116e80700ff02f846b9ed8834c257a6f0c3cebeab4f58508b20ad7202f846b9ed8834c257a6f0c3cebeab4f58508b20ad900217cc08000202ce4ab1f214186fc04b06383e012357ccf7b67f9bddbd5818dba80f704b3a79f4"), + policy: signatory.Policy{ + AllowedRequests: []string{"generic", "block", "endorsement"}, + AllowedOps: []string{"endorsement", "seed_nonce_revelation", "activate_account", "ballot", "reveal", "origination", "delegation"}, + LogPayloads: true, + }, + expected: "operation `update_consensus_key' is not allowed", + }, } priv, err := tezos.ParsePrivateKey(pk, nil) diff --git a/pkg/tezos/operation.go b/pkg/tezos/operation.go index 5bb79b69..0257d90b 100644 --- a/pkg/tezos/operation.go +++ b/pkg/tezos/operation.go @@ -23,6 +23,7 @@ const ( tagBallot = 6 tagDoublePreendorsementEvidence = 7 tagVdfRevelation = 8 + tagDrainDelegate = 9 tagEndorsementWithSlot = 10 tagFailingNoop = 17 tagPreendorsement = 20 @@ -34,6 +35,7 @@ const ( tagRegisterGlobalConstant = 111 tagSetDepositsLimit = 112 tagIncreasePaidStorageLimit = 113 + tagUpdateConsensusKey = 114 tagTxRollupOrigination = 150 tagTxRollupSubmitBatch = 151 tagTxRollupCommit = 152 @@ -59,6 +61,7 @@ var opKinds = map[int]string{ tagBallot: "ballot", tagDoublePreendorsementEvidence: "double_preendorsement_evidence", tagVdfRevelation: "vdf_revelation", + tagDrainDelegate: "drain_delegate", tagEndorsementWithSlot: "endorsement_with_slot", tagFailingNoop: "failing_noop", tagPreendorsement: "preendorsement", @@ -70,6 +73,7 @@ var opKinds = map[int]string{ tagRegisterGlobalConstant: "register_global_constant", tagSetDepositsLimit: "set_deposits_limit", tagIncreasePaidStorageLimit: "increase_paid_storage", + tagUpdateConsensusKey: "update_consensus_key", tagTxRollupOrigination: "tx_rollup_origination", tagTxRollupSubmitBatch: "tx_rollup_submit_batch", tagTxRollupCommit: "tx_rollup_commit", @@ -467,6 +471,22 @@ type OpIncreasePaidStorage struct { func (o *OpIncreasePaidStorage) OperationKind() string { return "increase_paid_storage" } +type OpUpdateConsensusKey struct { + Manager + ConsesusKey string +} + +func (o *OpUpdateConsensusKey) OperationKind() string { return "update_consensus_key" } + +type OpDrainDelegate struct { + Manager + ConsesusKey string + Delegate string + Destination string +} + +func (o *OpDrainDelegate) OperationKind() string { return "drain_delegate" } + type Commitment struct { CompressedState string InboxLevel int32 @@ -499,6 +519,19 @@ func parseOperation(buf *[]byte) (op Operation, err error) { } return &op, nil + case tagDrainDelegate: + var op OpDrainDelegate + if op.ConsesusKey, err = parsePublicKeyHash(buf); err != nil { + return nil, fmt.Errorf("%s: %w", opKinds[int(t)], err) + } + if op.Delegate, err = parsePublicKeyHash(buf); err != nil { + return nil, fmt.Errorf("%s: %w", opKinds[int(t)], err) + } + if op.Destination, err = parsePublicKeyHash(buf); err != nil { + return nil, fmt.Errorf("%s: %w", opKinds[int(t)], err) + } + return &op, nil + case tagEmmyEndorsement: var op OpEmmyEndorsement if op.Level, err = utils.GetInt32(buf); err != nil { @@ -712,6 +745,7 @@ func parseOperation(buf *[]byte) (op Operation, err error) { tagRegisterGlobalConstant, tagSetDepositsLimit, tagIncreasePaidStorageLimit, + tagUpdateConsensusKey, tagTxRollupOrigination, tagTxRollupSubmitBatch, tagTxRollupCommit, @@ -873,6 +907,17 @@ func parseOperation(buf *[]byte) (op Operation, err error) { op.Destination = string(dest) return &op, nil + case tagUpdateConsensusKey: + op := OpUpdateConsensusKey{ + Manager: common, + } + dest, err := parsePublicKey(buf) + if err != nil { + return nil, fmt.Errorf("%s: %w", opKinds[int(t)], err) + } + op.ConsesusKey = string(dest) + return &op, nil + case tagTxRollupOrigination: return (*OpTxRollupOrigination)(&common), nil