diff --git a/RELEASES.md b/RELEASES.md index 5fd5372d5e86..e2bcdb7686a5 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -342,13 +342,13 @@ The plugin version is updated to `34` all plugins must update to be compatible. This upgrade consists of the following Avalanche Community Proposals (ACPs): -- [ACP-23](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/23-p-chain-native-transfers.md) P-Chain Native Transfers -- [ACP-24](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/24-shanghai-eips.md) Activate Shanghai EIPs on C-Chain -- [ACP-25](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/25-vm-application-errors.md) Virtual Machine Application Errors -- [ACP-30](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/30-avalanche-warp-x-evm.md) Integrate Avalanche Warp Messaging into the EVM -- [ACP-31](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/31-enable-subnet-ownership-transfer.md) Enable Subnet Ownership Transfer -- [ACP-41](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/41-remove-pending-stakers.md) Remove Pending Stakers -- [ACP-62](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/62-disable-addvalidatortx-and-adddelegatortx.md) Disable AddValidatorTx and AddDelegatorTx +- [ACP-23](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/23-p-chain-native-transfers/README.md) P-Chain Native Transfers +- [ACP-24](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/24-shanghai-eips/README.md) Activate Shanghai EIPs on C-Chain +- [ACP-25](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/25-vm-application-errors/README.md) Virtual Machine Application Errors +- [ACP-30](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/30-avalanche-warp-x-evm/README.md) Integrate Avalanche Warp Messaging into the EVM +- [ACP-31](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/31-enable-subnet-ownership-transfer/README.md) Enable Subnet Ownership Transfer +- [ACP-41](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/41-remove-pending-stakers/README.md) Remove Pending Stakers +- [ACP-62](https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/62-disable-addvalidatortx-and-adddelegatortx/README.md) Disable AddValidatorTx and AddDelegatorTx The changes in the upgrade go into effect at 11 AM ET (4 PM UTC) on Wednesday, March 6th, 2024 on Mainnet. @@ -3018,7 +3018,7 @@ This version is backwards compatible to [v1.7.0](https://github.com/ava-labs/ava ### Networking -- Reduced default peerlist and accepted frontier gossipping +- Reduced default peerlist and accepted frontier gossiping - Increased the default at-large outbound buffer size to 32 MiB ### Metrics @@ -3100,7 +3100,7 @@ This version is backwards compatible to [v1.7.0](https://github.com/ava-labs/ava - Added `--snow-mixed-query-num-push-vdr` and `--snow-mixed-query-num-push-non-vdr` to allow parameterization of sending push queries - By default, non-validators now send only pull queries, not push queries. - By default, validators now send both pull queries and push queries upon inserting a container into consensus. Previously, nodes sent only push queries. -- Added metrics to track the amount of over gossipping of `peerlist` messages +- Added metrics to track the amount of over gossiping of `peerlist` messages - Added custom message queueing support to outbound `Peer` messages - Reused `Ping` messages to avoid needless memory allocations diff --git a/api/admin/service.md b/api/admin/service.md index 94afbf370451..4a2a97c29e13 100644 --- a/api/admin/service.md +++ b/api/admin/service.md @@ -75,7 +75,7 @@ Now, calls to the X-Chain can be made to either `/ext/bc/X` or, equivalently, to Give a blockchain an alias, a different name that can be used any place the blockchain’s ID is used. -:::note Aliasing a chain can also be done via the [Node API](https://docs.avax.network/nodes/configure/avalanchego-config-flags.md#--chain-aliases-file-string). +:::note Aliasing a chain can also be done via the [Node API](/nodes/configure/avalanchego-config-flags.md#--chain-aliases-file-string). Note that the alias is set for each chain on each node individually. In a multi-node Subnet, the same alias should be configured on each node to use an alias across a Subnet successfully. Setting an alias for a chain on one node does not register that alias with other nodes automatically. diff --git a/config/config.go b/config/config.go index 4cc327240637..44147b19dbd1 100644 --- a/config/config.go +++ b/config/config.go @@ -289,6 +289,11 @@ func getNetworkConfig( // peers that we support these upgrades. supportedACPs.Union(constants.ScheduledACPs) + // To decrease unnecessary network traffic, peers will not be notified of + // objection or support of activated ACPs. + supportedACPs.Difference(constants.ActivatedACPs) + objectedACPs.Difference(constants.ActivatedACPs) + config := network.Config{ ThrottlerConfig: network.ThrottlerConfig{ MaxInboundConnsPerSec: maxInboundConnsPerSec, diff --git a/network/certs_test.go b/network/certs_test.go deleted file mode 100644 index 587674119546..000000000000 --- a/network/certs_test.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. -// See the file LICENSE for licensing terms. - -package network - -import ( - "crypto/tls" - "net" - "sync" - "testing" - - "github.com/stretchr/testify/require" - - _ "embed" - - "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/network/peer" - "github.com/ava-labs/avalanchego/staking" - "github.com/ava-labs/avalanchego/utils/ips" -) - -var ( - //go:embed test_cert_1.crt - testCertBytes1 []byte - //go:embed test_key_1.key - testKeyBytes1 []byte - //go:embed test_cert_2.crt - testCertBytes2 []byte - //go:embed test_key_2.key - testKeyBytes2 []byte - //go:embed test_cert_3.crt - testCertBytes3 []byte - //go:embed test_key_3.key - testKeyBytes3 []byte - - ip *ips.ClaimedIPPort - otherIP *ips.ClaimedIPPort - - certLock sync.Mutex - tlsCerts []*tls.Certificate - tlsConfigs []*tls.Config -) - -func init() { - cert1, err := staking.LoadTLSCertFromBytes(testKeyBytes1, testCertBytes1) - if err != nil { - panic(err) - } - cert2, err := staking.LoadTLSCertFromBytes(testKeyBytes2, testCertBytes2) - if err != nil { - panic(err) - } - cert3, err := staking.LoadTLSCertFromBytes(testKeyBytes3, testCertBytes3) - if err != nil { - panic(err) - } - tlsCerts = []*tls.Certificate{ - cert1, cert2, cert3, - } - - stakingCert1, err := staking.ParseCertificate(cert1.Leaf.Raw) - if err != nil { - panic(err) - } - stakingCert2, err := staking.ParseCertificate(cert2.Leaf.Raw) - if err != nil { - panic(err) - } - - ip = ips.NewClaimedIPPort( - stakingCert1, - ips.IPPort{ - IP: net.IPv4(127, 0, 0, 1), - Port: 9651, - }, - 1, // timestamp - nil, // signature - ) - otherIP = ips.NewClaimedIPPort( - stakingCert2, - ips.IPPort{ - IP: net.IPv4(127, 0, 0, 1), - Port: 9651, - }, - 1, // timestamp - nil, // signature - ) -} - -func getTLS(t *testing.T, index int) (ids.NodeID, *tls.Certificate, *tls.Config) { - certLock.Lock() - defer certLock.Unlock() - - for len(tlsCerts) <= index { - cert, err := staking.NewTLSCert() - require.NoError(t, err) - tlsCerts = append(tlsCerts, cert) - } - for len(tlsConfigs) <= index { - cert := tlsCerts[len(tlsConfigs)] - tlsConfig := peer.TLSConfig(*cert, nil) - tlsConfigs = append(tlsConfigs, tlsConfig) - } - - tlsCert := tlsCerts[index] - cert, err := staking.ParseCertificate(tlsCert.Leaf.Raw) - require.NoError(t, err) - nodeID := ids.NodeIDFromCert(cert) - return nodeID, tlsCert, tlsConfigs[index] -} diff --git a/network/network_test.go b/network/network_test.go index ee645aef21d7..f8f7b56427ff 100644 --- a/network/network_test.go +++ b/network/network_test.go @@ -6,7 +6,6 @@ package network import ( "context" "crypto" - "crypto/rsa" "net" "sync" "testing" @@ -166,13 +165,19 @@ func newTestNetwork(t *testing.T, count int) (*testDialer, []*testListener, []id ) for i := 0; i < count; i++ { ip, listener := dialer.NewListener() - nodeID, tlsCert, tlsConfig := getTLS(t, i) + + tlsCert, err := staking.NewTLSCert() + require.NoError(t, err) + + cert, err := staking.ParseCertificate(tlsCert.Leaf.Raw) + require.NoError(t, err) + nodeID := ids.NodeIDFromCert(cert) blsKey, err := bls.NewSecretKey() require.NoError(t, err) config := defaultConfig - config.TLSConfig = tlsConfig + config.TLSConfig = peer.TLSConfig(*tlsCert, nil) config.MyNodeID = nodeID config.MyIPPort = ip config.TLSKey = tlsCert.PrivateKey.(crypto.Signer) @@ -399,7 +404,14 @@ func TestTrackVerifiesSignatures(t *testing.T) { _, networks, wg := newFullyConnectedTestNetwork(t, []router.InboundHandler{nil}) network := networks[0] - nodeID, tlsCert, _ := getTLS(t, 1) + + tlsCert, err := staking.NewTLSCert() + require.NoError(err) + + cert, err := staking.ParseCertificate(tlsCert.Leaf.Raw) + require.NoError(err) + nodeID := ids.NodeIDFromCert(cert) + require.NoError(network.config.Validators.AddStaker(constants.PrimaryNetworkID, nodeID, nil, ids.Empty, 1)) stakingCert, err := staking.ParseCertificate(tlsCert.Leaf.Raw) @@ -417,7 +429,7 @@ func TestTrackVerifiesSignatures(t *testing.T) { ), }) // The signature is wrong so this peer tracking info isn't useful. - require.ErrorIs(err, rsa.ErrVerification) + require.ErrorIs(err, staking.ErrECDSAVerificationFailure) network.peersLock.RLock() require.Empty(network.trackedIPs) diff --git a/network/test_cert_1.crt b/network/test_cert_1.crt deleted file mode 100644 index 2f2b95e658ad..000000000000 --- a/network/test_cert_1.crt +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEnTCCAoWgAwIBAgIBADANBgkqhkiG9w0BAQsFADAAMCAXDTk5MTIzMTAwMDAw -MFoYDzIxMjQwMTA5MTQ0NTU4WjAAMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAqCOUESK8b5N894dVCSIs4mTfNTdhaL5cnw3ZXSbZlfquBRJOxhqHXutG -An9++OTWvevrssaXBxGT4oOT3N11dm4iKh7ewi3to+1Sfqq71blCVZtBDOeWpZx0 -WwhPO37Us26fCR7T2gStiTHY9qE0QV/9p15OCAFsRb94JuhF0OR0d6tRm0yQ6b7Y -NRzpaBw4MBxZD9h84+QDdhsTyxI0xk/NnbG74pykjsau0/YA9mNqHHSnL4DyD5qu -IKqRfD5HQHemx66I3jEXUB/GxTHhxz5uskIpS9AV3oclvVi14BjSEWgNkJX+nMi+ -tjuSKouAFpzJZzZme2DvmyAecxbNVBdajOTe2QRiG7HKh1OdMZabd2dUNv5S9/gd -bI53s4R++z/H4llsBfk6B2+/DmqDRauh4Mz9HTf0Pud7Nz2b7r77PnPTjHExgN3R -i+Yo6LskRCQTzzTVwW/RY+rNVux9UE6ZPLarDbXnSyetKMUS7qlz8NUerWjtkC6i -om570LfTGs3GxIqVgoGg0mXuji+EoG+XpYR3PRaeo8cAmfEu7T+SxgSfJAv7DyZv -+a2VTZcOPDI1KTLrM8Xovy17t5rd9cy1/75vxnKLiGDEhzWJmNl4IvIYbtihWWl5 -ksdFYbe9Dpvuh/wBCGoK+kmCirUM1DiizWn5TxJeS1qYI8I2sYMCAwEAAaMgMB4w -DgYDVR0PAQH/BAQDAgSwMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB -AABzczRjzfhlmV+bFDzAs7nszQlZREcoRuWe5qHy7VKLvZvIAaYlcApB34hH7nDq -T/8fS8g8rC+Tzw0iCPF21Z4AzSe76V6EU4VGWWe8l00nDszfvavE5BF24z8dCuVC -1gScC1tvG6FPT23koZ0BVmyueCIa7sdqFlDz8rrRpLWfUcLj38gxwWM2JVBHQUvV -j87lzpTNH+2nPiwrKISqUPFi4YvbWKe8T4bY2Elw7THiNLZGfgqOXVkeIVi4fs97 -Tc5uscZ4OpSTlrfJqMJEV8cMRvrDmhD/VWbJvnk7lyELPoHx6MUinBswBT51yvmY -bZh4AZ43GSvSyo/V7p9scytQP3zM1MeHpsFa0RHwGVFp2BmO1abvydAxX0NMWasv -WUzXCKliXsVD/qUeCU/CFnaBqpzBvm4AFBgwHzprwzP9Be/mz/TjTcsfrmoiyxlr -QjXNk9TnP9d+aeOJsRz+JSYyHETACO5PkCg+XCDyEOf+kQAzVb9Dp0oWaCovXciU -A5z0DSDzyKVBOQo0syb5NFsLZ2DeJemNbP+3kCNzBBASQ4VWAvRbLjPh3Oe8A5PZ -xezCvzRE05O6tYkz5C5hcKbpAjfP8G8RV6ERjLBICBfb7XI7T0hixhiNHlIKknkJ -F82B/zDt+qBFARw8A/qr44RF+vy3Ql4IS2ZcflAv2pTO ------END CERTIFICATE----- diff --git a/network/test_cert_2.crt b/network/test_cert_2.crt deleted file mode 100644 index 283e286be446..000000000000 --- a/network/test_cert_2.crt +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEnTCCAoWgAwIBAgIBADANBgkqhkiG9w0BAQsFADAAMCAXDTk5MTIzMTAwMDAw -MFoYDzIxMjQwMTA5MTQ0NTQ3WjAAMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEArT7afarml6cvCmAySAO8GQka1mcQIMACyEWy6KsqiccX+DoGh5ECyQSa -WFKWKGdQ32dAWGVlSkmmgJ1jtW749hSguysav3EPMaxe/ad5CV1MwyyccGS9U99M -z0UVuFEXVjN5W6UlcULp1oJDj07NzZP6ByRiDvnjzgeYb3jHwjqOBNwex1jLW6vp -oWD03zTanVQXZaaGcEISCI2CgDP3uXfd0NQpoGVpf9gMi0cdGu8gpqbLqBjzjzr8 -GDBQYGaWKFnlqe6X9nBUad/qNE3Zeb3ehSg+M2ecQzTZFWirfa6cGTtovu04RMML -9OLflQy3rTRST2HQ6z0gpVCP3V2Mg/LmAuWyhOLVYNkhEwkRHvddzFksRzQ+ghpP -cGfvI0dwxQV0CbEMVjd9zVEA6dOrMLI3st2922hqF23Al1+Hwcu1G/T3ybfSTwjd -YZ23IgkQF4r+RIXevzgOBBXfEwE8XERW2zNwUG5Sv5dxx+FgDjX0EGbrzgY6OeKT -D1SP/7WQLjwmGgwyNJYkAklvEKwU+dlGD5NpgvJ9fg8R1wUhp2HhSZ1l1OUVmRYw -YqUm7dTLK1CJU2BH2sRyZcUkwstjvgi688zfHNttGYmAnx6wGS12jWf+W4df+QNI -Ng6AdcJ5Ee0z0JAbTpZW/zX3CTSroow7igHnd4AwvKEVQFcyO/MCAwEAAaMgMB4w -DgYDVR0PAQH/BAQDAgSwMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB -ACePaZvjw2KiheheWNjzOv2B+7uLVe7oEbThEUQypEmTFK8wKaHwI4BGdBGEOr/N -LZ1M2wAYgwzMTEDJE+GEB2ZHIdH9cH5lu7ITsOMVcBSJttEJVhhEtbMwVJ9JC62j -AsW4VmHFpEik+xvinxedKczXOa21YJo4sv2TiFWFaSHqPeRo7HA1dxQYOwiLsS6e -JKIupMrn8IZz2YN5gFhbvQTBp2J3u6kxMIzN0a+BPARR4fwMn5lVMVvye/+8Kwtw -dZHSN1FYUcFqHagmhNlNkAOaGQklSFWtsVVQxQCFS2bxEImLj5kG16fCAsQoRC0J -ZS2OaRncrtB0r0Qu1JB5XJP9FLflSb57KIxBNVrl+iWdWikgBFE6cMthMwgLfQ99 -k8AMp6KrCjcxqegN+P30ct/JwahKPq2+SwtdHG3yrZ2TJEjhOtersrTnRK9zqm9v -lqS7JsiztjgqnhMs2eTdXygfEe0AoZihGTaaLYj37A9+2RECkuijkjBghG2NBnv6 -264lTghZyZcZgZNCgYglYC1bhifEorJpYf6TOOcDAi5UH8R7vi4x70vI6sIDrhga -d9E63EVe11QdIjceceMlNm42UTrhl0epMbL6FIzU+d91qBgd9qT6YqoYPFZSiYFy -2hArgLxH2fxTXatCAit5g1MEk0w1MiHVrPZ8lTU3U/ET ------END CERTIFICATE----- diff --git a/network/test_cert_3.crt b/network/test_cert_3.crt deleted file mode 100644 index c0977191ec7b..000000000000 --- a/network/test_cert_3.crt +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIEnTCCAoWgAwIBAgIBADANBgkqhkiG9w0BAQsFADAAMCAXDTk5MTIzMTAwMDAw -MFoYDzIxMjQwMTA5MTQ0NTM0WjAAMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEA5aV76ivIZ1iWmW0OzGMCrmFQBnej9JntQ1jP9yiacKu7j5Z/bD/eqoyc -jRwoSiesErfnThAGy7H80glVw/XmC0fYNPVDPyzAEdNk46M3yEI8hAKI6aSkl1s1 -KVAHpQuNcG+3xIB39OOMx0XuycZ6gqzyMmjqeT0cThNDXTwGbodMVDAf0q220QAq -zB/lz0sjHPXlYh25LJ1yPtl+vlcfGrP+q+2ODR9rnI79PE7AZB4Xc6wUIca5XXkH -PS7zQ1Ida1xrf446MYCVuazLFhpzq8/nhkxNMzxdZsJaWavL+xkpjGxAySvj0jlu -QFGsmsxOIU/XgJD/VRqqyISXpl2wg0l8mpsU9fV7bEW1y6MIc7AARRgbbEPiDz8m -/O8mjEW3C16untLHB7LzPCCitTssGR65Shkj+Lw+aM4X5ZI+Xm8eHTRCek8T5Cl3 -Sm2UFkLk2mun6cwoyWWhwi6+EfW6ks0c7qSHtJTP8DgLrWxYmBuD9PKSHclpa4/5 -toj52YnT6fIBJWz5ggIdntRCaH8+0eWvwuvDsdPUL7JQFjJmfQOdMenlNqW2aEvx -+JZiYLJBWj9cjpI33P5CAfFEVM3IFlDHmMHRTQ/kKLcfvSDfuofEBoMt4tjf01Um -dfi8kFKWl9ba9I7CoQ13U4J1wkk6KxatZP7eGCmKRoq8w+Y38NsCAwEAAaMgMB4w -DgYDVR0PAQH/BAQDAgSwMAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB -AKsvbN5/r4YPguetl+jIhqpr4TZM8GNZRGTqkKC8clRspBeihJqkNQWsnZiFkJTH -NhNAx+7tlJHqeGdojc2XjBAkc+//qYqXKHgihsO54bVG9oN9IPO+mpPumRRhGneH -jTUE/hLFqwA4ZPw5L1HtJ0m1yqg/HXf4aBXcVQ/YO8YN17ZgLpueYt+Chi1pP/Ku -TzHuoKuHst2T6uuZQZxcD+XJoXwdOt7mfPTh5y9/Psjn+qx833DNWSwF3O/lEghA -2yOb+5CFta2LLUHH894oj5SvgJ/5cvn4+NbyDCUv5ebvE98BMh72PLNRuIRV0gfO -XalMIZ+9Jm2TGXD0dWt9GeZ5z3h+nCEB6s3x0sqluaWG3lTUx+4T/aIxdGuvPFi6 -7DWm7TG7yxFGfbECyyXXL+B/gyHhE1Q93nE3wK9flSG+ljqFJS+8wytht52XhgwE -lV1AwHgxkbkFzNIwB0s7etR9+wBcQvFKqeCZrDeG1twKNcY1dv1D/OCUlBYJvL/X -YADeT2ZjFzHhWhv6TLVEAtqytT1o4qXh6VWeIrwfMG0VcQSiJyNxwO/aW5BOTM44 -EelDzvSjo/pRxqN/m44Iuf0Ran86DO7LmjNYh/04FN3oaL9cFIaT9BWXt/Xx2Fdw -+dg5bPSJ62ExVnnNRlY9lQECkSoRZK2epcICs+3YmmGX ------END CERTIFICATE----- diff --git a/network/test_key_1.key b/network/test_key_1.key deleted file mode 100644 index c49775114d66..000000000000 --- a/network/test_key_1.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -MUZqfFgfj8ESxFBEeToOwr3Jq46vOwQ= ------END PRIVATE KEY----- diff --git a/network/test_key_2.key b/network/test_key_2.key deleted file mode 100644 index bcc0a192b2b4..000000000000 --- a/network/test_key_2.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -i3mHicYaTQxj0ruIz7JHOtFNVGi1sME= ------END PRIVATE KEY----- diff --git a/network/test_key_3.key b/network/test_key_3.key deleted file mode 100644 index 2cef238b67a9..000000000000 --- a/network/test_key_3.key +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDlpXvqK8hnWJaZ -bQ7MYwKuYVAGd6P0me1DWM/3KJpwq7uPln9sP96qjJyNHChKJ6wSt+dOEAbLsfzS -CVXD9eYLR9g09UM/LMAR02TjozfIQjyEAojppKSXWzUpUAelC41wb7fEgHf044zH -Re7JxnqCrPIyaOp5PRxOE0NdPAZuh0xUMB/SrbbRACrMH+XPSyMc9eViHbksnXI+ -2X6+Vx8as/6r7Y4NH2ucjv08TsBkHhdzrBQhxrldeQc9LvNDUh1rXGt/jjoxgJW5 -rMsWGnOrz+eGTE0zPF1mwlpZq8v7GSmMbEDJK+PSOW5AUayazE4hT9eAkP9VGqrI -hJemXbCDSXyamxT19XtsRbXLowhzsABFGBtsQ+IPPyb87yaMRbcLXq6e0scHsvM8 -IKK1OywZHrlKGSP4vD5ozhflkj5ebx4dNEJ6TxPkKXdKbZQWQuTaa6fpzCjJZaHC -Lr4R9bqSzRzupIe0lM/wOAutbFiYG4P08pIdyWlrj/m2iPnZidPp8gElbPmCAh2e -1EJofz7R5a/C68Ox09QvslAWMmZ9A50x6eU2pbZoS/H4lmJgskFaP1yOkjfc/kIB -8URUzcgWUMeYwdFND+Qotx+9IN+6h8QGgy3i2N/TVSZ1+LyQUpaX1tr0jsKhDXdT -gnXCSTorFq1k/t4YKYpGirzD5jfw2wIDAQABAoICAQC/Rt32h29NvTj7JB5OWS2z -h3R7Xo2ev9Mi5EecSyKQNEpuZ+FMjcpubd47nrdkRLULhkhP+gNfCKpXW9Um+psY -zEemnJ7dcO2uK1B+VsWwtJLpNZ9KVIuPUjXuai1j6EJv423Ca2r++8WXeYVSZVJH -o7u8By09vIvl8B+M+eE1kNYfzVHETlLWtHfxO6RTy/a8OYhM+ArzwVSWStxJuBE9 -Ua0PETffcEtWxLbi04lmGrZX7315QKfG1ncUHBYc/blpYjpbrWCFON/9HpKtn2y3 -L91dPBKVWXNGkx1kUTb+t8+mmchAh6Ejyhgt1Jma+g8dqf4KpTs3bJXRnLcfqCvL -Kq+wCUGv7iVWlTmhlzLpneajLDdBxGfbkAgwPFOyZoJNrnh6hU60TPc1IV6YSLlB -GsxesK9QWUrg3BAN4iKD3FvDt0qeUPbPztxEZi1OzSYQDZUQBrBL+WHuD9NxeAYe -2yx1OlPMo73gK5GW/MHBCz77+NX2kVURlTvYW4TsmInCRvOTsVNkRPUJtiHYT7Ss -Y8SzS5F/u9sfjFAVowGgwtNfq8Rm6Q1QdPZltiUNBgiTekFNQEy7WhzVg6MlT5Ca -BRqUhN3+CFwxLZ9rSQL6gxfAHk9umb0ee4JU9JgcYjtb5AtyE6DmmcSZPSejjxit -HwZ/g5MDK7kk5fKMcnL7kQKCAQEA895z7T0c6y3rhWfEUMDdTlsPgAoxYNf+jXyJ -aQmtfnDP9tf8BdPpobfHp29e7JRaGGa9QWPaaemBPHXMmD+IegG9/E+PQdHQwFSG -OpI13uCBULt8a+MMUbTCg1V4uXqf2j1BUo9SFQ6aXh/Rg1gVBgsq1M6eyvel93io -0X+/cinsDEpB5HENZwBuRb0SP0RfCgQR9Yh+jIy2TwJDDNw3sG1TvIo9aK7blSwB -z/gwSDx1UUa2KReD4ChYcqgLFUj3F/uF2f20P/JuaUn7tU3HoCsbG0C+Cci/XSJ9 -gu8xYl64Vg16bO3CflqjucPTFXgyBOt0lIug77YYa9CgCUJvEwKCAQEA8RHqGghV -meDnRXvPmAEwtoT7IKBe+eYjGN6wc2o+QZzjeUFkyfOtaB8rqriUXqvihD2GD6XQ -O/cSNCqp5g6yUhBLo3b9BmCsQsvxkhMpwB/hdi5aYjn+CFQVD4rAso9yGwRBWoA0 -gQdGMKenOUhU/PtVKyTTUuY7rFD8RhYq0ZLqEgO7chn8QXCNPo7MfE/qF9vQBosP -ktiS0FG442PJp2B/lYKK6N2w77ZeCoLhQowaNN0/N36kX/n4bjBE2XFLNpSuHtlg -C7bV/RMR5i/3yB0eRVUDVlqC077qlC1w0tCNZvvi6kbWwIu/4pQTdcA8mAz5B7Lc -OwOMbA2GT4OIGQKCAQABoyS0Gwzup0hFhQTUZfcWZ5YbDfZ25/xVhtiFVANOLgO3 -bIvMnjebVliIzz6b6AMS1t2+aqU0wNSVS1UsUIDiENDtuLsFfhsgr3CXRBQIgwlb -OWcEcmnKwqPrrc85r5ETLgYaP8wVSBvRNfV6JEU/3SNUem6mfjMnDjBT97+ZTJ7B -Fl6K4hds8ZvL7BELS7I3pv9X3qq61tcCgMlidLgK/zDouyTeZw4iWkFI3Cm20nEX -MppWfEnuX1b4rhgk9HB0QMQNSp7DLyV+n3iJJxSIBsIP1Mdx2V8viOO+1UxHlMs4 -CK8hvBbqMkGXJbFtG3l6fvoxZR6XfWl8j9IDPebxAoIBAF07cnBy/LgwdQE4awb8 -ntxX/c+WdmTrjnNV3KQmWMGDba49jj9UkKIOPBMgo7EhhM9kA+8VT72BRncKcP7a -fDikuLwVjrHivXxv55N4+dKmAcp1DtuiVg7ehe6m2PO16olsUeIwZx3ntEuo61GK -GeRlR4ESEvCivj1cbNSmShUXXpNtAheU2Sxt3RJuo8MIHR7xEjkVmwZN4CnVEU5Q -D3M+LNmjzRlWc9GhlCk4iOn1yUTctFBAGE5OHLhwzo/R8ya+xcCEjVK6eXQQ5gFC -V+/64vQpdsr04lgGJC7+i/3cTnOfwxicIP4CjkmQvx3xJP4hNka189qW+r3nVSR3 -WDECggEAAQCCqF4J8C2keY+o/kYQBq0tHhrC28HgiVQuCGc4XruYQtDh4di/I72F -RsvgVHS29ApAlh29i29ws7K2bU6WIc+JR3nmwAHUtiJmxRZhn/c722AvRXF5YMH/ -u46bEURHF5sGz8vr5chX/R4LiF579xyNsB9KC3mPqdjW/L6ACQdrBJVAS9cwplO0 -D+YWxmCE1Ps2tQtz6ZN+LUC7WO6M24k8KW2y4Scue0/23uCllWFgS3/vxDdQDZWn -+7AvMYPh4Wrfdd0t0cU+c9rirFYVz+uo/QBUIZOIw64AvIUjZpHTbhcjz1mAqcgJ -eAOQk+OFUTNKeI9uJwoNYOguHsxt2w== ------END PRIVATE KEY----- diff --git a/network/tracked_ip_test.go b/network/tracked_ip_test.go index 956f02cc19b4..90207e48a6e9 100644 --- a/network/tracked_ip_test.go +++ b/network/tracked_ip_test.go @@ -4,12 +4,63 @@ package network import ( + "net" "testing" "time" "github.com/stretchr/testify/require" + + "github.com/ava-labs/avalanchego/staking" + "github.com/ava-labs/avalanchego/utils/ips" +) + +var ( + ip *ips.ClaimedIPPort + otherIP *ips.ClaimedIPPort ) +func init() { + { + cert, err := staking.NewTLSCert() + if err != nil { + panic(err) + } + stakingCert, err := staking.ParseCertificate(cert.Leaf.Raw) + if err != nil { + panic(err) + } + ip = ips.NewClaimedIPPort( + stakingCert, + ips.IPPort{ + IP: net.IPv4(127, 0, 0, 1), + Port: 9651, + }, + 1, // timestamp + nil, // signature + ) + } + + { + cert, err := staking.NewTLSCert() + if err != nil { + panic(err) + } + stakingCert, err := staking.ParseCertificate(cert.Leaf.Raw) + if err != nil { + panic(err) + } + otherIP = ips.NewClaimedIPPort( + stakingCert, + ips.IPPort{ + IP: net.IPv4(127, 0, 0, 1), + Port: 9651, + }, + 1, // timestamp + nil, // signature + ) + } +} + func TestTrackedIP(t *testing.T) { require := require.New(t) diff --git a/node/node.go b/node/node.go index 6ecac252b1c3..fff8e13572cb 100644 --- a/node/node.go +++ b/node/node.go @@ -505,7 +505,7 @@ func (n *Node) initNetworking() error { } } if unknownACPs.Len() > 0 { - n.Log.Warn("gossipping unknown ACPs", + n.Log.Warn("gossiping unknown ACPs", zap.Reflect("acps", unknownACPs), ) } diff --git a/scripts/build_test.sh b/scripts/build_test.sh index 747cb8882449..cfff1a2fc9fd 100755 --- a/scripts/build_test.sh +++ b/scripts/build_test.sh @@ -9,12 +9,6 @@ source "$AVALANCHE_PATH"/scripts/constants.sh EXCLUDED_TARGETS="| grep -v /mocks | grep -v proto | grep -v tests/e2e | grep -v tests/upgrade" -GOOS=$(go env GOOS) -if [[ "$GOOS" == "windows" ]]; then - # tmpnet and antithesis tests (which depend on tmpnet) are not compatible with windows - EXCLUDED_TARGETS="${EXCLUDED_TARGETS} | grep -v tests/fixture | grep -v tests/antithesis" -fi - TEST_TARGETS="$(eval "go list ./... ${EXCLUDED_TARGETS}")" # shellcheck disable=SC2086 diff --git a/snow/README.md b/snow/README.md index b5b16bc938ba..86a90919b2ac 100644 --- a/snow/README.md +++ b/snow/README.md @@ -47,7 +47,7 @@ Currently, Avalanchego implements its own message serialization to communicate. ### [Network](https://github.com/ava-labs/avalanchego/blob/master/network/network.go) -The networking interface is shared across all chains. It implements functions from the `ExternalSender` interface. The two functions it implements are `Send` and `Gossip`. `Send` sends a message of type `OutboundMessage` to a specific set of nodes (specified by an array of `NodeIDs`). `Gossip` sends a message of type `OutboundMessage` to a random group of nodes in a subnet (can be a validator or a non-validator). Gossipping is used to push transactions across the network. The networking protocol uses TLS to pass messages between peers. +The networking interface is shared across all chains. It implements functions from the `ExternalSender` interface. The two functions it implements are `Send` and `Gossip`. `Send` sends a message of type `OutboundMessage` to a specific set of nodes (specified by an array of `NodeIDs`). `Gossip` sends a message of type `OutboundMessage` to a random group of nodes in a subnet (can be a validator or a non-validator). gossiping is used to push transactions across the network. The networking protocol uses TLS to pass messages between peers. Along with sending and gossiping, the networking library is also responsible for making connections and maintaining connections. Any node whether they are a validator or non-validator will attempt to connect to the primary network. diff --git a/snow/engine/snowman/bootstrap/bootstrapper.go b/snow/engine/snowman/bootstrap/bootstrapper.go index 2988ece9ba0e..095ba4e63b17 100644 --- a/snow/engine/snowman/bootstrap/bootstrapper.go +++ b/snow/engine/snowman/bootstrap/bootstrapper.go @@ -150,6 +150,14 @@ func (b *Bootstrapper) Clear(context.Context) error { } func (b *Bootstrapper) Start(ctx context.Context, startReqID uint32) error { + b.Ctx.State.Set(snow.EngineState{ + Type: p2p.EngineType_ENGINE_TYPE_SNOWMAN, + State: snow.Bootstrapping, + }) + if err := b.VM.SetState(ctx, snow.Bootstrapping); err != nil { + return fmt.Errorf("failed to notify VM that bootstrapping has started: %w", err) + } + lastAccepted, err := b.getLastAccepted(ctx) if err != nil { return err @@ -161,14 +169,6 @@ func (b *Bootstrapper) Start(ctx context.Context, startReqID uint32) error { zap.Uint64("lastAcceptedHeight", lastAcceptedHeight), ) - b.Ctx.State.Set(snow.EngineState{ - Type: p2p.EngineType_ENGINE_TYPE_SNOWMAN, - State: snow.Bootstrapping, - }) - if err := b.VM.SetState(ctx, snow.Bootstrapping); err != nil { - return fmt.Errorf("failed to notify VM that bootstrapping has started: %w", err) - } - // Set the starting height b.startingHeight = lastAcceptedHeight b.requestID = startReqID diff --git a/snow/engine/snowman/bootstrap/bootstrapper_test.go b/snow/engine/snowman/bootstrap/bootstrapper_test.go index 159fc98fb581..5577f62fa81d 100644 --- a/snow/engine/snowman/bootstrap/bootstrapper_test.go +++ b/snow/engine/snowman/bootstrap/bootstrapper_test.go @@ -742,6 +742,37 @@ func TestBootstrapperReceiveStaleAncestorsMessage(t *testing.T) { require.Equal(snow.Bootstrapping, config.Ctx.State.Get().State) } +func TestBootstrapperRollbackOnSetState(t *testing.T) { + require := require.New(t) + + config, _, _, vm := newConfig(t) + + blks := snowmantest.BuildChain(2) + initializeVMWithBlockchain(vm, blks) + + blks[1].StatusV = choices.Accepted + + bs, err := New( + config, + func(context.Context, uint32) error { + config.Ctx.State.Set(snow.EngineState{ + Type: p2ppb.EngineType_ENGINE_TYPE_SNOWMAN, + State: snow.NormalOp, + }) + return nil + }, + ) + require.NoError(err) + + vm.SetStateF = func(context.Context, snow.State) error { + blks[1].StatusV = choices.Processing + return nil + } + + require.NoError(bs.Start(context.Background(), 0)) + require.Equal(blks[0].HeightV, bs.startingHeight) +} + func initializeVMWithBlockchain(vm *block.TestVM, blocks []*snowmantest.Block) { vm.CantSetState = false vm.LastAcceptedF = func(context.Context) (ids.ID, error) { diff --git a/staking/tls.go b/staking/tls.go index fbb5d9e488ae..c63dd84c3dfe 100644 --- a/staking/tls.go +++ b/staking/tls.go @@ -5,8 +5,9 @@ package staking import ( "bytes" + "crypto/ecdsa" + "crypto/elliptic" "crypto/rand" - "crypto/rsa" "crypto/tls" "crypto/x509" "encoding/pem" @@ -115,9 +116,9 @@ func NewTLSCert() (*tls.Certificate, error) { // Returns the PEM byte representations of both. func NewCertAndKeyBytes() ([]byte, []byte, error) { // Create key to sign cert with - key, err := rsa.GenerateKey(rand.Reader, 4096) + key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { - return nil, nil, fmt.Errorf("couldn't generate rsa key: %w", err) + return nil, nil, fmt.Errorf("couldn't generate ecdsa key: %w", err) } // Create self-signed staking cert @@ -125,10 +126,10 @@ func NewCertAndKeyBytes() ([]byte, []byte, error) { SerialNumber: big.NewInt(0), NotBefore: time.Date(2000, time.January, 0, 0, 0, 0, 0, time.UTC), NotAfter: time.Now().AddDate(100, 0, 0), - KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature | x509.KeyUsageDataEncipherment, + KeyUsage: x509.KeyUsageDigitalSignature, BasicConstraintsValid: true, } - certBytes, err := x509.CreateCertificate(rand.Reader, certTemplate, certTemplate, &key.PublicKey, key) + certBytes, err := x509.CreateCertificate(rand.Reader, certTemplate, certTemplate, key.Public(), key) if err != nil { return nil, nil, fmt.Errorf("couldn't create certificate: %w", err) } diff --git a/staking/tls_test.go b/staking/tls_test.go index 6de376c2a538..31762542802d 100644 --- a/staking/tls_test.go +++ b/staking/tls_test.go @@ -29,3 +29,10 @@ func TestMakeKeys(t *testing.T) { require.NoError(cert.Leaf.CheckSignature(cert.Leaf.SignatureAlgorithm, msg, sig)) } + +func BenchmarkNewCertAndKeyBytes(b *testing.B) { + for i := 0; i < b.N; i++ { + _, _, err := NewCertAndKeyBytes() + require.NoError(b, err) + } +} diff --git a/staking/verify_test.go b/staking/verify_test.go new file mode 100644 index 000000000000..9c8ca5ad98cb --- /dev/null +++ b/staking/verify_test.go @@ -0,0 +1,53 @@ +// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package staking + +import ( + "crypto" + "crypto/rand" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/ava-labs/avalanchego/utils/hashing" +) + +func BenchmarkSign(b *testing.B) { + tlsCert, err := NewTLSCert() + require.NoError(b, err) + + signer := tlsCert.PrivateKey.(crypto.Signer) + msg := []byte("msg") + hash := hashing.ComputeHash256(msg) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := signer.Sign(rand.Reader, hash, crypto.SHA256) + require.NoError(b, err) + } +} + +func BenchmarkVerify(b *testing.B) { + tlsCert, err := NewTLSCert() + require.NoError(b, err) + + signer := tlsCert.PrivateKey.(crypto.Signer) + msg := []byte("msg") + signature, err := signer.Sign( + rand.Reader, + hashing.ComputeHash256(msg), + crypto.SHA256, + ) + require.NoError(b, err) + + certBytes := tlsCert.Leaf.Raw + cert, err := ParseCertificate(certBytes) + require.NoError(b, err) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + err := CheckSignature(cert, msg, signature) + require.NoError(b, err) + } +} diff --git a/tests/e2e/c/dynamic_fees.go b/tests/e2e/c/dynamic_fees.go index 9af074894afc..c3dda77b985c 100644 --- a/tests/e2e/c/dynamic_fees.go +++ b/tests/e2e/c/dynamic_fees.go @@ -37,9 +37,7 @@ var _ = e2e.DescribeCChain("[Dynamic Fees]", func() { ginkgo.It("should ensure that the gas price is affected by load", func() { ginkgo.By("creating a new private network to ensure isolation from other tests") - privateNetwork := &tmpnet.Network{ - Owner: "avalanchego-e2e-dynamic-fees", - } + privateNetwork := tmpnet.NewDefaultNetwork("avalanchego-e2e-dynamic-fees") e2e.Env.StartPrivateNetwork(privateNetwork) ginkgo.By("allocating a pre-funded key") diff --git a/tests/e2e/e2e_test.go b/tests/e2e/e2e_test.go index 443a781281a3..73c29b3bc83f 100644 --- a/tests/e2e/e2e_test.go +++ b/tests/e2e/e2e_test.go @@ -7,7 +7,6 @@ import ( "testing" "github.com/onsi/gomega" - "github.com/stretchr/testify/require" // ensure test packages are scanned by ginkgo _ "github.com/ava-labs/avalanchego/tests/e2e/banff" @@ -38,11 +37,8 @@ func init() { var _ = ginkgo.SynchronizedBeforeSuite(func() []byte { // Run only once in the first ginkgo process - nodes, err := tmpnet.NewNodes(tmpnet.DefaultNodeCount) - require.NoError(ginkgo.GinkgoT(), err) - + nodes := tmpnet.NewNodesOrPanic(flagVars.NodeCount()) subnets := vms.XSVMSubnets(nodes...) - return e2e.NewTestEnvironment( flagVars, &tmpnet.Network{ diff --git a/tests/fixture/e2e/flags.go b/tests/fixture/e2e/flags.go index 8af3cce6d787..bc752adaf7df 100644 --- a/tests/fixture/e2e/flags.go +++ b/tests/fixture/e2e/flags.go @@ -19,6 +19,7 @@ type FlagVars struct { reuseNetwork bool networkShutdownDelay time.Duration stopNetwork bool + nodeCount int } func (v *FlagVars) AvalancheGoExecPath() string { @@ -51,6 +52,10 @@ func (v *FlagVars) StopNetwork() bool { return v.stopNetwork } +func (v *FlagVars) NodeCount() int { + return v.nodeCount +} + func RegisterFlags() *FlagVars { vars := FlagVars{} flag.StringVar( @@ -89,6 +94,12 @@ func RegisterFlags() *FlagVars { false, "[optional] stop an existing network and exit without executing any tests.", ) + flag.IntVar( + &vars.nodeCount, + "node-count", + tmpnet.DefaultNodeCount, + "number of nodes the network should initially consist of", + ) return &vars } diff --git a/tests/fixture/e2e/helpers.go b/tests/fixture/e2e/helpers.go index 1395db1f8c29..358f07946055 100644 --- a/tests/fixture/e2e/helpers.go +++ b/tests/fixture/e2e/helpers.go @@ -233,7 +233,6 @@ func StartNetwork( DefaultNetworkDir, avalancheGoExecPath, pluginDir, - tmpnet.DefaultNodeCount, ), ) diff --git a/tests/fixture/tmpnet/README.md b/tests/fixture/tmpnet/README.md index b1158773d628..3c0679b4410d 100644 --- a/tests/fixture/tmpnet/README.md +++ b/tests/fixture/tmpnet/README.md @@ -49,7 +49,7 @@ A temporary network can be managed by the `tmpnetctl` cli tool: # Build the tmpnetctl binary $ ./scripts/build_tmpnetctl.sh -# Start a new network +# Start a new network. Possible to specify the number of nodes (> 1) with --node-count. $ ./build/tmpnetctl start-network --avalanchego-path=/path/to/avalanchego ... Started network /home/me/.tmpnet/networks/20240306-152305.924531 (UUID: abaab590-b375-44f6-9ca5-f8a6dc061725) @@ -87,6 +87,7 @@ network := &tmpnet.Network{ // Configure non-default values fo DefaultFlags: tmpnet.FlagsMap{ config.LogLevelKey: "INFO", // Change one of the network's defaults }, + Nodes: tmpnet.NewNodesOrPanic(5), // Number of initial validating nodes Subnets: []*tmpnet.Subnet{ // Subnets to create on the new network once it is running { Name: "xsvm-a", // User-defined name used to reference subnet in code and on disk @@ -97,6 +98,7 @@ network := &tmpnet.Network{ // Configure non-default values fo PreFundedKey: , // (Optional) A private key that is funded in the genesis bytes }, }, + ValidatorIDs: , // The IDs of nodes that validate the subnet }, }, } @@ -108,7 +110,6 @@ _ := tmpnet.StartNewNetwork( // Start the network "", // Empty string uses the default network path (~/tmpnet/networks) "/path/to/avalanchego", // The path to the binary that nodes will execute "/path/to/plugins", // The path nodes will use for plugin binaries (suggested value ~/.avalanchego/plugins) - 5, // Number of initial validating nodes ) uris := network.GetNodeURIs() diff --git a/tests/fixture/tmpnet/cmd/main.go b/tests/fixture/tmpnet/cmd/main.go index 7b415b32788b..0e6bcb1fd0a0 100644 --- a/tests/fixture/tmpnet/cmd/main.go +++ b/tests/fixture/tmpnet/cmd/main.go @@ -66,6 +66,7 @@ func main() { network := &tmpnet.Network{ Owner: networkOwner, + Nodes: tmpnet.NewNodesOrPanic(int(nodeCount)), } // Extreme upper bound, should never take this long @@ -80,7 +81,6 @@ func main() { rootDir, avalancheGoPath, pluginDir, - int(nodeCount), ) if err != nil { return err diff --git a/tests/fixture/tmpnet/detached_process_default.go b/tests/fixture/tmpnet/detached_process_default.go new file mode 100644 index 000000000000..0e4b20ddd8e3 --- /dev/null +++ b/tests/fixture/tmpnet/detached_process_default.go @@ -0,0 +1,17 @@ +// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +//go:build linux || darwin + +package tmpnet + +import ( + "os/exec" + "syscall" +) + +func configureDetachedProcess(cmd *exec.Cmd) { + cmd.SysProcAttr = &syscall.SysProcAttr{ + Setsid: true, + } +} diff --git a/tests/fixture/tmpnet/detached_process_windows.go b/tests/fixture/tmpnet/detached_process_windows.go new file mode 100644 index 000000000000..bf7ff9a726b4 --- /dev/null +++ b/tests/fixture/tmpnet/detached_process_windows.go @@ -0,0 +1,12 @@ +// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +//go:build windows + +package tmpnet + +import "os/exec" + +func configureDetachedProcess(*exec.Cmd) { + panic("tmpnet deployment to windows is not supported") +} diff --git a/tests/fixture/tmpnet/network.go b/tests/fixture/tmpnet/network.go index faea1dde50f7..bd5b1b914efc 100644 --- a/tests/fixture/tmpnet/network.go +++ b/tests/fixture/tmpnet/network.go @@ -47,9 +47,13 @@ const ( HardHatKeyStr = "56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027" ) -// HardhatKey is a legacy used for hardhat testing in subnet-evm -// TODO(marun) Remove when no longer needed. -var HardhatKey *secp256k1.PrivateKey +var ( + // Key expected to be funded for subnet-evm hardhat testing + // TODO(marun) Remove when subnet-evm configures the genesis with this key. + HardhatKey *secp256k1.PrivateKey + + errInsufficientNodes = errors.New("network needs at least one node to start") +) func init() { hardhatKeyBytes, err := hex.DecodeString(HardHatKeyStr) @@ -105,6 +109,13 @@ type Network struct { Subnets []*Subnet } +func NewDefaultNetwork(owner string) *Network { + return &Network{ + Owner: owner, + Nodes: NewNodesOrPanic(DefaultNodeCount), + } +} + // Ensure a real and absolute network dir so that node // configuration that embeds the network path will continue to // work regardless of symlink and working directory changes. @@ -123,9 +134,11 @@ func StartNewNetwork( rootNetworkDir string, avalancheGoExecPath string, pluginDir string, - nodeCount int, ) error { - if err := network.EnsureDefaultConfig(w, avalancheGoExecPath, pluginDir, nodeCount); err != nil { + if len(network.Nodes) == 0 { + return errInsufficientNodes + } + if err := network.EnsureDefaultConfig(w, avalancheGoExecPath, pluginDir); err != nil { return err } if err := network.Create(rootNetworkDir); err != nil { @@ -171,7 +184,7 @@ func ReadNetwork(dir string) (*Network, error) { } // Initializes a new network with default configuration. -func (n *Network) EnsureDefaultConfig(w io.Writer, avalancheGoPath string, pluginDir string, nodeCount int) error { +func (n *Network) EnsureDefaultConfig(w io.Writer, avalancheGoPath string, pluginDir string) error { if _, err := fmt.Fprintf(w, "Preparing configuration for new network with %s\n", avalancheGoPath); err != nil { return err } @@ -187,6 +200,11 @@ func (n *Network) EnsureDefaultConfig(w io.Writer, avalancheGoPath string, plugi } n.DefaultFlags.SetDefaults(DefaultFlags()) + if len(n.Nodes) == 1 { + // Sybil protection needs to be disabled for a single node network to start + n.DefaultFlags[config.SybilProtectionEnabledKey] = false + } + // Only configure the plugin dir with a non-empty value to ensure // the use of the default value (`[datadir]/plugins`) when // no plugin dir is configured. @@ -222,15 +240,6 @@ func (n *Network) EnsureDefaultConfig(w io.Writer, avalancheGoPath string, plugi n.DefaultRuntimeConfig.AvalancheGoPath = avalancheGoPath } - // Ensure nodes are created - if len(n.Nodes) == 0 { - nodes, err := NewNodes(nodeCount) - if err != nil { - return err - } - n.Nodes = nodes - } - // Ensure nodes are configured for i := range n.Nodes { if err := n.EnsureNodeConfig(n.Nodes[i]); err != nil { diff --git a/tests/fixture/tmpnet/network_test.go b/tests/fixture/tmpnet/network_test.go index c04c497c2485..db8d1c404716 100644 --- a/tests/fixture/tmpnet/network_test.go +++ b/tests/fixture/tmpnet/network_test.go @@ -15,8 +15,8 @@ func TestNetworkSerialization(t *testing.T) { tmpDir := t.TempDir() - network := &Network{} - require.NoError(network.EnsureDefaultConfig(&bytes.Buffer{}, "/path/to/avalanche/go", "", 1)) + network := NewDefaultNetwork("testnet") + require.NoError(network.EnsureDefaultConfig(&bytes.Buffer{}, "/path/to/avalanche/go", "")) require.NoError(network.Create(tmpDir)) // Ensure node runtime is initialized require.NoError(network.readNodes()) diff --git a/tests/fixture/tmpnet/node.go b/tests/fixture/tmpnet/node.go index 452d8d8e78ad..99777e674c04 100644 --- a/tests/fixture/tmpnet/node.go +++ b/tests/fixture/tmpnet/node.go @@ -104,16 +104,16 @@ func NewEphemeralNode(flags FlagsMap) *Node { } // Initializes the specified number of nodes. -func NewNodes(count int) ([]*Node, error) { +func NewNodesOrPanic(count int) []*Node { nodes := make([]*Node, count) for i := range nodes { node := NewNode("") if err := node.EnsureKeys(); err != nil { - return nil, err + panic(err) } nodes[i] = node } - return nodes, nil + return nodes } // Reads a node's configuration from the specified directory. diff --git a/tests/fixture/tmpnet/node_process.go b/tests/fixture/tmpnet/node_process.go index 4ce0997eb60f..f2a9c7ff628d 100644 --- a/tests/fixture/tmpnet/node_process.go +++ b/tests/fixture/tmpnet/node_process.go @@ -114,11 +114,8 @@ func (p *NodeProcess) Start(w io.Writer) error { // All arguments are provided in the flags file cmd := exec.Command(p.node.RuntimeConfig.AvalancheGoPath, "--config-file", p.node.getFlagsPath()) // #nosec G204 - // Ensure process is detached from the parent process so that an error in the parent will not affect the child - cmd.SysProcAttr = &syscall.SysProcAttr{ - Setsid: true, - } + configureDetachedProcess(cmd) if err := cmd.Start(); err != nil { return err diff --git a/tests/upgrade/upgrade_test.go b/tests/upgrade/upgrade_test.go index 7114ac291d43..d3632853bc31 100644 --- a/tests/upgrade/upgrade_test.go +++ b/tests/upgrade/upgrade_test.go @@ -45,9 +45,7 @@ var _ = ginkgo.Describe("[Upgrade]", func() { require := require.New(ginkgo.GinkgoT()) ginkgo.It("can upgrade versions", func() { - network := &tmpnet.Network{ - Owner: "avalanchego-upgrade", - } + network := tmpnet.NewDefaultNetwork("avalanchego-upgrade") e2e.StartNetwork(network, avalancheGoExecPath, "" /* pluginDir */, 0 /* shutdownDelay */, false /* reuseNetwork */) ginkgo.By(fmt.Sprintf("restarting all nodes with %q binary", avalancheGoExecPathToUpgradeTo)) diff --git a/utils/constants/acps.go b/utils/constants/acps.go index 5392b21865ad..efa315fb6ff3 100644 --- a/utils/constants/acps.go +++ b/utils/constants/acps.go @@ -6,28 +6,25 @@ package constants import "github.com/ava-labs/avalanchego/utils/set" var ( + // ActivatedACPs is the set of ACPs that are activated. + // + // See: https://github.com/orgs/avalanche-foundation/projects/1 + ActivatedACPs = set.Of[uint32]( + 23, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/23-p-chain-native-transfers/README.md + 24, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/24-shanghai-eips/README.md + 25, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/25-vm-application-errors/README.md + 30, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/30-avalanche-warp-x-evm/README.md + 31, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/31-enable-subnet-ownership-transfer/README.md + 41, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/41-remove-pending-stakers/README.md + 62, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/62-disable-addvalidatortx-and-adddelegatortx/README.md + ) + // CurrentACPs is the set of ACPs that are currently, at the time of // release, marked as implementable and not activated. // // See: https://github.com/orgs/avalanche-foundation/projects/1 - CurrentACPs = set.Of[uint32]( - 23, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/23-p-chain-native-transfers.md - 24, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/24-shanghai-eips.md - 25, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/25-vm-application-errors.md - 30, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/30-avalanche-warp-x-evm.md - 31, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/31-enable-subnet-ownership-transfer.md - 41, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/41-remove-pending-stakers.md - 62, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/62-disable-addvalidatortx-and-adddelegatortx.md - ) + CurrentACPs = set.Of[uint32]() - // ScheduledACPs are the ACPs incuded into the next upgrade. - ScheduledACPs = set.Of[uint32]( - 23, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/23-p-chain-native-transfers.md - 24, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/24-shanghai-eips.md - 25, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/25-vm-application-errors.md - 30, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/30-avalanche-warp-x-evm.md - 31, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/31-enable-subnet-ownership-transfer.md - 41, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/41-remove-pending-stakers.md - 62, // https://github.com/avalanche-foundation/ACPs/blob/main/ACPs/62-disable-addvalidatortx-and-adddelegatortx.md - ) + // ScheduledACPs are the ACPs included into the next upgrade. + ScheduledACPs = set.Of[uint32]() ) diff --git a/vms/platformvm/block/builder/builder.go b/vms/platformvm/block/builder/builder.go index a860342dd669..364f72cf1a08 100644 --- a/vms/platformvm/block/builder/builder.go +++ b/vms/platformvm/block/builder/builder.go @@ -336,11 +336,6 @@ func packBlockTxs( return nil, err } - feeRates, err := stateDiff.GetFeeRates() - if err != nil { - return nil, err - } - var ( upgrades = backend.Config.UpgradeConfig isEActivated = upgrades.IsEActivated(timestamp) @@ -350,12 +345,9 @@ func packBlockTxs( inputs set.Set[ids.ID] ) - feeMan := commonfees.NewManager(feeRates) - if isEActivated { - feeMan, err = state.UpdatedFeeManager(stateDiff, upgrades, parentBlkTime) - if err != nil { - return nil, err - } + feeCalculator, err := state.PickFeeCalculator(backend.Config, stateDiff, parentBlkTime) + if err != nil { + return nil, fmt.Errorf("failed picking fee calculator: %w", err) } for { @@ -369,7 +361,7 @@ func packBlockTxs( // pre e upgrade is active, we fill blocks till a target size // post e upgrade is active, we fill blocks till a target complexity targetSizeReached := (!isEActivated && txSize > remainingSize) || - (isEActivated && !commonfees.Compare(feeMan.GetCumulatedComplexity(), feeCfg.BlockTargetComplexityRate)) + (isEActivated && !commonfees.Compare(feeCalculator.GetCumulatedComplexity(), feeCfg.BlockTargetComplexityRate)) if targetSizeReached { break } @@ -383,11 +375,10 @@ func packBlockTxs( } executor := &txexecutor.StandardTxExecutor{ - Backend: backend, - BlkFeeManager: feeMan, - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: txDiff, - Tx: tx, + Backend: backend, + State: txDiff, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(executor) diff --git a/vms/platformvm/block/builder/helpers_test.go b/vms/platformvm/block/builder/helpers_test.go index f254984cf2fb..de4c98de1bf4 100644 --- a/vms/platformvm/block/builder/helpers_test.go +++ b/vms/platformvm/block/builder/helpers_test.go @@ -34,7 +34,6 @@ import ( "github.com/ava-labs/avalanchego/utils/logging" "github.com/ava-labs/avalanchego/utils/timer/mockable" "github.com/ava-labs/avalanchego/utils/units" - "github.com/ava-labs/avalanchego/vms/components/fees" "github.com/ava-labs/avalanchego/vms/platformvm/api" "github.com/ava-labs/avalanchego/vms/platformvm/config" "github.com/ava-labs/avalanchego/vms/platformvm/fx" @@ -266,17 +265,14 @@ func addSubnet(t *testing.T, env *environment) { stateDiff, err := state.NewDiff(genesisID, env.blkManager) require.NoError(err) - feeRates, err := env.state.GetFeeRates() + feeCalculator, err := state.PickFeeCalculator(env.backend.Config, stateDiff, stateDiff.GetTimestamp()) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) executor := txexecutor.StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeRates), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: stateDiff, - Tx: testSubnet1, + Backend: &env.backend, + State: stateDiff, + FeeCalculator: feeCalculator, + Tx: testSubnet1, } require.NoError(testSubnet1.Unsigned.Visit(&executor)) diff --git a/vms/platformvm/block/executor/helpers_test.go b/vms/platformvm/block/executor/helpers_test.go index 0de7ec6d07dc..2bb083064dbc 100644 --- a/vms/platformvm/block/executor/helpers_test.go +++ b/vms/platformvm/block/executor/helpers_test.go @@ -300,21 +300,16 @@ func addSubnet(env *environment) { if err != nil { panic(err) } - - chainTime := env.state.GetTimestamp() - upgrades := env.config.UpgradeConfig - feeManager, err := state.UpdatedFeeManager(stateDiff, upgrades, chainTime) + feeCalculator, err := state.PickFeeCalculator(env.backend.Config, stateDiff, stateDiff.GetTimestamp()) if err != nil { panic(err) } - feeCfg := fee.GetDynamicConfig(upgrades.IsEActivated(chainTime)) executor := executor.StandardTxExecutor{ - Backend: env.backend, - BlkFeeManager: feeManager, - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: stateDiff, - Tx: testSubnet1, + Backend: env.backend, + State: stateDiff, + FeeCalculator: feeCalculator, + Tx: testSubnet1, } err = testSubnet1.Unsigned.Visit(&executor) if err != nil { diff --git a/vms/platformvm/block/executor/manager.go b/vms/platformvm/block/executor/manager.go index 765238776627..06bd49ef61bc 100644 --- a/vms/platformvm/block/executor/manager.go +++ b/vms/platformvm/block/executor/manager.go @@ -14,11 +14,8 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/state" "github.com/ava-labs/avalanchego/vms/platformvm/txs" "github.com/ava-labs/avalanchego/vms/platformvm/txs/executor" - "github.com/ava-labs/avalanchego/vms/platformvm/txs/fee" "github.com/ava-labs/avalanchego/vms/platformvm/txs/mempool" "github.com/ava-labs/avalanchego/vms/platformvm/validators" - - commonfees "github.com/ava-labs/avalanchego/vms/components/fees" ) var ( @@ -142,37 +139,21 @@ func (m *manager) VerifyTx(tx *txs.Tx) error { if err != nil { return err } - _, err = executor.AdvanceTimeTo(m.txExecutorBackend, stateDiff, nextBlkTime) if err != nil { return err } - feeRates, err := stateDiff.GetFeeRates() + feeCalculator, err := state.PickFeeCalculator(m.txExecutorBackend.Config, stateDiff, parentBlkTime) if err != nil { return err } - var ( - upgrades = m.txExecutorBackend.Config.UpgradeConfig - isEActive = upgrades.IsEActivated(nextBlkTime) - feesCfg = fee.GetDynamicConfig(isEActive) - ) - - feeManager := commonfees.NewManager(feeRates) - if isEActive { - feeManager, err = state.UpdatedFeeManager(stateDiff, upgrades, parentBlkTime) - if err != nil { - return err - } - } - return tx.Unsigned.Visit(&executor.StandardTxExecutor{ - Backend: m.txExecutorBackend, - BlkFeeManager: feeManager, - BlockMaxComplexity: feesCfg.BlockMaxComplexity, - State: stateDiff, - Tx: tx, + Backend: m.txExecutorBackend, + State: stateDiff, + FeeCalculator: feeCalculator, + Tx: tx, }) } diff --git a/vms/platformvm/block/executor/proposal_block_test.go b/vms/platformvm/block/executor/proposal_block_test.go index 241342f9d11d..e44fff5ea0f7 100644 --- a/vms/platformvm/block/executor/proposal_block_test.go +++ b/vms/platformvm/block/executor/proposal_block_test.go @@ -29,7 +29,6 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/txs/executor" "github.com/ava-labs/avalanchego/vms/secp256k1fx" - commonfees "github.com/ava-labs/avalanchego/vms/components/fees" walletcommon "github.com/ava-labs/avalanchego/wallet/subnet/primary/common" ) @@ -160,7 +159,6 @@ func TestBanffProposalBlockTimeVerification(t *testing.T) { onParentAccept := state.NewMockDiff(ctrl) onParentAccept.EXPECT().GetTimestamp().Return(parentTime).AnyTimes() - onParentAccept.EXPECT().GetFeeRates().Return(commonfees.Empty, nil).Times(2) onParentAccept.EXPECT().GetCurrentSupply(constants.PrimaryNetworkID).Return(uint64(1000), nil).AnyTimes() env.blkManager.(*manager).blkIDToState[parentID] = &blockState{ diff --git a/vms/platformvm/block/executor/verifier.go b/vms/platformvm/block/executor/verifier.go index b3daaed60005..139d3cad3969 100644 --- a/vms/platformvm/block/executor/verifier.go +++ b/vms/platformvm/block/executor/verifier.go @@ -6,7 +6,6 @@ package executor import ( "errors" "fmt" - "time" "github.com/ava-labs/avalanchego/chains/atomic" "github.com/ava-labs/avalanchego/ids" @@ -73,11 +72,16 @@ func (v *verifier) BanffProposalBlock(b *block.BanffProposalBlock) error { return err } - inputs, feesMan, atomicRequests, onAcceptFunc, err := v.processStandardTxs( + feeCalculator, err := state.PickFeeCalculator(v.txExecutorBackend.Config, onDecisionState, parentBlkTime) + if err != nil { + return err + } + + inputs, atomicRequests, onAcceptFunc, err := v.processStandardTxs( b.Transactions, + feeCalculator, onDecisionState, b.Parent(), - parentBlkTime, ) if err != nil { return err @@ -98,7 +102,7 @@ func (v *verifier) BanffProposalBlock(b *block.BanffProposalBlock) error { onDecisionState, onCommitState, onAbortState, - feesMan.GetCumulatedComplexity(), + feeCalculator, inputs, atomicRequests, onAcceptFunc, @@ -135,7 +139,11 @@ func (v *verifier) BanffStandardBlock(b *block.BanffStandardBlock) error { return errBanffStandardBlockWithoutChanges } - return v.standardBlock(&b.ApricotStandardBlock, parentBlkTime, onAcceptState) + feeCalculator, err := state.PickFeeCalculator(v.txExecutorBackend.Config, onAcceptState, parentBlkTime) + if err != nil { + return err + } + return v.standardBlock(&b.ApricotStandardBlock, feeCalculator, onAcceptState) } func (v *verifier) ApricotAbortBlock(b *block.ApricotAbortBlock) error { @@ -167,7 +175,12 @@ func (v *verifier) ApricotProposalBlock(b *block.ApricotProposalBlock) error { return err } - return v.proposalBlock(b, nil, onCommitState, onAbortState, commonfees.Empty, nil, nil, nil) + var ( + staticFeesCfg = v.txExecutorBackend.Config.StaticFeeConfig + upgrades = v.txExecutorBackend.Config.UpgradeConfig + feeCalculator = fee.NewStaticCalculator(staticFeesCfg, upgrades, onCommitState.GetTimestamp()) + ) + return v.proposalBlock(b, nil, onCommitState, onAbortState, feeCalculator, nil, nil, nil) } func (v *verifier) ApricotStandardBlock(b *block.ApricotStandardBlock) error { @@ -181,7 +194,12 @@ func (v *verifier) ApricotStandardBlock(b *block.ApricotStandardBlock) error { return err } - return v.standardBlock(b, time.Time{}, onAcceptState) + var ( + staticFeesCfg = v.txExecutorBackend.Config.StaticFeeConfig + upgrades = v.txExecutorBackend.Config.UpgradeConfig + feeCalculator = fee.NewStaticCalculator(staticFeesCfg, upgrades, onAcceptState.GetTimestamp()) + ) + return v.standardBlock(b, feeCalculator, onAcceptState) } func (v *verifier) ApricotAtomicBlock(b *block.ApricotAtomicBlock) error { @@ -203,8 +221,10 @@ func (v *verifier) ApricotAtomicBlock(b *block.ApricotAtomicBlock) error { ) } + feeCalculator := fee.NewStaticCalculator(v.txExecutorBackend.Config.StaticFeeConfig, v.txExecutorBackend.Config.UpgradeConfig, currentTimestamp) atomicExecutor := executor.AtomicTxExecutor{ Backend: v.txExecutorBackend, + FeeCalculator: feeCalculator, ParentID: parentID, StateVersions: v, Tx: b.Tx, @@ -379,7 +399,7 @@ func (v *verifier) proposalBlock( onDecisionState state.Diff, onCommitState state.Diff, onAbortState state.Diff, - blockComplexity commonfees.Dimensions, + feeCalculator *fee.Calculator, inputs set.Set[ids.ID], atomicRequests map[ids.ID]*atomic.Requests, onAcceptFunc func(), @@ -388,6 +408,7 @@ func (v *verifier) proposalBlock( OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: v.txExecutorBackend, + FeeCalculator: feeCalculator, Tx: b.Tx, } @@ -419,7 +440,7 @@ func (v *verifier) proposalBlock( // never be modified by an Apricot Abort block and the timestamp will // always be the same as the Banff Proposal Block. timestamp: onAbortState.GetTimestamp(), - blockComplexity: blockComplexity, + blockComplexity: feeCalculator.GetCumulatedComplexity(), atomicRequests: atomicRequests, } return nil @@ -428,15 +449,10 @@ func (v *verifier) proposalBlock( // standardBlock populates the state of this block if [nil] is returned func (v *verifier) standardBlock( b *block.ApricotStandardBlock, - parentBlkTime time.Time, + feeCalculator *fee.Calculator, onAcceptState state.Diff, ) error { - inputs, feeMan, atomicRequests, onAcceptFunc, err := v.processStandardTxs( - b.Transactions, - onAcceptState, - b.Parent(), - parentBlkTime, - ) + inputs, atomicRequests, onAcceptFunc, err := v.processStandardTxs(b.Transactions, feeCalculator, onAcceptState, b.Parent()) if err != nil { return err } @@ -451,7 +467,7 @@ func (v *verifier) standardBlock( onAcceptFunc: onAcceptFunc, timestamp: onAcceptState.GetTimestamp(), - blockComplexity: feeMan.GetCumulatedComplexity(), + blockComplexity: feeCalculator.GetCumulatedComplexity(), inputs: inputs, atomicRequests: atomicRequests, } @@ -460,61 +476,42 @@ func (v *verifier) standardBlock( func (v *verifier) processStandardTxs( txs []*txs.Tx, - chain state.Diff, + feeCalculator *fee.Calculator, + state state.Diff, parentID ids.ID, - parentBlkTime time.Time, ) ( set.Set[ids.ID], - *commonfees.Manager, map[ids.ID]*atomic.Requests, func(), error, ) { - feeRates, err := chain.GetFeeRates() - if err != nil { - return nil, nil, nil, nil, err - } - var ( - upgrades = v.txExecutorBackend.Config.UpgradeConfig - isEActive = upgrades.IsEActivated(chain.GetTimestamp()) - feesCfg = fee.GetDynamicConfig(isEActive) - onAcceptFunc func() inputs set.Set[ids.ID] funcs = make([]func(), 0, len(txs)) atomicRequests = make(map[ids.ID]*atomic.Requests) ) - feeMan := commonfees.NewManager(feeRates) - if isEActive { - feeMan, err = state.UpdatedFeeManager(chain, upgrades, parentBlkTime) - if err != nil { - return nil, nil, nil, nil, err - } - } - for _, tx := range txs { txExecutor := executor.StandardTxExecutor{ - Backend: v.txExecutorBackend, - BlkFeeManager: feeMan, - BlockMaxComplexity: feesCfg.BlockMaxComplexity, - State: chain, - Tx: tx, + Backend: v.txExecutorBackend, + State: state, + FeeCalculator: feeCalculator, + Tx: tx, } if err := tx.Unsigned.Visit(&txExecutor); err != nil { txID := tx.ID() v.MarkDropped(txID, err) // cache tx as dropped - return nil, nil, nil, nil, err + return nil, nil, nil, err } // ensure it doesn't overlap with current input batch if inputs.Overlaps(txExecutor.Inputs) { - return nil, nil, nil, nil, ErrConflictingBlockTxs + return nil, nil, nil, ErrConflictingBlockTxs } // Add UTXOs to batch inputs.Union(txExecutor.Inputs) - chain.AddTx(tx, status.Committed) + state.AddTx(tx, status.Committed) if txExecutor.OnAccept != nil { funcs = append(funcs, txExecutor.OnAccept) } @@ -533,12 +530,12 @@ func (v *verifier) processStandardTxs( } if err := v.verifyUniqueInputs(parentID, inputs); err != nil { - return nil, nil, nil, nil, err + return nil, nil, nil, err } - if isEActive { - chain.SetFeeRates(feeMan.GetFeeRates()) - chain.SetLastBlockComplexity(feeMan.GetCumulatedComplexity()) + if v.txExecutorBackend.Config.UpgradeConfig.IsEActivated(state.GetTimestamp()) { + state.SetFeeRates(feeCalculator.GetFeeRates()) + state.SetLastBlockComplexity(feeCalculator.GetCumulatedComplexity()) } if numFuncs := len(funcs); numFuncs == 1 { @@ -551,5 +548,5 @@ func (v *verifier) processStandardTxs( } } - return inputs, feeMan, atomicRequests, onAcceptFunc, nil + return inputs, atomicRequests, onAcceptFunc, nil } diff --git a/vms/platformvm/block/executor/verifier_test.go b/vms/platformvm/block/executor/verifier_test.go index 1b852ddf82d8..a38db14cdf0f 100644 --- a/vms/platformvm/block/executor/verifier_test.go +++ b/vms/platformvm/block/executor/verifier_test.go @@ -218,10 +218,14 @@ func TestStandardBlockComplexity(t *testing.T) { onAcceptState, err := state.NewDiffOn(env.state) require.NoError(t, err) + feeCalculator, err := state.PickFeeCalculator(env.backend.Config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(t, err) + require.NoError(t, subnetValTx.Unsigned.Visit(&executor.StandardTxExecutor{ - Backend: env.backend, - State: onAcceptState, - Tx: subnetValTx, + Backend: env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: subnetValTx, })) require.NoError(t, onAcceptState.Apply(env.state)) @@ -677,7 +681,6 @@ func TestVerifierVisitStandardBlock(t *testing.T) { // Set expectations for dependencies. timestamp := time.Now() parentState.EXPECT().GetTimestamp().Return(timestamp).Times(1) - parentState.EXPECT().GetFeeRates().Return(commonfees.Empty, nil) parentStatelessBlk.EXPECT().Height().Return(uint64(1)).Times(1) mempool.EXPECT().Remove(apricotBlk.Txs()).Times(1) @@ -1172,7 +1175,6 @@ func TestVerifierVisitStandardBlockWithDuplicateInputs(t *testing.T) { timestamp := time.Now() parentStatelessBlk.EXPECT().Height().Return(uint64(1)).Times(1) parentState.EXPECT().GetTimestamp().Return(timestamp).Times(1) - parentState.EXPECT().GetFeeRates().Return(commonfees.Empty, nil) parentStatelessBlk.EXPECT().Parent().Return(grandParentID).Times(1) diff --git a/vms/platformvm/service.go b/vms/platformvm/service.go index 0705e269e2f9..b7de8a98d615 100644 --- a/vms/platformvm/service.go +++ b/vms/platformvm/service.go @@ -1856,29 +1856,17 @@ func (s *Service) GetFeeRates(_ *http.Request, _ *struct{}, reply *GetFeeRatesRe return fmt.Errorf("could not calculate next staker change time: %w", err) } - upgrades := s.vm.Config.UpgradeConfig - isEActivated := upgrades.IsEActivated(nextTimestamp) - - if !isEActivated { - reply.NextFeeRates = reply.CurrentFeeRates - return nil + stateDiff, err := state.NewDiffOn(onAccept) + if err != nil { + return err } + stateDiff.SetTimestamp(nextTimestamp) - var ( - currentTimestamp = onAccept.GetTimestamp() - feeManager = commonfees.NewManager(currentFeeRate) - ) - - if isEActivated { - // make sure the diff we update the fee manager from has timestamp duly set - onAccept.SetTimestamp(nextTimestamp) - feeManager, err = state.UpdatedFeeManager(onAccept, upgrades, currentTimestamp) - if err != nil { - return err - } + feeCalculator, err := state.PickFeeCalculator(&s.vm.Config, stateDiff, onAccept.GetTimestamp()) + if err != nil { + return err } - reply.NextFeeRates = feeManager.GetFeeRates() - + reply.NextFeeRates = feeCalculator.GetFeeRates() return nil } diff --git a/vms/platformvm/state/block_helpers.go b/vms/platformvm/state/block_helpers.go index d24c1636c85d..583ef3c0060d 100644 --- a/vms/platformvm/state/block_helpers.go +++ b/vms/platformvm/state/block_helpers.go @@ -74,7 +74,30 @@ func GetNextStakerChangeTime(state Chain) (time.Time, error) { } } -func UpdatedFeeManager(state Chain, upgrades upgrade.Config, parentBlkTime time.Time) (*commonfees.Manager, error) { +// [PickFeeCalculator] creates either a static or a dynamic fee calculator, depending on the active upgrade +// [PickFeeCalculators] does not mnodify [state] +func PickFeeCalculator(cfg *config.Config, state Chain, parentBlkTime time.Time) (*fee.Calculator, error) { + var ( + childBlkTime = state.GetTimestamp() + isEActive = cfg.UpgradeConfig.IsEActivated(childBlkTime) + staticFeeCfg = cfg.StaticFeeConfig + feeCalculator *fee.Calculator + ) + + if !isEActive { + feeCalculator = fee.NewStaticCalculator(staticFeeCfg, cfg.UpgradeConfig, childBlkTime) + } else { + feesCfg := fee.GetDynamicConfig(isEActive) + feesMan, err := updatedFeeManager(state, cfg.UpgradeConfig, parentBlkTime) + if err != nil { + return nil, fmt.Errorf("failed updating fee manager: %w", err) + } + feeCalculator = fee.NewDynamicCalculator(staticFeeCfg, feesMan, feesCfg.BlockMaxComplexity) + } + return feeCalculator, nil +} + +func updatedFeeManager(state Chain, upgrades upgrade.Config, parentBlkTime time.Time) (*commonfees.Manager, error) { var ( isEActive = upgrades.IsEActivated(parentBlkTime) feeCfg = fee.GetDynamicConfig(isEActive) @@ -104,25 +127,3 @@ func UpdatedFeeManager(state Chain, upgrades upgrade.Config, parentBlkTime time. return feeManager, nil } - -// helper to create either a static or a dynamic fee calculator, depending on the active upgrade -func PickFeeCalculator(cfg *config.Config, state Chain, parentBlkTime time.Time) (*fee.Calculator, error) { - var ( - childBlkTime = state.GetTimestamp() - isEActive = cfg.UpgradeConfig.IsEActivated(childBlkTime) - staticFeeCfg = cfg.StaticFeeConfig - feeCalculator *fee.Calculator - ) - - if !isEActive { - feeCalculator = fee.NewStaticCalculator(staticFeeCfg, cfg.UpgradeConfig, childBlkTime) - } else { - feesCfg := fee.GetDynamicConfig(isEActive) - feesMan, err := UpdatedFeeManager(state, cfg.UpgradeConfig, parentBlkTime) - if err != nil { - return nil, fmt.Errorf("failed updating fee manager: %w", err) - } - feeCalculator = fee.NewDynamicCalculator(staticFeeCfg, feesMan, feesCfg.BlockMaxComplexity) - } - return feeCalculator, nil -} diff --git a/vms/platformvm/txs/executor/advance_time_test.go b/vms/platformvm/txs/executor/advance_time_test.go index 755cbb3b2beb..9da7a0f20b2d 100644 --- a/vms/platformvm/txs/executor/advance_time_test.go +++ b/vms/platformvm/txs/executor/advance_time_test.go @@ -63,10 +63,14 @@ func TestAdvanceTimeTxUpdatePrimaryNetworkStakers(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&executor)) @@ -109,10 +113,14 @@ func TestAdvanceTimeTxTimestampTooEarly(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -144,10 +152,14 @@ func TestAdvanceTimeTxTimestampTooLate(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -173,10 +185,14 @@ func TestAdvanceTimeTxTimestampTooLate(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -413,10 +429,14 @@ func TestAdvanceTimeTxUpdateStakers(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&executor)) @@ -543,10 +563,14 @@ func TestAdvanceTimeTxRemoveSubnetValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&executor)) @@ -620,10 +644,14 @@ func TestTrackedSubnet(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&executor)) @@ -668,10 +696,14 @@ func TestAdvanceTimeTxDelegatorStakerWeight(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&executor)) @@ -733,6 +765,7 @@ func TestAdvanceTimeTxDelegatorStakerWeight(t *testing.T) { OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&executor)) @@ -771,10 +804,14 @@ func TestAdvanceTimeTxDelegatorStakers(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&executor)) @@ -831,6 +868,7 @@ func TestAdvanceTimeTxDelegatorStakers(t *testing.T) { OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&executor)) @@ -866,10 +904,14 @@ func TestAdvanceTimeTxAfterBanff(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) diff --git a/vms/platformvm/txs/executor/atomic_tx_executor.go b/vms/platformvm/txs/executor/atomic_tx_executor.go index 4a9699132918..ff6d3d5be60f 100644 --- a/vms/platformvm/txs/executor/atomic_tx_executor.go +++ b/vms/platformvm/txs/executor/atomic_tx_executor.go @@ -10,8 +10,6 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/state" "github.com/ava-labs/avalanchego/vms/platformvm/txs" "github.com/ava-labs/avalanchego/vms/platformvm/txs/fee" - - commonfees "github.com/ava-labs/avalanchego/vms/components/fees" ) var _ txs.Visitor = (*AtomicTxExecutor)(nil) @@ -21,6 +19,7 @@ var _ txs.Visitor = (*AtomicTxExecutor)(nil) type AtomicTxExecutor struct { // inputs, to be filled before visitor methods are called *Backend + FeeCalculator *fee.Calculator ParentID ids.ID StateVersions state.Versions Tx *txs.Tx @@ -101,13 +100,11 @@ func (e *AtomicTxExecutor) atomicTx(tx txs.UnsignedTx) error { } e.OnAccept = onAccept - feesCfg := fee.GetDynamicConfig(false /*isEActive*/) executor := StandardTxExecutor{ - Backend: e.Backend, - BlkFeeManager: commonfees.NewManager(feesCfg.InitialFeeRate), - BlockMaxComplexity: feesCfg.BlockMaxComplexity, - State: e.OnAccept, - Tx: e.Tx, + Backend: e.Backend, + State: e.OnAccept, + FeeCalculator: e.FeeCalculator, + Tx: e.Tx, } err = tx.Visit(&executor) e.Inputs = executor.Inputs diff --git a/vms/platformvm/txs/executor/create_chain_test.go b/vms/platformvm/txs/executor/create_chain_test.go index 0f8541540ac3..e2bff4181125 100644 --- a/vms/platformvm/txs/executor/create_chain_test.go +++ b/vms/platformvm/txs/executor/create_chain_test.go @@ -18,12 +18,9 @@ import ( "github.com/ava-labs/avalanchego/utils/units" "github.com/ava-labs/avalanchego/vms/platformvm/state" "github.com/ava-labs/avalanchego/vms/platformvm/txs" - "github.com/ava-labs/avalanchego/vms/platformvm/txs/fee" "github.com/ava-labs/avalanchego/vms/platformvm/txs/txstest" "github.com/ava-labs/avalanchego/vms/platformvm/utxo" "github.com/ava-labs/avalanchego/vms/secp256k1fx" - - commonfees "github.com/ava-labs/avalanchego/vms/components/fees" ) // Ensure Execute fails when there are not enough control sigs @@ -49,24 +46,21 @@ func TestCreateChainTxInsufficientControlSigs(t *testing.T) { stateDiff, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - currentTime := stateDiff.GetTimestamp() - upgrades := env.config.UpgradeConfig - feeCfg := fee.GetDynamicConfig(upgrades.IsEActivated(currentTime)) + parentBlkTime := stateDiff.GetTimestamp() builderDiff, err := state.NewDiffOn(stateDiff) require.NoError(err) nextBlkTime, _, err := state.NextBlockTime(stateDiff, env.clk) require.NoError(err) builderDiff.SetTimestamp(nextBlkTime) - feeMan, err := state.UpdatedFeeManager(builderDiff, upgrades, currentTime) - require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.backend.Config, builderDiff, parentBlkTime) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: feeMan, - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: stateDiff, - Tx: tx, + Backend: &env.backend, + FeeCalculator: feeCalculator, + State: stateDiff, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, errUnauthorizedSubnetModification) @@ -101,24 +95,21 @@ func TestCreateChainTxWrongControlSig(t *testing.T) { stateDiff, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - currentTime := stateDiff.GetTimestamp() - upgrades := env.config.UpgradeConfig - feeCfg := fee.GetDynamicConfig(upgrades.IsEActivated(currentTime)) + parentBlkTime := stateDiff.GetTimestamp() builderDiff, err := state.NewDiffOn(stateDiff) require.NoError(err) nextBlkTime, _, err := state.NextBlockTime(stateDiff, env.clk) require.NoError(err) builderDiff.SetTimestamp(nextBlkTime) - feeMan, err := state.UpdatedFeeManager(builderDiff, upgrades, currentTime) - require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.backend.Config, builderDiff, parentBlkTime) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: feeMan, - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: stateDiff, - Tx: tx, + Backend: &env.backend, + FeeCalculator: feeCalculator, + State: stateDiff, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, errUnauthorizedSubnetModification) @@ -147,24 +138,22 @@ func TestCreateChainTxNoSuchSubnet(t *testing.T) { stateDiff, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - currentTime := stateDiff.GetTimestamp() - upgrades := env.config.UpgradeConfig - feeCfg := fee.GetDynamicConfig(upgrades.IsEActivated(currentTime)) + parentBlkTime := stateDiff.GetTimestamp() builderDiff, err := state.NewDiffOn(stateDiff) require.NoError(err) nextBlkTime, _, err := state.NextBlockTime(stateDiff, env.clk) require.NoError(err) builderDiff.SetTimestamp(nextBlkTime) - feeMan, err := state.UpdatedFeeManager(builderDiff, upgrades, currentTime) + + feeCalculator, err := state.PickFeeCalculator(env.backend.Config, builderDiff, parentBlkTime) require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: feeMan, - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: stateDiff, - Tx: tx, + Backend: &env.backend, + FeeCalculator: feeCalculator, + State: stateDiff, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, database.ErrNotFound) @@ -190,24 +179,22 @@ func TestCreateChainTxValid(t *testing.T) { stateDiff, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - currentTime := stateDiff.GetTimestamp() - upgrades := env.config.UpgradeConfig - feeCfg := fee.GetDynamicConfig(upgrades.IsEActivated(currentTime)) + parentBlkTime := stateDiff.GetTimestamp() builderDiff, err := state.NewDiffOn(stateDiff) require.NoError(err) nextBlkTime, _, err := state.NextBlockTime(stateDiff, env.clk) require.NoError(err) builderDiff.SetTimestamp(nextBlkTime) - feeMan, err := state.UpdatedFeeManager(builderDiff, upgrades, currentTime) + + feeCalculator, err := state.PickFeeCalculator(env.backend.Config, builderDiff, parentBlkTime) require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: feeMan, - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: stateDiff, - Tx: tx, + Backend: &env.backend, + FeeCalculator: feeCalculator, + State: stateDiff, + Tx: tx, } require.NoError(tx.Unsigned.Visit(&executor)) } @@ -271,14 +258,14 @@ func TestCreateChainTxAP3FeeChange(t *testing.T) { stateDiff.SetTimestamp(test.time) - currentTime := stateDiff.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(currentTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, stateDiff, stateDiff.GetTimestamp()) + require.NoError(err) + executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: commonfees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: stateDiff, - Tx: tx, + Backend: &env.backend, + FeeCalculator: feeCalculator, + State: stateDiff, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, test.expectedError) diff --git a/vms/platformvm/txs/executor/create_subnet_test.go b/vms/platformvm/txs/executor/create_subnet_test.go index ea8c13d153ff..7188fc1b537e 100644 --- a/vms/platformvm/txs/executor/create_subnet_test.go +++ b/vms/platformvm/txs/executor/create_subnet_test.go @@ -13,12 +13,9 @@ import ( "github.com/ava-labs/avalanchego/utils/set" "github.com/ava-labs/avalanchego/utils/units" "github.com/ava-labs/avalanchego/vms/platformvm/state" - "github.com/ava-labs/avalanchego/vms/platformvm/txs/fee" "github.com/ava-labs/avalanchego/vms/platformvm/txs/txstest" "github.com/ava-labs/avalanchego/vms/platformvm/utxo" "github.com/ava-labs/avalanchego/vms/secp256k1fx" - - commonfees "github.com/ava-labs/avalanchego/vms/components/fees" ) func TestCreateSubnetTxAP3FeeChange(t *testing.T) { @@ -78,14 +75,14 @@ func TestCreateSubnetTxAP3FeeChange(t *testing.T) { stateDiff.SetTimestamp(test.time) - chainTime := stateDiff.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, stateDiff, stateDiff.GetTimestamp()) + require.NoError(err) + executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: commonfees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: stateDiff, - Tx: tx, + Backend: &env.backend, + FeeCalculator: feeCalculator, + State: stateDiff, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, test.expectedErr) diff --git a/vms/platformvm/txs/executor/export_test.go b/vms/platformvm/txs/executor/export_test.go index 7959791187db..17efad64c8e2 100644 --- a/vms/platformvm/txs/executor/export_test.go +++ b/vms/platformvm/txs/executor/export_test.go @@ -72,10 +72,14 @@ func TestNewExportTx(t *testing.T) { stateDiff.SetTimestamp(tt.timestamp) + feeCalculator, err := state.PickFeeCalculator(env.config, stateDiff, stateDiff.GetTimestamp()) + require.NoError(err) + verifier := StandardTxExecutor{ - Backend: &env.backend, - State: stateDiff, - Tx: tx, + Backend: &env.backend, + FeeCalculator: feeCalculator, + State: stateDiff, + Tx: tx, } require.NoError(tx.Unsigned.Visit(&verifier)) }) diff --git a/vms/platformvm/txs/executor/helpers_test.go b/vms/platformvm/txs/executor/helpers_test.go index 7f4c1823487e..488e1b9de7ac 100644 --- a/vms/platformvm/txs/executor/helpers_test.go +++ b/vms/platformvm/txs/executor/helpers_test.go @@ -233,18 +233,14 @@ func addSubnet(t *testing.T, env *environment) { stateDiff, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - currentChainTime := env.state.GetTimestamp() - upgrades := env.config.UpgradeConfig - feeManager, err := state.UpdatedFeeManager(stateDiff, upgrades, currentChainTime) + feeCalculator, err := state.PickFeeCalculator(env.backend.Config, stateDiff, stateDiff.GetTimestamp()) require.NoError(err) - feeCfg := fee.GetDynamicConfig(upgrades.IsEActivated(currentChainTime)) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: feeManager, - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: stateDiff, - Tx: testSubnet1, + Backend: &env.backend, + FeeCalculator: feeCalculator, + State: stateDiff, + Tx: testSubnet1, } require.NoError(testSubnet1.Unsigned.Visit(&executor)) diff --git a/vms/platformvm/txs/executor/import_test.go b/vms/platformvm/txs/executor/import_test.go index 7bb0be9afcc1..824e312381a0 100644 --- a/vms/platformvm/txs/executor/import_test.go +++ b/vms/platformvm/txs/executor/import_test.go @@ -155,10 +155,14 @@ func TestNewImportTx(t *testing.T) { stateDiff.SetTimestamp(tt.timestamp) + feeCalculator, err := state.PickFeeCalculator(env.config, stateDiff, stateDiff.GetTimestamp()) + require.NoError(err) + verifier := StandardTxExecutor{ - Backend: &env.backend, - State: stateDiff, - Tx: tx, + Backend: &env.backend, + FeeCalculator: feeCalculator, + State: stateDiff, + Tx: tx, } require.NoError(tx.Unsigned.Visit(&verifier)) }) diff --git a/vms/platformvm/txs/executor/proposal_tx_executor.go b/vms/platformvm/txs/executor/proposal_tx_executor.go index 1162dae8739e..b62b8e059f20 100644 --- a/vms/platformvm/txs/executor/proposal_tx_executor.go +++ b/vms/platformvm/txs/executor/proposal_tx_executor.go @@ -16,8 +16,7 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/reward" "github.com/ava-labs/avalanchego/vms/platformvm/state" "github.com/ava-labs/avalanchego/vms/platformvm/txs" - - commonfees "github.com/ava-labs/avalanchego/vms/components/fees" + "github.com/ava-labs/avalanchego/vms/platformvm/txs/fee" ) const ( @@ -47,8 +46,8 @@ var ( type ProposalTxExecutor struct { // inputs, to be filled before visitor methods are called *Backend - Tx *txs.Tx - + FeeCalculator *fee.Calculator + Tx *txs.Tx // [OnCommitState] is the state used for validation. // [OnCommitState] is modified by this struct's methods to // reflect changes made to the state if the proposal is committed. @@ -117,6 +116,7 @@ func (e *ProposalTxExecutor) AddValidatorTx(tx *txs.AddValidatorTx) error { onAbortOuts, err := verifyAddValidatorTx( e.Backend, + e.FeeCalculator, e.OnCommitState, e.Tx, tx, @@ -164,8 +164,7 @@ func (e *ProposalTxExecutor) AddSubnetValidatorTx(tx *txs.AddSubnetValidatorTx) if err := verifyAddSubnetValidatorTx( e.Backend, - commonfees.NewManager(commonfees.Empty), - commonfees.Max, + e.FeeCalculator, e.OnCommitState, e.Tx, tx, @@ -212,6 +211,7 @@ func (e *ProposalTxExecutor) AddDelegatorTx(tx *txs.AddDelegatorTx) error { onAbortOuts, err := verifyAddDelegatorTx( e.Backend, + e.FeeCalculator, e.OnCommitState, e.Tx, tx, diff --git a/vms/platformvm/txs/executor/proposal_tx_executor_test.go b/vms/platformvm/txs/executor/proposal_tx_executor_test.go index 87caaca7d7c1..8c31d0c6abc4 100644 --- a/vms/platformvm/txs/executor/proposal_tx_executor_test.go +++ b/vms/platformvm/txs/executor/proposal_tx_executor_test.go @@ -262,10 +262,14 @@ func TestProposalTxExecuteAddDelegator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -305,10 +309,13 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -340,10 +347,13 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&executor)) @@ -393,10 +403,13 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -443,10 +456,13 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -476,10 +492,13 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -509,10 +528,13 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&executor)) @@ -544,10 +566,13 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -609,10 +634,13 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: duplicateSubnetTx, } err = duplicateSubnetTx.Unsigned.Visit(&executor) @@ -652,10 +680,13 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -689,10 +720,13 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -736,10 +770,13 @@ func TestProposalTxExecuteAddSubnetValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -780,10 +817,14 @@ func TestProposalTxExecuteAddValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -816,10 +857,14 @@ func TestProposalTxExecuteAddValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -866,10 +911,14 @@ func TestProposalTxExecuteAddValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) @@ -908,10 +957,14 @@ func TestProposalTxExecuteAddValidator(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) + executor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&executor) diff --git a/vms/platformvm/txs/executor/reward_validator_test.go b/vms/platformvm/txs/executor/reward_validator_test.go index 215e9a6f729a..f577f5ab9531 100644 --- a/vms/platformvm/txs/executor/reward_validator_test.go +++ b/vms/platformvm/txs/executor/reward_validator_test.go @@ -59,10 +59,14 @@ func TestRewardValidatorTxExecuteOnCommit(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onAbortState, onAbortState.GetTimestamp()) + require.NoError(err) + txExecutor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&txExecutor) @@ -85,6 +89,7 @@ func TestRewardValidatorTxExecuteOnCommit(t *testing.T) { OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&txExecutor) @@ -104,6 +109,7 @@ func TestRewardValidatorTxExecuteOnCommit(t *testing.T) { OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&txExecutor)) @@ -159,10 +165,13 @@ func TestRewardValidatorTxExecuteOnAbort(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onAbortState, onAbortState.GetTimestamp()) + require.NoError(err) txExecutor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&txExecutor) @@ -179,6 +188,7 @@ func TestRewardValidatorTxExecuteOnAbort(t *testing.T) { OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } err = tx.Unsigned.Visit(&txExecutor) @@ -198,6 +208,7 @@ func TestRewardValidatorTxExecuteOnAbort(t *testing.T) { OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&txExecutor)) @@ -312,10 +323,13 @@ func TestRewardDelegatorTxExecuteOnCommitPreDelegateeDeferral(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) txExecutor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&txExecutor)) @@ -452,10 +466,13 @@ func TestRewardDelegatorTxExecuteOnCommitPostDelegateeDeferral(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) txExecutor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&txExecutor)) @@ -504,6 +521,7 @@ func TestRewardDelegatorTxExecuteOnCommitPostDelegateeDeferral(t *testing.T) { OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&txExecutor)) @@ -672,10 +690,14 @@ func TestRewardDelegatorTxAndValidatorTxExecuteOnCommitPostDelegateeDeferral(t * delOnAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, delOnCommitState, delOnCommitState.GetTimestamp()) + require.NoError(err) + txExecutor := ProposalTxExecutor{ OnCommitState: delOnCommitState, OnAbortState: delOnAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&txExecutor)) @@ -697,6 +719,7 @@ func TestRewardDelegatorTxAndValidatorTxExecuteOnCommitPostDelegateeDeferral(t * OnCommitState: vdrOnCommitState, OnAbortState: vdrOnAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&txExecutor)) @@ -830,10 +853,13 @@ func TestRewardDelegatorTxExecuteOnAbort(t *testing.T) { onAbortState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) + feeCalculator, err := state.PickFeeCalculator(env.config, onCommitState, onCommitState.GetTimestamp()) + require.NoError(err) txExecutor := ProposalTxExecutor{ OnCommitState: onCommitState, OnAbortState: onAbortState, Backend: &env.backend, + FeeCalculator: feeCalculator, Tx: tx, } require.NoError(tx.Unsigned.Visit(&txExecutor)) diff --git a/vms/platformvm/txs/executor/staker_tx_verification.go b/vms/platformvm/txs/executor/staker_tx_verification.go index 0d7ffcfbe9e1..9f4ba22f9e2f 100644 --- a/vms/platformvm/txs/executor/staker_tx_verification.go +++ b/vms/platformvm/txs/executor/staker_tx_verification.go @@ -18,7 +18,6 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/txs/fee" safemath "github.com/ava-labs/avalanchego/utils/math" - commonfees "github.com/ava-labs/avalanchego/vms/components/fees" ) var ( @@ -91,6 +90,7 @@ func verifySubnetValidatorPrimaryNetworkRequirements( // added to the staking set. func verifyAddValidatorTx( backend *Backend, + feeCalculator *fee.Calculator, chainState state.Chain, sTx *txs.Tx, tx *txs.AddValidatorTx, @@ -169,12 +169,10 @@ func verifyAddValidatorTx( } // Verify the flowcheck - feeCalculator := fee.NewStaticCalculator(backend.Config.StaticFeeConfig, upgrades, currentTimestamp) fee, err := feeCalculator.ComputeFee(tx, sTx.Creds) if err != nil { return nil, err } - if err := backend.FlowChecker.VerifySpend( tx, chainState, @@ -195,8 +193,7 @@ func verifyAddValidatorTx( // AddSubnetValidatorTx. func verifyAddSubnetValidatorTx( backend *Backend, - feeManager *commonfees.Manager, - maxComplexity commonfees.Dimensions, + feeCalculator *fee.Calculator, chainState state.Chain, sTx *txs.Tx, tx *txs.AddSubnetValidatorTx, @@ -210,7 +207,6 @@ func verifyAddSubnetValidatorTx( currentTimestamp = chainState.GetTimestamp() upgrades = backend.Config.UpgradeConfig isDurangoActive = upgrades.IsDurangoActivated(currentTimestamp) - isEActive = upgrades.IsEActivated(currentTimestamp) ) if err := avax.VerifyMemoFieldLength(tx.Memo, isDurangoActive); err != nil { return err @@ -267,21 +263,10 @@ func verifyAddSubnetValidatorTx( } // Verify the flowcheck - var ( - feeCalculator *fee.Calculator - staticFeesCfg = backend.Config.StaticFeeConfig - ) - if !isEActive { - feeCalculator = fee.NewStaticCalculator(staticFeesCfg, upgrades, currentTimestamp) - } else { - feeCalculator = fee.NewDynamicCalculator(staticFeesCfg, feeManager, maxComplexity) - } - fee, err := feeCalculator.ComputeFee(tx, sTx.Creds) if err != nil { return err } - if err := backend.FlowChecker.VerifySpend( tx, chainState, @@ -308,8 +293,7 @@ func verifyAddSubnetValidatorTx( // * The flow checker passes. func verifyRemoveSubnetValidatorTx( backend *Backend, - feeManager *commonfees.Manager, - maxComplexity commonfees.Dimensions, + feeCalculator *fee.Calculator, chainState state.Chain, sTx *txs.Tx, tx *txs.RemoveSubnetValidatorTx, @@ -323,7 +307,6 @@ func verifyRemoveSubnetValidatorTx( currentTimestamp = chainState.GetTimestamp() upgrades = backend.Config.UpgradeConfig isDurangoActive = upgrades.IsDurangoActivated(currentTimestamp) - isEActive = upgrades.IsEActivated(currentTimestamp) ) if err := avax.VerifyMemoFieldLength(tx.Memo, isDurangoActive); err != nil { return nil, false, err @@ -361,21 +344,10 @@ func verifyRemoveSubnetValidatorTx( } // Verify the flowcheck - var ( - feeCalculator *fee.Calculator - staticFeesCfg = backend.Config.StaticFeeConfig - ) - if !isEActive { - feeCalculator = fee.NewStaticCalculator(staticFeesCfg, upgrades, currentTimestamp) - } else { - feeCalculator = fee.NewDynamicCalculator(staticFeesCfg, feeManager, maxComplexity) - } - fee, err := feeCalculator.ComputeFee(tx, sTx.Creds) if err != nil { return nil, false, err } - if err := backend.FlowChecker.VerifySpend( tx, chainState, @@ -397,6 +369,7 @@ func verifyRemoveSubnetValidatorTx( // added to the staking set. func verifyAddDelegatorTx( backend *Backend, + feeCalculator *fee.Calculator, chainState state.Chain, sTx *txs.Tx, tx *txs.AddDelegatorTx, @@ -495,12 +468,10 @@ func verifyAddDelegatorTx( } // Verify the flowcheck - feeCalculator := fee.NewStaticCalculator(backend.Config.StaticFeeConfig, upgrades, currentTimestamp) fee, err := feeCalculator.ComputeFee(tx, sTx.Creds) if err != nil { return nil, err } - if err := backend.FlowChecker.VerifySpend( tx, chainState, @@ -521,8 +492,7 @@ func verifyAddDelegatorTx( // AddPermissionlessValidatorTx. func verifyAddPermissionlessValidatorTx( backend *Backend, - feeManager *commonfees.Manager, - maxComplexity commonfees.Dimensions, + feeCalculator *fee.Calculator, chainState state.Chain, sTx *txs.Tx, tx *txs.AddPermissionlessValidatorTx, @@ -536,7 +506,6 @@ func verifyAddPermissionlessValidatorTx( currentTimestamp = chainState.GetTimestamp() upgrades = backend.Config.UpgradeConfig isDurangoActive = upgrades.IsDurangoActivated(currentTimestamp) - isEActive = upgrades.IsEActivated(currentTimestamp) ) if err := avax.VerifyMemoFieldLength(tx.Memo, isDurangoActive); err != nil { return err @@ -622,21 +591,10 @@ func verifyAddPermissionlessValidatorTx( copy(outs[len(tx.Outs):], tx.StakeOuts) // Verify the flowcheck - var ( - feeCalculator *fee.Calculator - staticFeesCfg = backend.Config.StaticFeeConfig - ) - if !isEActive { - feeCalculator = fee.NewStaticCalculator(staticFeesCfg, upgrades, currentTimestamp) - } else { - feeCalculator = fee.NewDynamicCalculator(staticFeesCfg, feeManager, maxComplexity) - } - fee, err := feeCalculator.ComputeFee(tx, sTx.Creds) if err != nil { return err } - if err := backend.FlowChecker.VerifySpend( tx, chainState, @@ -657,8 +615,7 @@ func verifyAddPermissionlessValidatorTx( // AddPermissionlessDelegatorTx. func verifyAddPermissionlessDelegatorTx( backend *Backend, - feeManager *commonfees.Manager, - maxComplexity commonfees.Dimensions, + feeCalculator *fee.Calculator, chainState state.Chain, sTx *txs.Tx, tx *txs.AddPermissionlessDelegatorTx, @@ -672,7 +629,6 @@ func verifyAddPermissionlessDelegatorTx( currentTimestamp = chainState.GetTimestamp() upgrades = backend.Config.UpgradeConfig isDurangoActive = upgrades.IsDurangoActivated(currentTimestamp) - isEActive = upgrades.IsEActivated(currentTimestamp) ) if err := avax.VerifyMemoFieldLength(tx.Memo, isDurangoActive); err != nil { return err @@ -783,21 +739,10 @@ func verifyAddPermissionlessDelegatorTx( } // Verify the flowcheck - var ( - feeCalculator *fee.Calculator - staticFeesCfg = backend.Config.StaticFeeConfig - ) - if !isEActive { - feeCalculator = fee.NewStaticCalculator(staticFeesCfg, upgrades, currentTimestamp) - } else { - feeCalculator = fee.NewDynamicCalculator(staticFeesCfg, feeManager, maxComplexity) - } - fee, err := feeCalculator.ComputeFee(tx, sTx.Creds) if err != nil { return err } - if err := backend.FlowChecker.VerifySpend( tx, chainState, @@ -821,8 +766,7 @@ func verifyAddPermissionlessDelegatorTx( // * The flow checker passes. func verifyTransferSubnetOwnershipTx( backend *Backend, - feeManager *commonfees.Manager, - maxComplexity commonfees.Dimensions, + feeCalculator *fee.Calculator, chainState state.Chain, sTx *txs.Tx, tx *txs.TransferSubnetOwnershipTx, @@ -831,7 +775,6 @@ func verifyTransferSubnetOwnershipTx( currentTimestamp = chainState.GetTimestamp() upgrades = backend.Config.UpgradeConfig isDurangoActive = upgrades.IsDurangoActivated(currentTimestamp) - isEActive = upgrades.IsEActivated(currentTimestamp) ) if !isDurangoActive { @@ -858,21 +801,10 @@ func verifyTransferSubnetOwnershipTx( } // Verify the flowcheck - var ( - feeCalculator *fee.Calculator - staticFeesCfg = backend.Config.StaticFeeConfig - ) - if !isEActive { - feeCalculator = fee.NewStaticCalculator(staticFeesCfg, upgrades, currentTimestamp) - } else { - feeCalculator = fee.NewDynamicCalculator(staticFeesCfg, feeManager, maxComplexity) - } - fee, err := feeCalculator.ComputeFee(tx, sTx.Creds) if err != nil { return err } - if err := backend.FlowChecker.VerifySpend( tx, chainState, diff --git a/vms/platformvm/txs/executor/staker_tx_verification_test.go b/vms/platformvm/txs/executor/staker_tx_verification_test.go index e80ca693c3a8..7b38a798f9ee 100644 --- a/vms/platformvm/txs/executor/staker_tx_verification_test.go +++ b/vms/platformvm/txs/executor/staker_tx_verification_test.go @@ -18,7 +18,6 @@ import ( "github.com/ava-labs/avalanchego/utils/constants" "github.com/ava-labs/avalanchego/utils/timer/mockable" "github.com/ava-labs/avalanchego/vms/components/avax" - "github.com/ava-labs/avalanchego/vms/components/fees" "github.com/ava-labs/avalanchego/vms/components/verify" "github.com/ava-labs/avalanchego/vms/platformvm/config" "github.com/ava-labs/avalanchego/vms/platformvm/state" @@ -117,8 +116,10 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { Config: defaultTestConfig(t, durango, activeForkTime), } }, - stateF: func(*gomock.Controller) state.Chain { - return nil + stateF: func(ctrl *gomock.Controller) state.Chain { + mockState := state.NewMockChain(ctrl) + mockState.EXPECT().GetTimestamp().Return(now).Times(2) + return mockState }, sTxF: func() *txs.Tx { return nil @@ -139,7 +140,7 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { }, stateF: func(ctrl *gomock.Controller) state.Chain { mockState := state.NewMockChain(ctrl) - mockState.EXPECT().GetTimestamp().Return(now) // chain time is after Durango fork activation since now.After(activeForkTime) + mockState.EXPECT().GetTimestamp().Return(now).Times(3) // chain time is after Durango fork activation since now.After(activeForkTime) return mockState }, sTxF: func() *txs.Tx { @@ -163,7 +164,7 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { }, stateF: func(ctrl *gomock.Controller) state.Chain { state := state.NewMockChain(ctrl) - state.EXPECT().GetTimestamp().Return(verifiedTx.StartTime()) + state.EXPECT().GetTimestamp().Return(verifiedTx.StartTime()).Times(3) return state }, sTxF: func() *txs.Tx { @@ -187,7 +188,7 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { }, stateF: func(ctrl *gomock.Controller) state.Chain { state := state.NewMockChain(ctrl) - state.EXPECT().GetTimestamp().Return(now) // chain time is after latest fork activation since now.After(activeForkTime) + state.EXPECT().GetTimestamp().Return(now).Times(3) // chain time is after latest fork activation since now.After(activeForkTime) state.EXPECT().GetSubnetTransformation(subnetID).Return(&transformTx, nil) return state }, @@ -214,7 +215,7 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { }, stateF: func(ctrl *gomock.Controller) state.Chain { state := state.NewMockChain(ctrl) - state.EXPECT().GetTimestamp().Return(now) // chain time is after latest fork activation since now.After(activeForkTime) + state.EXPECT().GetTimestamp().Return(now).Times(3) // chain time is after latest fork activation since now.After(activeForkTime) state.EXPECT().GetSubnetTransformation(subnetID).Return(&transformTx, nil) return state }, @@ -241,7 +242,7 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { }, stateF: func(ctrl *gomock.Controller) state.Chain { state := state.NewMockChain(ctrl) - state.EXPECT().GetTimestamp().Return(now) // chain time is after latest fork activation since now.After(activeForkTime) + state.EXPECT().GetTimestamp().Return(now).Times(3) // chain time is after latest fork activation since now.After(activeForkTime) state.EXPECT().GetSubnetTransformation(subnetID).Return(&transformTx, nil) return state }, @@ -269,7 +270,7 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { }, stateF: func(ctrl *gomock.Controller) state.Chain { state := state.NewMockChain(ctrl) - state.EXPECT().GetTimestamp().Return(now) // chain time is after latest fork activation since now.After(activeForkTime) + state.EXPECT().GetTimestamp().Return(now).Times(3) // chain time is after latest fork activation since now.After(activeForkTime) state.EXPECT().GetSubnetTransformation(subnetID).Return(&transformTx, nil) return state }, @@ -300,7 +301,7 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { }, stateF: func(ctrl *gomock.Controller) state.Chain { state := state.NewMockChain(ctrl) - state.EXPECT().GetTimestamp().Return(time.Unix(1, 0)) // chain time is after fork activation since time.Unix(1, 0).After(activeForkTime) + state.EXPECT().GetTimestamp().Return(time.Unix(1, 0)).Times(3) // chain time is after fork activation since time.Unix(1, 0).After(activeForkTime) state.EXPECT().GetSubnetTransformation(subnetID).Return(&transformTx, nil) return state }, @@ -331,7 +332,7 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { }, stateF: func(ctrl *gomock.Controller) state.Chain { mockState := state.NewMockChain(ctrl) - mockState.EXPECT().GetTimestamp().Return(now) // chain time is after latest fork activation since now.After(activeForkTime) + mockState.EXPECT().GetTimestamp().Return(now).Times(3) // chain time is after latest fork activation since now.After(activeForkTime) mockState.EXPECT().GetSubnetTransformation(subnetID).Return(&transformTx, nil) return mockState }, @@ -364,7 +365,7 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { }, stateF: func(ctrl *gomock.Controller) state.Chain { mockState := state.NewMockChain(ctrl) - mockState.EXPECT().GetTimestamp().Return(now) // chain time is after latest fork activation since now.After(activeForkTime) + mockState.EXPECT().GetTimestamp().Return(now).Times(3) // chain time is after latest fork activation since now.After(activeForkTime) mockState.EXPECT().GetSubnetTransformation(subnetID).Return(&transformTx, nil) // State says validator exists mockState.EXPECT().GetCurrentValidator(subnetID, verifiedTx.NodeID()).Return(nil, nil) @@ -391,7 +392,7 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { }, stateF: func(ctrl *gomock.Controller) state.Chain { mockState := state.NewMockChain(ctrl) - mockState.EXPECT().GetTimestamp().Return(now).Times(2) // chain time is after latest fork activation since now.After(activeForkTime) + mockState.EXPECT().GetTimestamp().Return(now).Times(4) // chain time is after latest fork activation since now.After(activeForkTime) mockState.EXPECT().GetSubnetTransformation(subnetID).Return(&transformTx, nil) mockState.EXPECT().GetCurrentValidator(subnetID, verifiedTx.NodeID()).Return(nil, database.ErrNotFound) mockState.EXPECT().GetPendingValidator(subnetID, verifiedTx.NodeID()).Return(nil, database.ErrNotFound) @@ -438,7 +439,7 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { }, stateF: func(ctrl *gomock.Controller) state.Chain { mockState := state.NewMockChain(ctrl) - mockState.EXPECT().GetTimestamp().Return(now).Times(2) // chain time is after latest fork activation since now.After(activeForkTime) + mockState.EXPECT().GetTimestamp().Return(now).Times(4) // chain time is after latest fork activation since now.After(activeForkTime) mockState.EXPECT().GetSubnetTransformation(subnetID).Return(&transformTx, nil) mockState.EXPECT().GetCurrentValidator(subnetID, verifiedTx.NodeID()).Return(nil, database.ErrNotFound) mockState.EXPECT().GetPendingValidator(subnetID, verifiedTx.NodeID()).Return(nil, database.ErrNotFound) @@ -484,7 +485,7 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { }, stateF: func(ctrl *gomock.Controller) state.Chain { mockState := state.NewMockChain(ctrl) - mockState.EXPECT().GetTimestamp().Return(now).Times(2) // chain time is after Durango fork activation since now.After(activeForkTime) + mockState.EXPECT().GetTimestamp().Return(now).Times(4) // chain time is after Durango fork activation since now.After(activeForkTime) mockState.EXPECT().GetSubnetTransformation(subnetID).Return(&transformTx, nil) mockState.EXPECT().GetCurrentValidator(subnetID, verifiedTx.NodeID()).Return(nil, database.ErrNotFound) mockState.EXPECT().GetPendingValidator(subnetID, verifiedTx.NodeID()).Return(nil, database.ErrNotFound) @@ -510,14 +511,15 @@ func TestVerifyAddPermissionlessValidatorTx(t *testing.T) { var ( backend = tt.backendF(ctrl) - - feeManager = fees.NewManager(fees.Empty) - state = tt.stateF(ctrl) - sTx = tt.sTxF() - tx = tt.txF() + chain = tt.stateF(ctrl) + sTx = tt.sTxF() + tx = tt.txF() ) - err := verifyAddPermissionlessValidatorTx(backend, feeManager, fees.Empty, state, sTx, tx) + feeCalculator, err := state.PickFeeCalculator(backend.Config, chain, chain.GetTimestamp()) + require.NoError(t, err) + + err = verifyAddPermissionlessValidatorTx(backend, feeCalculator, chain, sTx, tx) require.ErrorIs(t, err, tt.expectedErr) }) } diff --git a/vms/platformvm/txs/executor/standard_tx_executor.go b/vms/platformvm/txs/executor/standard_tx_executor.go index 391001f2efad..3e7b7a42a0b1 100644 --- a/vms/platformvm/txs/executor/standard_tx_executor.go +++ b/vms/platformvm/txs/executor/standard_tx_executor.go @@ -20,8 +20,6 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/state" "github.com/ava-labs/avalanchego/vms/platformvm/txs" "github.com/ava-labs/avalanchego/vms/platformvm/txs/fee" - - commonfees "github.com/ava-labs/avalanchego/vms/components/fees" ) var ( @@ -35,10 +33,9 @@ var ( type StandardTxExecutor struct { // inputs, to be filled before visitor methods are called *Backend - BlkFeeManager *commonfees.Manager - BlockMaxComplexity commonfees.Dimensions - State state.Diff // state is expected to be modified - Tx *txs.Tx + State state.Diff // state is expected to be modified + FeeCalculator *fee.Calculator + Tx *txs.Tx // outputs of visitor execution OnAccept func() // may be nil @@ -63,7 +60,6 @@ func (e *StandardTxExecutor) CreateChainTx(tx *txs.CreateChainTx) error { currentTimestamp = e.State.GetTimestamp() upgrades = e.Backend.Config.UpgradeConfig isDurangoActive = upgrades.IsDurangoActivated(currentTimestamp) - isEActive = upgrades.IsEActivated(currentTimestamp) ) if err := avax.VerifyMemoFieldLength(tx.Memo, isDurangoActive); err != nil { return err @@ -75,21 +71,10 @@ func (e *StandardTxExecutor) CreateChainTx(tx *txs.CreateChainTx) error { } // Verify the flowcheck - var ( - feeCalculator *fee.Calculator - staticFeesCfg = e.Backend.Config.StaticFeeConfig - ) - if !isEActive { - feeCalculator = fee.NewStaticCalculator(staticFeesCfg, upgrades, currentTimestamp) - } else { - feeCalculator = fee.NewDynamicCalculator(staticFeesCfg, e.BlkFeeManager, e.BlockMaxComplexity) - } - - fee, err := feeCalculator.ComputeFee(tx, e.Tx.Creds) + fee, err := e.FeeCalculator.ComputeFee(tx, e.Tx.Creds) if err != nil { return err } - if err := e.FlowChecker.VerifySpend( tx, e.State, @@ -130,28 +115,16 @@ func (e *StandardTxExecutor) CreateSubnetTx(tx *txs.CreateSubnetTx) error { currentTimestamp = e.State.GetTimestamp() upgrades = e.Backend.Config.UpgradeConfig isDurangoActive = upgrades.IsDurangoActivated(currentTimestamp) - isEActive = upgrades.IsEActivated(currentTimestamp) ) if err := avax.VerifyMemoFieldLength(tx.Memo, isDurangoActive); err != nil { return err } // Verify the flowcheck - var ( - feeCalculator *fee.Calculator - staticFeesCfg = e.Backend.Config.StaticFeeConfig - ) - if !isEActive { - feeCalculator = fee.NewStaticCalculator(staticFeesCfg, upgrades, currentTimestamp) - } else { - feeCalculator = fee.NewDynamicCalculator(staticFeesCfg, e.BlkFeeManager, e.BlockMaxComplexity) - } - - fee, err := feeCalculator.ComputeFee(tx, e.Tx.Creds) + fee, err := e.FeeCalculator.ComputeFee(tx, e.Tx.Creds) if err != nil { return err } - if err := e.FlowChecker.VerifySpend( tx, e.State, @@ -186,7 +159,6 @@ func (e *StandardTxExecutor) ImportTx(tx *txs.ImportTx) error { currentTimestamp = e.State.GetTimestamp() upgrades = e.Backend.Config.UpgradeConfig isDurangoActive = upgrades.IsDurangoActivated(currentTimestamp) - isEActive = upgrades.IsEActivated(currentTimestamp) ) if err := avax.VerifyMemoFieldLength(tx.Memo, isDurangoActive); err != nil { return err @@ -234,21 +206,10 @@ func (e *StandardTxExecutor) ImportTx(tx *txs.ImportTx) error { copy(ins[len(tx.Ins):], tx.ImportedInputs) // Verify the flowcheck - var ( - feeCalculator *fee.Calculator - staticFeesCfg = e.Backend.Config.StaticFeeConfig - ) - if !isEActive { - feeCalculator = fee.NewStaticCalculator(staticFeesCfg, upgrades, currentTimestamp) - } else { - feeCalculator = fee.NewDynamicCalculator(staticFeesCfg, e.BlkFeeManager, e.BlockMaxComplexity) - } - - fee, err := feeCalculator.ComputeFee(tx, e.Tx.Creds) + fee, err := e.FeeCalculator.ComputeFee(tx, e.Tx.Creds) if err != nil { return err } - if err := e.FlowChecker.VerifySpendUTXOs( tx, utxos, @@ -290,7 +251,6 @@ func (e *StandardTxExecutor) ExportTx(tx *txs.ExportTx) error { currentTimestamp = e.State.GetTimestamp() upgrades = e.Backend.Config.UpgradeConfig isDurangoActive = upgrades.IsDurangoActivated(currentTimestamp) - isEActive = upgrades.IsEActivated(currentTimestamp) ) if err := avax.VerifyMemoFieldLength(tx.Memo, isDurangoActive); err != nil { return err @@ -303,21 +263,10 @@ func (e *StandardTxExecutor) ExportTx(tx *txs.ExportTx) error { } // Verify the flowcheck - var ( - feeCalculator *fee.Calculator - staticFeesCfg = e.Backend.Config.StaticFeeConfig - ) - if !isEActive { - feeCalculator = fee.NewStaticCalculator(staticFeesCfg, upgrades, currentTimestamp) - } else { - feeCalculator = fee.NewDynamicCalculator(staticFeesCfg, e.BlkFeeManager, e.BlockMaxComplexity) - } - - fee, err := feeCalculator.ComputeFee(tx, e.Tx.Creds) + fee, err := e.FeeCalculator.ComputeFee(tx, e.Tx.Creds) if err != nil { return err } - outs := make([]*avax.TransferableOutput, len(tx.Outs)+len(tx.ExportedOutputs)) copy(outs, tx.Outs) copy(outs[len(tx.Outs):], tx.ExportedOutputs) @@ -385,6 +334,7 @@ func (e *StandardTxExecutor) AddValidatorTx(tx *txs.AddValidatorTx) error { if _, err := verifyAddValidatorTx( e.Backend, + e.FeeCalculator, e.State, e.Tx, tx, @@ -414,8 +364,7 @@ func (e *StandardTxExecutor) AddValidatorTx(tx *txs.AddValidatorTx) error { func (e *StandardTxExecutor) AddSubnetValidatorTx(tx *txs.AddSubnetValidatorTx) error { if err := verifyAddSubnetValidatorTx( e.Backend, - e.BlkFeeManager, - e.BlockMaxComplexity, + e.FeeCalculator, e.State, e.Tx, tx, @@ -436,6 +385,7 @@ func (e *StandardTxExecutor) AddSubnetValidatorTx(tx *txs.AddSubnetValidatorTx) func (e *StandardTxExecutor) AddDelegatorTx(tx *txs.AddDelegatorTx) error { if _, err := verifyAddDelegatorTx( e.Backend, + e.FeeCalculator, e.State, e.Tx, tx, @@ -461,8 +411,7 @@ func (e *StandardTxExecutor) AddDelegatorTx(tx *txs.AddDelegatorTx) error { func (e *StandardTxExecutor) RemoveSubnetValidatorTx(tx *txs.RemoveSubnetValidatorTx) error { staker, isCurrentValidator, err := verifyRemoveSubnetValidatorTx( e.Backend, - e.BlkFeeManager, - e.BlockMaxComplexity, + e.FeeCalculator, e.State, e.Tx, tx, @@ -494,7 +443,6 @@ func (e *StandardTxExecutor) TransformSubnetTx(tx *txs.TransformSubnetTx) error currentTimestamp = e.State.GetTimestamp() upgrades = e.Backend.Config.UpgradeConfig isDurangoActive = upgrades.IsDurangoActivated(currentTimestamp) - isEActive = upgrades.IsEActivated(currentTimestamp) ) if err := avax.VerifyMemoFieldLength(tx.Memo, isDurangoActive); err != nil { return err @@ -511,21 +459,11 @@ func (e *StandardTxExecutor) TransformSubnetTx(tx *txs.TransformSubnetTx) error return err } - var ( - feeCalculator *fee.Calculator - staticFeesCfg = e.Backend.Config.StaticFeeConfig - ) - if !isEActive { - feeCalculator = fee.NewStaticCalculator(staticFeesCfg, upgrades, currentTimestamp) - } else { - feeCalculator = fee.NewDynamicCalculator(staticFeesCfg, e.BlkFeeManager, e.BlockMaxComplexity) - } - - fee, err := feeCalculator.ComputeFee(tx, e.Tx.Creds) + // Verify the flowcheck + fee, err := e.FeeCalculator.ComputeFee(tx, e.Tx.Creds) if err != nil { return err } - totalRewardAmount := tx.MaximumSupply - tx.InitialSupply if err := e.Backend.FlowChecker.VerifySpend( tx, @@ -559,8 +497,7 @@ func (e *StandardTxExecutor) TransformSubnetTx(tx *txs.TransformSubnetTx) error func (e *StandardTxExecutor) AddPermissionlessValidatorTx(tx *txs.AddPermissionlessValidatorTx) error { if err := verifyAddPermissionlessValidatorTx( e.Backend, - e.BlkFeeManager, - e.BlockMaxComplexity, + e.FeeCalculator, e.State, e.Tx, tx, @@ -593,8 +530,7 @@ func (e *StandardTxExecutor) AddPermissionlessValidatorTx(tx *txs.AddPermissionl func (e *StandardTxExecutor) AddPermissionlessDelegatorTx(tx *txs.AddPermissionlessDelegatorTx) error { if err := verifyAddPermissionlessDelegatorTx( e.Backend, - e.BlkFeeManager, - e.BlockMaxComplexity, + e.FeeCalculator, e.State, e.Tx, tx, @@ -619,8 +555,7 @@ func (e *StandardTxExecutor) AddPermissionlessDelegatorTx(tx *txs.AddPermissionl func (e *StandardTxExecutor) TransferSubnetOwnershipTx(tx *txs.TransferSubnetOwnershipTx) error { err := verifyTransferSubnetOwnershipTx( e.Backend, - e.BlkFeeManager, - e.BlockMaxComplexity, + e.FeeCalculator, e.State, e.Tx, tx, @@ -642,7 +577,6 @@ func (e *StandardTxExecutor) BaseTx(tx *txs.BaseTx) error { currentTimestamp = e.State.GetTimestamp() upgrades = e.Backend.Config.UpgradeConfig IsDurangoActive = upgrades.IsDurangoActivated(currentTimestamp) - isEActive = upgrades.IsEActivated(currentTimestamp) ) if !IsDurangoActive { @@ -659,21 +593,10 @@ func (e *StandardTxExecutor) BaseTx(tx *txs.BaseTx) error { } // Verify the flowcheck - var ( - feeCalculator *fee.Calculator - staticFeesCfg = e.Backend.Config.StaticFeeConfig - ) - if !isEActive { - feeCalculator = fee.NewStaticCalculator(staticFeesCfg, upgrades, currentTimestamp) - } else { - feeCalculator = fee.NewDynamicCalculator(staticFeesCfg, e.BlkFeeManager, e.BlockMaxComplexity) - } - - fee, err := feeCalculator.ComputeFee(tx, e.Tx.Creds) + fee, err := e.FeeCalculator.ComputeFee(tx, e.Tx.Creds) if err != nil { return err } - if err := e.FlowChecker.VerifySpend( tx, e.State, diff --git a/vms/platformvm/txs/executor/standard_tx_executor_test.go b/vms/platformvm/txs/executor/standard_tx_executor_test.go index 23beaf447c3a..881f5713a9b9 100644 --- a/vms/platformvm/txs/executor/standard_tx_executor_test.go +++ b/vms/platformvm/txs/executor/standard_tx_executor_test.go @@ -24,7 +24,6 @@ import ( "github.com/ava-labs/avalanchego/utils/timer/mockable" "github.com/ava-labs/avalanchego/utils/units" "github.com/ava-labs/avalanchego/vms/components/avax" - "github.com/ava-labs/avalanchego/vms/components/fees" "github.com/ava-labs/avalanchego/vms/components/verify" "github.com/ava-labs/avalanchego/vms/platformvm/config" "github.com/ava-labs/avalanchego/vms/platformvm/fx" @@ -33,7 +32,6 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/state" "github.com/ava-labs/avalanchego/vms/platformvm/status" "github.com/ava-labs/avalanchego/vms/platformvm/txs" - "github.com/ava-labs/avalanchego/vms/platformvm/txs/fee" "github.com/ava-labs/avalanchego/vms/platformvm/upgrade" "github.com/ava-labs/avalanchego/vms/platformvm/utxo" "github.com/ava-labs/avalanchego/vms/secp256k1fx" @@ -95,14 +93,13 @@ func TestStandardTxExecutorAddValidatorTxEmptyID(t *testing.T) { stateDiff, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, stateDiff, stateDiff.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: stateDiff, - Tx: tx, + Backend: &env.backend, + State: stateDiff, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, test.expectedError) @@ -349,14 +346,13 @@ func TestStandardTxExecutorAddDelegator(t *testing.T) { env.config.UpgradeConfig.BanffTime = onAcceptState.GetTimestamp() - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, tt.expectedExecutionErr) @@ -394,14 +390,13 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, ErrPeriodMismatch) @@ -429,14 +424,13 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } require.NoError(tx.Unsigned.Visit(&executor)) } @@ -482,14 +476,13 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, ErrNotValidator) @@ -532,14 +525,13 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, ErrPeriodMismatch) @@ -565,14 +557,13 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, ErrPeriodMismatch) @@ -598,14 +589,13 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } require.NoError(tx.Unsigned.Visit(&executor)) } @@ -633,14 +623,13 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, ErrTimestampNotBeforeStartTime) @@ -699,14 +688,13 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: duplicateSubnetTx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: duplicateSubnetTx, } err = duplicateSubnetTx.Unsigned.Visit(&executor) require.ErrorIs(err, ErrDuplicateValidator) @@ -743,14 +731,13 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, secp256k1fx.ErrInputIndicesNotSortedUnique) @@ -783,14 +770,13 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, errUnauthorizedSubnetModification) @@ -821,14 +807,13 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, errUnauthorizedSubnetModification) @@ -869,14 +854,13 @@ func TestApricotStandardTxExecutorAddSubnetValidator(t *testing.T) { onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, ErrDuplicateValidator) @@ -912,14 +896,13 @@ func TestBanffStandardTxExecutorAddValidator(t *testing.T) { onAcceptState, err := state.NewDiff(lastAcceptedID, env) require.NoError(err) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, ErrTimestampNotBeforeStartTime) @@ -959,14 +942,13 @@ func TestBanffStandardTxExecutorAddValidator(t *testing.T) { onAcceptState.PutCurrentValidator(staker) onAcceptState.AddTx(tx, status.Committed) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, ErrAlreadyValidator) @@ -1003,14 +985,13 @@ func TestBanffStandardTxExecutorAddValidator(t *testing.T) { onAcceptState.PutPendingValidator(staker) onAcceptState.AddTx(tx, status.Committed) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, ErrAlreadyValidator) @@ -1046,14 +1027,13 @@ func TestBanffStandardTxExecutorAddValidator(t *testing.T) { onAcceptState.DeleteUTXO(utxoID) } - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(env.config.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) executor := StandardTxExecutor{ - Backend: &env.backend, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + FeeCalculator: feeCalculator, + State: onAcceptState, + Tx: tx, } err = tx.Unsigned.Visit(&executor) require.ErrorIs(err, ErrFlowCheckFailed) @@ -1148,10 +1128,13 @@ func TestDurangoDisabledTransactions(t *testing.T) { tx := tt.buildTx(env) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(err) err = tx.Unsigned.Visit(&StandardTxExecutor{ - Backend: &env.backend, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, }) require.ErrorIs(err, tt.expectedErr) }) @@ -1344,10 +1327,13 @@ func TestDurangoMemoField(t *testing.T) { onAcceptState, err := state.NewDiff(env.state.GetLastAccepted(), env) require.NoError(t, err) + feeCalculator, err := state.PickFeeCalculator(env.config, onAcceptState, onAcceptState.GetTimestamp()) + require.NoError(t, err) require.NoError(t, subnetValTx.Unsigned.Visit(&StandardTxExecutor{ - Backend: &env.backend, - State: onAcceptState, - Tx: subnetValTx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: subnetValTx, })) tx, err := env.txBuilder.NewRemoveSubnetValidatorTx( @@ -1531,21 +1517,26 @@ func TestDurangoMemoField(t *testing.T) { env.ctx.Lock.Lock() defer env.ctx.Lock.Unlock() + feeCalculator, err := state.PickFeeCalculator(env.config, env.state, env.state.GetTimestamp()) + require.NoError(err) + // Populated memo field should error tx, onAcceptState := tt.setupTest(env, []byte{'m', 'e', 'm', 'o'}) - err := tx.Unsigned.Visit(&StandardTxExecutor{ - Backend: &env.backend, - State: onAcceptState, - Tx: tx, + err = tx.Unsigned.Visit(&StandardTxExecutor{ + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, }) require.ErrorIs(err, avax.ErrMemoTooLarge) // Empty memo field should not error tx, onAcceptState = tt.setupTest(env, []byte{}) require.NoError(tx.Unsigned.Visit(&StandardTxExecutor{ - Backend: &env.backend, - State: onAcceptState, - Tx: tx, + Backend: &env.backend, + State: onAcceptState, + FeeCalculator: feeCalculator, + Tx: tx, })) }) } @@ -1675,20 +1666,19 @@ func TestStandardExecutorRemoveSubnetValidatorTx(t *testing.T) { env.state.EXPECT().AddUTXO(gomock.Any()).Times(len(env.unsignedTx.Outs)) cfg := defaultTestConfig(t, durango, env.latestForkTime) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(cfg.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(cfg, env.state, env.state.GetTimestamp()) + require.NoError(t, err) e := &StandardTxExecutor{ Backend: &Backend{ - Config: defaultTestConfig(t, durango, env.latestForkTime), + Config: cfg, Bootstrapped: &utils.Atomic[bool]{}, Fx: env.fx, FlowChecker: env.flowChecker, Ctx: &snow.Context{}, }, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - Tx: env.tx, - State: env.state, + FeeCalculator: feeCalculator, + Tx: env.tx, + State: env.state, } e.Bootstrapped.Set(true) return env.unsignedTx, e @@ -1702,20 +1692,22 @@ func TestStandardExecutorRemoveSubnetValidatorTx(t *testing.T) { // Setting the subnet ID to the Primary Network ID makes the tx fail syntactic verification env.tx.Unsigned.(*txs.RemoveSubnetValidatorTx).Subnet = constants.PrimaryNetworkID env.state = state.NewMockDiff(ctrl) + env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).Times(2) - feeCfg := fee.GetDynamicConfig(false /*isEActive*/) + cfg := defaultTestConfig(t, durango, env.latestForkTime) + feeCalculator, err := state.PickFeeCalculator(cfg, env.state, env.state.GetTimestamp()) + require.NoError(t, err) e := &StandardTxExecutor{ Backend: &Backend{ - Config: defaultTestConfig(t, durango, env.latestForkTime), + Config: cfg, Bootstrapped: &utils.Atomic[bool]{}, Fx: env.fx, FlowChecker: env.flowChecker, Ctx: &snow.Context{}, }, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - Tx: env.tx, - State: env.state, + FeeCalculator: feeCalculator, + Tx: env.tx, + State: env.state, } e.Bootstrapped.Set(true) return env.unsignedTx, e @@ -1732,20 +1724,19 @@ func TestStandardExecutorRemoveSubnetValidatorTx(t *testing.T) { env.state.EXPECT().GetPendingValidator(env.unsignedTx.Subnet, env.unsignedTx.NodeID).Return(nil, database.ErrNotFound) cfg := defaultTestConfig(t, durango, env.latestForkTime) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(cfg.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(cfg, env.state, env.state.GetTimestamp()) + require.NoError(t, err) e := &StandardTxExecutor{ Backend: &Backend{ - Config: defaultTestConfig(t, durango, env.latestForkTime), + Config: cfg, Bootstrapped: &utils.Atomic[bool]{}, Fx: env.fx, FlowChecker: env.flowChecker, Ctx: &snow.Context{}, }, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - Tx: env.tx, - State: env.state, + FeeCalculator: feeCalculator, + Tx: env.tx, + State: env.state, } e.Bootstrapped.Set(true) return env.unsignedTx, e @@ -1761,24 +1752,23 @@ func TestStandardExecutorRemoveSubnetValidatorTx(t *testing.T) { staker.Priority = txs.SubnetPermissionlessValidatorCurrentPriority // Set dependency expectations. - env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).AnyTimes() + env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).Times(3) env.state.EXPECT().GetCurrentValidator(env.unsignedTx.Subnet, env.unsignedTx.NodeID).Return(&staker, nil).Times(1) cfg := defaultTestConfig(t, durango, env.latestForkTime) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(cfg.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(cfg, env.state, env.state.GetTimestamp()) + require.NoError(t, err) e := &StandardTxExecutor{ Backend: &Backend{ - Config: defaultTestConfig(t, durango, env.latestForkTime), + Config: cfg, Bootstrapped: &utils.Atomic[bool]{}, Fx: env.fx, FlowChecker: env.flowChecker, Ctx: &snow.Context{}, }, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - Tx: env.tx, - State: env.state, + FeeCalculator: feeCalculator, + Tx: env.tx, + State: env.state, } e.Bootstrapped.Set(true) return env.unsignedTx, e @@ -1792,24 +1782,23 @@ func TestStandardExecutorRemoveSubnetValidatorTx(t *testing.T) { // Remove credentials env.tx.Creds = nil env.state = state.NewMockDiff(ctrl) - env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).AnyTimes() + env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).Times(3) env.state.EXPECT().GetCurrentValidator(env.unsignedTx.Subnet, env.unsignedTx.NodeID).Return(env.staker, nil) cfg := defaultTestConfig(t, durango, env.latestForkTime) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(cfg.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(cfg, env.state, env.state.GetTimestamp()) + require.NoError(t, err) e := &StandardTxExecutor{ Backend: &Backend{ - Config: defaultTestConfig(t, durango, env.latestForkTime), + Config: cfg, Bootstrapped: &utils.Atomic[bool]{}, Fx: env.fx, FlowChecker: env.flowChecker, Ctx: &snow.Context{}, }, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - Tx: env.tx, - State: env.state, + FeeCalculator: feeCalculator, + Tx: env.tx, + State: env.state, } e.Bootstrapped.Set(true) return env.unsignedTx, e @@ -1826,20 +1815,19 @@ func TestStandardExecutorRemoveSubnetValidatorTx(t *testing.T) { env.state.EXPECT().GetSubnetOwner(env.unsignedTx.Subnet).Return(nil, database.ErrNotFound) cfg := defaultTestConfig(t, durango, env.latestForkTime) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(cfg.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(cfg, env.state, env.state.GetTimestamp()) + require.NoError(t, err) e := &StandardTxExecutor{ Backend: &Backend{ - Config: defaultTestConfig(t, durango, env.latestForkTime), + Config: cfg, Bootstrapped: &utils.Atomic[bool]{}, Fx: env.fx, FlowChecker: env.flowChecker, Ctx: &snow.Context{}, }, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - Tx: env.tx, - State: env.state, + FeeCalculator: feeCalculator, + Tx: env.tx, + State: env.state, } e.Bootstrapped.Set(true) return env.unsignedTx, e @@ -1858,20 +1846,19 @@ func TestStandardExecutorRemoveSubnetValidatorTx(t *testing.T) { env.fx.EXPECT().VerifyPermission(gomock.Any(), env.unsignedTx.SubnetAuth, env.tx.Creds[len(env.tx.Creds)-1], subnetOwner).Return(errTest) cfg := defaultTestConfig(t, durango, env.latestForkTime) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(cfg.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(cfg, env.state, env.state.GetTimestamp()) + require.NoError(t, err) e := &StandardTxExecutor{ Backend: &Backend{ - Config: defaultTestConfig(t, durango, env.latestForkTime), + Config: cfg, Bootstrapped: &utils.Atomic[bool]{}, Fx: env.fx, FlowChecker: env.flowChecker, Ctx: &snow.Context{}, }, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - Tx: env.tx, - State: env.state, + FeeCalculator: feeCalculator, + Tx: env.tx, + State: env.state, } e.Bootstrapped.Set(true) return env.unsignedTx, e @@ -1893,20 +1880,19 @@ func TestStandardExecutorRemoveSubnetValidatorTx(t *testing.T) { ).Return(errTest) cfg := defaultTestConfig(t, durango, env.latestForkTime) - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(cfg.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(cfg, env.state, env.state.GetTimestamp()) + require.NoError(t, err) e := &StandardTxExecutor{ Backend: &Backend{ - Config: defaultTestConfig(t, durango, env.latestForkTime), + Config: cfg, Bootstrapped: &utils.Atomic[bool]{}, Fx: env.fx, FlowChecker: env.flowChecker, Ctx: &snow.Context{}, }, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - Tx: env.tx, - State: env.state, + FeeCalculator: feeCalculator, + Tx: env.tx, + State: env.state, } e.Bootstrapped.Set(true) return env.unsignedTx, e @@ -2050,20 +2036,22 @@ func TestStandardExecutorTransformSubnetTx(t *testing.T) { // Setting the tx to nil makes the tx fail syntactic verification env.tx.Unsigned = (*txs.TransformSubnetTx)(nil) env.state = state.NewMockDiff(ctrl) + env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).Times(2) - feeCfg := fee.GetDynamicConfig(false /*isEActive*/) + cfg := defaultTestConfig(t, durango, env.latestForkTime) + feeCalculator, err := state.PickFeeCalculator(cfg, env.state, env.state.GetTimestamp()) + require.NoError(t, err) e := &StandardTxExecutor{ Backend: &Backend{ - Config: defaultTestConfig(t, durango, env.latestForkTime), + Config: cfg, Bootstrapped: &utils.Atomic[bool]{}, Fx: env.fx, FlowChecker: env.flowChecker, Ctx: &snow.Context{}, }, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - Tx: env.tx, - State: env.state, + FeeCalculator: feeCalculator, + Tx: env.tx, + State: env.state, } e.Bootstrapped.Set(true) return env.unsignedTx, e @@ -2076,23 +2064,22 @@ func TestStandardExecutorTransformSubnetTx(t *testing.T) { env := newValidTransformSubnetTxVerifyEnv(t, ctrl) env.unsignedTx.MaxStakeDuration = math.MaxUint32 env.state = state.NewMockDiff(ctrl) + env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).Times(3) cfg := defaultTestConfig(t, durango, env.latestForkTime) - env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).AnyTimes() - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(cfg.UpgradeConfig.IsEActivated(chainTime)) + feeCalculator, err := state.PickFeeCalculator(cfg, env.state, env.state.GetTimestamp()) + require.NoError(t, err) e := &StandardTxExecutor{ Backend: &Backend{ - Config: defaultTestConfig(t, durango, env.latestForkTime), + Config: cfg, Bootstrapped: &utils.Atomic[bool]{}, Fx: env.fx, FlowChecker: env.flowChecker, Ctx: &snow.Context{}, }, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - Tx: env.tx, - State: env.state, + FeeCalculator: feeCalculator, + Tx: env.tx, + State: env.state, } e.Bootstrapped.Set(true) return env.unsignedTx, e @@ -2106,12 +2093,13 @@ func TestStandardExecutorTransformSubnetTx(t *testing.T) { // Remove credentials env.tx.Creds = nil env.state = state.NewMockDiff(ctrl) + env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).Times(3) cfg := defaultTestConfig(t, durango, env.latestForkTime) cfg.MaxStakeDuration = math.MaxInt64 - env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).AnyTimes() - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(cfg.UpgradeConfig.IsEActivated(chainTime)) + + feeCalculator, err := state.PickFeeCalculator(cfg, env.state, env.state.GetTimestamp()) + require.NoError(t, err) e := &StandardTxExecutor{ Backend: &Backend{ Config: cfg, @@ -2120,10 +2108,9 @@ func TestStandardExecutorTransformSubnetTx(t *testing.T) { FlowChecker: env.flowChecker, Ctx: &snow.Context{}, }, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - Tx: env.tx, - State: env.state, + FeeCalculator: feeCalculator, + Tx: env.tx, + State: env.state, } e.Bootstrapped.Set(true) return env.unsignedTx, e @@ -2136,7 +2123,7 @@ func TestStandardExecutorTransformSubnetTx(t *testing.T) { env := newValidTransformSubnetTxVerifyEnv(t, ctrl) env.state = state.NewMockDiff(ctrl) subnetOwner := fx.NewMockOwner(ctrl) - env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).AnyTimes() + env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).Times(3) env.state.EXPECT().GetSubnetOwner(env.unsignedTx.Subnet).Return(subnetOwner, nil) env.state.EXPECT().GetSubnetTransformation(env.unsignedTx.Subnet).Return(nil, database.ErrNotFound).Times(1) env.fx.EXPECT().VerifyPermission(gomock.Any(), env.unsignedTx.SubnetAuth, env.tx.Creds[len(env.tx.Creds)-1], subnetOwner).Return(nil) @@ -2146,8 +2133,9 @@ func TestStandardExecutorTransformSubnetTx(t *testing.T) { cfg := defaultTestConfig(t, durango, env.latestForkTime) cfg.MaxStakeDuration = math.MaxInt64 - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(cfg.UpgradeConfig.IsEActivated(chainTime)) + + feeCalculator, err := state.PickFeeCalculator(cfg, env.state, env.state.GetTimestamp()) + require.NoError(t, err) e := &StandardTxExecutor{ Backend: &Backend{ Config: cfg, @@ -2156,10 +2144,9 @@ func TestStandardExecutorTransformSubnetTx(t *testing.T) { FlowChecker: env.flowChecker, Ctx: &snow.Context{}, }, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - Tx: env.tx, - State: env.state, + FeeCalculator: feeCalculator, + Tx: env.tx, + State: env.state, } e.Bootstrapped.Set(true) return env.unsignedTx, e @@ -2173,7 +2160,7 @@ func TestStandardExecutorTransformSubnetTx(t *testing.T) { // Set dependency expectations. subnetOwner := fx.NewMockOwner(ctrl) - env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).AnyTimes() + env.state.EXPECT().GetTimestamp().Return(env.latestForkTime).Times(3) env.state.EXPECT().GetSubnetOwner(env.unsignedTx.Subnet).Return(subnetOwner, nil).Times(1) env.state.EXPECT().GetSubnetTransformation(env.unsignedTx.Subnet).Return(nil, database.ErrNotFound).Times(1) env.fx.EXPECT().VerifyPermission(env.unsignedTx, env.unsignedTx.SubnetAuth, env.tx.Creds[len(env.tx.Creds)-1], subnetOwner).Return(nil).Times(1) @@ -2187,8 +2174,9 @@ func TestStandardExecutorTransformSubnetTx(t *testing.T) { cfg := defaultTestConfig(t, durango, env.latestForkTime) cfg.MaxStakeDuration = math.MaxInt64 - chainTime := env.state.GetTimestamp() - feeCfg := fee.GetDynamicConfig(cfg.UpgradeConfig.IsEActivated(chainTime)) + + feeCalculator, err := state.PickFeeCalculator(cfg, env.state, env.state.GetTimestamp()) + require.NoError(t, err) e := &StandardTxExecutor{ Backend: &Backend{ Config: cfg, @@ -2197,10 +2185,9 @@ func TestStandardExecutorTransformSubnetTx(t *testing.T) { FlowChecker: env.flowChecker, Ctx: &snow.Context{}, }, - BlkFeeManager: fees.NewManager(feeCfg.InitialFeeRate), - BlockMaxComplexity: feeCfg.BlockMaxComplexity, - Tx: env.tx, - State: env.state, + FeeCalculator: feeCalculator, + Tx: env.tx, + State: env.state, } e.Bootstrapped.Set(true) return env.unsignedTx, e diff --git a/vms/platformvm/txs/fee/calculator.go b/vms/platformvm/txs/fee/calculator.go index 1be6d3de6f3d..9ba16a82bf0d 100644 --- a/vms/platformvm/txs/fee/calculator.go +++ b/vms/platformvm/txs/fee/calculator.go @@ -67,6 +67,7 @@ func (c *Calculator) ResetFee(newFee uint64) { func (c *Calculator) ComputeFee(tx txs.UnsignedTx, creds []verify.Verifiable) (uint64, error) { c.c.credentials = creds + c.c.fee = 0 // zero fee among different ComputeFee invocations (unlike Complexity which gets cumulated) err := tx.Visit(c.c) return c.c.fee, err } @@ -79,14 +80,28 @@ func (c *Calculator) RemoveFeesFor(unitsToRm fees.Dimensions) (uint64, error) { return c.c.removeFeesFor(unitsToRm) } +func (c *Calculator) GetFeeRates() fees.Dimensions { + if c.c.feeManager != nil { + return c.c.feeManager.GetFeeRates() + } + return fees.Empty +} + +func (c *Calculator) GetCumulatedComplexity() fees.Dimensions { + if c.c.feeManager != nil { + return c.c.feeManager.GetCumulatedComplexity() + } + return fees.Empty +} + type calculator struct { // setup isEActive bool + staticCfg StaticConfig // Pre E-upgrade inputs - upgrades upgrade.Config - staticCfg StaticConfig - time time.Time + upgrades upgrade.Config + time time.Time // Post E-upgrade inputs feeManager *fees.Manager diff --git a/vms/platformvm/vm_test.go b/vms/platformvm/vm_test.go index d7d07f944477..3f60e11dad19 100644 --- a/vms/platformvm/vm_test.go +++ b/vms/platformvm/vm_test.go @@ -413,6 +413,7 @@ func TestGenesis(t *testing.T) { feeCalc = fee.NewDynamicCalculator(staticFeeCfg, feeMan, feeCfg.BlockMaxComplexity) } + require.NoError(err) fee, err := feeCalc.ComputeFee(testSubnet1.Unsigned, testSubnet1.Creds) require.NoError(err) require.Equal(uint64(utxo.Amount)-fee, out.Amount()) @@ -2115,7 +2116,7 @@ func TestRemovePermissionedValidatorDuringAddPending(t *testing.T) { validatorStartTime := latestForkTime.Add(txexecutor.SyncBound).Add(1 * time.Second) validatorEndTime := validatorStartTime.Add(360 * 24 * time.Hour) - vm, txBuilder, _, _ := defaultVM(t, latestFork) + vm, txBuilder, _, _ := defaultVM(t, durango) vm.ctx.Lock.Lock() defer vm.ctx.Lock.Unlock() diff --git a/wallet/chain/p/builder/builder.go b/wallet/chain/p/builder/builder.go index 600b5d1c2eeb..4f712cc119c1 100644 --- a/wallet/chain/p/builder/builder.go +++ b/wallet/chain/p/builder/builder.go @@ -438,16 +438,16 @@ func (b *builder) NewAddSubnetValidatorTx( toStake := map[ids.ID]uint64{} toBurn := map[ids.ID]uint64{} // fees are calculated in financeTx - // update fees to account for the auth credentials to be added upon tx signing - if _, err = fee.FinanceCredential(feeCalc, len(subnetAuth.SigIndices)); err != nil { - return nil, fmt.Errorf("account for credential fees: %w", err) - } - // feesMan cumulates complexity. Let's init it with utx filled so far if _, err := feeCalc.ComputeFee(utx, nil); err != nil { return nil, err } + // update fees to account for the auth credentials to be added upon tx signing + if _, err = fee.FinanceCredential(feeCalc, len(subnetAuth.SigIndices)); err != nil { + return nil, fmt.Errorf("account for credential fees: %w", err) + } + inputs, outputs, _, err := b.financeTx(toBurn, toStake, feeCalc, ops) if err != nil { return nil, err @@ -486,16 +486,16 @@ func (b *builder) NewRemoveSubnetValidatorTx( toStake := map[ids.ID]uint64{} toBurn := map[ids.ID]uint64{} // fees are calculated in financeTx - // update fees to account for the auth credentials to be added upon tx signing - if _, err = fee.FinanceCredential(feeCalc, len(subnetAuth.SigIndices)); err != nil { - return nil, fmt.Errorf("account for credential fees: %w", err) - } - // feesMan cumulates complexity. Let's init it with utx filled so far if _, err := feeCalc.ComputeFee(utx, nil); err != nil { return nil, err } + // update fees to account for the auth credentials to be added upon tx signing + if _, err = fee.FinanceCredential(feeCalc, len(subnetAuth.SigIndices)); err != nil { + return nil, fmt.Errorf("account for credential fees: %w", err) + } + inputs, outputs, _, err := b.financeTx(toBurn, toStake, feeCalc, ops) if err != nil { return nil, err @@ -585,16 +585,16 @@ func (b *builder) NewCreateChainTx( toStake := map[ids.ID]uint64{} toBurn := map[ids.ID]uint64{} // fees are calculated in financeTx - // update fees to account for the auth credentials to be added upon tx signing - if _, err = fee.FinanceCredential(feeCalc, len(subnetAuth.SigIndices)); err != nil { - return nil, fmt.Errorf("account for credential fees: %w", err) - } - // feesMan cumulates complexity. Let's init it with utx filled so far if _, err := feeCalc.ComputeFee(utx, nil); err != nil { return nil, err } + // update fees to account for the auth credentials to be added upon tx signing + if _, err = fee.FinanceCredential(feeCalc, len(subnetAuth.SigIndices)); err != nil { + return nil, fmt.Errorf("account for credential fees: %w", err) + } + inputs, outputs, _, err := b.financeTx(toBurn, toStake, feeCalc, ops) if err != nil { return nil, err @@ -673,16 +673,16 @@ func (b *builder) NewTransferSubnetOwnershipTx( toStake := map[ids.ID]uint64{} toBurn := map[ids.ID]uint64{} // fees are calculated in financeTx - // update fees to account for the auth credentials to be added upon tx signing - if _, err = fee.FinanceCredential(feeCalc, len(subnetAuth.SigIndices)); err != nil { - return nil, fmt.Errorf("account for credential fees: %w", err) - } - // feesMan cumulates complexity. Let's init it with utx filled so far if _, err := feeCalc.ComputeFee(utx, nil); err != nil { return nil, err } + // update fees to account for the auth credentials to be added upon tx signing + if _, err = fee.FinanceCredential(feeCalc, len(subnetAuth.SigIndices)); err != nil { + return nil, fmt.Errorf("account for credential fees: %w", err) + } + inputs, outputs, _, err := b.financeTx(toBurn, toStake, feeCalc, ops) if err != nil { return nil, err @@ -961,16 +961,16 @@ func (b *builder) NewTransformSubnetTx( assetID: maxSupply - initialSupply, } // fees are calculated in financeTx - // update fees to account for the auth credentials to be added upon tx signing - if _, err = fee.FinanceCredential(feeCalc, len(subnetAuth.SigIndices)); err != nil { - return nil, fmt.Errorf("account for credential fees: %w", err) - } - // feesMan cumulates complexity. Let's init it with utx filled so far if _, err := feeCalc.ComputeFee(utx, nil); err != nil { return nil, err } + // update fees to account for the auth credentials to be added upon tx signing + if _, err = fee.FinanceCredential(feeCalc, len(subnetAuth.SigIndices)); err != nil { + return nil, fmt.Errorf("account for credential fees: %w", err) + } + inputs, outputs, _, err := b.financeTx(toBurn, toStake, feeCalc, ops) if err != nil { return nil, err