/
change_gov_controller.go
55 lines (49 loc) · 1.61 KB
/
change_gov_controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package transaction
import (
"fmt"
iotago "github.com/iotaledger/iota.go/v3"
"github.com/iotaledger/wasp/packages/cryptolib"
"github.com/iotaledger/wasp/packages/parameters"
"github.com/iotaledger/wasp/packages/util"
)
func NewChangeGovControllerTx(
chainID iotago.AliasID,
newGovController iotago.Address,
utxos iotago.OutputSet,
wallet cryptolib.VariantKeyPair,
) (*iotago.Transaction, error) {
// find the correct chain UTXO
var chainOutput *iotago.AliasOutput
var chainOutputID iotago.OutputID
for id, o := range utxos {
ao, ok := o.(*iotago.AliasOutput)
if !ok {
continue
}
if util.AliasIDFromAliasOutput(ao, id) == chainID {
chainOutputID = id
chainOutput = ao.Clone().(*iotago.AliasOutput)
break
}
}
if chainOutput == nil {
return nil, fmt.Errorf("unable to find UTXO for chain (%s) in owned UTXOs", chainID.String())
}
newConditions := make(iotago.UnlockConditions, len(chainOutput.Conditions))
for i, c := range chainOutput.Conditions {
if _, ok := c.(*iotago.GovernorAddressUnlockCondition); ok {
// change the gov unlock condiiton to the new owner
newConditions[i] = &iotago.GovernorAddressUnlockCondition{
Address: newGovController,
}
continue
}
newConditions[i] = c
}
chainOutput.Conditions = newConditions
chainOutput.AliasID = chainID // in case right after mint where outputID is still 0
inputIDs := iotago.OutputIDs{chainOutputID}
inputsCommitment := inputIDs.OrderedSet(utxos).MustCommitment()
outputs := []iotago.Output{chainOutput}
return CreateAndSignTx(inputIDs.UTXOInputs(), inputsCommitment, outputs, wallet, parameters.L1().Protocol.NetworkID())
}