From 280ae62e16081fa7254c85b837738460ae750d57 Mon Sep 17 00:00:00 2001 From: guqicun <166205493+guqicun@users.noreply.github.com> Date: Wed, 10 Apr 2024 17:02:26 +0800 Subject: [PATCH 1/9] chore: remove repetitive words (#1169) Signed-off-by: guqicun --- docs/architecture/components.md | 2 +- docs/architecture/fees-and-channels.md | 4 ++-- docs/rococo-testnet/rococo-sepolia-token-transfers.md | 2 +- relayer/crypto/merkle/merkle.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/architecture/components.md b/docs/architecture/components.md index 35121af97c..6c9e39add3 100644 --- a/docs/architecture/components.md +++ b/docs/architecture/components.md @@ -10,7 +10,7 @@ This [pallet](https://github.com/Snowfork/snowbridge/tree/main/parachain/pallets 1. Verifying that message[^1] that was included in the finalized Ethereum execution chain as tracked by our ethereum light client. 2. Converting the message to an [XCM](https://wiki.polkadot.network/docs/learn-xcm) script. -3. Sending the the XCM script to the destination parachain. +3. Sending the XCM script to the destination parachain. ### OutboundQueue diff --git a/docs/architecture/fees-and-channels.md b/docs/architecture/fees-and-channels.md index 2f28903540..4ba49a73a3 100644 --- a/docs/architecture/fees-and-channels.md +++ b/docs/architecture/fees-and-channels.md @@ -2,7 +2,7 @@ Bridge messages flow across the bridge through logical _channels_. Each parachain that wishes to directly send or receive messages is allocated its own dedicated channel, and has some influence over the operation of its channel. -This design ensures the the following: +This design ensures the following: * Parachain governance assumes the responsibility of [rebalancing](fees-and-channels.md#rebalancing) * The potential for custom fee/reward models on a per-channel basis @@ -27,7 +27,7 @@ As a prerequisite, the parachain must already have an agent instantiated on Ethe The net result is that: -* On Ethereum, the agent contract of the origin parachain is _credited_ with fees that cover the cost of delivery to the the destination parachain. +* On Ethereum, the agent contract of the origin parachain is _credited_ with fees that cover the cost of delivery to the destination parachain. * On BridgeHub, sovereign account of the origin parachain is _debited_ with the costs incurred for delivery. ### Parachain -> BridgeHub -> Ethereum diff --git a/docs/rococo-testnet/rococo-sepolia-token-transfers.md b/docs/rococo-testnet/rococo-sepolia-token-transfers.md index e5146ca29a..01d4ceb8a7 100644 --- a/docs/rococo-testnet/rococo-sepolia-token-transfers.md +++ b/docs/rococo-testnet/rococo-sepolia-token-transfers.md @@ -159,7 +159,7 @@ Gateway Contract Address: [0x5b4909ce6ca82d2ce23bd46738953c7959e710cd](https://s 1. Navigate to the Contract tab, click Read as Proxy. 2. Expand `quoteSendTokenFee` and input the token address. 3. The `destinationChain` that the token is going to be sent to. In this example it is destination parachain `2005`. -4. The `destinationFee` is the fee used by the destination chain to pay for XCM execution. This amount in in the unit of the relaychain native currency. Here we use `1,000,000 ROC CENTS` . (`1 MircroROC`) +4. The `destinationFee` is the fee used by the destination chain to pay for XCM execution. This amount in the unit of the relaychain native currency. Here we use `1,000,000 ROC CENTS` . (`1 MircroROC`) 5. Click query, the fee is returned in the unit `Wei`.
diff --git a/relayer/crypto/merkle/merkle.go b/relayer/crypto/merkle/merkle.go index af0040e215..b3143d7c5b 100644 --- a/relayer/crypto/merkle/merkle.go +++ b/relayer/crypto/merkle/merkle.go @@ -141,7 +141,7 @@ func (t *Tree) MerklePath(preLeaf []byte) []*Node { remainder := levelLen % 2 nextIndex := index / 2 - // if index is the the last item in an odd length level promote + // if index is the last item in an odd length level promote if index == levelLen-1 && remainder != 0 { index = nextIndex continue From bc62ad1878ff7747594c4153f255c85174522d64 Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Fri, 12 Apr 2024 09:37:56 +0200 Subject: [PATCH 2/9] update subxt (#1173) Co-authored-by: claravanstaden --- go.work.sum | 316 +++++++++ smoketest/Cargo.lock | 1285 ++++++++++++++++++------------------ smoketest/Cargo.toml | 12 +- smoketest/make-bindings.sh | 2 +- 4 files changed, 968 insertions(+), 647 deletions(-) diff --git a/go.work.sum b/go.work.sum index c799d27f1b..b383ff0db2 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,39 +1,355 @@ +cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= +cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= +cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= +cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= +cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= +cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= +cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= +cloud.google.com/go/storage v1.35.1 h1:B59ahL//eDfx2IIKFBeT5Atm9wnNmj3+8xG/W4WB//w= +cloud.google.com/go/storage v1.35.1/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0 h1:gggzg0SUMs6SQbEw+3LoSsYf9YMjkupeAnHMX8O9mmY= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.2.0/go.mod h1:+6KLcKIVgxoBDMqMO/Nvy7bZ9a0nbU3I1DtFQK3YvB4= +github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= +github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= +github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= +github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= +github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794 h1:xlwdaKcTNVW4PtpQb8aKA4Pjy0CdJHEqvFbAnvR5m2g= +github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= +github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= +github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= +github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/aws/aws-sdk-go-v2 v1.21.2 h1:+LXZ0sgo8quN9UOKXXzAWRT3FWd4NxeXWOZom9pE7GA= +github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= +github.com/aws/aws-sdk-go-v2/config v1.18.45 h1:Aka9bI7n8ysuwPeFdm77nfbyHCAKQ3z9ghB3S/38zes= +github.com/aws/aws-sdk-go-v2/config v1.18.45/go.mod h1:ZwDUgFnQgsazQTnWfeLWk5GjeqTQTL8lMkoE1UXzxdE= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43 h1:LU8vo40zBlo3R7bAvBVy/ku4nxGEyZe9N8MqAeFTzF8= +github.com/aws/aws-sdk-go-v2/credentials v1.13.43/go.mod h1:zWJBz1Yf1ZtX5NGax9ZdNjhhI4rgjfgsyk6vTY1yfVg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13 h1:PIktER+hwIG286DqXyvVENjgLTAwGgoeriLDD5C+YlQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.13/go.mod h1:f/Ib/qYjhV2/qdsf79H3QP/eRE4AkVyEf6sk7XfZ1tg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43 h1:nFBQlGtkbPzp/NjZLuFxRqmT91rLJkgvsEQs68h962Y= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37 h1:JRVhO25+r3ar2mKGP7E0LDl8K9/G36gjlqca5iQbaqc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45 h1:hze8YsjSh8Wl1rYa1CJpRmXP21BvOBuc76YhW0HsuQ4= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.45/go.mod h1:lD5M20o09/LCuQ2mE62Mb/iSdSlCNuj6H5ci7tW7OsE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37 h1:WWZA/I2K4ptBS1kg0kV1JbBtG/umed0vwHRrmcr9z7k= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.37/go.mod h1:vBmDnwWXWxNPFRMmG2m/3MKOe+xEcMDo1tanpaWCcck= +github.com/aws/aws-sdk-go-v2/service/route53 v1.30.2 h1:/RPQNjh1sDIezpXaFIkZb7MlXnSyAqjVdAwcJuGYTqg= +github.com/aws/aws-sdk-go-v2/service/route53 v1.30.2/go.mod h1:TQZBt/WaQy+zTHoW++rnl8JBrmZ0VO6EUbVua1+foCA= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2 h1:JuPGc7IkOP4AaqcZSIcyqLpFSqBWK32rM9+a1g6u73k= +github.com/aws/aws-sdk-go-v2/service/sso v1.15.2/go.mod h1:gsL4keucRCgW+xA85ALBpRFfdSLH4kHOVSnLMSuBECo= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3 h1:HFiiRkf1SdaAmV3/BHOFZ9DjFynPHj8G/UIO1lQS+fk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.17.3/go.mod h1:a7bHA82fyUXOm+ZSWKU6PIoBxrjSprdLoM8xPYvzYVg= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.2 h1:0BkLfgeDjfZnZ+MhB3ONb01u9pwFYTCZVhlsSSBvlbU= +github.com/aws/aws-sdk-go-v2/service/sts v1.23.2/go.mod h1:Eows6e1uQEsc4ZaHANmsPRzAKcVDrcmjjWiih2+HUUQ= +github.com/aws/smithy-go v1.15.0 h1:PS/durmlzvAFpQHDs4wi4sNNP9ExsqZh6IlfdHXgKK8= +github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/btcsuite/btcd v0.22.0-beta h1:LTDpDKUM5EeOFBPM8IXpinEcmZ6FWfNZbE3lfrfdnWo= github.com/btcsuite/btcd v0.22.0-beta/go.mod h1:9n5ntfhhHQBIhUvlhDvD3Qg6fRUj4jkN0VB8L8svzOA= github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= +github.com/cloudflare/cloudflare-go v0.79.0 h1:ErwCYDjFCYppDJlDJ/5WhsSmzegAUe2+K9qgFyQDg3M= +github.com/cloudflare/cloudflare-go v0.79.0/go.mod h1:gkHQf9xEubaQPEuerBuoinR9P8bf8a05Lq0X6WKy1Oc= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w= +github.com/deepmap/oapi-codegen v1.6.0 h1:w/d1ntwh91XI0b/8ja7+u5SvA4IFfM0UNNLmiDR1gg0= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= +github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= +github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo= +github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= +github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= +github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= +github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= +github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9 h1:r5GgOLGbza2wVHRzK7aAj6lWZjfbAwiu/RDCVOKjRyM= +github.com/ghemawat/stream v0.0.0-20171120220530-696b145b53b9/go.mod h1:106OIgooyS7OzLDOpUGgm9fA3bQENb/cFSyyBmMoJDs= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= +github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= +github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= +github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= +github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20230207041349-798e818bf904 h1:4/hN5RUoecvl+RmJRE2YxKWtnnQls6rQjjW5oV7qg2U= +github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= +github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720 h1:zC34cGQu69FG7qzJ3WiKW244WfhDC3xxYMeNOX2gtUQ= +github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0= +github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/guptarohit/asciigraph v0.5.5 h1:ccFnUF8xYIOUPPY3tmdvRyHqmn1MYI9iv1pLKX+/ZkQ= +github.com/guptarohit/asciigraph v0.5.5/go.mod h1:dYl5wwK4gNsnFf9Zp+l06rFiDZ5YtXM6x7SRWZ3KGag= +github.com/hashicorp/consul/api v1.25.1 h1:CqrdhYzc8XZuPnhIYZWH45toM0LB9ZeYr/gvpLVI3PE= +github.com/hashicorp/consul/api v1.25.1/go.mod h1:iiLVwR/htV7mas/sy0O+XSuEnrdBUUydemjxcUrAt4g= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= +github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/hydrogen18/memlistener v1.0.0 h1:JR7eDj8HD6eXrc5fWLbSUnfcQFL06PYvCc0DKQnWfaU= +github.com/hydrogen18/memlistener v1.0.0/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 h1:mV02weKRL81bEnm8A0HT1/CAelMQDBuQIfLw8n+d6xI= +github.com/influxdata/influxdb-client-go/v2 v2.4.0 h1:HGBfZYStlx3Kqvsv1h2pJixbCl/jhnFtxpKFAv9Tu5k= github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= +github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= +github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= +github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY15rFihtRfck/bfFqNfvcabqvXAFQfAUpY= +github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/karalabe/usb v0.0.2 h1:M6QQBNxF+CQ8OFvxrT90BA0qBOXymndZnk5q235mFc4= +github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= +github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= +github.com/kataras/golog v0.1.8 h1:isP8th4PJH2SrbkciKnylaND9xoTtfxv++NB+DF0l9g= +github.com/kataras/golog v0.1.8/go.mod h1:rGPAin4hYROfk1qT9wZP6VY2rsb4zzc37QpdPjdkqVw= +github.com/kataras/iris/v12 v12.2.0 h1:WzDY5nGuW/LgVaFS5BtTkW3crdSKJ/FEgWnxPnIVVLI= +github.com/kataras/iris/v12 v12.2.0/go.mod h1:BLzBpEunc41GbE68OUaQlqX4jzi791mx5HU04uPb90Y= +github.com/kataras/pio v0.0.11 h1:kqreJ5KOEXGMwHAWHDwIl+mjfNCPhAwZPa8gK7MKlyw= +github.com/kataras/pio v0.0.11/go.mod h1:38hH6SWH6m4DKSYmRhlrCJ5WItwWgCVrTNU62XZyUvI= +github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= +github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= +github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= +github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= +github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= +github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= +github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/labstack/echo/v4 v4.10.0 h1:5CiyngihEO4HXsz3vVsJn7f8xAlWwRr3aY6Ih280ZKA= +github.com/labstack/echo/v4 v4.10.0/go.mod h1:S/T/5fy/GigaXnHTkh0ZGe4LpkkQysvRjFMSUTkDRNQ= +github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= +github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= +github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= +github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/microcosm-cc/bluemonday v1.0.23 h1:SMZe2IGa0NuHvnVNAZ+6B38gsTbi5e4sViiWJyDDqFY= +github.com/microcosm-cc/bluemonday v1.0.23/go.mod h1:mN70sk7UkkF8TUr2IGBpNN0jAgStuPzlK76QuruE/z4= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/profile v0.1.1 h1:jhDmAqPyebOsVDOCICJoINoLb/AnLBaUw58nFzxWS2w= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E= +github.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8= +github.com/nats-io/nkeys v0.4.6 h1:IzVe95ru2CT6ta874rt9saQRkWfe2nFj1NtvYSLqMzY= +github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= +github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= +github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7 h1:cZC+usqsYgHtlBaGulVnZ1hfKAi8iWtujBnRLQE698c= +github.com/protolambda/bls12-381-util v0.0.0-20220416220906-d8552aa452c7/go.mod h1:IToEjHuttnUzwZI5KBSM/LOOW3qLbbrHOEfp3SbECGY= +github.com/sagikazarmark/crypt v0.17.0 h1:ZA/7pXyjkHoK4bW4mIdnCLvL8hd+Nrbiw7Dqk7D4qUk= +github.com/sagikazarmark/crypt v0.17.0/go.mod h1:SMtHTvdmsZMuY/bpZoqokSoChIrcJ/epOxZN58PbZDg= +github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= +github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/tdewolff/minify/v2 v2.12.4 h1:kejsHQMM17n6/gwdw53qsi6lg0TGddZADVyQOz1KMdE= +github.com/tdewolff/minify/v2 v2.12.4/go.mod h1:h+SRvSIX3kwgwTFOpSckvSxgax3uy8kZTSF1Ojrr3bk= +github.com/tdewolff/parse/v2 v2.6.4 h1:KCkDvNUMof10e3QExio9OPZJT8SbdKojLBumw8YZycQ= +github.com/tdewolff/parse/v2 v2.6.4/go.mod h1:woz0cgbLwFdtbjJu8PIKxhW05KplTFQkOdX78o+Jgrs= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= +github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/umbracle/gohashtree v0.0.2-alpha.0.20230207094856-5b775a815c10/go.mod h1:x/Pa0FF5Te9kdrlZKJK82YmAkvL8+f989USgz6Jiw7M= +github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= +github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.40.0 h1:CRq/00MfruPGFLTQKY8b+8SfdK60TxNztjRMnH0t1Yc= +github.com/valyala/fasthttp v1.40.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= +github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k= +go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= +go.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0= +go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U= +go.etcd.io/etcd/client/v2 v2.305.10 h1:MrmRktzv/XF8CvtQt+P6wLUlURaNpSDJHFZhe//2QE4= +go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA= +go.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao= +go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= +go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= +golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= +golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5 h1:ObuXPmIgI4ZMyQLIz48cJYgSyWdjUXc2SZAdyJMwEAU= +golang.org/x/perf v0.0.0-20230113213139-801c7ef9e5c5/go.mod h1:UBKtEnL8aqnd+0JHqZ+2qoMDwtuy6cYhhKNoHLBiTQc= +golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.153.0 h1:N1AwGhielyKFaUqH07/ZSIQR3uNPcV7NVw0vj+j4iR4= +google.golang.org/api v0.153.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= +google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f h1:ultW7fxlIvee4HYrtnaRPon9HpEgFk5zYpmfMgtKB5I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= diff --git a/smoketest/Cargo.lock b/smoketest/Cargo.lock index b8d924c190..3d39e0475d 100644 --- a/smoketest/Cargo.lock +++ b/smoketest/Cargo.lock @@ -43,7 +43,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "crypto-common", - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -63,7 +63,7 @@ version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ - "getrandom 0.2.12", + "getrandom", "once_cell", "version_check", ] @@ -75,7 +75,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", - "getrandom 0.2.12", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -252,7 +252,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.5", + "rand", ] [[package]] @@ -276,29 +276,12 @@ dependencies = [ "nodrop", ] -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "arrayvec" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - [[package]] name = "async-channel" version = "2.1.1" @@ -321,41 +304,20 @@ dependencies = [ "async-lock 3.3.0", "async-task", "concurrent-queue", - "fastrand 2.0.1", - "futures-lite 2.2.0", + "fastrand", + "futures-lite", "slab", ] [[package]] name = "async-fs" -version = "1.6.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +checksum = "bc19683171f287921f2405677dd2ed2549c3b3bda697a563ebc3a121ace2aba1" dependencies = [ - "async-lock 2.8.0", - "autocfg", + "async-lock 3.3.0", "blocking", - "futures-lite 1.13.0", -] - -[[package]] -name = "async-io" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" -dependencies = [ - "async-lock 2.8.0", - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-lite 1.13.0", - "log", - "parking", - "polling 2.8.0", - "rustix 0.37.27", - "slab", - "socket2 0.4.10", - "waker-fn", + "futures-lite", ] [[package]] @@ -368,9 +330,9 @@ dependencies = [ "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.2.0", + "futures-lite", "parking", - "polling 3.4.0", + "polling", "rustix 0.38.31", "slab", "tracing", @@ -399,30 +361,33 @@ dependencies = [ [[package]] name = "async-net" -version = "1.8.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0434b1ed18ce1cf5769b8ac540e33f01fa9471058b5e89da9e06f3c882a8c12f" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" dependencies = [ - "async-io 1.13.0", + "async-io", "blocking", - "futures-lite 1.13.0", + "futures-lite", ] [[package]] name = "async-process" -version = "1.8.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +checksum = "d999d925640d51b662b7b4e404224dd81de70f4aa4a199383c2c5e5b86885fa3" dependencies = [ - "async-io 1.13.0", - "async-lock 2.8.0", + "async-channel", + "async-io", + "async-lock 3.3.0", "async-signal", + "async-task", "blocking", "cfg-if", - "event-listener 3.1.0", - "futures-lite 1.13.0", + "event-listener 5.3.0", + "futures-lite", "rustix 0.38.31", - "windows-sys 0.48.0", + "tracing", + "windows-sys 0.52.0", ] [[package]] @@ -431,7 +396,7 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" dependencies = [ - "async-io 2.3.1", + "async-io", "async-lock 2.8.0", "atomic-waker", "cfg-if", @@ -457,7 +422,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -491,7 +456,7 @@ checksum = "823b8bb275161044e2ac7a25879cb3e2480cb403e3943022c7c769c599b756aa" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -539,6 +504,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9475866fec1451be56a3c2400fd081ff546538961565ccb5b7142cbd22bc7a51" + [[package]] name = "base64ct" version = "1.6.0" @@ -575,19 +546,33 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" dependencies = [ - "bitcoin_hashes", - "rand 0.8.5", - "rand_core 0.6.4", + "bitcoin_hashes 0.11.0", "serde", "unicode-normalization", ] +[[package]] +name = "bitcoin-internals" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" + [[package]] name = "bitcoin_hashes" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" +[[package]] +name = "bitcoin_hashes" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" +dependencies = [ + "bitcoin-internals", + "hex-conservative", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -642,25 +627,13 @@ dependencies = [ "constant_time_eq 0.3.0", ] -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array 0.12.4", -] - [[package]] name = "block-buffer" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -669,16 +642,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array 0.14.7", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", + "generic-array", ] [[package]] @@ -687,28 +651,16 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ - "async-channel 2.1.1", + "async-channel", "async-lock 3.3.0", "async-task", - "fastrand 2.0.1", + "fastrand", "futures-io", - "futures-lite 2.2.0", + "futures-lite", "piper", "tracing", ] -[[package]] -name = "bounded-collections" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca548b6163b872067dc5eb82fd130c56881435e30367d2073594a3d9744120dd" -dependencies = [ - "log", - "parity-scale-codec", - "scale-info", - "serde", -] - [[package]] name = "bounded-collections" version = "0.2.0" @@ -743,12 +695,6 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - [[package]] name = "byteorder" version = "1.5.0" @@ -871,7 +817,7 @@ dependencies = [ "hmac 0.12.1", "once_cell", "pbkdf2 0.12.2", - "rand 0.8.5", + "rand", "sha2 0.10.8", "thiserror", ] @@ -886,7 +832,7 @@ dependencies = [ "bech32", "bs58", "digest 0.10.7", - "generic-array 0.14.7", + "generic-array", "hex", "ripemd", "serde", @@ -896,6 +842,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "common-path" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2382f75942f4b3be3690fe4f86365e9c853c1587d6ee58212cebf6e2a9ccd101" + [[package]] name = "concurrent-queue" version = "2.4.0" @@ -1027,7 +979,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "generic-array 0.14.7", + "generic-array", "rand_core 0.6.4", "subtle", "zeroize", @@ -1039,7 +991,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array 0.14.7", + "generic-array", "rand_core 0.6.4", "typenum", ] @@ -1050,17 +1002,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ - "generic-array 0.14.7", - "subtle", -] - -[[package]] -name = "crypto-mac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25fab6889090c8133f3deb8f73ba3c65a7f456f66436fc012a1b1e272b1e103e" -dependencies = [ - "generic-array 0.14.7", + "generic-array", "subtle", ] @@ -1073,19 +1015,6 @@ dependencies = [ "cipher", ] -[[package]] -name = "curve25519-dalek" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b85542f99a2dfa2a1b8e192662741c9859a846b296bef1c92ef9b58b5a216" -dependencies = [ - "byteorder", - "digest 0.8.1", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - [[package]] name = "curve25519-dalek" version = "3.2.0" @@ -1124,7 +1053,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -1139,12 +1068,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.5" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc5d6b04b3fd0ba9926f945895de7d806260a2d7431ba82e7edaecb043c4c6b8" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" dependencies = [ - "darling_core 0.20.5", - "darling_macro 0.20.5", + "darling_core 0.20.8", + "darling_macro 0.20.8", ] [[package]] @@ -1163,16 +1092,16 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.5" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e48a959bcd5c761246f5d090ebc2fbf7b9cd527a492b07a67510c108f1e7e3" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -1188,13 +1117,13 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.5" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1545d67a2149e1d93b7e5c7752dce5a7426eb5d1357ddcfd89336b94444f77" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ - "darling_core 0.20.5", + "darling_core 0.20.8", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -1233,6 +1162,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive-syn-parse" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.58", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -1246,22 +1186,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - [[package]] name = "digest" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -1276,6 +1207,33 @@ dependencies = [ "subtle", ] +[[package]] +name = "docify" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2f138ad521dc4a2ced1a4576148a6a610b4c5923933b062a263130a6802ce" +dependencies = [ + "docify_macros", +] + +[[package]] +name = "docify_macros" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a081e51fb188742f5a7a1164ad752121abcb22874b21e2c3b0dd040c515fdad" +dependencies = [ + "common-path", + "derive-syn-parse", + "once_cell", + "proc-macro2", + "quote", + "regex", + "syn 2.0.58", + "termcolor", + "toml", + "walkdir", +] + [[package]] name = "downcast-rs" version = "1.2.0" @@ -1325,6 +1283,7 @@ dependencies = [ "digest 0.10.7", "elliptic-curve", "rfc6979", + "serdect", "signature", "spki", ] @@ -1384,9 +1343,9 @@ dependencies = [ [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "elliptic-curve" @@ -1398,11 +1357,12 @@ dependencies = [ "crypto-bigint", "digest 0.10.7", "ff", - "generic-array 0.14.7", + "generic-array", "group", "pkcs8", "rand_core 0.6.4", "sec1", + "serdect", "subtle", "zeroize", ] @@ -1427,7 +1387,7 @@ dependencies = [ "hex", "k256", "log", - "rand 0.8.5", + "rand", "rlp", "serde", "sha3", @@ -1468,7 +1428,7 @@ dependencies = [ "hex", "hmac 0.12.1", "pbkdf2 0.11.0", - "rand 0.8.5", + "rand", "scrypt", "serde", "serde_json", @@ -1584,7 +1544,7 @@ dependencies = [ "regex", "serde", "serde_json", - "syn 2.0.52", + "syn 2.0.58", "toml", "walkdir", ] @@ -1601,7 +1561,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -1616,17 +1576,17 @@ dependencies = [ "const-hex", "elliptic-curve", "ethabi", - "generic-array 0.14.7", + "generic-array", "k256", "num_enum", "once_cell", "open-fastrlp", - "rand 0.8.5", + "rand", "rlp", "serde", "serde_json", "strum", - "syn 2.0.52", + "syn 2.0.58", "tempfile", "thiserror", "tiny-keccak", @@ -1707,7 +1667,7 @@ dependencies = [ "elliptic-curve", "eth-keystore", "ethers-core", - "rand 0.8.5", + "rand", "sha2 0.10.8", "thiserror", "tracing", @@ -1721,9 +1681,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "3.1.0" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" dependencies = [ "concurrent-queue", "parking", @@ -1732,9 +1692,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "4.0.3" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" dependencies = [ "concurrent-queue", "parking", @@ -1751,6 +1711,20 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "expander" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00e83c02035136f1592a47964ea60c05a50e4ed8b5892cfac197063850898d4d" +dependencies = [ + "blake2", + "fs-err", + "prettier-please", + "proc-macro2", + "quote", + "syn 2.0.58", +] + [[package]] name = "eyre" version = "0.6.12" @@ -1761,27 +1735,12 @@ dependencies = [ "once_cell", ] -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - [[package]] name = "fallible-iterator" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - [[package]] name = "fastrand" version = "2.0.1" @@ -1811,7 +1770,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.5", + "rand", "rustc-hex", "static_assertions", ] @@ -1854,6 +1813,15 @@ dependencies = [ "serde", ] +[[package]] +name = "fs-err" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a41f105fe1d5b6b34b2055e3dc59bb79b46b48b2040b9e6c7b4b5de097aa41" +dependencies = [ + "autocfg", +] + [[package]] name = "funty" version = "2.0.0" @@ -1909,28 +1877,13 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - [[package]] name = "futures-lite" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" dependencies = [ - "fastrand 2.0.1", + "fastrand", "futures-core", "futures-io", "parking", @@ -1955,7 +1908,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -2007,15 +1960,6 @@ dependencies = [ "byteorder", ] -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -2027,17 +1971,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.12" @@ -2046,7 +1979,7 @@ checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", ] [[package]] @@ -2055,7 +1988,7 @@ version = "0.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ea1015b5a70616b688dc230cfe50c8af89d972cb132d5a622814d29773b10b9" dependencies = [ - "rand 0.8.5", + "rand", "rand_core 0.6.4", ] @@ -2189,6 +2122,12 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hex-conservative" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ed443af458ccb6d81c1e7e661545f94d3176752fb1df2f543b902a1e0f51e2" + [[package]] name = "hex-literal" version = "0.4.1" @@ -2201,17 +2140,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", -] - -[[package]] -name = "hmac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" -dependencies = [ - "crypto-mac 0.11.0", + "crypto-mac", "digest 0.9.0", ] @@ -2231,7 +2160,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" dependencies = [ "digest 0.9.0", - "generic-array 0.14.7", + "generic-array", "hmac 0.8.1", ] @@ -2286,7 +2215,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.5", + "socket2", "tokio", "tower-service", "tracing", @@ -2303,10 +2232,10 @@ dependencies = [ "http", "hyper", "log", - "rustls", - "rustls-native-certs", + "rustls 0.21.10", + "rustls-native-certs 0.6.3", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", ] [[package]] @@ -2425,7 +2354,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "generic-array 0.14.7", + "generic-array", ] [[package]] @@ -2474,9 +2403,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] @@ -2498,9 +2427,9 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.20.3" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "affdc52f7596ccb2d7645231fc6163bb314630c989b64998f3699a28b4d5d4dc" +checksum = "c4b0e68d9af1f066c06d6e2397583795b912d78537d7d907c561e82c13d69fa1" dependencies = [ "jsonrpsee-client-transport", "jsonrpsee-core", @@ -2510,19 +2439,20 @@ dependencies = [ [[package]] name = "jsonrpsee-client-transport" -version = "0.20.3" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b005c793122d03217da09af68ba9383363caa950b90d3436106df8cabce935" +checksum = "92f254f56af1ae84815b9b1325094743dcf05b92abb5e94da2e81a35cff0cada" dependencies = [ "futures-util", "http", "jsonrpsee-core", "pin-project", - "rustls-native-certs", + "rustls-native-certs 0.7.0", + "rustls-pki-types", "soketto", "thiserror", "tokio", - "tokio-rustls", + "tokio-rustls 0.25.0", "tokio-util", "tracing", "url", @@ -2530,31 +2460,32 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.20.3" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2327ba8df2fdbd5e897e2b5ed25ce7f299d345b9736b6828814c3dbd1fd47b" +checksum = "274d68152c24aa78977243bb56f28d7946e6aa309945b37d33174a3f92d89a3a" dependencies = [ "anyhow", - "async-lock 2.8.0", "async-trait", "beef", "futures-timer", "futures-util", "hyper", "jsonrpsee-types", + "pin-project", "rustc-hash", "serde", "serde_json", "thiserror", "tokio", + "tokio-stream", "tracing", ] [[package]] name = "jsonrpsee-http-client" -version = "0.20.3" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f80c17f62c7653ce767e3d7288b793dfec920f97067ceb189ebdd3570f2bc20" +checksum = "ac13bc1e44cd00448a5ff485824a128629c945f02077804cb659c07a0ba41395" dependencies = [ "async-trait", "hyper", @@ -2572,16 +2503,15 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.20.3" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be0be325642e850ed0bdff426674d2e66b2b7117c9be23a7caef68a2902b7d9" +checksum = "3dc828e537868d6b12bbb07ec20324909a22ced6efca0057c825c3e1126b2c6d" dependencies = [ "anyhow", "beef", "serde", "serde_json", "thiserror", - "tracing", ] [[package]] @@ -2608,6 +2538,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", + "serdect", "sha2 0.10.8", "signature", ] @@ -2652,7 +2583,7 @@ dependencies = [ "libsecp256k1-core", "libsecp256k1-gen-ecmult", "libsecp256k1-gen-genmult", - "rand 0.8.5", + "rand", "serde", "sha2 0.9.9", "typenum", @@ -2693,12 +2624,6 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - [[package]] name = "linux-raw-sys" version = "0.4.13" @@ -2717,9 +2642,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.20" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "lru" @@ -2781,18 +2706,6 @@ dependencies = [ "hash-db", ] -[[package]] -name = "merlin" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e261cf0f8b3c42ded9f7d2bb59dea03aa52bc8a1cbc7482f9fc3fd1229d3b42" -dependencies = [ - "byteorder", - "keccak", - "rand_core 0.5.1", - "zeroize", -] - [[package]] name = "merlin" version = "3.0.0" @@ -2833,7 +2746,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", "windows-sys 0.48.0", ] @@ -2952,7 +2865,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -2982,12 +2895,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - [[package]] name = "opaque-debug" version = "0.3.0" @@ -3025,6 +2932,19 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "parity-bip39" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9" +dependencies = [ + "bitcoin_hashes 0.13.0", + "rand", + "rand_core 0.6.4", + "serde", + "unicode-normalization", +] + [[package]] name = "parity-scale-codec" version = "3.6.9" @@ -3082,20 +3002,22 @@ dependencies = [ ] [[package]] -name = "paste" -version = "1.0.14" +name = "password-hash" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "pbkdf2" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95f5254224e617595d2cc3cc73ff0a5eaf2637519e25f03388154e9378b6ffa" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" dependencies = [ - "crypto-mac 0.11.0", + "base64ct", + "rand_core 0.6.4", + "subtle", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "pbkdf2" version = "0.11.0" @@ -3113,6 +3035,7 @@ checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", "hmac 0.12.1", + "password-hash", ] [[package]] @@ -3157,7 +3080,7 @@ checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -3179,7 +3102,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" dependencies = [ "atomic-waker", - "fastrand 2.0.1", + "fastrand", "futures-io", ] @@ -3200,19 +3123,77 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" [[package]] -name = "polling" -version = "2.8.0" +name = "polkavm-common" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c99f7eee94e7be43ba37eef65ad0ee8cbaf89b7c00001c3f6d2be985cb1817" + +[[package]] +name = "polkavm-common" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +checksum = "1d9428a5cfcc85c5d7b9fc4b6a18c4b802d0173d768182a51cc7751640f08b92" + +[[package]] +name = "polkavm-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79fa916f7962348bd1bb1a65a83401675e6fc86c51a0fdbcf92a3108e58e6125" dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", + "polkavm-derive-impl-macro 0.8.0", +] + +[[package]] +name = "polkavm-derive" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8c4bea6f3e11cd89bb18bcdddac10bd9a24015399bd1c485ad68a985a19606" +dependencies = [ + "polkavm-derive-impl-macro 0.9.0", +] + +[[package]] +name = "polkavm-derive-impl" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c10b2654a8a10a83c260bfb93e97b262cf0017494ab94a65d389e0eda6de6c9c" +dependencies = [ + "polkavm-common 0.8.0", + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "polkavm-derive-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c4fdfc49717fb9a196e74a5d28e0bc764eb394a2c803eb11133a31ac996c60c" +dependencies = [ + "polkavm-common 0.9.0", + "proc-macro2", + "quote", + "syn 2.0.58", +] + +[[package]] +name = "polkavm-derive-impl-macro" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e85319a0d5129dc9f021c62607e0804f5fb777a05cdda44d750ac0732def66" +dependencies = [ + "polkavm-derive-impl 0.8.0", + "syn 2.0.58", +] + +[[package]] +name = "polkavm-derive-impl-macro" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ba81f7b5faac81e528eb6158a6f3c9e0bb1008e0ffa19653bc8dea925ecb429" +dependencies = [ + "polkavm-derive-impl 0.9.0", + "syn 2.0.58", ] [[package]] @@ -3236,7 +3217,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" dependencies = [ "cpufeatures", - "opaque-debug 0.3.0", + "opaque-debug", "universal-hash", ] @@ -3252,6 +3233,16 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "prettier-please" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22020dfcf177fcc7bf5deaf7440af371400c67c0de14c399938d8ed4fb4645d3" +dependencies = [ + "proc-macro2", + "syn 2.0.58", +] + [[package]] name = "prettyplease" version = "0.2.16" @@ -3259,7 +3250,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -3330,9 +3321,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -3346,8 +3337,8 @@ dependencies = [ "bitflags 2.4.2", "lazy_static", "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "rand_xorshift", "regex-syntax 0.8.2", "unarray", @@ -3377,19 +3368,6 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - [[package]] name = "rand" version = "0.8.5" @@ -3397,20 +3375,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha 0.3.1", + "rand_chacha", "rand_core 0.6.4", ] -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - [[package]] name = "rand_chacha" version = "0.3.1" @@ -3426,9 +3394,6 @@ name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] [[package]] name = "rand_core" @@ -3436,16 +3401,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.12", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", + "getrandom", ] [[package]] @@ -3483,7 +3439,7 @@ checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -3598,7 +3554,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", - "getrandom 0.2.12", + "getrandom", "libc", "spin 0.9.8", "untrusted 0.9.0", @@ -3677,20 +3633,6 @@ dependencies = [ "windows-sys 0.45.0", ] -[[package]] -name = "rustix" -version = "0.37.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - [[package]] name = "rustix" version = "0.38.31" @@ -3712,10 +3654,24 @@ checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", "ring 0.17.7", - "rustls-webpki", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c" +dependencies = [ + "log", + "ring 0.17.7", + "rustls-pki-types", + "rustls-webpki 0.102.2", + "subtle", + "zeroize", +] + [[package]] name = "rustls-native-certs" version = "0.6.3" @@ -3723,7 +3679,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" dependencies = [ "openssl-probe", - "rustls-pemfile", + "rustls-pemfile 1.0.4", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +dependencies = [ + "openssl-probe", + "rustls-pemfile 2.1.2", + "rustls-pki-types", "schannel", "security-framework", ] @@ -3737,6 +3706,22 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.0", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -3747,6 +3732,17 @@ dependencies = [ "untrusted 0.9.0", ] +[[package]] +name = "rustls-webpki" +version = "0.102.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +dependencies = [ + "ring 0.17.7", + "rustls-pki-types", + "untrusted 0.9.0", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -3790,38 +3786,38 @@ dependencies = [ [[package]] name = "scale-bits" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "036575c29af9b6e4866ffb7fa055dbf623fe7a9cc159b33786de6013a6969d89" +checksum = "662d10dcd57b1c2a3c41c9cf68f71fb09747ada1ea932ad961aca7e2ca28315f" dependencies = [ "parity-scale-codec", "scale-info", + "scale-type-resolver", "serde", ] [[package]] name = "scale-decode" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7caaf753f8ed1ab4752c6afb20174f03598c664724e0e32628e161c21000ff76" +checksum = "afc79ba56a1c742f5aeeed1f1801f3edf51f7e818f0a54582cac6f131364ea7b" dependencies = [ "derive_more", "parity-scale-codec", "primitive-types", "scale-bits", "scale-decode-derive", - "scale-info", + "scale-type-resolver", "smallvec", ] [[package]] name = "scale-decode-derive" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3475108a1b62c7efd1b5c65974f30109a598b2f45f23c9ae030acb9686966db" +checksum = "5398fdb3c7bea3cb419bac4983aadacae93fe1a7b5f693f4ebd98c3821aad7a5" dependencies = [ "darling 0.14.4", - "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -3829,24 +3825,24 @@ dependencies = [ [[package]] name = "scale-encode" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d70cb4b29360105483fac1ed567ff95d65224a14dd275b6303ed0a654c78de5" +checksum = "628800925a33794fb5387781b883b5e14d130fece9af5a63613867b8de07c5c7" dependencies = [ "derive_more", "parity-scale-codec", "primitive-types", "scale-bits", "scale-encode-derive", - "scale-info", + "scale-type-resolver", "smallvec", ] [[package]] name = "scale-encode-derive" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "995491f110efdc6bea96d6a746140e32bfceb4ea47510750a5467295a4707a25" +checksum = "7a304e1af7cdfbe7a24e08b012721456cc8cecdedadc14b3d10513eada63233c" dependencies = [ "darling 0.14.4", "proc-macro-crate 1.3.1", @@ -3857,9 +3853,9 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.10.0" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +checksum = "7c453e59a955f81fb62ee5d596b450383d699f152d350e9d23a0db2adb78e4c0" dependencies = [ "bitvec", "cfg-if", @@ -3871,9 +3867,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.10.0" +version = "2.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +checksum = "18cf6c6447f813ef19eb450e985bcce6705f9ce7660db221b59093d15c79c4b7" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -3881,11 +3877,34 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "scale-type-resolver" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10b800069bfd43374e0f96f653e0d46882a2cb16d6d961ac43bea80f26c76843" +dependencies = [ + "scale-info", + "smallvec", +] + +[[package]] +name = "scale-typegen" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d470fa75e71b12b3244a4113adc4bc49891f3daba2054703cacd06256066397e" +dependencies = [ + "proc-macro2", + "quote", + "scale-info", + "syn 2.0.58", + "thiserror", +] + [[package]] name = "scale-value" -version = "0.13.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58223c7691bf0bd46b43c9aea6f0472d1067f378d574180232358d7c6e0a8089" +checksum = "c07ccfee963104335c971aaf8b7b0e749be8569116322df23f1f75c4ca9e4a28" dependencies = [ "base58", "blake2", @@ -3897,6 +3916,7 @@ dependencies = [ "scale-decode", "scale-encode", "scale-info", + "scale-type-resolver", "serde", "yap", ] @@ -3921,24 +3941,6 @@ dependencies = [ "hashbrown 0.13.2", ] -[[package]] -name = "schnorrkel" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "021b403afe70d81eea68f6ea12f6b3c9588e5d536a94c3bf80f15e7faa267862" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "curve25519-dalek 2.1.3", - "getrandom 0.1.16", - "merlin 2.0.1", - "rand 0.7.3", - "rand_core 0.5.1", - "sha2 0.8.2", - "subtle", - "zeroize", -] - [[package]] name = "schnorrkel" version = "0.11.4" @@ -3950,7 +3952,7 @@ dependencies = [ "arrayvec 0.7.4", "curve25519-dalek 4.1.1", "getrandom_or_panic", - "merlin 3.0.0", + "merlin", "rand_core 0.6.4", "serde_bytes", "sha2 0.10.8", @@ -3994,37 +3996,20 @@ checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", - "generic-array 0.14.7", + "generic-array", "pkcs8", + "serdect", "subtle", "zeroize", ] -[[package]] -name = "secp256k1" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1629c9c557ef9b293568b338dddfc8208c98a18c59d722a9d53f859d9c9b62" -dependencies = [ - "secp256k1-sys 0.6.1", -] - [[package]] name = "secp256k1" version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" dependencies = [ - "secp256k1-sys 0.9.2", -] - -[[package]] -name = "secp256k1-sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83080e2c2fc1006e625be82e5d1eb6a43b7fd9578b617fcc55814daf286bba4b" -dependencies = [ - "cc", + "secp256k1-sys", ] [[package]] @@ -4115,14 +4100,14 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] name = "serde_json" -version = "1.0.113" +version = "1.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" +checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" dependencies = [ "itoa", "ryu", @@ -4150,6 +4135,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "sha-1" version = "0.9.8" @@ -4160,7 +4155,7 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.9.0", - "opaque-debug 0.3.0", + "opaque-debug", ] [[package]] @@ -4174,18 +4169,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", -] - [[package]] name = "sha2" version = "0.9.9" @@ -4196,7 +4179,7 @@ dependencies = [ "cfg-if", "cpufeatures", "digest 0.9.0", - "opaque-debug 0.3.0", + "opaque-debug", ] [[package]] @@ -4248,6 +4231,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simple-mermaid" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "620a1d43d70e142b1d46a929af51d44f383db9c7a2ec122de2cd992ccfcf3c18" + [[package]] name = "simple_asn1" version = "0.6.2" @@ -4283,26 +4272,26 @@ checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "smol" -version = "1.3.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13f2b548cd8447f8de0fdf1c592929f70f4fc7039a05e47404b0d096ec6987a1" +checksum = "e635339259e51ef85ac7aa29a1cd991b957047507288697a690e80ab97d07cad" dependencies = [ - "async-channel 1.9.0", + "async-channel", "async-executor", "async-fs", - "async-io 1.13.0", - "async-lock 2.8.0", + "async-io", + "async-lock 3.3.0", "async-net", "async-process", "blocking", - "futures-lite 1.13.0", + "futures-lite", ] [[package]] name = "smoldot" -version = "0.14.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca99148e026936bbc444c3708748207033968e4ef1c33bfc885660ae4d44d21" +checksum = "e6d1eaa97d77be4d026a1e7ffad1bb3b78448763b357ea6f8188d3e6f736a9b9" dependencies = [ "arrayvec 0.7.4", "async-lock 3.3.0", @@ -4316,17 +4305,17 @@ dependencies = [ "derive_more", "ed25519-zebra 4.0.3", "either", - "event-listener 3.1.0", + "event-listener 4.0.3", "fnv", - "futures-lite 2.2.0", + "futures-lite", "futures-util", "hashbrown 0.14.3", "hex", "hmac 0.12.1", - "itertools 0.11.0", + "itertools 0.12.1", "libm", "libsecp256k1", - "merlin 3.0.0", + "merlin", "no-std-net", "nom", "num-bigint", @@ -4335,10 +4324,10 @@ dependencies = [ "pbkdf2 0.12.2", "pin-project", "poly1305", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "ruzstd", - "schnorrkel 0.11.4", + "schnorrkel", "serde", "serde_json", "sha2 0.10.8", @@ -4355,31 +4344,31 @@ dependencies = [ [[package]] name = "smoldot-light" -version = "0.12.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e6f1898682b618b81570047b9d870b3faaff6ae1891b468eddd94d7f903c2fe" +checksum = "5496f2d116b7019a526b1039ec2247dd172b8670633b1a64a614c9ea12c9d8c7" dependencies = [ - "async-channel 2.1.1", + "async-channel", "async-lock 3.3.0", "base64 0.21.7", "blake2-rfc", "derive_more", "either", - "event-listener 3.1.0", + "event-listener 4.0.3", "fnv", "futures-channel", - "futures-lite 2.2.0", + "futures-lite", "futures-util", "hashbrown 0.14.3", "hex", - "itertools 0.11.0", + "itertools 0.12.1", "log", "lru", "no-std-net", "parking_lot", "pin-project", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "serde", "serde_json", "siphasher", @@ -4409,16 +4398,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "socket2" version = "0.5.5" @@ -4440,63 +4419,63 @@ dependencies = [ "futures", "httparse", "log", - "rand 0.8.5", + "rand", "sha-1", ] [[package]] name = "sp-application-crypto" -version = "28.0.0" +version = "33.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23030de8eae0272c705cf3e2ce0523a64708a6b53aa23f3cf9053ca63abd08d7" +checksum = "13ca6121c22c8bd3d1dce1f05c479101fd0d7b159bef2a3e8c834138d839c75c" dependencies = [ "parity-scale-codec", "scale-info", "serde", "sp-core", "sp-io", - "sp-std 12.0.0", + "sp-std 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sp-arithmetic" -version = "21.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cf6e5c0c7c2e7be3a4a10af5316d2d40182915509a70f632a66c238a05c37b" +version = "23.0.0" dependencies = [ + "docify", "integer-sqrt", "num-traits", "parity-scale-codec", "scale-info", "serde", - "sp-std 12.0.0", + "sp-std 14.0.0", "static_assertions", ] [[package]] name = "sp-arithmetic" -version = "23.0.0" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "910c07fa263b20bf7271fdd4adcb5d3217dfdac14270592e0780223542e7e114" dependencies = [ "integer-sqrt", "num-traits", "parity-scale-codec", "scale-info", "serde", - "sp-std 14.0.0", + "sp-std 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "static_assertions", ] [[package]] name = "sp-core" -version = "26.0.0" +version = "31.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0db34a19be2efa0398a9506a365392d93a85220856d55e0eb78165ad2e1bedc" +checksum = "26d7a0fd8f16dcc3761198fc83be12872f823b37b749bc72a3a6a1f702509366" dependencies = [ "array-bytes", - "bip39", "bitflags 1.3.2", "blake2", - "bounded-collections 0.1.9", + "bounded-collections", "bs58", "dyn-clonable", "ed25519-zebra 3.1.0", @@ -4505,26 +4484,26 @@ dependencies = [ "hash256-std-hasher", "impl-serde", "itertools 0.10.5", - "lazy_static", + "k256", "libsecp256k1", "log", - "merlin 2.0.1", + "merlin", + "parity-bip39", "parity-scale-codec", "parking_lot", "paste", "primitive-types", - "rand 0.8.5", - "regex", + "rand", "scale-info", - "schnorrkel 0.9.1", - "secp256k1 0.24.3", + "schnorrkel", + "secp256k1", "secrecy", "serde", - "sp-core-hashing", - "sp-debug-derive 12.0.0", + "sp-crypto-hashing", + "sp-debug-derive 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-externalities", "sp-runtime-interface", - "sp-std 12.0.0", + "sp-std 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-storage", "ss58-registry", "substrate-bip39", @@ -4535,10 +4514,10 @@ dependencies = [ ] [[package]] -name = "sp-core-hashing" -version = "13.0.0" +name = "sp-crypto-hashing" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb8524f01591ee58b46cd83c9dbc0fcffd2fd730dabec4f59326cd58a00f17e2" +checksum = "bc9927a7f81334ed5b8a98a4a978c81324d12bd9713ec76b5c68fd410174c5eb" dependencies = [ "blake2b_simd", "byteorder", @@ -4550,55 +4529,57 @@ dependencies = [ [[package]] name = "sp-debug-derive" -version = "12.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50535e1a5708d3ba5c1195b59ebefac61cc8679c2c24716b87a86e8b7ed2e4a1" +version = "14.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] name = "sp-debug-derive" version = "14.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d09fa0a5f7299fb81ee25ae3853d26200f7a348148aed6de76be905c007dbe" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] name = "sp-externalities" -version = "0.23.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884d05160bc89d0943d1c9fb8006c3d44b80f37f8af607aeff8d4d9cc82e279a" +checksum = "a1d6a4572eadd4a63cff92509a210bf425501a0c5e76574b30a366ac77653787" dependencies = [ "environmental", "parity-scale-codec", - "sp-std 12.0.0", + "sp-std 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-storage", ] [[package]] name = "sp-io" -version = "28.0.0" +version = "33.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301c0ce94f80b324465a6f6173183aa07b26bd71d67f94a44de1fd11dea4a7cb" +checksum = "3e09bba780b55bd9e67979cd8f654a31e4a6cf45426ff371394a65953d2177f2" dependencies = [ "bytes", "ed25519-dalek", "libsecp256k1", "log", "parity-scale-codec", + "polkavm-derive 0.9.1", "rustversion", - "secp256k1 0.24.3", + "secp256k1", "sp-core", + "sp-crypto-hashing", "sp-externalities", "sp-keystore", "sp-runtime-interface", "sp-state-machine", - "sp-std 12.0.0", + "sp-std 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-tracing", "sp-trie", "tracing", @@ -4607,22 +4588,21 @@ dependencies = [ [[package]] name = "sp-keystore" -version = "0.32.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db18ab01b2684856904c973d2be7dbf9ab3607cf706a7bd6648812662e5e7c5" +checksum = "bdbab8b61bd61d5f8625a0c75753b5d5a23be55d3445419acd42caf59cf6236b" dependencies = [ "parity-scale-codec", "parking_lot", "sp-core", "sp-externalities", - "thiserror", ] [[package]] name = "sp-panic-handler" -version = "12.0.0" +version = "13.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00e40857ed3e0187f145b037c733545c5633859f1bd1d1b09deb52805fa696a" +checksum = "d8f5a17a0a11de029a8b811cb6e8b32ce7e02183cc04a3e965c383246798c416" dependencies = [ "backtrace", "lazy_static", @@ -4631,40 +4611,43 @@ dependencies = [ [[package]] name = "sp-runtime" -version = "29.0.0" +version = "34.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "082bae4a164b8b629ce9cee79ff3c6b20e66d11d8ef37398796567d616325da4" +checksum = "ec3cb126971e7db2f0fcf8053dce740684c438c7180cfca1959598230f342c58" dependencies = [ + "docify", "either", "hash256-std-hasher", "impl-trait-for-tuples", "log", "parity-scale-codec", "paste", - "rand 0.8.5", + "rand", "scale-info", "serde", + "simple-mermaid", "sp-application-crypto", - "sp-arithmetic 21.0.0", + "sp-arithmetic 25.0.0", "sp-core", "sp-io", - "sp-std 12.0.0", - "sp-weights 25.0.0", + "sp-std 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-weights 30.0.0", ] [[package]] name = "sp-runtime-interface" -version = "22.0.0" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695bba5d981a6fd3131b098d65f620601bd822501612bfb65897d4bb660762b1" +checksum = "e48a675ea4858333d4d755899ed5ed780174aa34fec15953428d516af5452295" dependencies = [ "bytes", "impl-trait-for-tuples", "parity-scale-codec", + "polkavm-derive 0.8.0", "primitive-types", "sp-externalities", "sp-runtime-interface-proc-macro", - "sp-std 12.0.0", + "sp-std 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-storage", "sp-tracing", "sp-wasm-interface", @@ -4673,33 +4656,34 @@ dependencies = [ [[package]] name = "sp-runtime-interface-proc-macro" -version = "15.0.0" +version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2afcbd1bd18d323371111b66b7ac2870bdc1c86c3d7b0dae67b112ca52b4d8" +checksum = "0195f32c628fee3ce1dfbbf2e7e52a30ea85f3589da9fe62a8b816d70fc06294" dependencies = [ "Inflector", - "proc-macro-crate 1.3.1", + "expander", + "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] name = "sp-state-machine" -version = "0.33.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7c6680d9342c22c10d8272ebf9f0339b0e439b3e67b68f5627f9dfc6926a07" +checksum = "1eae0eac8034ba14437e772366336f579398a46d101de13dbb781ab1e35e67c5" dependencies = [ "hash-db", "log", "parity-scale-codec", "parking_lot", - "rand 0.8.5", + "rand", "smallvec", "sp-core", "sp-externalities", "sp-panic-handler", - "sp-std 12.0.0", + "sp-std 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "sp-trie", "thiserror", "tracing", @@ -4708,36 +4692,36 @@ dependencies = [ [[package]] name = "sp-std" -version = "12.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c78c5a66682568cc7b153603c5d01a2cc8f5c221c7b1e921517a0eef18ae05" +version = "14.0.0" [[package]] name = "sp-std" version = "14.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f8ee986414b0a9ad741776762f4083cd3a5128449b982a3919c4df36874834" [[package]] name = "sp-storage" -version = "17.0.0" +version = "20.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016f20812cc51bd479cc88d048c35d44cd3adde4accdb159d49d6050f2953595" +checksum = "8dba5791cb3978e95daf99dad919ecb3ec35565604e88cd38d805d9d4981e8bd" dependencies = [ "impl-serde", "parity-scale-codec", "ref-cast", "serde", - "sp-debug-derive 12.0.0", - "sp-std 12.0.0", + "sp-debug-derive 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-std 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "sp-tracing" -version = "14.0.0" +version = "16.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d727cb5265641ffbb7d4e42c18b63e29f6cfdbd240aae3bcf093c3d6eb29a19" +checksum = "0351810b9d074df71c4514c5228ed05c250607cba131c1c9d1526760ab69c05c" dependencies = [ "parity-scale-codec", - "sp-std 12.0.0", + "sp-std 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "tracing", "tracing-core", "tracing-subscriber", @@ -4745,23 +4729,23 @@ dependencies = [ [[package]] name = "sp-trie" -version = "27.0.0" +version = "32.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c4bf89a5bd74f696cd1f23d83bb6abe6bd0abad1f3c70d4b0d7ebec4098cfe" +checksum = "f1aa91ad26c62b93d73e65f9ce7ebd04459c4bad086599348846a81988d6faa4" dependencies = [ "ahash 0.8.7", "hash-db", - "hashbrown 0.13.2", "lazy_static", "memory-db", "nohash-hasher", "parity-scale-codec", "parking_lot", - "rand 0.8.5", + "rand", "scale-info", "schnellru", "sp-core", - "sp-std 12.0.0", + "sp-externalities", + "sp-std 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror", "tracing", "trie-db", @@ -4770,46 +4754,45 @@ dependencies = [ [[package]] name = "sp-wasm-interface" -version = "18.0.0" +version = "20.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d85813d46a22484cdf5e5afddbbe85442dd1b4d84d67a8c7792f92f9f93607" +checksum = "9ef97172c42eb4c6c26506f325f48463e9bc29b2034a587f1b9e48c751229bee" dependencies = [ "anyhow", "impl-trait-for-tuples", "log", "parity-scale-codec", - "sp-std 12.0.0", + "sp-std 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasmtime", ] [[package]] name = "sp-weights" -version = "25.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1689f9594c2c4d09ede3d8a991a9eb900654e424fb00b62f2b370170af347acd" +version = "27.0.0" dependencies = [ + "bounded-collections", "parity-scale-codec", "scale-info", "serde", "smallvec", - "sp-arithmetic 21.0.0", - "sp-core", - "sp-debug-derive 12.0.0", - "sp-std 12.0.0", + "sp-arithmetic 23.0.0", + "sp-debug-derive 14.0.0", ] [[package]] name = "sp-weights" -version = "27.0.0" +version = "30.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9af6c661fe3066b29f9e1d258000f402ff5cc2529a9191972d214e5871d0ba87" dependencies = [ - "bounded-collections 0.2.0", + "bounded-collections", "parity-scale-codec", "scale-info", "serde", "smallvec", - "sp-arithmetic 23.0.0", - "sp-debug-derive 14.0.0", - "sp-std 14.0.0", + "sp-arithmetic 25.0.0", + "sp-debug-derive 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sp-std 14.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4860,7 +4843,7 @@ name = "staging-xcm" version = "7.0.0" dependencies = [ "array-bytes", - "bounded-collections 0.2.0", + "bounded-collections", "derivative", "environmental", "impl-trait-for-tuples", @@ -4903,19 +4886,19 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] name = "substrate-bip39" -version = "0.4.5" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e620c7098893ba667438b47169c00aacdd9e7c10e042250ce2b60b087ec97328" +checksum = "a2b564c293e6194e8b222e52436bcb99f60de72043c7f845cf6c4406db4df121" dependencies = [ - "hmac 0.11.0", - "pbkdf2 0.8.0", - "schnorrkel 0.9.1", - "sha2 0.9.9", + "hmac 0.12.1", + "pbkdf2 0.12.2", + "schnorrkel", + "sha2 0.10.8", "zeroize", ] @@ -4927,8 +4910,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "subxt" -version = "0.33.0" -source = "git+https://github.com/paritytech/subxt.git?tag=v0.33.0#f06a95d687605bf826db9d83b2932a73a57b169f" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd68bef23f4de5e513ab4c29af69053e232b098f9c87ab552d7ea153b4a1fbc5" dependencies = [ "async-trait", "base58", @@ -4939,6 +4923,7 @@ dependencies = [ "futures", "hex", "impl-serde", + "instant", "jsonrpsee", "parity-scale-codec", "primitive-types", @@ -4950,19 +4935,22 @@ dependencies = [ "serde", "serde_json", "sp-core", - "sp-core-hashing", + "sp-crypto-hashing", "sp-runtime", "subxt-lightclient", "subxt-macro", "subxt-metadata", "thiserror", + "tokio-util", "tracing", + "url", ] [[package]] name = "subxt-codegen" -version = "0.33.0" -source = "git+https://github.com/paritytech/subxt.git?tag=v0.33.0#f06a95d687605bf826db9d83b2932a73a57b169f" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d9e2b256b71d31a2629e44eb9cbfd944eb7d577c9e0c8e9802cc3c3943af2d9" dependencies = [ "frame-metadata 16.0.0", "heck", @@ -4972,16 +4960,18 @@ dependencies = [ "proc-macro2", "quote", "scale-info", + "scale-typegen", "subxt-metadata", - "syn 2.0.52", + "syn 2.0.58", "thiserror", "tokio", ] [[package]] name = "subxt-lightclient" -version = "0.33.0" -source = "git+https://github.com/paritytech/subxt.git?tag=v0.33.0#f06a95d687605bf826db9d83b2932a73a57b169f" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d51f1ac12e3be7aafea4d037730a57da4f22f2e9c73955666081ffa2697c6f1" dependencies = [ "futures", "futures-util", @@ -4996,46 +4986,53 @@ dependencies = [ [[package]] name = "subxt-macro" -version = "0.33.0" -source = "git+https://github.com/paritytech/subxt.git?tag=v0.33.0#f06a95d687605bf826db9d83b2932a73a57b169f" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98dc84d7e6a0abd7ed407cce0bf60d7d58004f699460cffb979640717d1ab506" dependencies = [ - "darling 0.20.5", + "darling 0.20.8", "parity-scale-codec", "proc-macro-error", + "quote", + "scale-typegen", "subxt-codegen", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] name = "subxt-metadata" -version = "0.33.0" -source = "git+https://github.com/paritytech/subxt.git?tag=v0.33.0#f06a95d687605bf826db9d83b2932a73a57b169f" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc10c54028d079a9f1be65188707cd29e5ffd8d0031a2b1346a0941d57b7ab7e" dependencies = [ + "derive_more", "frame-metadata 16.0.0", + "hashbrown 0.14.3", "parity-scale-codec", "scale-info", - "sp-core-hashing", - "thiserror", + "sp-crypto-hashing", ] [[package]] name = "subxt-signer" -version = "0.33.0" -source = "git+https://github.com/paritytech/subxt.git?tag=v0.33.0#f06a95d687605bf826db9d83b2932a73a57b169f" +version = "0.35.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ccb59a38fe357fab55247756174435e8626b93929864e8a498635a15e779df8" dependencies = [ "bip39", + "cfg-if", + "derive_more", "hex", "hmac 0.12.1", "parity-scale-codec", "pbkdf2 0.12.2", "regex", - "schnorrkel 0.11.4", - "secp256k1 0.28.2", + "schnorrkel", + "secp256k1", "secrecy", "sha2 0.10.8", - "sp-core-hashing", + "sp-crypto-hashing", "subxt", - "thiserror", "zeroize", ] @@ -5052,9 +5049,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.52" +version = "2.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" dependencies = [ "proc-macro2", "quote", @@ -5107,29 +5104,38 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", - "fastrand 2.0.1", + "fastrand", "rustix 0.38.31", "windows-sys 0.52.0", ] +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -5209,7 +5215,7 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", - "socket2 0.5.5", + "socket2", "tokio-macros", "windows-sys 0.48.0", ] @@ -5222,7 +5228,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -5231,7 +5237,18 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.10", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls 0.22.3", + "rustls-pki-types", "tokio", ] @@ -5387,7 +5404,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -5493,7 +5510,7 @@ dependencies = [ "http", "httparse", "log", - "rand 0.8.5", + "rand", "sha1", "thiserror", "url", @@ -5508,7 +5525,7 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", "digest 0.10.7", - "rand 0.8.5", + "rand", "static_assertions", ] @@ -5608,7 +5625,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.12", + "getrandom", "serde", ] @@ -5639,8 +5656,8 @@ dependencies = [ "arrayref", "constcat", "digest 0.10.7", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand", + "rand_chacha", "rand_core 0.6.4", "sha2 0.10.8", "sha3", @@ -5648,12 +5665,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "waker-fn" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" - [[package]] name = "walkdir" version = "2.4.0" @@ -5673,12 +5684,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -5706,7 +5711,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", "wasm-bindgen-shared", ] @@ -5740,7 +5745,7 @@ checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5913,7 +5918,7 @@ dependencies = [ "memfd", "memoffset", "paste", - "rand 0.8.5", + "rand", "rustix 0.36.17", "wasmtime-asm-macros", "wasmtime-environ", @@ -6247,7 +6252,7 @@ dependencies = [ "Inflector", "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -6273,7 +6278,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] [[package]] @@ -6293,5 +6298,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.52", + "syn 2.0.58", ] diff --git a/smoketest/Cargo.toml b/smoketest/Cargo.toml index 8d45cab0b7..ab73a3c81e 100644 --- a/smoketest/Cargo.toml +++ b/smoketest/Cargo.toml @@ -11,12 +11,12 @@ tokio = { version = "1.35.0", features = ["macros", "rt-multi-thread", "time"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["bit-vec", "derive", "full"] } hex = "0.4.3" hex-literal = "0.4.1" -serde = { version = "1.0", features = ["derive"] } -subxt = { git = "https://github.com/paritytech/subxt.git", tag = "v0.33.0", features = ["substrate-compat"]} -subxt-macro = { git = "https://github.com/paritytech/subxt.git", tag = "v0.33.0" } -subxt-metadata = { git = "https://github.com/paritytech/subxt.git", tag = "v0.33.0" } -subxt-codegen = { git = "https://github.com/paritytech/subxt.git", tag = "v0.33.0" } -subxt-signer = { git = "https://github.com/paritytech/subxt.git", tag = "v0.33.0" } +serde = { version = "1.0.197", features = ["derive"] } +subxt = { version = "0.35.3", features = ["substrate-compat", "unstable-light-client"]} +subxt-macro = { version = "0.35.3" } +subxt-metadata = { version = "0.35.3" } +subxt-codegen = { version = "0.35.3" } +subxt-signer = { version = "0.35.3" } ethers = { git = "https://github.com/gakonst/ethers-rs", default-features = false, features = ["abigen", "ws"] } lazy_static = "1.4.0" diff --git a/smoketest/make-bindings.sh b/smoketest/make-bindings.sh index b6fb1cf0d4..791d9bdd0d 100755 --- a/smoketest/make-bindings.sh +++ b/smoketest/make-bindings.sh @@ -13,7 +13,7 @@ forge bind --module --overwrite \ # Install subxt command -v subxt || cargo install subxt-cli \ --git https://github.com/paritytech/subxt.git \ - --tag v0.33.0 + --tag v0.35.3 if ! lsof -Pi :11144 -sTCP:LISTEN -t >/dev/null; then echo "substrate nodes not running, please start with the e2e setup and rerun this script" From bceb8f7c7a01a35c35aad1380104f070825a3a3f Mon Sep 17 00:00:00 2001 From: Vincent Geddes <117534+vgeddes@users.noreply.github.com> Date: Sat, 13 Apr 2024 17:40:20 +0200 Subject: [PATCH 3/9] Generate preimage for bridge initialization (#1163) --- control/.gitignore | 9 + control/Cargo.lock | 1748 ++++++++++++++++- control/Cargo.toml | 4 + control/README.md | 68 + control/launch-config.toml | 67 + control/preimage/Cargo.toml | 30 +- control/preimage/build.rs | 4 +- control/preimage/snowbridge-preimage.hex | 0 control/preimage/src/asset_hub_runtime.rs | 9 + control/preimage/src/bridge_hub_runtime.rs | 7 + control/preimage/src/chopsticks.rs | 58 + control/preimage/src/commands.rs | 180 +- control/preimage/src/constants.rs | 25 + control/preimage/src/helpers.rs | 193 +- control/preimage/src/main.rs | 288 ++- control/preimage/src/relay_runtime.rs | 7 + .../chopsticks-execute-upgrade.js.hbs | 44 + .../runtimes/asset-hub-polkadot/Cargo.toml | 13 + .../asset-hub-polkadot/asset-hub-metadata.bin | Bin 0 -> 187738 bytes control/runtimes/asset-hub-polkadot/build.rs | 3 + .../runtimes/asset-hub-polkadot/src/lib.rs | 7 + control/runtimes/asset-hub-rococo/Cargo.toml | 13 + .../asset-hub-rococo/asset-hub-metadata.bin | Bin 0 -> 188502 bytes control/runtimes/asset-hub-rococo/build.rs | 3 + control/runtimes/asset-hub-rococo/src/lib.rs | 7 + .../runtimes/bridge-hub-polkadot/Cargo.toml | 14 + .../bridge-hub-metadata.bin | Bin 0 -> 336524 bytes control/runtimes/bridge-hub-polkadot/build.rs | 3 + .../runtimes/bridge-hub-polkadot/src/lib.rs | 15 + control/runtimes/bridge-hub-rococo/Cargo.toml | 8 +- .../bridge-hub-rococo/bridge-hub-metadata.bin | Bin 345105 -> 381982 bytes control/runtimes/bridge-hub-rococo/build.rs | 3 + control/runtimes/bridge-hub-rococo/src/lib.rs | 10 +- control/runtimes/polkadot/Cargo.toml | 12 + control/runtimes/polkadot/build.rs | 3 + .../runtimes/polkadot/polkadot-metadata.bin | Bin 0 -> 304115 bytes control/runtimes/polkadot/src/lib.rs | 7 + control/runtimes/rococo/build.rs | 3 + 38 files changed, 2611 insertions(+), 254 deletions(-) create mode 100644 control/README.md create mode 100644 control/launch-config.toml create mode 100644 control/preimage/snowbridge-preimage.hex create mode 100644 control/preimage/src/asset_hub_runtime.rs create mode 100644 control/preimage/src/chopsticks.rs create mode 100644 control/preimage/src/constants.rs create mode 100644 control/preimage/templates/chopsticks-execute-upgrade.js.hbs create mode 100644 control/runtimes/asset-hub-polkadot/Cargo.toml create mode 100644 control/runtimes/asset-hub-polkadot/asset-hub-metadata.bin create mode 100644 control/runtimes/asset-hub-polkadot/build.rs create mode 100644 control/runtimes/asset-hub-polkadot/src/lib.rs create mode 100644 control/runtimes/asset-hub-rococo/Cargo.toml create mode 100644 control/runtimes/asset-hub-rococo/asset-hub-metadata.bin create mode 100644 control/runtimes/asset-hub-rococo/build.rs create mode 100644 control/runtimes/asset-hub-rococo/src/lib.rs create mode 100644 control/runtimes/bridge-hub-polkadot/Cargo.toml create mode 100644 control/runtimes/bridge-hub-polkadot/bridge-hub-metadata.bin create mode 100644 control/runtimes/bridge-hub-polkadot/build.rs create mode 100644 control/runtimes/bridge-hub-polkadot/src/lib.rs create mode 100644 control/runtimes/bridge-hub-rococo/build.rs create mode 100644 control/runtimes/polkadot/Cargo.toml create mode 100644 control/runtimes/polkadot/build.rs create mode 100644 control/runtimes/polkadot/polkadot-metadata.bin create mode 100644 control/runtimes/polkadot/src/lib.rs create mode 100644 control/runtimes/rococo/build.rs diff --git a/control/.gitignore b/control/.gitignore index 5bd3e67032..9272c3cf0f 100644 --- a/control/.gitignore +++ b/control/.gitignore @@ -10,3 +10,12 @@ # The cache for chain data in container .local + +/chain-spec-generator +/polkadot +/polkadot-execute-worker +/polkadot-parachain +/polkadot-prepare-worker +/initial-checkpoint.json +db.sqlite +db.sqlite-* diff --git a/control/Cargo.lock b/control/Cargo.lock index bc6727c964..951c8ba9cc 100644 --- a/control/Cargo.lock +++ b/control/Cargo.lock @@ -195,6 +195,20 @@ version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" +[[package]] +name = "aquamarine" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21cc1548309245035eb18aa7f0967da6bc65587005170c56e6ef2788a4cf3f4e" +dependencies = [ + "include_dir", + "itertools 0.10.5", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.50", +] + [[package]] name = "ark-bls12-377" version = "0.4.0" @@ -417,6 +431,28 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "asset-hub-polkadot-runtime" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic 24.0.0", + "subxt 0.35.1", +] + +[[package]] +name = "asset-hub-rococo-runtime" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-arithmetic 24.0.0", + "subxt 0.35.1", +] + [[package]] name = "async-channel" version = "2.2.0" @@ -656,7 +692,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" dependencies = [ - "bitcoin_hashes", + "bitcoin_hashes 0.11.0", "rand", "rand_core 0.6.4", "serde", @@ -678,12 +714,28 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bitcoin-internals" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" + [[package]] name = "bitcoin_hashes" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90064b8dee6815a6470d60bad07bbbaee885c0e12d04177138fa3291a01b7bc4" +[[package]] +name = "bitcoin_hashes" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" +dependencies = [ + "bitcoin-internals", + "hex-conservative", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -805,6 +857,30 @@ dependencies = [ "serde", ] +[[package]] +name = "bounded-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32385ecb91a31bddaf908e8dcf4a15aef1bcd3913cc03ebfad02ff6d568abc1" +dependencies = [ + "log", + "parity-scale-codec", + "scale-info", + "serde", +] + +[[package]] +name = "bridge-hub-polkadot-runtime" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "snowbridge-beacon-primitives", + "sp-arithmetic 24.0.0", + "subxt 0.35.1", +] + [[package]] name = "bridge-hub-rococo-runtime" version = "0.1.0" @@ -812,7 +888,9 @@ dependencies = [ "parity-scale-codec", "scale-info", "serde", - "subxt", + "snowbridge-beacon-primitives", + "sp-arithmetic 24.0.0", + "subxt 0.35.1", ] [[package]] @@ -860,6 +938,15 @@ version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3286b845d0fccbdd15af433f61c5970e711987036cb468f437ff6badd70f4e24" +[[package]] +name = "cfg-expr" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa50868b64a9a6fda9d593ce778849ea8715cd2a3d2cc17ffdb4a2f2f2f1961d" +dependencies = [ + "smallvec", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -979,6 +1066,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom", + "once_cell", + "tiny-keccak", +] + [[package]] name = "constant_time_eq" version = "0.1.5" @@ -1388,6 +1495,7 @@ dependencies = [ "digest 0.10.7", "elliptic-curve", "rfc6979", + "serdect", "signature", "spki", ] @@ -1466,6 +1574,7 @@ dependencies = [ "pkcs8", "rand_core 0.6.4", "sec1", + "serdect", "subtle", "zeroize", ] @@ -1492,6 +1601,47 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "ethabi-decode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d398648d65820a727d6a81e58b962f874473396a047e4c30bafe3240953417" +dependencies = [ + "ethereum-types", + "tiny-keccak", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types", + "scale-info", + "uint", +] + [[package]] name = "event-listener" version = "2.5.3" @@ -1648,6 +1798,113 @@ dependencies = [ "serde", ] +[[package]] +name = "frame-support" +version = "30.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40bde5b74ac70a1c9fe4f846220ea10e78b81b0ffcdb567d16d28472bc332f95" +dependencies = [ + "aquamarine", + "array-bytes", + "bitflags 1.3.2", + "docify", + "environmental", + "frame-metadata 16.0.0", + "frame-support-procedural", + "impl-trait-for-tuples", + "k256", + "log", + "macro_magic", + "parity-scale-codec", + "paste", + "scale-info", + "serde", + "serde_json", + "smallvec", + "sp-api", + "sp-arithmetic 25.0.0", + "sp-core 30.0.0", + "sp-crypto-hashing-proc-macro", + "sp-debug-derive", + "sp-genesis-builder", + "sp-inherents", + "sp-io 32.0.0", + "sp-metadata-ir", + "sp-runtime 33.0.0", + "sp-staking", + "sp-state-machine 0.37.0", + "sp-std", + "sp-tracing", + "sp-weights 29.0.0", + "static_assertions", + "tt-call", +] + +[[package]] +name = "frame-support-procedural" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bf871c6655636a40a74d06f7f1bf69813f8037ad269704ae35b1c56c42ec" +dependencies = [ + "Inflector", + "cfg-expr", + "derive-syn-parse", + "expander", + "frame-support-procedural-tools", + "itertools 0.10.5", + "macro_magic", + "proc-macro-warning", + "proc-macro2", + "quote", + "sp-crypto-hashing", + "syn 2.0.50", +] + +[[package]] +name = "frame-support-procedural-tools" +version = "11.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be30b1ce0b477476a3fe13cd8ff479007582340d14f0ddea9e832b01e706a07" +dependencies = [ + "frame-support-procedural-tools-derive", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "frame-support-procedural-tools-derive" +version = "12.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed971c6435503a099bdac99fe4c5bea08981709e5b5a0a8535a1856f48561191" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "frame-system" +version = "30.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c302f711acf3196b4bf2b4629a07a2ac6e44cd1782434ec88b85d59adfb1204d" +dependencies = [ + "cfg-if", + "docify", + "frame-support", + "log", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core 30.0.0", + "sp-io 32.0.0", + "sp-runtime 33.0.0", + "sp-std", + "sp-version", + "sp-weights 29.0.0", +] + [[package]] name = "fs-err" version = "2.11.0" @@ -1860,6 +2117,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "handlebars" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d08485b96a0e6393e9e4d1b8d48cf74ad6c063cd905eb33f42c1ce3f0377539b" +dependencies = [ + "log", + "pest", + "pest_derive", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "hash-db" version = "0.16.0" @@ -1922,6 +2193,12 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hex-conservative" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ed443af458ccb6d81c1e7e661545f94d3176752fb1df2f543b902a1e0f51e2" + [[package]] name = "hex-literal" version = "0.4.1" @@ -2090,6 +2367,15 @@ dependencies = [ "parity-scale-codec", ] +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + [[package]] name = "impl-serde" version = "0.4.0" @@ -2110,6 +2396,25 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "include_dir" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "indexmap" version = "1.9.3" @@ -2214,10 +2519,22 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9579d0ca9fb30da026bac2f0f7d9576ec93489aeb7cd4971dd5b4617d82c79b2" dependencies = [ - "jsonrpsee-client-transport", - "jsonrpsee-core", - "jsonrpsee-http-client", - "jsonrpsee-types", + "jsonrpsee-client-transport 0.21.0", + "jsonrpsee-core 0.21.0", + "jsonrpsee-http-client 0.21.0", + "jsonrpsee-types 0.21.0", +] + +[[package]] +name = "jsonrpsee" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cdbb7cb6f3ba28f5b212dd250ab4483105efc3e381f5c8bb90340f14f0a2cc3" +dependencies = [ + "jsonrpsee-client-transport 0.22.3", + "jsonrpsee-core 0.22.3", + "jsonrpsee-http-client 0.22.3", + "jsonrpsee-types 0.22.3", ] [[package]] @@ -2228,7 +2545,28 @@ checksum = "3f9f9ed46590a8d5681975f126e22531698211b926129a40a2db47cbca429220" dependencies = [ "futures-util", "http", - "jsonrpsee-core", + "jsonrpsee-core 0.21.0", + "pin-project", + "rustls-native-certs 0.7.0", + "rustls-pki-types", + "soketto", + "thiserror", + "tokio", + "tokio-rustls 0.25.0", + "tokio-util", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ab2e14e727d2faf388c99d9ca5210566ed3b044f07d92c29c3611718d178380" +dependencies = [ + "futures-util", + "http", + "jsonrpsee-core 0.22.3", "pin-project", "rustls-native-certs 0.7.0", "rustls-pki-types", @@ -2254,7 +2592,31 @@ dependencies = [ "futures-timer", "futures-util", "hyper", - "jsonrpsee-types", + "jsonrpsee-types 0.21.0", + "pin-project", + "rustc-hash", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71962a1c49af43adf81d337e4ebc93f3c915faf6eccaa14d74e255107dfd7723" +dependencies = [ + "anyhow", + "async-lock 3.3.0", + "async-trait", + "beef", + "futures-timer", + "futures-util", + "hyper", + "jsonrpsee-types 0.22.3", "pin-project", "rustc-hash", "serde", @@ -2274,8 +2636,28 @@ dependencies = [ "async-trait", "hyper", "hyper-rustls", - "jsonrpsee-core", - "jsonrpsee-types", + "jsonrpsee-core 0.21.0", + "jsonrpsee-types 0.21.0", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c13987da51270bda2c1c9b40c19be0fe9b225c7a0553963d8f17e683a50ce84" +dependencies = [ + "async-trait", + "hyper", + "hyper-rustls", + "jsonrpsee-core 0.22.3", + "jsonrpsee-types 0.22.3", "serde", "serde_json", "thiserror", @@ -2298,6 +2680,19 @@ dependencies = [ "thiserror", ] +[[package]] +name = "jsonrpsee-types" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e53c72de6cd2ad6ac1aa6e848206ef8b736f92ed02354959130373dfa5b3cbd" +dependencies = [ + "anyhow", + "beef", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "k256" version = "0.13.3" @@ -2308,6 +2703,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", + "serdect", "sha2 0.10.8", "signature", ] @@ -2443,6 +2839,54 @@ dependencies = [ "libc", ] +[[package]] +name = "macro_magic" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e03844fc635e92f3a0067e25fa4bf3e3dbf3f2927bf3aa01bb7bc8f1c428949d" +dependencies = [ + "macro_magic_core", + "macro_magic_macros", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "macro_magic_core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468155613a44cfd825f1fb0ffa532b018253920d404e6fca1e8d43155198a46d" +dependencies = [ + "const-random", + "derive-syn-parse", + "macro_magic_core_macros", + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "macro_magic_core_macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "macro_magic_macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" +dependencies = [ + "macro_magic_core", + "quote", + "syn 2.0.50", +] + [[package]] name = "matchers" version = "0.0.1" @@ -2670,6 +3114,25 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "parity-bip39" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9" +dependencies = [ + "bitcoin_hashes 0.13.0", + "rand", + "rand_core 0.6.4", + "serde", + "unicode-normalization", +] + +[[package]] +name = "parity-bytes" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b56e3a2420138bdb970f84dfb9c774aea80fa0e7371549eedec0d80c209c67" + [[package]] name = "parity-scale-codec" version = "3.6.9" @@ -2697,6 +3160,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "parity-wasm" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1ad0aff30c1da14b1254fcb2af73e1fa9a28670e584a626f53a369d0e157304" + [[package]] name = "parking" version = "2.2.0" @@ -2726,6 +3195,17 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "paste" version = "1.0.14" @@ -2748,6 +3228,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ "digest 0.10.7", + "password-hash", ] [[package]] @@ -2758,15 +3239,49 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.7" +version = "2.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546" +checksum = "311fb059dee1a7b802f036316d790138c613a4e8b180c822e3925a662e9f0c95" dependencies = [ "memchr", "thiserror", "ucd-trie", ] +[[package]] +name = "pest_derive" +version = "2.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f73541b156d32197eecda1a4014d7f868fd2bcb3c550d5386087cfba442bf69c" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c35eeed0a3fab112f75165fdc026b3913f4183133f19b49be773ac9ea966e8bd" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "pest_meta" +version = "2.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2adbf29bb9776f28caece835398781ab24435585fe0d4dc1374a61db5accedca" +dependencies = [ + "once_cell", + "pest", + "sha2 0.10.8", +] + [[package]] name = "pin-project" version = "1.1.4" @@ -2826,6 +3341,90 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c" +[[package]] +name = "polkadot-runtime" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "subxt 0.34.0", +] + +[[package]] +name = "polkavm-common" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c99f7eee94e7be43ba37eef65ad0ee8cbaf89b7c00001c3f6d2be985cb1817" + +[[package]] +name = "polkavm-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d9428a5cfcc85c5d7b9fc4b6a18c4b802d0173d768182a51cc7751640f08b92" + +[[package]] +name = "polkavm-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79fa916f7962348bd1bb1a65a83401675e6fc86c51a0fdbcf92a3108e58e6125" +dependencies = [ + "polkavm-derive-impl-macro 0.8.0", +] + +[[package]] +name = "polkavm-derive" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8c4bea6f3e11cd89bb18bcdddac10bd9a24015399bd1c485ad68a985a19606" +dependencies = [ + "polkavm-derive-impl-macro 0.9.0", +] + +[[package]] +name = "polkavm-derive-impl" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c10b2654a8a10a83c260bfb93e97b262cf0017494ab94a65d389e0eda6de6c9c" +dependencies = [ + "polkavm-common 0.8.0", + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "polkavm-derive-impl" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c4fdfc49717fb9a196e74a5d28e0bc764eb394a2c803eb11133a31ac996c60c" +dependencies = [ + "polkavm-common 0.9.0", + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "polkavm-derive-impl-macro" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e85319a0d5129dc9f021c62607e0804f5fb777a05cdda44d750ac0732def66" +dependencies = [ + "polkavm-derive-impl 0.8.0", + "syn 2.0.50", +] + +[[package]] +name = "polkavm-derive-impl-macro" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ba81f7b5faac81e528eb6158a6f3c9e0bb1008e0ffa19653bc8dea925ecb429" +dependencies = [ + "polkavm-derive-impl 0.9.0", + "syn 2.0.50", +] + [[package]] name = "polling" version = "3.5.0" @@ -2865,6 +3464,7 @@ checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" dependencies = [ "fixed-hash", "impl-codec", + "impl-rlp", "impl-serde", "scale-info", "uint", @@ -2922,11 +3522,22 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-warning" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "834da187cfe638ae8abb0203f0b33e5ccdb02a28e7199f2f47b3e2754f50edca" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -3141,7 +3752,7 @@ dependencies = [ "parity-scale-codec", "scale-info", "serde", - "subxt", + "subxt 0.34.0", ] [[package]] @@ -3389,6 +4000,18 @@ dependencies = [ "serde", ] +[[package]] +name = "scale-bits" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "662d10dcd57b1c2a3c41c9cf68f71fb09747ada1ea932ad961aca7e2ca28315f" +dependencies = [ + "parity-scale-codec", + "scale-info", + "scale-type-resolver", + "serde", +] + [[package]] name = "scale-decode" version = "0.10.0" @@ -3398,12 +4021,27 @@ dependencies = [ "derive_more", "parity-scale-codec", "primitive-types", - "scale-bits", - "scale-decode-derive", + "scale-bits 0.4.0", + "scale-decode-derive 0.10.0", "scale-info", "smallvec", ] +[[package]] +name = "scale-decode" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc79ba56a1c742f5aeeed1f1801f3edf51f7e818f0a54582cac6f131364ea7b" +dependencies = [ + "derive_more", + "parity-scale-codec", + "primitive-types", + "scale-bits 0.5.0", + "scale-decode-derive 0.11.1", + "scale-type-resolver", + "smallvec", +] + [[package]] name = "scale-decode-derive" version = "0.10.0" @@ -3417,6 +4055,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "scale-decode-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5398fdb3c7bea3cb419bac4983aadacae93fe1a7b5f693f4ebd98c3821aad7a5" +dependencies = [ + "darling 0.14.4", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "scale-encode" version = "0.5.0" @@ -3426,12 +4076,27 @@ dependencies = [ "derive_more", "parity-scale-codec", "primitive-types", - "scale-bits", - "scale-encode-derive", + "scale-bits 0.4.0", + "scale-encode-derive 0.5.0", "scale-info", "smallvec", ] +[[package]] +name = "scale-encode" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "628800925a33794fb5387781b883b5e14d130fece9af5a63613867b8de07c5c7" +dependencies = [ + "derive_more", + "parity-scale-codec", + "primitive-types", + "scale-bits 0.5.0", + "scale-encode-derive 0.6.0", + "scale-type-resolver", + "smallvec", +] + [[package]] name = "scale-encode-derive" version = "0.5.0" @@ -3445,11 +4110,24 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "scale-encode-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a304e1af7cdfbe7a24e08b012721456cc8cecdedadc14b3d10513eada63233c" +dependencies = [ + "darling 0.14.4", + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "scale-info" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" +checksum = "788745a868b0e751750388f4e6546eb921ef714a4317fa6954f7cde114eb2eb7" dependencies = [ "bitvec", "cfg-if", @@ -3461,9 +4139,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.10.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" +checksum = "7dc2f4e8bc344b9fc3d5f74f72c2e55bfc38d28dc2ebc69c194a3df424e4d9ac" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -3471,6 +4149,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "scale-type-resolver" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10b800069bfd43374e0f96f653e0d46882a2cb16d6d961ac43bea80f26c76843" +dependencies = [ + "scale-info", + "smallvec", +] + [[package]] name = "scale-typegen" version = "0.1.1" @@ -3484,6 +4172,19 @@ dependencies = [ "thiserror", ] +[[package]] +name = "scale-typegen" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d470fa75e71b12b3244a4113adc4bc49891f3daba2054703cacd06256066397e" +dependencies = [ + "proc-macro2", + "quote", + "scale-info", + "syn 2.0.50", + "thiserror", +] + [[package]] name = "scale-value" version = "0.13.0" @@ -3496,17 +4197,38 @@ dependencies = [ "either", "frame-metadata 15.1.0", "parity-scale-codec", - "scale-bits", - "scale-decode", - "scale-encode", + "scale-bits 0.4.0", + "scale-decode 0.10.0", + "scale-encode 0.5.0", "scale-info", "serde", "yap", ] [[package]] -name = "schannel" -version = "0.1.23" +name = "scale-value" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07ccfee963104335c971aaf8b7b0e749be8569116322df23f1f75c4ca9e4a28" +dependencies = [ + "base58", + "blake2", + "derive_more", + "either", + "frame-metadata 15.1.0", + "parity-scale-codec", + "scale-bits 0.5.0", + "scale-decode 0.11.1", + "scale-encode 0.6.0", + "scale-info", + "scale-type-resolver", + "serde", + "yap", +] + +[[package]] +name = "schannel" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ @@ -3585,6 +4307,7 @@ dependencies = [ "der", "generic-array 0.14.7", "pkcs8", + "serdect", "subtle", "zeroize", ] @@ -3672,6 +4395,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-big-array" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd31f59f6fe2b0c055371bb2f16d7f0aa7d8881676c04a55b1596d1a17cd10a4" +dependencies = [ + "serde", +] + [[package]] name = "serde_bytes" version = "0.11.14" @@ -3712,6 +4444,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "sha-1" version = "0.9.8" @@ -3944,22 +4686,103 @@ dependencies = [ "zeroize", ] +[[package]] +name = "snowbridge-amcl" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460a9ed63cdf03c1b9847e8a12a5f5ba19c4efd5869e4a737e05be25d7c427e5" +dependencies = [ + "parity-scale-codec", + "scale-info", +] + +[[package]] +name = "snowbridge-beacon-primitives" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c35d4d8b5be969d0f824c6aa8380289edf0bec2c45ccef9f758a4d7a7dca96ea" +dependencies = [ + "byte-slice-cast", + "frame-support", + "frame-system", + "hex", + "parity-scale-codec", + "rlp", + "scale-info", + "serde", + "snowbridge-ethereum", + "snowbridge-milagro-bls", + "sp-core 30.0.0", + "sp-io 32.0.0", + "sp-runtime 33.0.0", + "sp-std", + "ssz_rs", + "ssz_rs_derive", + "static_assertions", +] + +[[package]] +name = "snowbridge-ethereum" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a4000b70f42c9adc0247de3893aee803cbf37e9e5f13a4c18a28a86872f648a" +dependencies = [ + "ethabi-decode", + "ethbloom", + "ethereum-types", + "hex-literal", + "parity-bytes", + "parity-scale-codec", + "rlp", + "rustc-hex", + "scale-info", + "serde", + "serde-big-array", + "sp-core 30.0.0", + "sp-io 32.0.0", + "sp-runtime 33.0.0", + "sp-std", +] + +[[package]] +name = "snowbridge-milagro-bls" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "026aa8638f690a53e3f7676024b9e913b1cab0111d1b7b92669d40a188f9d7e6" +dependencies = [ + "hex", + "lazy_static", + "parity-scale-codec", + "rand", + "scale-info", + "snowbridge-amcl", + "zeroize", +] + [[package]] name = "snowbridge-preimage" version = "0.1.0" dependencies = [ "alloy-primitives", + "asset-hub-polkadot-runtime", + "asset-hub-rococo-runtime", + "bridge-hub-polkadot-runtime", "bridge-hub-rococo-runtime", "clap", "futures", + "handlebars", "hex", "hex-literal", "parity-scale-codec", + "polkadot-runtime", "rococo-runtime", "scale-info", "serde", + "serde_json", + "snowbridge-beacon-primitives", "sp-arithmetic 24.0.0", - "subxt", + "sp-crypto-hashing", + "subxt 0.35.1", "tokio", ] @@ -3988,6 +4811,44 @@ dependencies = [ "sha-1", ] +[[package]] +name = "sp-api" +version = "28.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298331cb47a948244f6fb4921b5cbeece267d72139fb90760993b6ec37b2212c" +dependencies = [ + "hash-db", + "log", + "parity-scale-codec", + "scale-info", + "sp-api-proc-macro", + "sp-core 30.0.0", + "sp-externalities 0.27.0", + "sp-metadata-ir", + "sp-runtime 33.0.0", + "sp-runtime-interface 26.0.0", + "sp-state-machine 0.37.0", + "sp-std", + "sp-trie 31.0.0", + "sp-version", + "thiserror", +] + +[[package]] +name = "sp-api-proc-macro" +version = "16.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18cfbb3ae0216e842dfb805ea8e896e85b07a7c34d432a6c7b7d770924431ed2" +dependencies = [ + "Inflector", + "blake2", + "expander", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.50", +] + [[package]] name = "sp-application-crypto" version = "30.0.0" @@ -3997,8 +4858,36 @@ dependencies = [ "parity-scale-codec", "scale-info", "serde", - "sp-core", - "sp-io", + "sp-core 28.0.0", + "sp-io 30.0.0", + "sp-std", +] + +[[package]] +name = "sp-application-crypto" +version = "32.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b4b7b12922cb90cf8dff0cab14087ba0ca25c1f04ba060c7294ce42c78d89ab" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-core 30.0.0", + "sp-io 32.0.0", + "sp-std", +] + +[[package]] +name = "sp-application-crypto" +version = "33.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13ca6121c22c8bd3d1dce1f05c479101fd0d7b159bef2a3e8c834138d839c75c" +dependencies = [ + "parity-scale-codec", + "scale-info", + "serde", + "sp-core 31.0.0", + "sp-io 33.0.0", "sp-std", ] @@ -4032,6 +4921,21 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "sp-arithmetic" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "910c07fa263b20bf7271fdd4adcb5d3217dfdac14270592e0780223542e7e114" +dependencies = [ + "integer-sqrt", + "num-traits", + "parity-scale-codec", + "scale-info", + "serde", + "sp-std", + "static_assertions", +] + [[package]] name = "sp-core" version = "28.0.0" @@ -4042,7 +4946,7 @@ dependencies = [ "bip39", "bitflags 1.3.2", "blake2", - "bounded-collections", + "bounded-collections 0.1.9", "bs58", "dyn-clonable", "ed25519-zebra 3.1.0", @@ -4066,12 +4970,105 @@ dependencies = [ "serde", "sp-core-hashing", "sp-debug-derive", - "sp-externalities", - "sp-runtime-interface", + "sp-externalities 0.25.0", + "sp-runtime-interface 24.0.0", + "sp-std", + "sp-storage 19.0.0", + "ss58-registry", + "substrate-bip39 0.4.5", + "thiserror", + "tracing", + "w3f-bls", + "zeroize", +] + +[[package]] +name = "sp-core" +version = "30.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "586e0d5185e4545f465fc9a04fb9c4572d3e294137312496db2b67b0bb579e1f" +dependencies = [ + "array-bytes", + "bip39", + "bitflags 1.3.2", + "blake2", + "bounded-collections 0.2.0", + "bs58", + "dyn-clonable", + "ed25519-zebra 3.1.0", + "futures", + "hash-db", + "hash256-std-hasher", + "impl-serde", + "itertools 0.10.5", + "libsecp256k1", + "log", + "merlin 3.0.0", + "parity-scale-codec", + "parking_lot", + "paste", + "primitive-types", + "rand", + "scale-info", + "schnorrkel 0.11.4", + "secp256k1", + "secrecy", + "serde", + "sp-crypto-hashing", + "sp-debug-derive", + "sp-externalities 0.27.0", + "sp-runtime-interface 26.0.0", "sp-std", - "sp-storage", + "sp-storage 20.0.0", "ss58-registry", - "substrate-bip39", + "substrate-bip39 0.4.5", + "thiserror", + "tracing", + "w3f-bls", + "zeroize", +] + +[[package]] +name = "sp-core" +version = "31.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d7a0fd8f16dcc3761198fc83be12872f823b37b749bc72a3a6a1f702509366" +dependencies = [ + "array-bytes", + "bitflags 1.3.2", + "blake2", + "bounded-collections 0.2.0", + "bs58", + "dyn-clonable", + "ed25519-zebra 3.1.0", + "futures", + "hash-db", + "hash256-std-hasher", + "impl-serde", + "itertools 0.10.5", + "k256", + "libsecp256k1", + "log", + "merlin 3.0.0", + "parity-bip39", + "parity-scale-codec", + "parking_lot", + "paste", + "primitive-types", + "rand", + "scale-info", + "schnorrkel 0.11.4", + "secp256k1", + "secrecy", + "serde", + "sp-crypto-hashing", + "sp-debug-derive", + "sp-externalities 0.27.0", + "sp-runtime-interface 26.0.0", + "sp-std", + "sp-storage 20.0.0", + "ss58-registry", + "substrate-bip39 0.5.0", "thiserror", "tracing", "w3f-bls", @@ -4092,6 +5089,31 @@ dependencies = [ "twox-hash", ] +[[package]] +name = "sp-crypto-hashing" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9927a7f81334ed5b8a98a4a978c81324d12bd9713ec76b5c68fd410174c5eb" +dependencies = [ + "blake2b_simd", + "byteorder", + "digest 0.10.7", + "sha2 0.10.8", + "sha3", + "twox-hash", +] + +[[package]] +name = "sp-crypto-hashing-proc-macro" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b85d0f1f1e44bd8617eb2a48203ee854981229e3e79e6f468c7175d5fd37489b" +dependencies = [ + "quote", + "sp-crypto-hashing", + "syn 2.0.50", +] + [[package]] name = "sp-debug-derive" version = "14.0.0" @@ -4112,7 +5134,46 @@ dependencies = [ "environmental", "parity-scale-codec", "sp-std", - "sp-storage", + "sp-storage 19.0.0", +] + +[[package]] +name = "sp-externalities" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d6a4572eadd4a63cff92509a210bf425501a0c5e76574b30a366ac77653787" +dependencies = [ + "environmental", + "parity-scale-codec", + "sp-std", + "sp-storage 20.0.0", +] + +[[package]] +name = "sp-genesis-builder" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a862db099e8a799417b63ea79c90079811cdf68fcf3013d81cdceeddcec8f142" +dependencies = [ + "serde_json", + "sp-api", + "sp-runtime 33.0.0", + "sp-std", +] + +[[package]] +name = "sp-inherents" +version = "28.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42eb3c88572c7c80e7ecb6365601a490350b09d11000fcc7839efd304e172177" +dependencies = [ + "async-trait", + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "sp-runtime 33.0.0", + "sp-std", + "thiserror", ] [[package]] @@ -4128,14 +5189,67 @@ dependencies = [ "parity-scale-codec", "rustversion", "secp256k1", - "sp-core", - "sp-externalities", - "sp-keystore", - "sp-runtime-interface", - "sp-state-machine", + "sp-core 28.0.0", + "sp-externalities 0.25.0", + "sp-keystore 0.34.0", + "sp-runtime-interface 24.0.0", + "sp-state-machine 0.35.0", + "sp-std", + "sp-tracing", + "sp-trie 29.0.0", + "tracing", + "tracing-core", +] + +[[package]] +name = "sp-io" +version = "32.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca29e042628cb94cbcaefa935e624a9b48f9230dbce6324908e9b4f768317ef" +dependencies = [ + "bytes", + "ed25519-dalek", + "libsecp256k1", + "log", + "parity-scale-codec", + "rustversion", + "secp256k1", + "sp-core 30.0.0", + "sp-crypto-hashing", + "sp-externalities 0.27.0", + "sp-keystore 0.36.0", + "sp-runtime-interface 26.0.0", + "sp-state-machine 0.37.0", "sp-std", "sp-tracing", - "sp-trie", + "sp-trie 31.0.0", + "tracing", + "tracing-core", +] + +[[package]] +name = "sp-io" +version = "33.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e09bba780b55bd9e67979cd8f654a31e4a6cf45426ff371394a65953d2177f2" +dependencies = [ + "bytes", + "ed25519-dalek", + "libsecp256k1", + "log", + "parity-scale-codec", + "polkavm-derive 0.9.1", + "rustversion", + "secp256k1", + "sp-core 31.0.0", + "sp-crypto-hashing", + "sp-externalities 0.27.0", + "sp-keystore 0.37.0", + "sp-runtime-interface 26.0.0", + "sp-state-machine 0.38.0", + "sp-std", + "sp-tracing", + "sp-trie 32.0.0", "tracing", "tracing-core", ] @@ -4148,11 +5262,47 @@ checksum = "96806a28a62ed9ddecd0b28857b1344d029390f7c5c42a2ff9199cbf5638635c" dependencies = [ "parity-scale-codec", "parking_lot", - "sp-core", - "sp-externalities", + "sp-core 28.0.0", + "sp-externalities 0.25.0", "thiserror", ] +[[package]] +name = "sp-keystore" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd4bf9e5fa486416c92c2bb497b7ce2c43eac80cbdc407ffe2d34b365694ac29" +dependencies = [ + "parity-scale-codec", + "parking_lot", + "sp-core 30.0.0", + "sp-externalities 0.27.0", +] + +[[package]] +name = "sp-keystore" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdbab8b61bd61d5f8625a0c75753b5d5a23be55d3445419acd42caf59cf6236b" +dependencies = [ + "parity-scale-codec", + "parking_lot", + "sp-core 31.0.0", + "sp-externalities 0.27.0", +] + +[[package]] +name = "sp-metadata-ir" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa0b5e87e56c1bb26d9524d48dd127121d630f895bd5914a34f0b017489f7c1d" +dependencies = [ + "frame-metadata 16.0.0", + "parity-scale-codec", + "scale-info", + "sp-std", +] + [[package]] name = "sp-panic-handler" version = "13.0.0" @@ -4181,52 +5331,195 @@ dependencies = [ "scale-info", "serde", "simple-mermaid", - "sp-application-crypto", + "sp-application-crypto 30.0.0", "sp-arithmetic 23.0.0", - "sp-core", - "sp-io", + "sp-core 28.0.0", + "sp-io 30.0.0", "sp-std", - "sp-weights", + "sp-weights 27.0.0", +] + +[[package]] +name = "sp-runtime" +version = "33.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b28fcf8f53d917e420e783dd27d06fd276f55160301c5bc977cc5898c4130f6f" +dependencies = [ + "docify", + "either", + "hash256-std-hasher", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "paste", + "rand", + "scale-info", + "serde", + "simple-mermaid", + "sp-application-crypto 32.0.0", + "sp-arithmetic 25.0.0", + "sp-core 30.0.0", + "sp-io 32.0.0", + "sp-std", + "sp-weights 29.0.0", +] + +[[package]] +name = "sp-runtime" +version = "34.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3cb126971e7db2f0fcf8053dce740684c438c7180cfca1959598230f342c58" +dependencies = [ + "docify", + "either", + "hash256-std-hasher", + "impl-trait-for-tuples", + "log", + "parity-scale-codec", + "paste", + "rand", + "scale-info", + "serde", + "simple-mermaid", + "sp-application-crypto 33.0.0", + "sp-arithmetic 25.0.0", + "sp-core 31.0.0", + "sp-io 33.0.0", + "sp-std", + "sp-weights 30.0.0", ] [[package]] name = "sp-runtime-interface" version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66b66d8cec3d785fa6289336c1d9cbd4305d5d84f7134378c4d79ed7983e6fb" +checksum = "f66b66d8cec3d785fa6289336c1d9cbd4305d5d84f7134378c4d79ed7983e6fb" +dependencies = [ + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec", + "primitive-types", + "sp-externalities 0.25.0", + "sp-runtime-interface-proc-macro 17.0.0", + "sp-std", + "sp-storage 19.0.0", + "sp-tracing", + "sp-wasm-interface", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface" +version = "26.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a675ea4858333d4d755899ed5ed780174aa34fec15953428d516af5452295" +dependencies = [ + "bytes", + "impl-trait-for-tuples", + "parity-scale-codec", + "polkavm-derive 0.8.0", + "primitive-types", + "sp-externalities 0.27.0", + "sp-runtime-interface-proc-macro 18.0.0", + "sp-std", + "sp-storage 20.0.0", + "sp-tracing", + "sp-wasm-interface", + "static_assertions", +] + +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "17.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfaf6e85b2ec12a4b99cd6d8d57d083e30c94b7f1b0d8f93547121495aae6f0c" +dependencies = [ + "Inflector", + "expander", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "sp-runtime-interface-proc-macro" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0195f32c628fee3ce1dfbbf2e7e52a30ea85f3589da9fe62a8b816d70fc06294" +dependencies = [ + "Inflector", + "expander", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.50", +] + +[[package]] +name = "sp-staking" +version = "28.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48b92f4f66b40cbf7cf00d7808d8eec16e25cb420a29ec4060a74c0e9f7c2938" +dependencies = [ + "impl-trait-for-tuples", + "parity-scale-codec", + "scale-info", + "serde", + "sp-core 30.0.0", + "sp-runtime 33.0.0", + "sp-std", +] + +[[package]] +name = "sp-state-machine" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718c779ad1d6fcc0be64c7ce030b33fa44b5c8914b3a1319ef63bb5f27fb98df" dependencies = [ - "bytes", - "impl-trait-for-tuples", + "hash-db", + "log", "parity-scale-codec", - "primitive-types", - "sp-externalities", - "sp-runtime-interface-proc-macro", + "parking_lot", + "rand", + "smallvec", + "sp-core 28.0.0", + "sp-externalities 0.25.0", + "sp-panic-handler", "sp-std", - "sp-storage", - "sp-tracing", - "sp-wasm-interface", - "static_assertions", + "sp-trie 29.0.0", + "thiserror", + "tracing", + "trie-db", ] [[package]] -name = "sp-runtime-interface-proc-macro" -version = "17.0.0" +name = "sp-state-machine" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfaf6e85b2ec12a4b99cd6d8d57d083e30c94b7f1b0d8f93547121495aae6f0c" +checksum = "23ae47765916d342b53d07be012a71efc4c1377d875ade31340cc4fb784b9921" dependencies = [ - "Inflector", - "expander", - "proc-macro-crate 3.1.0", - "proc-macro2", - "quote", - "syn 2.0.50", + "hash-db", + "log", + "parity-scale-codec", + "parking_lot", + "rand", + "smallvec", + "sp-core 30.0.0", + "sp-externalities 0.27.0", + "sp-panic-handler", + "sp-std", + "sp-trie 31.0.0", + "thiserror", + "tracing", + "trie-db", ] [[package]] name = "sp-state-machine" -version = "0.35.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718c779ad1d6fcc0be64c7ce030b33fa44b5c8914b3a1319ef63bb5f27fb98df" +checksum = "1eae0eac8034ba14437e772366336f579398a46d101de13dbb781ab1e35e67c5" dependencies = [ "hash-db", "log", @@ -4234,11 +5527,11 @@ dependencies = [ "parking_lot", "rand", "smallvec", - "sp-core", - "sp-externalities", + "sp-core 31.0.0", + "sp-externalities 0.27.0", "sp-panic-handler", "sp-std", - "sp-trie", + "sp-trie 32.0.0", "thiserror", "tracing", "trie-db", @@ -4264,6 +5557,20 @@ dependencies = [ "sp-std", ] +[[package]] +name = "sp-storage" +version = "20.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dba5791cb3978e95daf99dad919ecb3ec35565604e88cd38d805d9d4981e8bd" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "ref-cast", + "serde", + "sp-debug-derive", + "sp-std", +] + [[package]] name = "sp-tracing" version = "16.0.0" @@ -4293,8 +5600,58 @@ dependencies = [ "rand", "scale-info", "schnellru", - "sp-core", - "sp-externalities", + "sp-core 28.0.0", + "sp-externalities 0.25.0", + "sp-std", + "thiserror", + "tracing", + "trie-db", + "trie-root", +] + +[[package]] +name = "sp-trie" +version = "31.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5791e2e310cf88abedbd5f60ff3d9c9a09d95b182b4a7510f3648a2170ace593" +dependencies = [ + "ahash 0.8.9", + "hash-db", + "lazy_static", + "memory-db", + "nohash-hasher", + "parity-scale-codec", + "parking_lot", + "rand", + "scale-info", + "schnellru", + "sp-core 30.0.0", + "sp-externalities 0.27.0", + "sp-std", + "thiserror", + "tracing", + "trie-db", + "trie-root", +] + +[[package]] +name = "sp-trie" +version = "32.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1aa91ad26c62b93d73e65f9ce7ebd04459c4bad086599348846a81988d6faa4" +dependencies = [ + "ahash 0.8.9", + "hash-db", + "lazy_static", + "memory-db", + "nohash-hasher", + "parity-scale-codec", + "parking_lot", + "rand", + "scale-info", + "schnellru", + "sp-core 31.0.0", + "sp-externalities 0.27.0", "sp-std", "thiserror", "tracing", @@ -4302,6 +5659,36 @@ dependencies = [ "trie-root", ] +[[package]] +name = "sp-version" +version = "31.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "973478ac076be7cb8e0a7968ee43cd7c46fb26e323d36020a9f3bb229e033cd2" +dependencies = [ + "impl-serde", + "parity-scale-codec", + "parity-wasm", + "scale-info", + "serde", + "sp-crypto-hashing-proc-macro", + "sp-runtime 33.0.0", + "sp-std", + "sp-version-proc-macro", + "thiserror", +] + +[[package]] +name = "sp-version-proc-macro" +version = "13.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9bc3fed32d6dacbbbfb28dd1fe0224affbb737cb6cbfca1d9149351c2b69a7d" +dependencies = [ + "parity-scale-codec", + "proc-macro2", + "quote", + "syn 2.0.50", +] + [[package]] name = "sp-wasm-interface" version = "20.0.0" @@ -4322,7 +5709,7 @@ version = "27.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e874bdf9dd3fd3242f5b7867a4eaedd545b02f29041a46d222a9d9d5caaaa5c" dependencies = [ - "bounded-collections", + "bounded-collections 0.1.9", "parity-scale-codec", "scale-info", "serde", @@ -4332,6 +5719,38 @@ dependencies = [ "sp-std", ] +[[package]] +name = "sp-weights" +version = "29.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8a9c7a1b64fa7dba38622ad1de26f0b2e595727c0e42c7b109ecb8e7120688" +dependencies = [ + "bounded-collections 0.2.0", + "parity-scale-codec", + "scale-info", + "serde", + "smallvec", + "sp-arithmetic 25.0.0", + "sp-debug-derive", + "sp-std", +] + +[[package]] +name = "sp-weights" +version = "30.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9af6c661fe3066b29f9e1d258000f402ff5cc2529a9191972d214e5871d0ba87" +dependencies = [ + "bounded-collections 0.2.0", + "parity-scale-codec", + "scale-info", + "serde", + "smallvec", + "sp-arithmetic 25.0.0", + "sp-debug-derive", + "sp-std", +] + [[package]] name = "spin" version = "0.9.8" @@ -4363,6 +5782,29 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "ssz_rs" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057291e5631f280978fa9c8009390663ca4613359fc1318e36a8c24c392f6d1f" +dependencies = [ + "bitvec", + "num-bigint", + "sha2 0.9.9", + "ssz_rs_derive", +] + +[[package]] +name = "ssz_rs_derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f07d54c4d01a1713eb363b55ba51595da15f6f1211435b71466460da022aa140" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -4400,6 +5842,19 @@ dependencies = [ "zeroize", ] +[[package]] +name = "substrate-bip39" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b564c293e6194e8b222e52436bcb99f60de72043c7f845cf6c4406db4df121" +dependencies = [ + "hmac 0.12.1", + "pbkdf2 0.12.2", + "schnorrkel 0.11.4", + "sha2 0.10.8", + "zeroize", +] + [[package]] name = "subtle" version = "2.5.0" @@ -4422,22 +5877,60 @@ dependencies = [ "hex", "impl-serde", "instant", - "jsonrpsee", + "jsonrpsee 0.21.0", "parity-scale-codec", "primitive-types", - "scale-bits", - "scale-decode", - "scale-encode", + "scale-bits 0.4.0", + "scale-decode 0.10.0", + "scale-encode 0.5.0", "scale-info", - "scale-value", + "scale-value 0.13.0", "serde", "serde_json", - "sp-core", + "sp-core 28.0.0", "sp-core-hashing", - "sp-runtime", - "subxt-lightclient", - "subxt-macro", - "subxt-metadata", + "sp-runtime 31.0.1", + "subxt-lightclient 0.34.0", + "subxt-macro 0.34.0", + "subxt-metadata 0.34.0", + "thiserror", + "tokio-util", + "tracing", + "url", +] + +[[package]] +name = "subxt" +version = "0.35.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5c287b336efcb9bab54020329c48d8cc6427e1c13dcc3b4ec20c793ff8a6926" +dependencies = [ + "async-trait", + "base58", + "blake2", + "derivative", + "either", + "frame-metadata 16.0.0", + "futures", + "hex", + "impl-serde", + "instant", + "jsonrpsee 0.22.3", + "parity-scale-codec", + "primitive-types", + "scale-bits 0.5.0", + "scale-decode 0.11.1", + "scale-encode 0.6.0", + "scale-info", + "scale-value 0.14.1", + "serde", + "serde_json", + "sp-core 31.0.0", + "sp-crypto-hashing", + "sp-runtime 34.0.0", + "subxt-lightclient 0.35.1", + "subxt-macro 0.35.1", + "subxt-metadata 0.35.1", "thiserror", "tokio-util", "tracing", @@ -4453,13 +5946,34 @@ dependencies = [ "frame-metadata 16.0.0", "heck", "hex", - "jsonrpsee", + "jsonrpsee 0.21.0", + "parity-scale-codec", + "proc-macro2", + "quote", + "scale-info", + "scale-typegen 0.1.1", + "subxt-metadata 0.34.0", + "syn 2.0.50", + "thiserror", + "tokio", +] + +[[package]] +name = "subxt-codegen" +version = "0.35.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31528ba082daea68850852ecb49e463022b47c14f8031874c73d04ce04d36d05" +dependencies = [ + "frame-metadata 16.0.0", + "heck", + "hex", + "jsonrpsee 0.22.3", "parity-scale-codec", "proc-macro2", "quote", "scale-info", - "scale-typegen", - "subxt-metadata", + "scale-typegen 0.2.1", + "subxt-metadata 0.35.1", "syn 2.0.50", "thiserror", "tokio", @@ -4482,6 +5996,23 @@ dependencies = [ "tracing", ] +[[package]] +name = "subxt-lightclient" +version = "0.35.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e4dc4cf724926d89dadeb26ecba7b8c92a3cabd04f1385ea46a927ef1508b0" +dependencies = [ + "futures", + "futures-util", + "serde", + "serde_json", + "smoldot-light", + "thiserror", + "tokio", + "tokio-stream", + "tracing", +] + [[package]] name = "subxt-macro" version = "0.34.0" @@ -4492,8 +6023,23 @@ dependencies = [ "parity-scale-codec", "proc-macro-error", "quote", - "scale-typegen", - "subxt-codegen", + "scale-typegen 0.1.1", + "subxt-codegen 0.34.0", + "syn 2.0.50", +] + +[[package]] +name = "subxt-macro" +version = "0.35.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4de9eebf532a2d28dea87e04974180842c892ca74b710cc929f3df7d3560e8" +dependencies = [ + "darling 0.20.8", + "parity-scale-codec", + "proc-macro-error", + "quote", + "scale-typegen 0.2.1", + "subxt-codegen 0.35.1", "syn 2.0.50", ] @@ -4510,6 +6056,20 @@ dependencies = [ "thiserror", ] +[[package]] +name = "subxt-metadata" +version = "0.35.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2ed94dbebe8a093c8990bfced142ac5377a1be8e5e2c8cfa5e0d7dce851289" +dependencies = [ + "derive_more", + "frame-metadata 16.0.0", + "hashbrown 0.14.3", + "parity-scale-codec", + "scale-info", + "sp-crypto-hashing", +] + [[package]] name = "syn" version = "1.0.109" @@ -4892,6 +6452,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "tt-call" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f195fd851901624eee5a58c4bb2b4f06399148fcd0ed336e6f1cb60a9881df" + [[package]] name = "twox-hash" version = "1.6.3" diff --git a/control/Cargo.toml b/control/Cargo.toml index e11961d486..dca6bf7ed9 100644 --- a/control/Cargo.toml +++ b/control/Cargo.toml @@ -3,5 +3,9 @@ resolver = "2" members = [ "runtimes/rococo", "runtimes/bridge-hub-rococo", + "runtimes/asset-hub-rococo", + "runtimes/polkadot", + "runtimes/bridge-hub-polkadot", + "runtimes/asset-hub-polkadot", "preimage", ] diff --git a/control/README.md b/control/README.md new file mode 100644 index 0000000000..2ba7f32c32 --- /dev/null +++ b/control/README.md @@ -0,0 +1,68 @@ +# Governance tools + +Tools for generating governance proposals + +## Example: Generate bridge activation preimage + +```shell +snowbridge-preimage + --bridge-hub-api ws://localhost:8001 \ + --asset-hub-api ws://localhost:8000 \ + initialize \ + --exchange-rate-numerator 1 \ + --exchange-rate-denominator 400 \ + --multiplier-numerator 4 \ + --multiplier-denominator 3 \ + --fee-per-gas 80 \ + --local-reward 0.01 \ + --remote-reward 0.0001 \ + --checkpoint initial-checkpoint.json \ + --gateway-address 0x1F98431c8aD98523631AE4a59f267346ea31F984 \ + --gateway-operating-mode normal +``` + +The preimage can be tested using the generated `chopsticks-execute-upgrade.js` script + +NOTE: Since the 1.2.0 upgrade has not executed yet on mainnet Polkadot, I tested the tool using a local zombienet or chopsticks environment. Pass the `--bridge-hub-api` the `--asset-hub-api` params to override the default API endpoints. + +## Update runtime bindings + +To generate runtime bindings that include the 1.2.0 runtime release, we need to start a local `polkadot-local` network using zombienet. + +Build polkadot executables: + +```shell +cd $WORKSPACE/polkadot-sdk +cargo build --release +cp target/release/{polkadot,polkadot-prepare-worker,polkadot-execute-worker,polkadot-parachain} $WORKDIR/ +``` + +Build the `chain-spec-generator` for production runtimes: + +```shell +cd $WORKSPACE/runtimes +cargo build -p chain-spec-generator --profile production +cp target/production/chain-spec-generator $WORKDIR/ +``` + +Create initial chainspecs: + +```shell +chain-spec-generator polkadot-local > polkadot-local.json +chain-spec-generator asset-hub-polkadot-local > asset-hub-polkadot-local.json +chain-spec-generator bridge-hub-polkadot-local > bridge-hub-polkadot-local.json +``` + +Launch zombienet: + +```shell +zombienet spawn launch-config.toml +``` + +Update bindings: + +```shell +subxt metadata --url ws://127.0.0.1:8000 -f bytes -o runtimes/polkadot/polkadot-metadata.bin +subxt metadata --url ws://127.0.0.1:8001 -f bytes -o runtimes/bridge-hub-polkadot/bridge-hub-metadata.bin +subxt metadata --url ws://127.0.0.1:8002 -f bytes -o runtimes/asset-hub-polkadot/asset-hub-metadata.bin +``` diff --git a/control/launch-config.toml b/control/launch-config.toml new file mode 100644 index 0000000000..153bf13e57 --- /dev/null +++ b/control/launch-config.toml @@ -0,0 +1,67 @@ +[settings] +node_spawn_timeout = 120 +provider = "native" +timeout = 600 + +[relaychain] +default_command = "./polkadot" +default_args = [ + "--enable-offchain-indexing=true", + "--pruning", + "archive", + "--disable-worker-version-check", + "--state-cache-size=0", +] +chain = "polkadot-local" +chain_spec_path = "./polkadot-local.json" + +[[relaychain.nodes]] +name = "alice" +args = ["--alice"] +ws_port = 8000 +validator = true + +[[relaychain.nodes]] +name = "bob" +args = ["--bob"] +validator = true + +[[relaychain.nodes]] +name = "charlie" +args = ["--charlie"] +validator = true + +[[relaychain.nodes]] +name = "dave" +args = ["--dave"] +validator = true + +## AssetHub +[[parachains]] +id = 1000 +chain_spec_path = "./asset-hub-polkadot-local.json" +cumulus_based = true +chain = "asset-hub-polkadot-local" + +[[parachains.collators]] +name = "assethub01" +command = "./polkadot-parachain" +args = ["--no-hardware-benchmarks"] +ws_port = 8001 + +## Bridge Hub +[[parachains]] +id = 1002 +chain_spec_path = "./bridge-hub-polkadot-local.json" +cumulus_based = true +chain = "bridge-hub-polkadot-local" + +[[parachains.collators]] +args = [ + "--enable-offchain-indexing=true", + "--pruning=archive", + "--no-hardware-benchmarks", +] +name = "bridgehub01" +command = "./polkadot-parachain" +ws_port = 8002 diff --git a/control/preimage/Cargo.toml b/control/preimage/Cargo.toml index 69b6994c2b..d5964414c4 100644 --- a/control/preimage/Cargo.toml +++ b/control/preimage/Cargo.toml @@ -9,22 +9,42 @@ edition = "2021" futures = "0.3.30" tokio = { version = "1.36.0", features = ["macros", "rt-multi-thread", "time"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.9.0", default-features = false, features = [ + "derive", +] } hex-literal = { version = "0.4.1" } clap = { version = "4.5.1", features = ["derive"] } hex = "0.4.3" -subxt = { version = "0.34.0", features = ["substrate-compat"] } +subxt = { version = "0.35.1", features = ["substrate-compat"] } serde = { version = "1.0.197", features = ["derive"] } sp-arithmetic = "24.0.0" alloy-primitives = "0.6.3" +snowbridge-beacon-primitives = "0.2.0" rococo-runtime = { path = "../runtimes/rococo", optional = true } bridge-hub-rococo-runtime = { path = "../runtimes/bridge-hub-rococo", optional = true } +asset-hub-rococo-runtime = { path = "../runtimes/asset-hub-rococo", optional = true } + +polkadot-runtime = { path = "../runtimes/polkadot", optional = true } +bridge-hub-polkadot-runtime = { path = "../runtimes/bridge-hub-polkadot", optional = true } +asset-hub-polkadot-runtime = { path = "../runtimes/asset-hub-polkadot", optional = true } + +serde_json = "1.0.114" +sp-crypto-hashing = "0.1.0" +handlebars = "5.1.2" [features] -default = ["rococo"] -rococo = ["rococo-runtime", "bridge-hub-rococo-runtime"] +default = ["polkadot"] +rococo = [ + "rococo-runtime", + "asset-hub-rococo-runtime", + "bridge-hub-rococo-runtime", +] kusama = [] -polkadot = [] +polkadot = [ + "polkadot-runtime", + "asset-hub-polkadot-runtime", + "bridge-hub-polkadot-runtime", +] diff --git a/control/preimage/build.rs b/control/preimage/build.rs index 100fde2adf..73f98cda43 100644 --- a/control/preimage/build.rs +++ b/control/preimage/build.rs @@ -1,5 +1,3 @@ fn main() { - // Tell Cargo that if the given file changes, to rerun this build script (i.e. recompile) - println!("cargo:rerun-if-changed=polkadot-metadata.bin"); - println!("cargo:rerun-if-changed=bridge-hub-metadata.bin"); + println!("cargo:rerun-if-changed=templates"); } diff --git a/control/preimage/snowbridge-preimage.hex b/control/preimage/snowbridge-preimage.hex new file mode 100644 index 0000000000..e69de29bb2 diff --git a/control/preimage/src/asset_hub_runtime.rs b/control/preimage/src/asset_hub_runtime.rs new file mode 100644 index 0000000000..8f6b76d607 --- /dev/null +++ b/control/preimage/src/asset_hub_runtime.rs @@ -0,0 +1,9 @@ +#[cfg(feature = "rococo")] +pub use asset_hub_polkadot_runtime::runtime_types::asset_hub_polkadot_runtime::RuntimeCall; +#[cfg(feature = "rococo")] +pub use asset_hub_rococo_runtime::*; + +#[cfg(feature = "polkadot")] +pub use asset_hub_polkadot_runtime::runtime_types::asset_hub_polkadot_runtime::RuntimeCall; +#[cfg(feature = "polkadot")] +pub use asset_hub_polkadot_runtime::*; diff --git a/control/preimage/src/bridge_hub_runtime.rs b/control/preimage/src/bridge_hub_runtime.rs index 9db0be1f3b..79406971b0 100644 --- a/control/preimage/src/bridge_hub_runtime.rs +++ b/control/preimage/src/bridge_hub_runtime.rs @@ -1,2 +1,9 @@ #[cfg(feature = "rococo")] +pub use bridge_hub_rococo_runtime::runtime_types::bridge_hub_rococo_runtime::RuntimeCall; +#[cfg(feature = "rococo")] pub use bridge_hub_rococo_runtime::*; + +#[cfg(feature = "polkadot")] +pub use bridge_hub_polkadot_runtime::runtime_types::bridge_hub_polkadot_runtime::RuntimeCall; +#[cfg(feature = "polkadot")] +pub use bridge_hub_polkadot_runtime::*; diff --git a/control/preimage/src/chopsticks.rs b/control/preimage/src/chopsticks.rs new file mode 100644 index 0000000000..af1e089cea --- /dev/null +++ b/control/preimage/src/chopsticks.rs @@ -0,0 +1,58 @@ +use codec::Encode; +use handlebars::Handlebars; +use serde::Serialize; +use sp_crypto_hashing::blake2_256; +use std::io::prelude::*; +use std::{fs::File, path::PathBuf}; + +#[derive(Clone, Serialize, Debug)] +struct TemplateData { + preimage: Preimage, +} + +impl TemplateData { + fn new(preimage: &[u8]) -> Self { + TemplateData { + preimage: preimage.into(), + } + } +} + +#[derive(Clone, Serialize, Debug)] +struct Preimage { + hash: String, + bytes: String, + size: String, +} + +impl From<&[u8]> for Preimage { + fn from(data: &[u8]) -> Self { + Preimage { + hash: as_hex_literal(&blake2_256(data)), + size: format!("{}", data.len()), + bytes: as_hex_literal(&data.to_owned().encode()), + } + } +} + +fn as_hex_literal(s: &[u8]) -> String { + format!("0x{}", hex::encode(s)) +} + +pub fn generate_chopsticks_script( + preimage: &[u8], + output_path: PathBuf, +) -> Result<(), Box> { + let mut registry = Handlebars::new(); + + // Disable HTML escaping + registry.register_escape_fn(|s| -> String { s.to_string() }); + + let template = include_str!("../templates/chopsticks-execute-upgrade.js.hbs"); + let data = TemplateData::new(preimage); + let output = registry.render_template(template, &data)?; + let mut file = File::create(output_path)?; + file.write_all(output.as_bytes())?; + + Ok(()) +} diff --git a/control/preimage/src/commands.rs b/control/preimage/src/commands.rs index 0aac14186a..a3d051820c 100644 --- a/control/preimage/src/commands.rs +++ b/control/preimage/src/commands.rs @@ -1,44 +1,164 @@ -use super::{Context, GatewayOperatingModeArg}; -use crate::helpers::wrap_calls; +use crate::bridge_hub_runtime::runtime_types::snowbridge_pallet_ethereum_client; +use crate::helpers::calculate_delivery_fee; +use crate::{ + constants::*, Context, ForceCheckpointArgs, GatewayAddressArgs, GatewayOperatingModeArgs, + GatewayOperatingModeEnum, PricingParametersArgs, UpgradeArgs, +}; +use alloy_primitives::{utils::format_units, U256}; +use codec::Encode; +use sp_arithmetic::FixedU128; +use sp_crypto_hashing::twox_128; +use std::{fs::File, io::Read}; +use subxt::utils::Static; + +type CheckpointUpdate = snowbridge_beacon_primitives::CheckpointUpdate<512>; -use alloy_primitives::{Address, Bytes, FixedBytes}; -use subxt::utils::{H160, H256}; +use crate::asset_hub_runtime::RuntimeCall as AssetHubRuntimeCall; use crate::bridge_hub_runtime::runtime_types::{ - snowbridge_core::outbound::v1::{Initializer, OperatingMode}, - bridge_hub_rococo_runtime::RuntimeCall as BridgeHubRuntimeCall, + snowbridge_core::{ + outbound::v1::{Initializer, OperatingMode}, + pricing::{PricingParameters, Rewards}, + }, snowbridge_pallet_system, }; +use crate::bridge_hub_runtime::RuntimeCall as BridgeHubRuntimeCall; -use crate::relay_runtime::runtime_types::polkadot_runtime::RuntimeCall as RelayRuntimeCall; +pub fn gateway_operating_mode(params: &GatewayOperatingModeArgs) -> BridgeHubRuntimeCall { + let mode = match params.gateway_operating_mode { + GatewayOperatingModeEnum::Normal => OperatingMode::Normal, + GatewayOperatingModeEnum::RejectingOutboundMessages => { + OperatingMode::RejectingOutboundMessages + } + }; + BridgeHubRuntimeCall::EthereumSystem( + snowbridge_pallet_system::pallet::Call::set_operating_mode { mode }, + ) +} -pub async fn gateway_operating_mode(context: &Context, mode: GatewayOperatingModeArg) -> Result> { - let mode = match mode { - GatewayOperatingModeArg::Normal => OperatingMode::Normal, - GatewayOperatingModeArg::RejectingOutboundMessages => OperatingMode::RejectingOutboundMessages, +pub fn upgrade(params: &UpgradeArgs) -> BridgeHubRuntimeCall { + let initializer = if params.initializer { + Some(( + params.initializer_params.as_ref().unwrap().clone(), + params.initializer_gas.unwrap(), + )) + } else { + None }; - let call = BridgeHubRuntimeCall::EthereumSystem(snowbridge_pallet_system::pallet::Call::set_operating_mode { mode }); - let call = wrap_calls(context, vec![call]).await?; - Ok(call) + BridgeHubRuntimeCall::EthereumSystem(snowbridge_pallet_system::pallet::Call::upgrade { + impl_address: params.logic_address.into_array().into(), + impl_code_hash: params.logic_code_hash.0.into(), + initializer: initializer.map(|(params, gas)| Initializer { + params: params.into(), + maximum_required_gas: gas, + }), + }) } -pub async fn upgrade( +pub async fn pricing_parameters( context: &Context, - logic_address: Address, - logic_code_hash: FixedBytes<32>, - initializer: Option<(Bytes, u64)>, -) -> Result> { - let call = BridgeHubRuntimeCall::EthereumSystem( - snowbridge_pallet_system::pallet::Call::upgrade { - impl_address: H160::from_slice(logic_address.as_slice()), - impl_code_hash: H256::from_slice(logic_code_hash.as_slice()), - initializer: initializer.map(|(params, gas)| Initializer { - params: params.into(), - maximum_required_gas: gas, - }), - } + params: &PricingParametersArgs, +) -> Result<(BridgeHubRuntimeCall, AssetHubRuntimeCall), Box> { + // BridgeHub parameters + let pricing_params: PricingParameters = PricingParameters { + exchange_rate: Static(FixedU128::from_rational( + params.exchange_rate_numerator.into(), + params.exchange_rate_denominator.into(), + )), + multiplier: Static(FixedU128::from_rational( + params.multiplier_numerator.into(), + params.multiplier_denominator.into(), + )), + fee_per_gas: crate::bridge_hub_runtime::runtime_types::primitive_types::U256( + params.fee_per_gas.into_limbs(), + ), + rewards: Rewards { + local: params.local_reward.to::(), + remote: crate::bridge_hub_runtime::runtime_types::primitive_types::U256( + params.remote_reward.into_limbs(), + ), + }, + }; + + let outbound_delivery_fee = + calculate_delivery_fee(&context.bridge_hub_api, &pricing_params).await?; + + let total_outbound_fee = outbound_delivery_fee.local + outbound_delivery_fee.remote; + + // Adjust outbound fee up by 10% as a buffer + let total_outbound_fee_adjusted = total_outbound_fee.saturating_add(total_outbound_fee / 10); + + eprintln!("BridgeHub:"); + eprintln!( + " ExchangeRate: {} ETH/{}", + params.exchange_rate_numerator as f64 / params.exchange_rate_denominator as f64, + POLKADOT_SYMBOL ); - let call = wrap_calls(context, vec![call]).await?; - Ok(call) + eprintln!( + " FeePerGas: {} GWEI", + format_units(params.fee_per_gas, "gwei").unwrap(), + ); + eprintln!( + " LocalReward: {} {} [{} PLANCK]", + format_units(U256::from(params.local_reward), POLKADOT_DECIMALS).unwrap(), + POLKADOT_SYMBOL, + params.local_reward, + ); + eprintln!( + " RemoteReward: {} ETH [{} WEI]", + format_units(params.remote_reward, "eth").unwrap(), + params.remote_reward + ); + eprintln!("AssetHub:"); + eprintln!( + " BaseFee: {} {}, [{} PLANCK]", + format_units(U256::from(total_outbound_fee_adjusted), POLKADOT_DECIMALS).unwrap(), + POLKADOT_SYMBOL, + total_outbound_fee_adjusted + ); + + // AssetHub parameters + let asset_hub_outbound_fee_storage_key: Vec = + twox_128(b":BridgeHubEthereumBaseFee:").to_vec(); + let asset_hub_outbound_fee_encoded: Vec = total_outbound_fee_adjusted.encode(); + + Ok(( + BridgeHubRuntimeCall::EthereumSystem( + snowbridge_pallet_system::pallet::Call::set_pricing_parameters { + params: pricing_params, + }, + ), + AssetHubRuntimeCall::System( + crate::asset_hub_runtime::runtime_types::frame_system::pallet::Call::set_storage { + items: vec![( + asset_hub_outbound_fee_storage_key, + asset_hub_outbound_fee_encoded, + )], + }, + ), + )) +} + +pub fn force_checkpoint(params: &ForceCheckpointArgs) -> BridgeHubRuntimeCall { + let mut file = File::open(params.checkpoint.clone()).expect("File not found"); + let mut data = String::new(); + file.read_to_string(&mut data) + .expect("Failed to read the file"); + let checkpoint: CheckpointUpdate = serde_json::from_str(&data).unwrap(); + BridgeHubRuntimeCall::EthereumBeaconClient( + snowbridge_pallet_ethereum_client::pallet::Call::force_checkpoint { + update: Box::new(Static(checkpoint)), + }, + ) +} + +pub fn set_gateway_address(params: &GatewayAddressArgs) -> BridgeHubRuntimeCall { + let storage_key = sp_crypto_hashing::twox_128(b":EthereumGatewayAddress:").to_vec(); + let storage_value = params.gateway_address.into_array().encode(); + BridgeHubRuntimeCall::System( + crate::bridge_hub_runtime::runtime_types::frame_system::pallet::Call::set_storage { + items: vec![(storage_key, storage_value)], + }, + ) } diff --git a/control/preimage/src/constants.rs b/control/preimage/src/constants.rs new file mode 100644 index 0000000000..90126df8d3 --- /dev/null +++ b/control/preimage/src/constants.rs @@ -0,0 +1,25 @@ +#[cfg(feature = "rococo")] +mod rococo { + pub const POLKADOT_SYMBOL: &str = "ROC"; + pub const POLKADOT_DECIMALS: u8 = 12; + pub const ASSET_HUB_ID: u32 = 1000; + pub const ASSET_HUB_API: &str = "wss://rococo-asset-hub-rpc.polkadot.io"; + pub const BRIDGE_HUB_ID: u32 = 1002; + pub const BRIDGE_HUB_API: &str = "wss://rococo-bridge-hub-rpc.polkadot.io"; +} + +#[cfg(feature = "rococo")] +pub use rococo::*; + +#[cfg(feature = "polkadot")] +mod polkadot { + pub const POLKADOT_SYMBOL: &str = "DOT"; + pub const POLKADOT_DECIMALS: u8 = 10; + pub const ASSET_HUB_ID: u32 = 1000; + pub const ASSET_HUB_API: &str = "wss://polkadot-asset-hub-rpc.polkadot.io"; + pub const BRIDGE_HUB_ID: u32 = 1002; + pub const BRIDGE_HUB_API: &str = "wss://polkadot-bridge-hub-rpc.polkadot.io"; +} + +#[cfg(feature = "polkadot")] +pub use polkadot::*; diff --git a/control/preimage/src/helpers.rs b/control/preimage/src/helpers.rs index b1c9d86e83..93516f30f7 100644 --- a/control/preimage/src/helpers.rs +++ b/control/preimage/src/helpers.rs @@ -1,55 +1,70 @@ -use subxt::{OnlineClient, PolkadotConfig}; +use bridge_hub_runtime::ethereum_system::storage::types::pricing_parameters::PricingParameters; use codec::Encode; +use subxt::{utils::H160, utils::H256, OnlineClient, PolkadotConfig}; +use crate::constants::{ASSET_HUB_ID, BRIDGE_HUB_ID}; use crate::Context; -use crate::bridge_hub_runtime::{ - self, - runtime_types::bridge_hub_rococo_runtime::RuntimeCall as BridgeHubRuntimeCall, -}; +use crate::bridge_hub_runtime::{self, RuntimeCall as BridgeHubRuntimeCall}; use crate::relay_runtime::runtime_types::{ - polkadot_runtime::RuntimeCall as RelayRuntimeCall, + pallet_xcm, sp_weights::weight_v2::Weight, + staging_xcm::v3::multilocation::MultiLocation, xcm::{ double_encoded::DoubleEncoded, v2::OriginKind, - v3::{Instruction::{self, *}, junction::Junction, junctions::Junctions, WeightLimit, MaybeErrorCode, Xcm}, - VersionedXcm, - VersionedMultiLocation + v3::{ + junction::Junction, + junctions::Junctions, + Instruction::{self, *}, + MaybeErrorCode, WeightLimit, Xcm, + }, + VersionedLocation, VersionedXcm, }, - staging_xcm::v3::multilocation::MultiLocation, - pallet_xcm }; +use crate::relay_runtime::RuntimeCall as RelayRuntimeCall; + +use crate::asset_hub_runtime::RuntimeCall as AssetHubRuntimeCall; use sp_arithmetic::helpers_128bit::multiply_by_rational_with_rounding; use sp_arithmetic::per_things::Rounding; -// Increase call weight by 10% as a buffer in case the chain is upgraded with new weights +const MAX_REF_TIME: u128 = 500_000_000_000 - 1; +const MAX_PROOF_SIZE: u128 = 3 * 1024 * 1024 - 1; + +// Increase call weight by 25% as a buffer in case the chain is upgraded with new weights // while the proposal is still in flight. pub fn increase_weight(ref_time: &mut u64, proof_size: &mut u64) { - let x = multiply_by_rational_with_rounding(*ref_time as u128, 110, 100, Rounding::Up).expect("overflow"); - let y = multiply_by_rational_with_rounding(*proof_size as u128, 110, 100, Rounding::Up).expect("overflow"); - - *ref_time = x.try_into().expect("overflow"); - *proof_size = y.try_into().expect("overflow"); + let _ref_time = multiply_by_rational_with_rounding(*ref_time as u128, 125, 100, Rounding::Up) + .expect("overflow") + .min(MAX_REF_TIME); + let _proof_size = + multiply_by_rational_with_rounding(*proof_size as u128, 125, 100, Rounding::Up) + .expect("overflow") + .min(MAX_PROOF_SIZE); + + *ref_time = _ref_time.try_into().expect("overflow"); + *proof_size = _proof_size.try_into().expect("overflow"); } -pub async fn wrap_calls(context: &Context, calls: Vec) -> Result> { +pub async fn send_xcm_bridge_hub( + context: &Context, + calls: Vec, +) -> Result> { let mut accum: Vec<(u64, u64, Vec)> = vec![]; for call in calls.iter() { - let (mut ref_time, mut proof_size) = query_weight(&context.api, call.clone()).await?; + let (mut ref_time, mut proof_size) = + query_weight_bridge_hub(&context.bridge_hub_api, call.clone()).await?; increase_weight(&mut ref_time, &mut proof_size); accum.push((ref_time, proof_size, call.encode())); } - let mut instructions: Vec = vec![ - UnpaidExecution { - weight_limit: WeightLimit::Unlimited, - check_origin: None, - }, - ]; + let mut instructions: Vec = vec![UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }]; for (ref_time, proof_size, encoded) in accum.into_iter() { instructions.append(&mut vec![ @@ -65,21 +80,67 @@ pub async fn wrap_calls(context: &Context, calls: Vec) -> ]); } - let para_id = query_para_id(&context.api).await?; + let call = RelayRuntimeCall::XcmPallet(pallet_xcm::pallet::Call::send { + dest: Box::new(VersionedLocation::V3(MultiLocation { + parents: 0, + interior: Junctions::X1(Junction::Parachain(BRIDGE_HUB_ID)), + })), + message: Box::new(VersionedXcm::V3(Xcm(instructions))), + }); + + Ok(call) +} + +pub async fn send_xcm_asset_hub( + context: &Context, + calls: Vec, +) -> Result> { + let mut accum: Vec<(u64, u64, Vec)> = vec![]; + + for call in calls.iter() { + let (mut ref_time, mut proof_size) = + query_weight_asset_hub(&context.asset_hub_api, call.clone()).await?; + increase_weight(&mut ref_time, &mut proof_size); + accum.push((ref_time, proof_size, call.encode())); + } + + let mut instructions: Vec = vec![UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }]; + + for (ref_time, proof_size, encoded) in accum.into_iter() { + instructions.append(&mut vec![ + Transact { + origin_kind: OriginKind::Superuser, + require_weight_at_most: Weight { + ref_time: ref_time, + proof_size: proof_size, + }, + call: DoubleEncoded { encoded }, + }, + ExpectTransactStatus(MaybeErrorCode::Success), + ]); + } let call = RelayRuntimeCall::XcmPallet(pallet_xcm::pallet::Call::send { - dest: Box::new(VersionedMultiLocation::V3(MultiLocation { + dest: Box::new(VersionedLocation::V3(MultiLocation { parents: 0, - interior: Junctions::X1(Junction::Parachain(para_id)), + interior: Junctions::X1(Junction::Parachain(ASSET_HUB_ID)), })), - message: Box::new(VersionedXcm::V3(Xcm(instructions))) + message: Box::new(VersionedXcm::V3(Xcm(instructions))), }); Ok(call) } -pub async fn query_weight(api: &OnlineClient, call: BridgeHubRuntimeCall) -> Result<(u64, u64), Box> { - let runtime_api_call = bridge_hub_runtime::apis().transaction_payment_call_api().query_call_info(call, 0); +pub async fn query_weight_bridge_hub( + api: &OnlineClient, + call: BridgeHubRuntimeCall, +) -> Result<(u64, u64), Box> { + let runtime_api_call = bridge_hub_runtime::apis() + .transaction_payment_call_api() + .query_call_info(call, 0); let call_info = api .runtime_api() .at_latest() @@ -89,15 +150,71 @@ pub async fn query_weight(api: &OnlineClient, call: BridgeHubRun Ok((call_info.weight.ref_time, call_info.weight.proof_size)) } -pub async fn query_para_id(api: &OnlineClient) -> Result> { - let storage_query = bridge_hub_runtime::storage().parachain_info().parachain_id(); - let bridge_hub_para_id = api - .storage() +pub async fn query_weight_asset_hub( + api: &OnlineClient, + call: AssetHubRuntimeCall, +) -> Result<(u64, u64), Box> { + let runtime_api_call = crate::asset_hub_runtime::apis() + .transaction_payment_call_api() + .query_call_info(call, 0); + let call_info = api + .runtime_api() .at_latest() .await? - .fetch(&storage_query) + .call(runtime_api_call) + .await?; + Ok((call_info.weight.ref_time, call_info.weight.proof_size)) +} + +pub fn utility_force_batch(calls: Vec) -> RelayRuntimeCall { + RelayRuntimeCall::Utility( + crate::relay_runtime::runtime_types::pallet_utility::pallet::Call::force_batch { calls }, + ) +} + +pub fn force_xcm_version() -> AssetHubRuntimeCall { + use crate::asset_hub_runtime::runtime_types::staging_xcm::v4::{ + junction::Junction::GlobalConsensus, junction::NetworkId, junctions::Junctions::X1, + location::Location, + }; + let location = Box::new(Location { + parents: 2, + interior: X1([GlobalConsensus(NetworkId::Ethereum { chain_id: 1 })]), + }); + + AssetHubRuntimeCall::PolkadotXcm( + crate::asset_hub_runtime::runtime_types::pallet_xcm::pallet::Call::force_xcm_version { + location, + version: 4, + }, + ) +} + +use bridge_hub_runtime::runtime_types::snowbridge_core::outbound::v1::AgentExecuteCommand; +use bridge_hub_runtime::runtime_types::snowbridge_core::outbound::v1::Command; +use bridge_hub_runtime::runtime_types::snowbridge_core::outbound::Fee; + +pub async fn calculate_delivery_fee( + api: &OnlineClient, + params: &PricingParameters, +) -> Result, Box> { + let command = Command::AgentExecute { + agent_id: H256::zero(), + command: AgentExecuteCommand::TransferToken { + token: H160::zero(), + recipient: H160::zero(), + amount: 0, + }, + }; + let runtime_api_call = bridge_hub_runtime::apis() + .outbound_queue_api() + .calculate_fee(command, Some(params.clone())); + let fee = api + .runtime_api() + .at_latest() .await? - .expect("parachain id not set"); + .call(runtime_api_call) + .await?; - Ok(bridge_hub_para_id.0) + Ok(fee) } diff --git a/control/preimage/src/main.rs b/control/preimage/src/main.rs index abeefe8db4..6043770004 100644 --- a/control/preimage/src/main.rs +++ b/control/preimage/src/main.rs @@ -1,151 +1,271 @@ +mod asset_hub_runtime; mod bridge_hub_runtime; -mod relay_runtime; +mod chopsticks; mod commands; +mod constants; mod helpers; +mod relay_runtime; +use alloy_primitives::{utils::parse_units, Address, Bytes, FixedBytes, U128, U256}; +use chopsticks::generate_chopsticks_script; +use clap::{Args, Parser, Subcommand, ValueEnum}; use codec::Encode; -use clap::{Parser, Subcommand, ValueEnum}; +use constants::{ASSET_HUB_API, BRIDGE_HUB_API, POLKADOT_DECIMALS, POLKADOT_SYMBOL}; +use helpers::{force_xcm_version, send_xcm_asset_hub, send_xcm_bridge_hub, utility_force_batch}; +use std::{io::Write, path::PathBuf}; use subxt::{OnlineClient, PolkadotConfig}; -use std::io::Write; -use alloy_primitives::{Address, Bytes, FixedBytes}; #[derive(Debug, Parser)] -#[command(name = "snowbridge-control", version, about, long_about = None)] +#[command(name = "snowbridge-preimage", version, about, long_about = None)] struct Cli { /// Output format of preimage #[arg(long, value_enum, default_value_t=Format::Hex)] format: Format, + #[command(flatten)] + api_endpoints: ApiEndpoints, + #[command(subcommand)] command: Command, } #[derive(Debug, Subcommand)] pub enum Command { - /// Change the gateway operating mode - GatewayOperatingMode { - /// Operating mode - #[arg(value_enum)] - mode: GatewayOperatingModeArg, - }, + /// Initialize the bridge + Initialize(InitializeArgs), /// Upgrade the Gateway contract - Upgrade { + Upgrade(UpgradeArgs), + /// Change the gateway operating mode + GatewayOperatingMode(GatewayOperatingModeArgs), + /// Set pricing parameters + PricingParameters(PricingParametersArgs), + /// Set the checkpoint for the beacon light client + ForceCheckpoint(ForceCheckpointArgs), +} - /// Address of the logic contract - #[arg(long, value_name = "ADDRESS", value_parser=parse_eth_address)] - logic_address: Address, +#[derive(Debug, Args)] +pub struct InitializeArgs { + #[command(flatten)] + gateway_operating_mode: GatewayOperatingModeArgs, + #[command(flatten)] + pricing_parameters: PricingParametersArgs, + #[command(flatten)] + force_checkpoint: ForceCheckpointArgs, + #[command(flatten)] + gateway_address: GatewayAddressArgs, +} - /// Hash of the code in the logic contract - #[arg(long, value_name = "HASH", value_parser=parse_hex_bytes32)] - logic_code_hash: FixedBytes<32>, +#[derive(Debug, Args)] +pub struct UpgradeArgs { + /// Address of the logic contract + #[arg(long, value_name = "ADDRESS", value_parser=parse_eth_address)] + logic_address: Address, - /// Initialize the logic contract - #[arg(long, requires_all=["initializer_params", "initializer_gas"])] - initializer: bool, + /// Hash of the code in the logic contract + #[arg(long, value_name = "HASH", value_parser=parse_hex_bytes32)] + logic_code_hash: FixedBytes<32>, - /// ABI-encoded params to pass to initializer - #[arg(long, requires = "initializer", value_name = "BYTES", value_parser=parse_hex_bytes)] - initializer_params: Option, + /// Initialize the logic contract + #[arg(long, requires_all=["initializer_params", "initializer_gas"])] + initializer: bool, - /// Maximum gas required by the initializer - #[arg(long, requires = "initializer", value_name = "GAS")] - initializer_gas: Option, - } + /// ABI-encoded params to pass to initializer + #[arg(long, requires = "initializer", value_name = "BYTES", value_parser=parse_hex_bytes)] + initializer_params: Option, + + /// Maximum gas required by the initializer + #[arg(long, requires = "initializer", value_name = "GAS")] + initializer_gas: Option, +} + +#[derive(Debug, Args)] +pub struct GatewayOperatingModeArgs { + /// Operating mode + #[arg(long, value_enum)] + gateway_operating_mode: GatewayOperatingModeEnum, +} + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, ValueEnum)] +pub enum GatewayOperatingModeEnum { + Normal, + RejectingOutboundMessages, +} + +#[derive(Debug, Args)] +pub struct GatewayAddressArgs { + /// Address of the contract on Ethereum + #[arg(long, value_name = "ADDRESS")] + pub gateway_address: Address, +} + +#[derive(Debug, Args)] +pub struct ForceCheckpointArgs { + /// Path to JSON file containing checkpoint + #[arg(long, value_name = "FILE")] + pub checkpoint: PathBuf, +} + +#[derive(Debug, Args)] +pub struct PricingParametersArgs { + /// Numerator for ETH/DOT Exchange rate + /// + /// For example, if the exchange rate is 1/400 (exchange 1 ETH for 400 DOT), then NUMERATOR should be 1. + #[arg(long, value_name = "UINT")] + pub exchange_rate_numerator: u64, + /// Denominator for ETH/DOT Exchange rate + /// + /// For example, if the exchange rate is 1/400 (exchange 1 ETH for 400 DOT), then DENOMINATOR should be 400. + #[arg(long, value_name = "UINT")] + pub exchange_rate_denominator: u64, + /// Numerator for Multiplier + /// + /// For example, if the multiplier is 4/3, then NUMERATOR should be 4. + #[arg(long, value_name = "UINT")] + pub multiplier_numerator: u64, + /// Denominator for Multiplier + /// + /// For example, if the multiplier is 4/3, then DENOMINATOR should be 3. + #[arg(long, value_name = "UINT")] + pub multiplier_denominator: u64, + /// Ether fee per unit of gas + #[arg(long, value_name = "GWEI", value_parser = parse_units_gwei)] + pub fee_per_gas: U256, + /// Relayer reward for delivering messages to Polkadot + #[arg(long, value_name = POLKADOT_SYMBOL, value_parser = parse_units_polkadot)] + pub local_reward: U128, + /// Relayer reward for delivering messages to Ethereum + #[arg(long, value_name = "ETHER", value_parser = parse_units_eth)] + pub remote_reward: U256, +} + +#[derive(Debug, Args)] +pub struct ApiEndpoints { + #[arg(long, value_name = "URL")] + bridge_hub_api: Option, + + #[arg(long, value_name = "URL")] + asset_hub_api: Option, } fn parse_eth_address(v: &str) -> Result { - Address::parse_checksummed(v, None).map_err(|_| { - "invalid ethereum address".to_owned() - }) + Address::parse_checksummed(v, None).map_err(|_| "invalid ethereum address".to_owned()) } fn parse_hex_bytes32(v: &str) -> Result, String> { - v.parse::>().map_err(|_| { - "invalid 32-byte hex value".to_owned() - }) + v.parse::>() + .map_err(|_| "invalid 32-byte hex value".to_owned()) } fn parse_hex_bytes(v: &str) -> Result { - v.parse::().map_err(|_| { - "invalid hex value".to_owned() - }) + v.parse::() + .map_err(|_| "invalid hex value".to_owned()) } +fn parse_units_polkadot(v: &str) -> Result { + let amount = parse_units(v, POLKADOT_DECIMALS).map_err(|e| format!("{e}"))?; + let amount: U256 = amount.into(); + let amount: U128 = amount.to::(); + Ok(amount) +} -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, ValueEnum)] -pub enum Format { - Hex, - Binary, +fn parse_units_gwei(v: &str) -> Result { + let amount = parse_units(v, "gwei").map_err(|e| format!("{e}"))?; + Ok(amount.into()) } -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, ValueEnum)] -pub enum GatewayOperatingModeArg { - Normal, - RejectingOutboundMessages, +fn parse_units_eth(v: &str) -> Result { + let amount = parse_units(v, "ether").map_err(|e| format!("{e}"))?; + Ok(amount.into()) } -struct StaticConfig<'a> { - api: &'a str, +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, ValueEnum)] +pub enum Format { + Hex, + Binary, } struct Context { - api: Box>, + bridge_hub_api: Box>, + asset_hub_api: Box>, } -#[cfg(feature = "rococo")] -static CONFIG: StaticConfig<'static> = StaticConfig { - api: "wss://rococo-bridge-hub-rpc.polkadot.io", -}; - -#[cfg(feature = "kusama")] -static CONFIG: StaticConfig<'static> = StaticConfig { - api: "wss://kusama-bridge-hub-rpc.polkadot.io", -}; - -#[cfg(feature = "polkadot")] -static CONFIG: StaticConfig<'static> = StaticConfig { - api: "wss://polkadot-bridge-hub-rpc.polkadot.io", -}; - #[tokio::main] -async fn main() -> Result<(), Box> { +async fn main() { + if let Err(err) = run().await { + eprintln!("{err}"); + } +} + +async fn run() -> Result<(), Box> { let cli = Cli::parse(); - let api: OnlineClient = OnlineClient::from_url(CONFIG.api) - .await - .expect("can not connect to bridgehub"); + let bridge_hub_api: OnlineClient = OnlineClient::from_url( + cli.api_endpoints + .bridge_hub_api + .unwrap_or(BRIDGE_HUB_API.to_owned()), + ) + .await?; + + let asset_hub_api: OnlineClient = OnlineClient::from_url( + cli.api_endpoints + .asset_hub_api + .unwrap_or(ASSET_HUB_API.to_owned()), + ) + .await?; let context = Context { - api: Box::new(api) + bridge_hub_api: Box::new(bridge_hub_api), + asset_hub_api: Box::new(asset_hub_api), }; let call = match &cli.command { - Command::GatewayOperatingMode { mode } => { - commands::gateway_operating_mode(&context, *mode).await? - }, - Command::Upgrade { logic_address, logic_code_hash, initializer, initializer_params, initializer_gas} => { - let initializer = if *initializer { - Some((initializer_params.as_ref().unwrap().clone(), initializer_gas.unwrap())) - } else { - None - }; - commands::upgrade( + Command::ForceCheckpoint(params) => { + let call = commands::force_checkpoint(params); + send_xcm_bridge_hub(&context, vec![call]).await? + } + Command::Initialize(params) => { + let (set_pricing_parameters, set_ethereum_fee) = + commands::pricing_parameters(&context, ¶ms.pricing_parameters).await?; + let call1 = send_xcm_bridge_hub( &context, - *logic_address, - *logic_code_hash, - initializer - ).await? + vec![ + commands::set_gateway_address(¶ms.gateway_address), + set_pricing_parameters, + commands::force_checkpoint(¶ms.force_checkpoint), + ], + ) + .await?; + let call2 = + send_xcm_asset_hub(&context, vec![force_xcm_version(), set_ethereum_fee]).await?; + utility_force_batch(vec![call1, call2]) + } + Command::GatewayOperatingMode(params) => { + let call = commands::gateway_operating_mode(params); + send_xcm_bridge_hub(&context, vec![call]).await? + } + Command::Upgrade(params) => { + let call = commands::upgrade(params); + send_xcm_bridge_hub(&context, vec![call]).await? + } + Command::PricingParameters(params) => { + let (set_pricing_parameters, set_ethereum_fee) = + commands::pricing_parameters(&context, params).await?; + let call1 = send_xcm_bridge_hub(&context, vec![set_pricing_parameters]).await?; + let call2 = send_xcm_asset_hub(&context, vec![set_ethereum_fee]).await?; + utility_force_batch(vec![call1, call2]) } }; let preimage = call.encode(); + generate_chopsticks_script(&preimage, "chopsticks-execute-upgrade.js".into())?; + match cli.format { Format::Hex => { println!("0x{}", hex::encode(preimage)); - }, + } Format::Binary => { - std::io::stdout().write_all(&preimage).expect("write stdout"); + std::io::stdout().write_all(&preimage)?; } } diff --git a/control/preimage/src/relay_runtime.rs b/control/preimage/src/relay_runtime.rs index 95739b3357..9805d49ca8 100644 --- a/control/preimage/src/relay_runtime.rs +++ b/control/preimage/src/relay_runtime.rs @@ -1,2 +1,9 @@ #[cfg(feature = "rococo")] pub use rococo_runtime::*; +#[cfg(feature = "rococo")] +pub use rococo_runtime::runtime_types::rococo_runtime::RuntimeCall; + +#[cfg(feature = "polkadot")] +pub use polkadot_runtime::*; +#[cfg(feature = "polkadot")] +pub use polkadot_runtime::runtime_types::polkadot_runtime::RuntimeCall; diff --git a/control/preimage/templates/chopsticks-execute-upgrade.js.hbs b/control/preimage/templates/chopsticks-execute-upgrade.js.hbs new file mode 100644 index 0000000000..fe85354876 --- /dev/null +++ b/control/preimage/templates/chopsticks-execute-upgrade.js.hbs @@ -0,0 +1,44 @@ +/* eslint-disable no-use-before-define */ + +let blockNumber = (await api.rpc.chain.getHeader()).number.toNumber(); + +let storage = { + Preimage: { + PreimageFor: [[[["{{preimage.hash}}", {{preimage.size}}]], "{{preimage.bytes}}"]], + StatusFor: [ + [ + [preimage.hash], + { + Requested: { + count: 1, + len: {{preimage.size}}, + }, + }, + ], + ], + }, + Scheduler: { + Agenda: [ + [ + [blockNumber + 1], + [ + { + call: { + Lookup: { + hash: "{{preimage.hash}}", + len: {{preimage.size}}, + }, + }, + origin: { + system: "Root", + }, + }, + ], + ], + ], + }, +}; + +await api.rpc("dev_setStorage", storage); + +await api.rpc("dev_newBlock", { count: 2 }); diff --git a/control/runtimes/asset-hub-polkadot/Cargo.toml b/control/runtimes/asset-hub-polkadot/Cargo.toml new file mode 100644 index 0000000000..6b440e09e7 --- /dev/null +++ b/control/runtimes/asset-hub-polkadot/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "asset-hub-polkadot-runtime" +version = "0.1.0" +edition = "2021" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +scale-info = { version = "2.9.0", default-features = false, features = [ + "derive", +] } +serde = { version = "1.0.197", features = ["derive"] } +subxt = { version = "0.35.1", features = ["substrate-compat"] } +sp-arithmetic = "24.0.0" diff --git a/control/runtimes/asset-hub-polkadot/asset-hub-metadata.bin b/control/runtimes/asset-hub-polkadot/asset-hub-metadata.bin new file mode 100644 index 0000000000000000000000000000000000000000..00eadf3a81ddb01909815b49c8f12b6cb33f60e3 GIT binary patch literal 187738 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�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 Hw=DSu>dIx) literal 0 HcmV?d00001 diff --git a/control/runtimes/asset-hub-rococo/build.rs b/control/runtimes/asset-hub-rococo/build.rs new file mode 100644 index 0000000000..1aaec9dcb5 --- /dev/null +++ b/control/runtimes/asset-hub-rococo/build.rs @@ -0,0 +1,3 @@ +fn main() { + println!("cargo:rerun-if-changed=asset-hub-metadata.bin"); +} diff --git a/control/runtimes/asset-hub-rococo/src/lib.rs b/control/runtimes/asset-hub-rococo/src/lib.rs new file mode 100644 index 0000000000..db14278410 --- /dev/null +++ b/control/runtimes/asset-hub-rococo/src/lib.rs @@ -0,0 +1,7 @@ +#[subxt::subxt( + runtime_metadata_path = "asset-hub-metadata.bin", + derive_for_all_types = "Clone" +)] +mod runtime {} + +pub use runtime::*; diff --git a/control/runtimes/bridge-hub-polkadot/Cargo.toml b/control/runtimes/bridge-hub-polkadot/Cargo.toml new file mode 100644 index 0000000000..714b1c1f9b --- /dev/null +++ b/control/runtimes/bridge-hub-polkadot/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "bridge-hub-polkadot-runtime" +version = "0.1.0" +edition = "2021" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +scale-info = { version = "2.9.0", default-features = false, features = [ + "derive", +] } +serde = { version = "1.0.197", features = ["derive"] } +subxt = { version = "0.35.1", features = ["substrate-compat"] } +snowbridge-beacon-primitives = "0.2.0" +sp-arithmetic = "24.0.0" diff --git a/control/runtimes/bridge-hub-polkadot/bridge-hub-metadata.bin b/control/runtimes/bridge-hub-polkadot/bridge-hub-metadata.bin new file mode 100644 index 0000000000000000000000000000000000000000..3d9098f4605dc6b0af6a76363f27c4ef3ecd9c95 GIT binary patch literal 336524 zcmeEv4`^K1neRC>cbsuLX~(V7D!a<=&91UL-Zz<*?Qx#sRf1&8uC$eG*^(1w*I_i8 zxss+H%}nOb*j7m)g%(;!Ab}KGNTG!k5@>l1G>}39DYVc)3tQMi16ycd16ycd11)S} z3-9-R=bSs|{uxPj?6z-T-pkgbd(ZvOzwdnizwc~&z3N9UW<_qy?^J5-t~Xli?sR(X z;!Lg9?zejL^f9_BIgL~}gWAvv;yF!R8{=dkiMJ_wB(XDQK6@SO?dE3Fa zt&MheCkrutkOVvQg@mjm(_qV;SpO@|hZ{rkokH?*E`%0r8 zeO&bW8yk&U!)x`z?eleXFe2^lgveu<88MQZ>QtLeuUA>GHmm5|AL;FMJl}5XjGa{P zY%6$LG(MciPTv;z}ztd@Vdv3kqcdEVG*7TCsoz=fjHLJewI4g2o$EC9(WU<}xy47Bz-7-(cx2r8IQoFmuEyQ@PfW5!!H8!_;{jgBm4xr zOtapo^cve@qn1fPIbDC?MAP0#jEfV=jVy=KsdAV9|_skwmm?07jAy-D1`Pe&RMRsgDaN-0HXG%8* zTrss&?N)1B)ke#F^Mrh@*5B?o`+h|q&W>rK$w>^16s|s`z9T*_pNJglSo_<>+)B6F z@~bsE220f)T2x0oC12EE;)t5J7zDqL0r`*sqBNUyZkD~K$DkbXjC?`EsOgs#-@J{1 zxKoTRd%lk`IN~dEMStk4N4mB6xENopZFkQ1y}sv&=j98L)wzb3mB;CA4E|q;;*#Df zfN;du<(BRPAH`b#r6`0hu>lfvPRR!%{RHUm@6nar@OG=avRJaaTLgYpK}#L6n39Jhoo(xvdvrBu7W8xbL*lqt zI!zSJ>u=Au*1@jp8fza<$=Cc=`>I}jy+RGuW(e{wi4_CvT)$^S`)o?S5r@{+jfQ|b zKN#CduL{xPRFh-{M|>_Ne-MY}>3LLY+$^#j4~Yw6(u~d!t}mqI*W-Yc1Qh#zSxo4C z&`b1END+v zCst0J2xL_-$E_K+&0g$)uGGDmes8PY zg*XM!5QOVsykR)9T-)+$mn&C5;lMzy$^3e|-4q8f-xijLf$(Ij0i=@CVH9yU+Fcj; z?JCUG1go?wvBH^J!=V4Q)%R%<36#!4h|y>@TAR>~ zif7wPMrRQjF}>1mV+K2>sSlBIWTk!CgA~w|1^%Vr-6je%-9~R~+v_!Ij_Am#!Jn!{ zR+KGCrrLBwPuj9gwW-=26yv9_ZB_fw#_HmBF#2}4+wYL{BR(XG7hBaUICs_crYCY@ z@SyIstQ;=RtX3A!&0btM zT{(T>!nq5T(`Qeen>{^SS)Tu=)6g56He7q=vM_xH?8CQ5hD|xwYVMe&#HLJ~^f1Il ztn+q%8~dU+?GztxkropdTbIFgS~I@y^{^46XIL-89$?D8(w;EE17ce3w)$|c-K>k- zL>WtP`WjAUo!2ER#!fcdHJo*EP>4>p3>BpsY)))rWN!Q-(Sr>P5a{Hd!#U;OQcTV^ zu0Wh=w@&W-lhk~S7KR|i*xB|1i8qAP*Pvtx@kH*4i0l;z z1X^&8Gm6o*hpWv7vM_hEX-CTC_O|ENb$i#yPgu$;o?6SU z{?-L?bFYFi;jycG0%NF0`@%V(K@fu|Y8}0gzbvBc*0&$8Y_e|T5{%vTpc^z!sgIo4wED#WG>G$mZDJ*>Jull)`_!1ld}Z`En;9J zdt0tgdrx1x+RjvRXF-Y=+J0}B{zj|YWbq33B(o37NLLUc+Q2#Y>Q>tidf=snLG8ZJ zfW)}#{T{Fhq{uyetpOeY%SyF5>vh_GqgT8J6Ba2`*y#o)0pX+%*%7uMx7h}gyUbuV zyl#%HU+wLfgp=)ov4*8CnK<^8vtVE;snWxlD;4x2E_+yv93~M1hHlB|W-mC4b$T&1 z7GZ`vF04>JlFF1#ZV0@@!QnXY5w(FD+n!rcD@@Z@`v`nBFAtXr7hC3!>*+D${706Q*8J0tge08m8kj zL9hm7&W=m=!_t_>-s@TL+nk^Cf~#}IXj4~b0H>$ml{QOCG9DOzTu83|;gb6ZPI0|k zy?Q;pWu3d#dRg5OH6S=G>>^N!mdp^1-TEI}hI9>1dp+GBG(5-Z-cX8NI^S;i>mHa= zquo7R8ii;D#JZktZ+D)LuJJYl!NvjsKwZqnkDlyz!KtqY_=n=a*BOXfP7C<>a^EM> z?fT&7oI7J%1~ae%6z#(;GIj7thsd zA|#C@lKEk0Z6;W0MszK@)JvoDzTYPaC6Nk##JNwdw0k&^4KyQj6@T4m5kG@;K{R$v zVbogDWhO^_qe?&PSPyJ5mP1pBdTAW%P$TtVSburv-lYEO-d_FHz4cgcqYEsbU(cE! za@JxrSV{RM_hL)^x*m8Rb+%&g`WjA2s~^_`?_&w$!|8={sWiH>Rb_!C2?3IKcO(H? zkD-(nc-ILxXw%QMyEQ&KP=&&bSLR?$2|v2i`4&rRAqdJ;14Bd2W6KeV;;l`v`#r_F zFOG!WTca?>H+nvt63~$SJP1^+d{VjOG-rb7cLq$6)GXi|d*ev-dn#wF-GC4^=ZB;~ zwwXD$-gUT3bV7n!+k2It z$-%76uFtriBEB|-Y1rE4TUYu`_~J+%CVOJT{`)yO%f2GZ_6GNk)5Ldf=tJlbP%)s7 zmuBtfGc;F+R+bf~N~0bV1D&3-ej@E!fXtej%B7SAZ#}10rdE#n3d9EG=Q^ zv!34oVS{y`PD(OOn`9(x&!qj-Es06!mfQi&oz_!Bt?itIJmkpY zI{v9B+8RY5$7vF14XC!`QriI7q=wYom!t4!z<&NM=|WCp9TUMQmVy_0F{aH)zu`5R zDjWuDEf^D1gGOkUN)q9Uc1}j6(%i+C2Lo;mGlE>up{Ne{X%a@^!hPP|0naJQF}UNp zI|%tm(p0YMv_CIt|tlPy@Q=n#=mtdC;#qT~-~ z_qboC<1G&cVhcjig)|-c5>EiG>elFS= z-$4KmHwe#|W0`oS_ecu3QnME6>|-*r5P{GUtO)2fjSWgdeMc$L)yp(NHh-=4s+YZr zS;jS57LoxP{*x^-qZkrIYuP{u7o!G9X|q|P(~U<&z7t10p%I#oxAs63=u1UO)Ds8N z*S;p87LBLD(gP24=m4<@FR~HbI6$$~v^3nnXqLO=mO?L)LXGn z44!3NHLZVFCl$Mi^P{IkEVW06s;lC)0#~NmJKz{BnWY7_*t0qoj$L5y2ZIiP0pBXl+)UMVK~)80&ZkU?m*%u zZh&oyF~sR18Qf_<)gWL<*HjIxk{%mc2#1j8Uz9XK#Y9+;F#}Tc$Mi-1WTLPExg;-s zRau;h%1u`s0PeM$Snd#g2F<|G`xtWRQgpo@R#61|XO9QR&fmatn3=`aB@m+*B^k~T zo)kOjovsI~WZwrhfS657M);(VZugZci5bb97`W6AL;|+}=N9Z+SVFTq!6;la2y%$P z9~Shih&wQKQ5p*5Z!z`b)vmIy7$3lVO2WC?J7U9N!iSkX)X5Ce#XNxN)IFgC{4gZX z?K~=3KN#$yaRb)7ZPF4-F5(7YcyKqN+;&@Ro+INb;*a6cfh2|r!eh7&-Czf8n5d9J zZmi|8t0j;ER=|*3P9g`o-TBc4Bj*^@)AEmn=2gY(jJ{Q754#WV4h<8IA~Z$Niwg2h zJc^?T7x8+&CnfB!kHPkUU-0*2Q|XjeG=x)ZVq$s;ks&`^ zxExh{A}^jgiEOO<+q*jXMq#Z!N2`w!&gUAP;M; zjYU-P%N6WDbxcw;9@S~nAm|m~c5dlIfCl6mKTO-p<{yyR(xqh+zYv-|?CAkMhXraq z*zlz9fNn)22!bJkIkAc!oQz=W)l`9rO0;El38>%O0!nW}2yVTBc%wFmS)&$S4<=R! zG$-`6aTazKlJRy{pt^ZIXbN>=a$s?$@6asNiHgXrBg{}=lrDCYdA;~B8{Cx7+Q89L z`xc>YFiX92et+GsbsOxmX4a+;oZG&t4-qhqdwIg_5uIBQp@G1Ph^3F8wkVV z&=2&-6&bch{2E+$?Qltp zfC%0tqtp8o0YC1%kt_lt%$RLjYN)mpXm)MDbKx+fpb3}?uP9y{7JWY9d|ufN^;@$2 zDsJs==uh{yslJdeB2ETY&CSZS+IIFzS$iwTjGw4jB>CNlCqE+&^?LGdUOTdmF~#Kc+T)GjuBwiO_IbU{-pg+=(7R{buqr2Bq^ z6jQP|a^Ufwi6T0|Bo#XSIpVxMXpqP@P8hHu6m2h9}iWxU^sj3~=fmp1Kar;wAhmv2d{k^{9>@VGs&EVDZ;tPA!@p)$E9Y zsd60Q*3~Wv4&q+1pxRmfU%Cp92*|077>4h$Fr$=VrRKsed+b{=q%+ z7~B_ldDIapi}w;#Ki#bctNEM6Ou?xNgRm zOcJLfUQ}wVMFxUG|6w+1Wtc&#Kb2lUAfw1*QFzV ztdq7gqM%=(Lon#3*V^oDY24!sb$fD1F{Vt1Q(FzrL>OOc_5l)!lK7xe{}(xWvRx-1 zmCOT)d;cn3`Wp+}!_G{7vIzrFlafm~huIN7kmJEZQtrZQNX*WQH|*%?AH<@kf56ex zKNz~V7D!nfKeem6`nuI*SVv!GK0=?h2iQ>ryJeQ3Y5??&5 zQt&6b#+po<{!W6SA=##d92xN=p!f)#Y4KyM*r@my!(;;l5B8yu2XF16?bu?w)woPK z+_Q3wQ((%E;pC5KbkLZe63E73?i zaYfAQ2KLm$;hdbQQ$Uap`xgo17$d^85uw-b?$8$hYiy_k6p;9tMSuiN<7f8rO&6x#hJ7ZK5N;6qNH z+!JtPi~o|)O=^%$u$FzE^Ax>$2+>Rbg;0k77XKanzG$`8aO4|hBb>0n;s{I976SP# zEMM_E%^e|_+Kr@G)n->CZ)tmIs8vdo&-dY<20ZpWpfCohy5zbp3|!Yk9J#P(!a1mX zYXe3r#|Q%WY@+&|*7;=!|L4JjbXD0bYt0XlOE~;gd!yRjv2_kdEU{#TkL?A3Zzc{S zPk{jT$C4yk%lnU`z`%f)(8H8pr2-#weO}7KIgTv&6#hag2kC2w(9$!lRC|?e*jKF? z=W)`Si&8Gkw)>EnPD2KVMOAG(j#+)KyWOGqETC%3Ya;isr4?3;oXme-*BppxT2T{~ zK*cZ2iwSyBt9Gh2P;LG2HnBjEHCXT;PsLh{!%NfXP%^S^h*}O-!&At@fFPNZ<2dlh z+kkt-^b#3O4A4PQJk|87U9~)*X=TX3HOxRgaKv{cJZJD9K<)`-Bjf`jsldpIjyMlv zWeDjwUpOZwG$M!b;-W;Q6~d4+jV1si!ea<>+#wb;fJEGg!Pyf*J}k%s+;`YM?xdNum9SfP0Kr+S5ZbXFI^$7|^ko(VF7gm~gduu8#yS@iyZEcS#e~xN%vnsNzo_7$TJc&q;$A72v~XNN zW?|9g=LnAaOO!WY719t%6&vk{2c?``Bx@_TJOxSzovp|RTIrWaAKd12=1L3NrB&!= zUkG)NnT7&}Do!B6-Zev^@==(>`YP5S$#|9R>Zb?fZ3-ezML%!ACaHn`l~_`kADwD4 z%Kx=kU~CGv7UNd*zuGig@TwfBEcX&Qq4TA!2)RH%3CYtT<82Z-jqbU{%~x-;pYgMD1v2BS=RL_jH&} zG6Vv@r#?*hXf!^)zvI(PCIe){d&mX-bfZ_H&@ak$GGz6C2^U9xg-Q#BwS=NR?)*yJ z2d%K#sQPA4>^YTa&&X715vpAYlbldR651>uB%ZLphoXaGWMM0wS}EfQhLo6rkU?T1 zZvaHY40PYrK`9On`BallQVSdPJER=r4@qUqfleL*{Y19)W@DYp-w1KX5HP`K7=pbJ z;?R%}LSSXqRlQKD0;7pS>qegJ;Q5_WDl44PWhr&y&LQBVEk`-Y9p+Nleng<cue_PaMkv0NMX8 z43(w)EIz?cRCR+UbdQWm>_MmyYFp*clFbsDDenjrR-2Ou)Hl<zi8KCEJDKrUXiY zu@4s|zT_l4=wA2431i?&qx2G+?|c%M9C05?5S=6=r&lLDQt#+h5iuRttfpkqL4^QS z(aj7Zfrw-J_exubKP+QP{9!B#{-b}KZ2m0n`#Sio^9pBz9&9W`s(XTf$BycTRcHgnkD z7b78tF#?7WunE*SqqtnnG{o`io_khJy*!xt16at^5ec4})Asf#Yn8b%U2uoagJ#+@ zQa%-*yxC)Jq~1N z2wN1O1gm&Uo7sSdNXf(rfd`}uqYmldIPzjqftswdCRXv3Dpn3DW)wS*lRsu&4odMs zH;Eqg1XTs)?uLe$C#uhhda}4UgeHd7ovaHZ4Jm3MxfW#+BL4`Cd5(Bg%5nO|)Q1k| zqeH;jt@61UrdcES=iEjzPk9WHR0P=OD-!i%nlJ?-R+h{S`Y4d`li=v*xkMI~2rgtL z!tOmbWbE;Q3^)_OH>aW8qgYwLc7Yg`F#0DI=GSZ5^P0fTK-nM+;ne zu1ar;HdM6Q=4iIs)Zj75O9IC>tsc#a(6jJg>@~@SpY8S+J5utywb<<)ds;?zYq9@#?3fwdfBXHn zWUtQH{@dSZOLh>sH~RIBeg~88=K`z>?C=AvO^#oOqv;Dk*MVn*4xcSw?&4vJe7HZ? zQskqX>{D{Ymmp$2;#Dt4Bn@%|^)4PeI(6(QY}&hfmY#-`7ji8Np&(jS&~-c65G?kfP;wzzMAVC?jPER z^K3Bm!4~|#U1Bml5XM|>kmhWG}_5Z{#In@JGjGQ>+!8RGj<8RDfRK*=)1w|AEz!X#6CJ1P<$ zyHR1{<*+dEaxmikgkZdqAV`FsiO^qKkO(~sw+R2G1&MvP4}Yx%i5vVn3`+|VHw9K0 zvKAz60pxH$T9CNq{e*jkAn{6oQAvWt^+c?E4=%Fz6|yn}!2Se_As^pl0pkxGwDNjL zHbY3m_d=!#ypGoUdmS_q|GggHRa;j19~!Ij{b1HMYq@TA`@pWDv}p%KjkMi)Yf^$=}1-j4JI4F|<@EqBP5MK!F1F zHzu=Z36Y=5+*)LLgIfgRi(D+j)k%pI%3TK;szVuV9y{+StFA-E?vc^SjY_D1NnSnZ zDHJ`oiTh??sNeLIF^p=?a@op?yA61i;wKn2Yv14-o~L(o7rkOqd-J<;Rj zIh{DFDnB5H&Vy$i<0?&=fN?XUv~w+KMkaEcask!k2Gs@B7=`1!82*yXvdX7zaySMn zGiO$200x0!?9MHso@?;sJUMu&o@*F1GUVdWt#w;f;0JKb3J&e!K#mKGdBIL5cd@@! ztp}?*7=d1;+f>!xK|k?%P)ds~h+mr2t4&_z7K(#soi}JDYU)qIIOLrmUlTz)z#WPw z4AO}W5^`7$oMx2d0Cy?X;z4~3E;^x$NgZ^WoB@G4cU>gXPyqq%fHSyDdOrGkj?g)TTW$IzIa@fGhzg5S@i?`wdOmuXvFiZ@N-OZE zv~H#>0FJAvRb&QHvlx(HD${jEgVCf>FLZ{I z!Z%Ua3I2m^?wAwMlfV+7!AP0-24gG`xwhRhCvoRZGB|<1mP9>IifY!`ypE%Fc@UV+y8* z+U2txSPeM?E?Rg}uXnsS3Nyhsv9TiOODzqk4+^mOpjuSVEEv9#AV&UZ!yk@zDd+j! zXJ!PL(yZAH4xb|~=-jTR{jrmZ;VB>gzJx_YIKXUnIIQgZ*Z{#3j&&&<3^?2s)niW^x@L&5KZH!Y-IX^M^)c11f@$5OQoAf zj+6713+iGfQzaMzB`UjNvfzG*0R(3yNF@sLr5`?0h*5l~)x#}axNp#Z7vXWLGhaKN zkrjdG&bJKQC@52i89Y{lDiIAM;G=RJCEgV{2gy?O%vJRnOTzh215q^|)OoNfv`|*9 zuHj`87ZKQxO9%=I8f9w^UyJ8W4|-r~Efn>@iB$ap0j_&7UNwLTR!|~F&x127xx~`- ztcP@-QBxYM1E-Yg;-y`+tEB~n11f1Ds3bWI8D22s9JTkh!<;yA-tck7dvZ{Z<#kYmda6(_yU_4aDitN5{KOm6NQR$*}mZvH{a#V z&4ilNBTbqv#S2k-NM?MIhO?!Q^-08#o}tqIbcfX(>H>06E|ve4muq@n7K@o$DZ29y zIbTZ&Q+mkih3e!X=QpHn=~l=g-9U+Z-)|!o1}cy)i?GWag!8DRg|cSH z*r(?>AU2xD7>H^KlxCvLEox!;(11>C?JZQxRCWr8q#!ArpHov)yVl#GNoULEFC=ZX zH)JN&G!I~h3X0#r$=t);aq>7EDRNS6Rd1&Pp|-t|Ny#t}A=j|0ba7emJ)#jAz)VU$ zr48x3bVKpCsa$mQl)roUq>9nF?;c9@Fo`AKsPH zLCE(bwNu=M$jkIJC^bTmcjvg>kg9$Gtl*e)3;P0W7L=Y@R#@wBf*gPTbOXzhxfRHu24KlE=Efz;; zHaL#Q#f2S8PV_X`l)faZwE1KTdj5wxeVK0vS^ObPsl z_~*M*MKP1IBc_jIPLWHaK)}d}bUKw=3#&JzUodG7D>#Pjjc!rB43r@NZkm=Cyiaqr zNC#Jzn`iU5Q<)mf*PZ{GM>Z{2w?%bu#q5G+N>YMO(n6U-4ObOJq*5(pQiKL_QL?3v z{_HZRVB-aq;3R56FeC7YpQ^9P(LkUhCAsmw~ln7oXgK5rivqTsvlxZG@4*}RgpK84|8gM-k zY&jnC25dnU0tT5?oeZyP&mi`>b-xW%^k|v^rr^5LpgU_}U)ytG+Zq~=aqlJVncfpu zBMrf7*lGkF1>@u{i@HD{Spu3g{~ebvk2EruK6hJY_6wA96`J}GoZ5TpT}>(WIrXKW z*TH_q7mU)8mAS@=en78E&MpKbyfO+`JXKeRaYSd#+Vq2I4g+4&8bB~gA|ON1;zzro zg(3-TErq?qsM&iSw&-keM7K&A=gD9^!Ky*CumJC=UCyU+(-4_E`bu>Otz8c#^)>SQ zny?d(H)gWMRMbossE7)k)Sb+T17N6?5&SvVP2aTN~}3cly5?lmcc z5;mx5{pH{WOmRLX&r1^7F6eTyrpeS4j4%2R<0BwPP2|x-Cr;dMUN3l8yryyiJoJ$B zoccwR0Bz?BHwWHK<5(z3=f|c;%qMosrXg;wQfliiQ!p5T)%y9fW^Rdl@EYv_7eZ5) z_7LIJt3fwr=<89Ly><~3TY^De!`)8F*#Nfb%t0=^Udo^$EKv7K(*UX^?=H9x-Ts5w zKrw||dN48FyXNE=PIz8>BKLU`mM*5m#T1)R%y415RV!>pf}!flO0_(an16Cmq5;0A2OWaG{Y*!&Kih^mw<4rBG`7|GCNe@*Ljv+k)&*zQ zZqXt_94;;$)U`rU#`#&J4p8}B16Gk4vYnzTquOI5n6Tyz>JwDA8%RX5fHDra4}vaQ zj9mESG?A|jQJP*cAtMsj)3yGD^9kK`_&<*pn~o|H0(1-0_sYLGe)F8yl_d%$NHhn25hsh<*JJ3uknc12;y3!zBb_C$^gZoD0yYb z;(GMXbBkX0GGZ*~nK^2MF>3g}E{UbggHA`8rFhtE3Z&_nrYYz19IIpgwzzTt_Xdti z`bLh*=Tf=P$MMy}GIqWGcBO_3({ZJ=Eqtm-h^3RbS-#yOQQhm#Z>tbFcnWxPv_7lL z`RDy+yQj^jLR?bLfAHJ=e4AJXPAo0&v}$I%Jgq(;mIQ~k(KZ&^l=wrf;TK^2iLar* zgW_`u_hz|c`YzU-oS^!u6*vY7TfdaT{Rc%kC#((!E;UDV~DzimL!|+YBz$4vJrX zOO{WzuT7aSR*DfpTqF23QKm6&O^zoQjJ;YH`5%`HbRfk&gBn-P%$YrRJ1t*$<M9h{v z!KUPAQ~9VgLb1>+K4h;Pi6E!6q!0-4WI)DL&*}DyN+R<~F!^%AFnM7y%&(?socEXi z!6g^PSD~$N&BUVkT3j?5!(3@OXJaeoSU%&tEW`f8>s*1v=Y0bL@R`OnuYQrRjUo+5 zCiTCWl291==hR7cM=zE2AR!dAys}yKgZ+m9OiAXr$+|1A6zyBIh#Dw-hJ?*QH>uRxeA9ie#2of2wErm4U{|7Q{Lhm+Av)`20fy7ca2>Z z`YFYK)>uJPQ-MWyOiLRHc??8xUvwD);;&{$iCm)`8$wg z(Dwn*#q&@xIk25&{2uWIyu~OmRb1iLhe6W!7jZ8js{2uiA&yJXTaJc-wp?zvyorD#%A7!qFD0CCAiKk7 zlM_s!zSs*R%Njk*M`JLWE<;juUZCU5kRo)z#ETOc0to}+Q|7n@*X7tb8oU-I6mQx@ zq01^R?n3bAt|Vxcx(<;b?k9*1wI;?*L!;!TX=jB=4*kK{2h^d9&GzKV-%jObwE<_V zzpf2`!5ZzmjjP1Y-NSzz)s|d zzHQ_oQ`yU@TrV*G2X=o%xoBa*N4$dh$=ZnYNUp&6Q4cVBy@nMP_6PJjf$6D1y(M zDE*0e6qrp>o6k5e#KajDbEQg5qaKDTUkZIiJ%L>DI{q&;A-+%l{4gc(A5|L5i#H>^ ztuDY%dO_J3wYo&%MP$mGfZ4D{(LiLgeN8Tqo>b$A8&uEjO`*yqha^y=7KZ;=| z*odE{a-pTv>NJ;>W^KAiqC~ZOnbRTYhgE1tIG2`Tc>CwIC8nS!PN=49kCi5U#4o^& z1`iWX2NmV!e@%dr^F;W&aBF;z8*X|y7*v1}7YEhtQl2TN9{-ry;Im8SGp^VO(G31Mm(S{}B-@z!f*oT1jWb9#NH--Se-T6Uy zsC&UdUu%e>YVK5mmi55|qPX%Q=YI_&Z*)E)<3!ONi>1 zBBN82C?kjvmses4NLlGEqCvk%3H%2dR4$9R=|Ne%6Fse5Qp}&=c+p2#L_^_?986uH zhZVMWSuRNl zx8)(;82hChxeA3A4tb6@6*A2qYu+-cKYm!TK_Og3;aM!N9A zR2sadabaE?JY-mrmicO@;b+pY4B}r9Tp<_O$OD!PHXVgqR`H}72I|=LC&7l(PVQ9u zDk1d2G(-^m58_+#KdC#?0{`KZ-i3^#L->_JJZ3tPsp=Y~p!K#GE?sMHiz_>d%# zl-7ZSVOp^u0@%`sC^Z$zYVRtAdysf+Tn}9(JSQm=D>oFn~Z_uFgN}8avx@;I+mI!G%gq1(o2ts5=z)&=M_9R_tn+6oXg4| zyP#>+67KtI{S)pmJRd(?{S|y)bI`8jG}($1 zxM-Kz4WSv|U38l6PK&$KxhEnO69)Q;lK1EONJvNU2!aDDzPCx2z(M(@IP`Ycp|D-h zzezGvRMv4Ct~Tnut$Wh4d=XDhng?)Y5ZFO*;?q!(jHd#eVGRnu-$%SlWwTwWLX<^U z6iVDYo(|&rIX6e;8=N?yCGtpKX(UrRz5n%O^D=h7gQ}Je4hRQ}A;pw45*_MdHU%fgEdbdgx+ag0O;Xvfw?23e*6l12dfk zy&DA1BOwcCj2v@xB<9nS(@dxhSg@L#es5<=z~hL3A95nnms*9==^KJF`j#Gxnqvp`! zF^MK+%!f1u@z~x7j3Ln~D`CfPRXZr*(py#5CNP0zN~&4bk4eg&sBb@B*?zpnTR9=2 zL(=DPqcmE^#PGa&W>|`HFiJ1gfvEcMeb+n zh60g%FD<`F(}$f;k+K;b8E6q2gx4V{<%Yf!)f-&5eN6|X4?%>%V%WqSjz#m_Mrse} zmTII0{$m=rofg|eQEwq(EvSNh==vtZB_;#C$38_eb_bMcAE(&`MYFBpA}&;;2Uuy~ z^oQ{YnELq8Vb_CU<6UYR(r|~bu zHCJMb&64m?irnQ+4{nfEwDgc_kpA#tMN+3PL9mqCFx`W9S+(GChW|f066m`1O+2;abFW}TXSSBs-7?7OY z>X}$(CKacM>flI-2|3P$giV~{vxXc(*a>8q9g<-_hXcg_llnqh;6FZ1c=IJXU{9yT z)9LJ5ATdx#o@EGMFdl27G1?mMQ1ai)6em26uwZrJ8I12_D3^Q#W?53|p5LpVIB|t6 zz?xe!UGT zxFC&p zeR|W3d0*Zyjt|?&JZk$72n6l=>9iaseTfijR{Z@UkOb&R@&p`jwwNJjiN@I5?te8c zn}n|ODyY~L$9p=J;Q=xogETfzDnorYiaSdUC!NV z@&MvRUdBkY!qtdT0+@rIQI=DY2?+6xBr@?$A`{;xGJ#(r^-@~Aw9DA$^w_Lv?SEXm z69^hZ>gBY+e@vw?oLBZuGi(df0{PLJuyTX?YpIlqGT$XML!=ZM4t=SLI3w6R; zEVfbx85^o0;R8Zo1mIilTAQUM$f;Yn^aRD9svuRJX9l!2Jgn5{90Rqc>Thy3v< zV?c4a>n@TrH(?1uoIxwNlowWtDRTT%?`R2IQ)%nrU<9)`Yp{yUT!DRvuK=gQW;6i9 zmUNz-9*>IZwZ=qe73T3e8$tkEO`lEhC0uqG5qLs9InLodd)fj7*jg-^X;^2t=)AWK zUs%15MS+3n=P>J7;|w<4AOto^+ZC~UzWFfOMDz?`vBAfD3=f9NMzc&mQG?NIw2G?S zL+o3!8gVw8^}X{XeXz#%qczuqD5W9>7@IhW_dT>|N57R*bx^)!^=Z|nOVNnOhArkkp9g@ZoV|Sr$9=#Z(MItUu z)ts_J)evu2^ZcHI4(l;!f*S=8$_aX%M~*j4`hxEjg7W(lBA`D^i=QU1 z!7dks{Y+2&Eo{#Um1toz;H~rYi3WqVc#)4MMrF9`SZbOCsK)Df}!g zesSGXcw0~5SJo8X9ySHknV8uoH8e}&>^o@_K4=E~4h$e9(Z)ATypzs0tq_(#cGkA~ zS#4ma`&`wYk}2s|G_AMO;@#_>)_ZzdzqO|I-u|Zbi`YK=0`<0sOzXEa!uQhRcX8PE zQ8hWP?h^ZvV6?BWk^{x3+S`Jwj1riBpO#BVO`-LjuP?OQm-`(Rw<||LdHddvWdXq% z`T*g?Jr^cGNsvL2CJ`-ILnyBfQl?v++kHG4-rEffCKZj(2zQEMCsFq@8W&uWj6TxFF^qw6R27@wzE>1MO!Ul*ArqmSs$U5X>jmzS%ZncN6YH%j( zO+;dLcoQQ)(a*GIlBU=nLQ|-t=j1F&%Rq<#WpKd_a&baTDf%to&8jX)x6`C~uaT2u zu(AP{Ko|kDQ9UaL7`-*s!)l%C6KU@QDs1$r2oTh|I<6{b;W6XLg&A%{+;!GGMi3ZG z6}@V>=Y!67!qeQP6O7^JaLC`MbL8*V^lF0Rw{^111lP`-QJF8<@nAzF?wZr*nPMMN zyj6~XkRTpS4jO?Wnagz~sv+AS5RbZ0y&5t(r^LAKD0(GmI(Tz*A{?ww9pe8EpgL^E z8N!&8S3m0pUSA>HS?$Or(tI!uNE1AzQW%OiG5Ih^8w8mF-FjX>aW(!yjBdMIh!!S! zn(PWBXd(oAWubw)>=8q|17>NA;|TvpwN~v$ZJGuYcM-G*JeO31g)ZT(HcJb*;I+T8 z0k163%M2yuT+=^!2rxQDMu4K=`zo~h^e7zg1WuI$M7Vx zbGSs;Dr1IKefO>7JhP$+^WS%>JM5Rd+U_^&E(LEHfF-1vDWyuUoDs~ioj;y|n_DSd zM(PeKc<=x?XI7~ZRkduT;w+pidJRD{o;vBZ5G01OZQUKyC1SXtDZrh49|I{(={#yJ zw)o;U=hd@Zb(f@S3PGrw*cZgYbFmDBTvt&6k%^ymULubbQMMQR z7%XR%9zv!AA45q^GerUm^S-fjJI{x?Sn@Z3Hb-wXl-drifooBoIsFq!YeyCKr{XZf zUjiQ7`>J>>GS&=Sj$8Rk_~XQ8_|X78e9Q@{$%w&Q9b3|@=KTS;TiAh>1G3WzBh5%h@u6=$-lJ#Od?B~VtU}>h@^t8jG5~O;?XQH z(=&?b2K@uupD>aDtU9J{Rdw)DiL6+I_Gt$-#8|%yLXE7pOL~4NFEStm!0yjuiU_2sXBTQyTF@i2p8}tsvN{U}*MdYffKQQLJ^KOJu{|f^L9jjAElQWpwr7GWs}M!V zhuH2yKfMjb-u3jzpoR+(5RYrBu|lL$4c+kXy}M(Mnm3Dph>WoZWHZG=$H;O<@+W9y4`tU z07#wQpe9=sRC!j3SJ=UY_EoUo-<$>R=)GZ>X30g$a?bDIu{n}8|qfOS@n(hLYVOUFfvopjV0lqv=Kx44=H zG-SxyEv=Acx;O7*|ANI6A9n6zDMmpEL^(*+n0411q(Q|;Y_{4yJk!cJh1fqmaPbjP z9y;)9;`QhXV?y5JsO5oa@l2HIE;yJt-DLkly)57}p(9o7;YT9xJSZ^_!Wk@wM=_a9 zKJ<=g*8=5kb~u|4Ignh@17>7JOhSvr=(V?;b(o}u`w*{&f1Rv2;^4nsja0>DgqA=Q zLk0!WKAErfyVc{4{K3==eo*?~c#ZOdVWffZin>JFsD&IORq7N~y-dy1<4%4S>LkSs zqF_@WWpM#w%`C$s@BoUvwb+Ma0j_p$MS*I!7OSj{zJjk z?_4ZU38j0`1of<(7XX}=jG2|y3l}3*DXJR$IGBj~2@ZFc#P_s!?6=b+Fcg6dbw%8I z0?h|B3DNRxY(8bA;E)GhaIYn&7mn7|c%tQl()sJwDvoQd;-aNhTqGnu?ubX7>|E#o z5xMm9%lKbHU6X0>7$f_mPF_@#yPq{~k9B17B5DZna(sH>rKB*}Wv>TQ21U2BlLOgG zMe`h&%?RN+It&&KDWVQB9*$_BQ~sY6{@kVkKkkUfooqdbT!B#%GCj&jbX3sMs)-pv zqzVPD&3ecPYJ$q(Rv9~B#FSa&QuRHr@1Veku8+V0cu3n*LB~GQSiohCH4|kB8eLf6 zI4Si|8o@M2?iaFvjGf3c(cf*D(az`|B20CBxsPN3*tocA)DAEC%c(5{MqB zm{RQ=*ZCcEAsK8wxbBIpTsqdE55p2wHE1XyreySz<-r+HYLU8I30Op=)F=RYham+` zYOUb{BTgM8o-_^EtTgV~U#XQxrud#t?Jqewq}vOSqrx(+^%eSz2?1e4My zkn9>8JI^|DTDL9qCsD<0l45Vi$or1`gGe}z5C~l6yl4oyWP&H1rRW=U;NfOHN)7 zdlW7=96EJ~h1_x}KxqRC0)}6{2-U6A^vGn+Y-jBvYS6=IP31pXsR+h^bvvJ8ZPgR6y3(Q$csrcKDc-gJ1q{0X>_Dg zIkk{0J}M?LSQ-w91r@~-9}{HMXO9L|I8%3+f@drVKkhgS!Myg2wJ+7Iu%uu={KK!0vl- zaoP=GH!ja5O6!yD8pSjm`4ufXk_lYBqgO>2i)l4Q?!Sm!5b1~q5&W`9w33h3DcXe$ zs%|6;t-DzBU(qu2>z2&?O0ZVQgP;+s@)M)FcFAihwp!-NkMli8K55N@$aFCJvv`jb zWYFv)+#-k!<0RbueKE3K{dBu)x*CD$#rlgg3iUhjz3ZNHRte|jf$!mUkdxFaj`+SJ zE1=Uqq+hw>ILdQeH~gRIHT|izraxiGZz6~Hr_>kz{8OLQuuk?t@nhY^OslRw zJJ+o1PlzEfp>o*hX0=kUv}`qHb?*BFP8Q_4Vu=5e^ z!8BOZRjR2OAcJ9BB+((7(g&JnGIAx<23%mOaF_zRot3anhaf{Wm@-9}RWU^*sd6;Z zZk-j^2kz_L+KpCOzVSfpLt|oW#ctv1F6jTWVkszg-y!%~?wvJsmE3tTJd>e7(c?As5;^XEt=oVOr2EslkTa-Gy9?GHa9&I5aTri^`=sg? z1?k^c$G1f*5?T;y30Pi*n7+eQ@&)H zM5w}_`cw}_3B!@kgM-vLMT?@NJ|2RKP`f50 zm&h1__omJd6MSg@Ece|@?;-ca-fIEyH+T*CFZLQz$H9!TQRHI1Lrc0NBYP?-4B>r! zj)Mw~0D{CF(2`PzGU8AGsR-w*X&sqQr)-pM=K68thY%~;e83H~E*UuXq!A*n@HhsJWwAIMN%k5b$r$Z0#5*Xis`@qz9k}gM zm6hRQ((_Ull;Px4@I(l@yc;2&$ez_?x!S`O6@E|86E*lCS1d}oHQUAwlHO_DJ_jE| z2m{0cQKzIjIQ+Hi1hvXr7XTJ!5ejyPTX2qP<@Kh6(d|I2h4^36LM{tJeB{G^Apo5}#3ei(tZCkosAh5x&VFv1fBR-2T z#d#_i+h}*gd-)-O{1USDu=!vJh7H?4&c+7QX6)2^q4yvsaI-hZt}?0xxN&DjP7kbx zs*;eF{}l3=Iq!~wcZdZI-o`*uc|K5PD5osBA0!&_ z0gs-8kBCdE7-$dbDcc$iRoP>C0FayS;|S#iq9o{ogkC^j_5i-$B{(D|nB-_nUOt%^ z4THAp#_WPeAH{9neH2>N&JCF&zNN&01P45E3Hx`?&Qa#9`K)-%oKxee69!*x*-b@Ys( zD2M&KJ0qtEzB2JNnh5YG=g8ej9mE@EU1J)8rL2fTX~Ca>anC>qumyWWN?&Yg2^U|D zEs)`vn7Uy!C}(B9JjQ|u8$Dp95Qj5zH7bEXw#_7G31yBG6x(>$uh@yV3wC-gs!l>9f4U#YsVob^bo9yLnM>v@TAQa zzJ1-2Nemp5t2i8%Ody`_E}5X*NqwJ^iM1L=I9Uh_CrUE@|4J%(d7n~=BaUa}EHfYQ zO%^uT5fPCw0&(_%L>Xgu%t;m~0@j%fa=+LUl^$|RdKd!qDhm0=5OoX|vIZ*K8pU}Z zvP3d?BTMW9>35SQl7a7cK@Jg1CaF^k6Ioe?h@-^F20UNM`)#DV#J-aSg>UXAC`9cz z`w|pD6~;+WQ0Fx&A%x%VM>L4-v=$BG`*U+eg8@YvCLN5Q#65@1fgKSY<(Mdv|5iJs zIxORqTH6*kl)b?CEXX= z-DBpWfQ=-1KW&({k2Ca~gM1MMWBD_u;Loh+=ay&luf&o%AJM5MAB?{i3oL?$TZ?fq zg=hydA6J`ZA6}8t{YPDSMchkT4IM)r8jzD?EfoB1cQ3y#<@j0klS~Xn#DHy}P*ABrrfWKq?fnpvOVSqpg&Zir=>Q#qr7)t)XgbO8OrQM-x zBp^-wbAR$5T#CCcYQ=(IiTgxxrrD_aW+UUhm1w&=)kfXYmO_eAl-|h+zOJ06I%3H%yynl>WEXOOJeSca?t(Gm|BvH#fqRhK9g z3sjc}6IGW7le&nhF8R3X@={cFnMqV#3Q%^C6+(eXj?i|G6mq{w1=7#CzRCW;jnoK~ z1_L+!Ow#DDQ!hHbUsLb=9;V($_b~N(^nQq~ci!OC(L`JC;@-C2MN+uVXT*&G)~lnFKd|-295Mg1ZM|Std)s;w8|_D- zi(37WwEZVx>%FL$-(;PAViiw0#mXTo6s6-q1|2gmC8D%BED$BY4eyK?Iv?A`(D@kg z-D*ZugKtB8_X9&Ga{aZ3AS#;vPcd|YGk;*{9Ii5l-LD@QIw=P914E}F3V&2XCsejw z44vV(`{9c*3ipAbb4dEg2ZqjJgzy7Hr`L;{%|0-6;zC?I0_1%dI=xJ;=<5>7h)&C1 zDTn>~ja|gu28p}d8L=IMu`jV#N~x185o<6koX~2ti&x)jb-fP#d*C22Ue+Oj`GG_K zv<&icjlpOaU%oY{kaYVk>6)+iG&k8W*x6`*%xdg!Zk^Nq16j7^i0?=Qn5js@VArBj z?0KYt@84a25fQTN;W5#Gwx{0S-#vWvF*ti7$PmAL91ywWZPdE~AvFfnIO6RYMlpCd z4}1*Zp3~jS>z=%AMi`Cum+Wvqh+4J0nUSEpY9wc3U%qyD1$GfZ!*BN^g4$cCrB8eH z|CkPTYiLp5y7emNR!^kBe?lJhWR&_-@~9_|@Hzy|SNG*m|G`jydJ;j6(t#vLx^>b5 zAG(dr$=-A8EA2S9zZoh?TAwLzx&75JKe_dhc9Gj(-Ad=U-Ou}Uizl8ic*Gx1%6T18 zF)UQntd7`)F4ZXD(g`B_7+1hU90k>OMFqSdo`Q?QP&s(rw&-pmF|~^f29y=_YE@h> zOI7i@9v60@@{CujJ5*PO>M|fJb-L?xH>( z)lm1`LZjrBxY8oNtpgxJ5)8P*R63Bd9{`%G@#&o0(vNTp=N4{nbgQ`ErgoV|fE#^l z9+w|mN0DsAct$>PgPVd=&hu2HM#Hj-)of6?D(**JA6!DDGK=!GY&t9j70SMAeT{Nr zO4vuy9aAxK-NTa7wWf_0O605|{lSE*AcNhi!QnXnMv&~~Uo&FN8dYJt(mKj_>e zX%Q)~2x)zU2sF+${obpusY2{7FcC2h1oqD;b{%;p0!f91;ugjoL(CzwyaCKWx zQLH9$txI9fNfXDQ9QsUh1-3< zw5m|()RtGfj5=*5Q;e&D4p51sckTlf;PuyA&)cl4)v$xpRMoU`Ug1$;p?%fVwEwU( z!z1TVsKG7p_|q+b6dg9Z%)Ow$DtEdA(&2OceNYiXf;Q^-s9xKxpmaM9*kvC@K;NLH zQ2nKhUU3goIDEZn&f_MuxKacQ86_!M*4x;ES4lq}G zAOZr?r#}m-n$r4Ep<%N{r2@rgp@&7Uha%|eF08>cbfOtf1D#2A-YLdP-^WFB4$`$O zB-!@7UTK0R4#=vS&qtl#%ph!@N>xzjmlf3|0H{=DoXr9#FYfai{a2=1bo5BIOLw8<(*!JjDU=X0ii* zb}bB=EpiG1vz%rSriZ&SP@)Lsbv!ZZJOQLZDO}Jfi%X)MoNlp?Qf~cB zZZ2NIFjl(oCfxwGlgX_`daIl2l)BGJyNC@YDaQ&xF+}gue!|vO)<0D&DoWC{ylc2+ z26anY6{7bj@V11iARv6iIjGPWm2{%@LZ~BQ1rmxcX&6-MOGyU?+6qG>I-pI2T+33| z`Amy?04w?_j8T&sDn-|}`W;7(;<7rw-TiDvenn@pSQTEV<`E7K!bOiAojNjcwEPfi zTcGM!&;ycA#b-m2l%LDQA}K!yDq{VMFDgD(}@$|CMQmqZMpr#iBniD5?birGwtq_>Zj=H?oqQq z@Qt_3KFuJWP0OF&%0UEIKF3BQQ7F({f9Z(trRDc-X=xyM-`BGtklaH`R*TTV1s_Gv6aP=JvMC*#mIh` zk?;JWMrL}o#&sO2n6O-Qz5ceopk9;Ow{G#cl6tkqwS;=ddR#D@t&^Ef5A5BH{MD^o zu*7byk)0o`*hyIW+pSZ$R=$N2+3)>#O_;`*I7Z1rEw$Y->zgM@H? zHg%G$hU(%>QdL&S(y{*uCD;3uPCcwEo9SR`)416P&Kat+`bVAOIH|N1*sWo`7-Z@u z&j%MXMCKEj1Lidat8L9|2Ghc23OBxU{a?s zCS2YTxua_E?xwBvH!``E@EUF^$;)0sbMJB<7uu|&%25U7p5O)S?Ns<`s;ry}9;j>L z4yNQ98P$}0QlGhpP&0rSu%zl;b82S2FQ%P^XUj|qVFTxjc=t-SC!g|w^MTJLiOsh zdZzc{hcS+}t%}|!B3J%8X^(inJMt!Kv>AmjOn&6P$Pbt<*S@TnS*fMSOI*Usj2kDu zf^(s`IWD=Th!!Dd;p@xtMKT*^+RbOL^;M)y+`pD@dXd)&E2bd-AHe#OT{THeoaq$x6t zL=*C6D`^IPM!re=jXlN}9>q;N1aD@tMPRyF&tVvl9bvYFyOxqUln|KEr%@FOfnY}e zHmgIV^(UG9iV@=!^~Ran-bT!a=~>4l_ULwBEm@o*3^7o6ZJpVW&_VQ2PT+Ubj*g;8WE4nrE)qG(2i-$qDfI!tWdgh*(N^NEOzsK4)xN4w z1u6mS7L69$iqxH&Hj`KP(~c?*kHmOA+FzhFq~3opi%a1{s~Y2MCdztw68Uygi4xxa zNbJpVe*OX$4r?KZw~gs#7)%XbY3~ZQuF`C8zMYY|h4!YQ%kO05h-PVT4+q6xpzhOH zwO&V{%>QNYec&Uzsx!g&)FqV+aw1RKNqe?Ed1l&!+EKsAMt0oDV0`q6>#05zPGx7~gRMEWQd_(IaO;JMxF_RWukW1?TlwtNEhqpBc`I+yg; zQok%n)n6S9H^|KFW@`OC+n;?qIgy(7#2R|dW^5PWTLna2MyH)`J;9N8=k=(5r`)F|?6%zYbG+w10rGGxFQEZw-bMY93aM zkY68ePIQl3O1GLTvPRe8N1QwlZD#=`aA-pHC^&Nb%&Akei;E{tEG^9b*a=MF&dy&# z-=o)a-)ui3R+K8%;&cf+l}G=wi@)qtY4EKpAhNfEd&<+^4nuhuk;nC{a8ca->hD-X%;81uV`vALK_@V8A z(_An(g#TThffTOd*T{oD6wXMR!ufN@UUA|f8GGCle+{dhz%F_?xb_OQdbZrB^Dzjb z@CaSic@L+X$=kVdO1LrW+jT?XCyCLt?`$78!Wl2)&SSHS3!X)%)H07aiKXJ0uZy3c zG(n|Q_^gJx2f&K$>CpQ7F>6Q0nlL; z9?S3}kInS~u#AgTZx{$`GTb}h32v+OeUia@J-BWGF59?17%?fq^;bnw@eAaX9}4HC z>4n*QPfstNJF9{Q%yt8rts=~J<4`d<_NC0IDIM8U)^f7s%~f1^VN=BJJ>T$hqjN?AswefR|&yn57``@Nw@Rcsrhg|pOEVJ8&9ImJc7^$Iu8keZmMh&7I~92n&hOZut<*Pp6rHQ)J1t|#&keiIX8&?LhK)f=^JZ(KptYm9 zc5-2frwrAWM>w2N)SKOn<)rOb+5>Ai(UU6{d`ZL-x_$csIo86;y0Pg?#vp{-RWbG# zTRpm5O_L>d3P$lIRP$!+HqOazV5c3zj6_2rk2JK$J}u)Y-A!xl>cwiK_ZJM;=wrg^9vZ0>v}L!WOU0pg z+pcE}>j6&6YRO1A!8^m3w(Vi3q?ngW_3k~#^W&rT^iVkGq-=J8lC-%!s`Q!-Tw|Br zaJ&hpDBqD)mWFw33RYm4(_>HsPrw%}M5lT7`SyYE!Fm0eX9pYdD-EreD@mIV(<(^>xZZ;D*)r(ADMZ#c^$iHo;wJ9_n}4*r{H$x9;OHaUV8!YfFs(Q~Y3g z*+DYzt8UQJy)V>zip!<<_F}VpeQ51TrDFGYMy~2=(W@bBc;{O{cW)ZxJwnFnw9dnU zK6?+c9Or09J?k(yjaRVx{)Z>CHzhW!=eH?;$gY)UYr(cFEO%)aBz<>mF4H|~&x!47 z&k0p~P7ICqTjU~dY#P3BD{=_&UN4?@x2fy6sasqC=OuSucLR&MT#r|yVDz$Yc4%bY z2|Q=T+|Aqx&a2|s3-fq5J7aO7Der^f(iuKACPjq=&n$83C9yYfVPUkE?vuBjM`cw5 z-jk|jCQEs6*67tXILZclnsT8(qv3v>B`pA@z6>OJaLG0^>vlT6YlDAk=(4dT6N(~3 zK6vCcx=+`lQg9#C!c|IQm|z%ga`>>m=`S&4G)S+9`MII+q#IvM5&wSB=K}r^%wm1v zdd0V+VD$c09qH&F9SW!a!mf8OTH>OE(5&R}VO9&H13ES`={lw%oe0K69s$II9l%+s zcCvK9dFIU4LR=;~dKPvd^miXOlgyPLg!v2D*y%Ao%o*o~cDRRppVo=ve#zt&6mvts z?r_%KJ5%cU0Xp|XLzfAo%q!h1M|hy_=t6zDf%TOOC>D%5awUBL{t$fRQV{^s;r$2{ zqNQCxW?6M;muR^{CW+F7i}xp&&`s%)EFzWOXlW!-TnMJu)C3jDK~aekDB2q1iy(Am zj5vX$DGejAu|70>#0vxG-g5Ce}vQ$tFty%o=#Ze?Jf zMsznSfLKUAUw~?=e!27|A6`)ix@Ww(gy$n4K%Q+w@}RVsl>)wta0VCMunFFw3qjy@R#zRFYi; z*U@u;ER^G>C08MRyDELZ76w~GS8!`B$eZZo>6ZGd-qUK!VgpVJO7F&C>nS_=jFgGH zDl=x{GS`)<28}%=&3|kx6uMv%vqy|GR(ib54jC>JST!w|S z;;*WiJ?0WvS%QJ#8$u%E+K`WU!VkVBU26~=NH+wq(E#NkR}>0F{mJDBK~#O3Oae-x zkBQyx#GT`kdgm-iSxL4xyQlPA<7)43@r-*HfY6gOqdmy?kAhkSy9i zNW2>4)myaZ5i-_z{3=m>RZ?2`0!X`B5tP|j2O*EmD zAWzIRDF}^V7m}-B;U|WQzL$}jo@Z;rqx7o@C-!MbKsbscAQ+MG@42f7T5hIy4?pN&##f9=pNj?S68j~xA-)D|;u)PA8AjhcdYtHuHY&_iPQGdcn%c-24zG#0s0j(Bn@Gck>$g2Cn8*w{g08&bc~g(PdT?7!+ICp-UgFrty?JPOl3u@l8<&dHwOlw0 z`7lMElM`w&`Mz~1JbDZz+~u8w7B6BhY{(&@XIyy^Uc@Ozr`2@sNWokCo7r9unp^C3 zAz$)x@aWmhYupLh@Bn$z*`YH(@gR76e>?M}wO{CRBUG>?1@9D9Wp-dRco$6O$}v6y zCr4&Sxik7;mIw;It(ar=rtBxt#5;s)CjwL@02i*4hr7*e+9LniW~O)aRN=dd)K8oN z3I;a_sVZf%%sE{Hbr!Nb!LAAoU6Ype=q%j9GUZ?V2!}6e3%x`K<|R1|g|jQhxbUO0 z%s}ZG;)pqlJaa^zOR0QCO$sETeJ4!6!wIqHFJ(f!XNMJdTj#>zNjHZ26K2IkFDCDU z2S~BR%_GEEzyy=e_H5x5OmuyM>)+x`ceBCRpyV{pP9RwXX|%FSBf##AHrbH zHAYL&sd@?xeq~*=J_+XV>T!&*}xJt&(qZPvFUupEP%4DX6$=q;MwT$&G4Eu+_le zwg3%wbCVTFe~$3?6`aeq+bx{fz%lRxJ>mq4K+pSfdr}a5aHz+b`iS#urynu(o6-T9 z1=z5{xP>Y1*)jd_Q1}*DB4%K_O>mQ^D)*U-_>t@@I+v)kD|WQ2_4dZD&aNNEEFSpi zQ1H=Sie|P|-cJ*9Q;T1E5az@NVdka1F%Zr;m*k}8%)u}MeZ04squA<;r=;(B07uY8 z=i}RLZX$qZH_F4s2ABha*16&D;>{aA=w8!|sq`J%+3WWcy_AhPn&Cag5!m0r(BN>V z=i5O*fZleAG87gT86)I$ZAyk&SRr&X@Q4Fx#+he*EwDV%_5}si~J@%gwxlq6|8Jbt<~h2s04*yrBUGX^fq_C}XaA$jeMJ4wata zSjaIL0f$8gp6$&w-BOEDF001x2YfXuTg#<4y2UnYFh^XSVu5+KBKwbfA`)QO`t-I+ zT+g=LdPoRl6!SWLipOo@2)kMgba2fuoQu&rCyazFmnN6#U151f9!_q#HP*nt$CVhL z;|=QFZ>u;Nl0^<6UtBSirvlBq(O@de6iJM6L=J0+=Xtd#1uq&_g+mTb)(l7NPzW$cl#8OhL(=N!hf%u4!Df@5?Xr@y## zw_xE$Q*t`Pu)(PYhc2=U8sN>{n&471JR=bqrVO_o2`s{n9_|#Fu{cH)G()wjxPw@h z5t)5RYc>?Z#<2YtotGn}*UKNwBg(a>$f)SKe)b(|JlFoEXgr_mmHj)&ns97J6aG1OHe2JIa#4a3w3Bu;5cJJJ$6b4ZEZ#~|TxR-BDVTC3U7_Z|;D~z> zl47pf#-?^Cm@A6=D^yUvI{j`q*n0+3svTStfKB>Mn2t5mNx!BnaZR}lFNLEWFF_p( z-qWS4sOt+fil89_vrRypKs3=7&d=U*8i`cky(RvL7oY)pS>TixR_}s@nKMD?HuzEv%6hU_aiO3tU+hgH=(pO8FTBtB_uf!AX8=!;Ow1I6O zK=E?jg@nQ@v8UZRbmDyI@m<=$+C`Vo>;4Ph9nk`Wb{gk}ma_;?fbj*Z zqo@!t&MN`36oRuN8tC%n2f~Z5dn>d%{KE)BjxzN)tPzhmtLcgqcCxh2enVd_9nICG zbqNKZC~6y};MpDZkKt0o_eWI=RZgOWdx7y$9yyhQuh796f2nA^rZj`Bz4H{VNEeOO z9;`g2#QGS~Qt%wy!FtQ|;}?}GzCG=Vq*j;KN|JH@a>u&Q;@q;})>e$=+DY7vPN`(W z@}jA!;YxtWuIw=k#vB7N-U~O^%d>IqVSC)`hyH;ys6^TQSkvwIu`XE6=r zk@+OyF`BxBz7Nho|A#V4ou**C!~BHjGc#PLU@8Zhczcu}1aZ9q7NqI+T9;=U*s+a5 z7fYFT_qkpVTHc)iAJIabj8kWK9GtL(TM07zA=pQl4;}a_H&|aA3cfaU& zXZ*e?KuX&H%;2T%btsWbYgiDTWTa4iANIh;t6c&cAA3lEB)U6}Q%I3(4C!djaQL2itX*5#U$1h11=s9a$MEVV zzrrw-E?rv=M~>AIemZg~Nw3F49kKqwwYz>hvRq%24{)D#>Ed}! zCw(U$`QXN@BI`lNz8hxjz@hbdCo!SW z?G5+SR+HA#o6F%Se}fpqs$8wN^MV7*jGut!b}290zoJnUd5QYiXV1aSS4EGuNuv*z zb&BzsaK8i?O(K$MFFcf1*1f~z!SdC|$`%yC%KE~2SP_$2?_`I4qJ^m*9GyjEWh1$O z8|5@~43pvu(=PPQA7MfM6^^>p$hGaDD?Wnd^B6-UvHfR*SgN1tZ4{Xbu%X>VTii=7 zbP*S^QGF$xO>mRVp1|u>%EqUX_W6c0xR!#)-J0K1U-6Z}py6KWV>s0kh5~G;MfvkV zI>nF6!ISP+IU1lV(Emq-#)o$}TbA#cZ)BMOD|V0<#y%6x}|7X=ML=oo@X zPh$2iwv&WF>Aop=aZu5ZcKB^1c)Vxuc6jC5phKT2bcc2B@WS^5>zt!BTkr7e_Xbb; zZByS6k=f)(CKwIYkIgN(#V1>gQb+%F!6JTzc*s(P=?|sgP&tf_HBwcM|5`BPSV5=E z0ssrXFXOPDZn{aecleyxOY{I+J^HCuG%-4A7{Vaymd`T)-BUPV`U#KlqQ3E>uiY=P z204F_mv?#%^{09k6z7+G=s012eowW1ELn%EbZ|Ykw?33ke|C~XhCKNGEO*rp1XtE_ z4qZX~jbK^M5e-L=Iz-iJ4qFwGO*&<>al#fmo5nuMHv5s=>PGhY_CbV%32rS9Z`+x8 zT@FGx!YLbqsHt-9pXQ(Rl-*CY7G(wR+2Ho_6$5t)B6vKz(@VEnl=F_`f?!S>a>wJx z)ufDm?uUydDL|(d9ff`G>Zh7KMLD8jP&fQhz7CLM^yqfBN!5+kI8t*I@H;v^? z3NJGBL3Tj6nnt!Q!`W}!Vsl`D@zVR81}X70QsZ_YG_K4pcb2zp8MCv1;-+l}WjuR=71D<6kp7iVuSn!^?DmBQ>D zq(@4Tam)QUx{j9aD~E481}t%!uGv+PrK{O#@iH7w$aut-fqrmb`GvY`Z$C&oSH5gS zOFDBc4;KoK^bYP$~SX144OM4U&ioQoinV-xpM z(sfc|6n)>*xU!gkeU3U9`zxb3Gz!2_z3*{fOQNv(m*e0eoW`xJtN9MdNDp-Rhf^fH z%t_c<7cvxAOd<4`V+~i%Rs%PAK_}S2H7`h}5+zKA)WxX{UAVCaUR%es(({*iT+o~6 zeVw(SJo1MeO~H*AY)Y|k41Jj$vKR`EgKC?^mu@QXYYJ|}SmG=GzM|e|a9yEuKRu+S z79?rT2z2_48yPu)I^>9&!$}TABAh#Mqy@TL7eU-GZqS=Xhj}3=&%Q_?>HxS1SAYvG z`I_MbJVc~M%`5(v6AV7F5VClW9B9LJpqokaD%`LhDi4n#^u?v@oI1sjlT35KmVW<< z+HJSre(Rm3;Ccj@CHlZ9t~H-L0@sPO-7All!;`5#6kiF0y(d;`X|)to%Sd3rKZ`#j zJm}H#h!4Qo?<(laHZkCmI^TiaAgak;-z(MizMPc9$NN)LoH#o>J%>a%Gd?9s0*Sq6 z8miTBP^a)7+bBO)?v}U8Pn2IgLGUvi+>*5y{eO1RSLFWa+}|yQqKZPoaW+c>F!?3 zQLP2pwOk!jQpe(@-Ws-cuVGSaaCU$R`TSlr3b^K<*!|-p`Y~c$kPHsnSZy7rIr=CS z;Kmo&hfcJsa5yfH78p-#4+wJ}!6lXQdl;6YStKCj*8p$7)^lqK!$p-)A8(V#0sr_i zdEDb4C*`r^A8(h(LH~G%JP!HCACbqhf1HxXVgCsBN4wYH#t`5SxNhz>{)61-t1Y48_k}Ty6duMCGW3g&r09-`RCh|zP;JA(szCKtn__< z_N?^%K=!Qk?aQ8(z8kVID1z5CbDOx?^geOyV7@C_N?^1EPGb^CbMUy@Am9j z>ANF)R{DM{;o%FMC${&SuX_-$M4R^etx3O5eHcS?Rk! zdsg}$$exwH2eW6T?;-zur_%Rh*|XC3aQ3Y9J(4{ueUE0(O5cB(Ju7`n*|XAD$)1(I zYWA%3EoaY4-%4=6%V#C9mKP|6NnW5NuI2?w<62&zM6TxrN@YDSP%>Yc7bu;s=Poc{qej&DSbRIP)eW33zX9TDlbq<|4v?@ls=gkD5bB?3f%JY zU*`o%>3@?KD5bB-3zX8=<^@XW-^~k@(*HIuP)c8y7bvAq;hP*&2{qOSvrSvEB0;Tkgd4W>;ro2EY{d;+VQu_Dv0;Tlnyg(^^b5`J%oPUrP zD5XD@7bvA~$qSUyx8?;(=}+ecO6fn$3zX8g;OkSXrzAG&^aFW;Quu1UZ9lzA9;aN`hWU@+a`34`ea_9lzu8N zP)dI-FHlNS~`pp-tB6}UC(U*-i$>Hn7(D5bxj z7bvA)%?p&$f0Y*~rGJnYD5Zax7bvA)%L|m!KgtV~(m&1$+#2=uyg(`aMqZ$l{z+b- zl>Y0yKq>vxyg(`aW?rC_{+ql&DgC#3fl~Tsd4W>;t*pSUQU5M4P)h%OUZ9kIJ1Z39UuVuj5jU zT5X;2Cbo zeAxs@Z_!9ljn+7`42vsr&*@=kI^Fb6a&!d_-drBp`SyqkjOI9Y$nP5P*0asC@&nC? z%v$PfYSXpqCY=93aQN0T;vU~x4rx1k>kF>_l2)%hsPO;}#@hU@ihcXt&D{Y`WnhdN zJ(aGd!9M*ch;XK-ju^u@^u#}JzdTS`Wq9?S<>8Z(NeG_LFuvnX3VIMs@K}7NtGN|m zYYhA`*1L8zg6$PIrM+_2JiJdK$8AmrfD?QmaQjsFo-&ST3s*boJ3%PvH|3S|ePyJ^ zM)sWSBOL9#XUFE|y2$?xqa|XrVBORf;8p3$vhPRtPwPzq;q!Y&ncyaT(_n6Q4Ie7+ z<*U^Y)>K5S0*m*-tU3TnKTyuHD@~o*titksD(O^f@LV7i1s}=agFUBuAJ~4X_W@Li zQ@s!4y|YOQTQx%Jag#QpPCts5htHfZ1z*JP@N9#70xlib*FRbwDVQ4PL1Z&^b4UDO zV63bZrp^6~UO}09IE2Id-FbW|_&Ds_?xFBLn%nP!GI9MYUU3h_S3uOquS~^Gm51X3 zHXCvC83^oCcYK_P@5R9_Ja*-p^BNAFaH&)&n1N>xgJq7@+nsfFSr`mvPFz~YSqI#C zaC*W!P3V2Q?>I_YxCL7sR}pP+tXe~OIYtNBjbQYg%N_(4ar%WJ^Z;Iy$=k-6HadMp zfOiCCWa79SdClPfy1R)k&Yf<-omYf{YmWJ+`l-Z$!Kcc@6PRc9CUYghhYF6+`WGEy zz*c%)#b?Ul)5qwTbE>+DV}E^P78zi90Uk2l$_*2|YXTSGluMC+b-473@P@E-e>e#& zKL;L?e+_)T9N>RA=Dh(we6f#!c@fvX4Pp%L6#voI`RdlCaCEuVY6Ri=;nZig9x)TX~SI$OcQ*iX97J}E>585 z*x}v@^xT!{I4a{+Ach`=IJi6Y32*9%=zLVJb+3ztIWFZF%Q1lBWk|3UDSL{We5K=@QreS|6$}O zPn3dhmPanL3aiWVoLgUfv>J014EyA2;l6#ktcM5SfxAza`$7)Hy+{|7rjLY^{_Ep> z2JgW8hFK)&EM7>}7JTa}2pWUi$_%7#y^)r3Ixy=e5s8LN=y9OMYM(EM2xz5aKc@p6?{Wp2MMekPhUUN$93y*X+8NrwZD1uE-l1MCtPPr= z0+du|_k@xwK}%f4v%!QyZFGRs%;e<`Ntp#+_fkEz7C+w-e6Ys zr~ucY$$V*lmP`9*2HevAY+-5t45SzyukWGoiR~F&pMXm}-n#*W4uk{2jr{LT!vX%s z>3s8WaPx3aPJjpfaJiv!lZKLf=fLyJTxzE-OFpg0K{kD8I5^bX;Gzpt>~F7hnTms3 zSr>@Ey{G$kZXcjK@gll^=kV~;gCJk5SH&FFWFJed)g|Pvf-i=5*c!v*s=ua1!(>KT4vnr`{6dv zm>S6M32^{amrSI-EjTB-g!w-HW*YZo6yNn#P(}MoOc@>qQ&(^A-7d+j_XLybQ|l`I4)S4_kQ_D1a~SY8+g0pj^?)TIgb0nNZ zE_(6d!F>pw%j%8W#OWV{IJu-xZ)`trQIBU6T@ zNe`%i01+cuw)6WQt^!2pYA1%bd5rFdz-4!{9zo1zdA5Vu9? zrI>X22*(x!T5tM~KDa0RNVe8v$I4Xu{+%p)vow|015Md!J1MSHDus_bi_5awPSR}+ zzbKedy`j}!K=_EHdME`qm%?Y)V1k{rVMM z1anl~P3EQG4MX9LVQ(GoX7#=*m>oj+Vp&_t-h%5S62Yw`x4t}hS@2-7k&Meg>br)* zJNw$n7_6UD`kN}g_@Y8{lfitkIj0w(vCj;J2m2b^PEHI=`XwezBv2e$|FKA_#{ zAdaEFh)cB!+JZyKh2iePR`Uq{rQ2fC-S8TetL+;@;m5Yu)~kZ_jmpb|`*PYe?DM$X ze^?3*mcw7&UR&atcGo0stL|(t<*D8V1bLH@j4i^XR zF1Y*xG9@@67P|k=?04bvVOSanMy5rp<(~Vy^v{!}-;e0xy4r;^s7sIvFH(4ky7anq z7OsNv8G_bD2v+ve>`XkB+505p1!5FSLFq%$B5!zwJFGJg!U2}9`B`!RceS72*Ste^qy9Sq;lrJkH1Po<`t}Z)7fMYWveLpbG)m@2z##qcQlzE^i?X z)j|0lGq_0FCY**ltu^6^@vH>~PW)_CJiA!XONePCR)f>`QM!TJue2w37;4hCA`Y z)dIMsuP13dnUT*elvIur1*C|f{Y7o7NPmZ)b|wrt!mFE-IwHgRrE~$t&4zUO#g%XJ z@j>{qYbw@Ybd;o*t^q_C^PXP%G<=$^Gut!95wtF*aI84@X5JFDa=sGtE_-Nkf=X}| zkZeYLm6%}q!BFF}`bur_zM1+O@&q6f1>OI8q)-0c9x}(_4xcjjQd?4rvn~gzMEJ$~ zPSCeIMMf9+a=s(dr^w}}cfRlZsHakTYDcHfES@+lxG-RV&eUC(8VlPBpRXLB;*^4W zk0zYR+jRRzNI;D_KSY^`KO4<<$nS9V7tidA^%UOo%~b|}O3&w8_iJ1s^9H#&5FEmY z3*GR=z5vf~4XVd?hc=)TwULb#@fLA}Aabb#O{0$-WAS%yQO`QmT6HgfJEBbkAH%sD zji;@RgeitJMKGzwm+*yGH+9~SuGcqHGi zXs-EjDOi-Nfho8qK0Z(i#%>NdEjFQP0yhozWIAr#9~_M#h`ycR7=($zz->4JBfB7% zDzL9c7oaIY4goUZ?j(JhfA5E8Bpt%NBF0CA0XBO&b(!Z*;oi}TCU zj$q;>aEY&xR17T{M(B(ILp?o#9SnW&k*b=R$`9#vyD}b#2!>NKVp8~t?iWywS?@-|-;o57ef+&_xX>^E-D-mLh*A?1_!oLCIDmdk8HPm2*uXs0)toCrEfcU* z#*T5W>g2zt)yDXYE1%6$MjWhQ7&MPG@>5@AL@dB>F|j=v=oIc=MkjP^o5PP@MVn4%pkCqFJ1JP;{T-1QVA$V2OrUjb*7X3pkZ6;?u}Xre0)571 z97eRa>kZCD`0auRHt7&OmT997sNMBeGz8>^H_Q+&2(>8Gi=<@}p-S7zn;ji|Pfo6(r&>%_XtY@LV(LS*2?)|2sp9>dgy?gN^sQXp(TxR%uRmO^4RI%ZI%E zcc(H^G5WW^mox-(&p!5sM?P`e@^7;6w?6uXpK1TvwF&?J=db+r^|zKQ|FDF=f8=+6 z>f4XM>6^a?GemIoKOFwe@Xy}-(=g-)zwwc`{L~+P_9w63gTMdnPrURep8L@gbA0FL zj|{dC{@@?{1nc?8+n;*lnTP-0kMi#y`Q)#B-~4-i=H0CGU;p{u&;R_{&4>8yzxw;X z`;FG!^<{qh?>}+z!@qU!AOADH|Li08|G;z6KRCs|U;E{o{^SQYul@J@`}@vbcy8l& z{?WhS-+%J!PaXZ0-}%_D^Y4)-o`2}k(LdVDzc2jJBY*Hu{@qXhIsaxGh%$`sg`&k7 zB#HzSIj^E%Md4;Y9$Q$reF`D?tMyCQ?SU0(ud)@6yCl8}!^#(^THy_yj*Rl6jUx{3 zc50%XGo#Y*}~F?GbPGlx4KIW5yfd7okbo(%=mhG zD^~}fh#A^F1KQl3F3bQORbeyM?l^i-ncVb3mfWbGm(_+uB1p5EZbCjsIJk3XtzMQW z?IB07-(C~;7gUfASB|F;x4Mw5(U&C*ZrD=__RWUT9JDV{iEv_s-`!LJaw}NmnO38R zfw2ur;963PqgfD*A!#!uV=YBEA+&a=XHcS`0!Zcv+q@?YgulbsLf%BVB9$5P-hCvIOyscpK8BwLx${ZFq|TM*de`)2H91r zD=@#H4up5gOlK@2x$5Bxg6P%Hosh`M73~4cC&Fpq^JxO)G3_5YRXH{3T>F` zG6wAAStMf1j-}%095oc~NTuJ@qS!SZFOCNr#aWrco=Syp1Qz67Zu1mcof7OmGp-;N zQW`JLtFqU7coqiOjqQVe1vU^>8nsuW{C)wqaFH!A6kdl^I0~z7!qvhZ-RX))VVxY{ z-A*u6)ZzdezG+m@!pw4Nl<-0eRUaPF(ty#dT_Qm#lX5pZ68Gy8(&|KugTx6)ua2(Z^vMaq z3eLOpTNOliWJbfB(^PYFqC)3T7PSqkMQ*6d5Eo7~_1N?TXVYgzL3p?_Pf^eF=o|yS zg~`g!lktVsM5@G?CL+?oT~t94*6cH(C>s1kw0Y)+WOfuMjku+%cd)?d7M5I*)F!C4drP|{`W(XeN0F;cKWG%eb_%A*1s|7cAVcgnWoT#}CE zTNA&_9Jx`&T;VH6vQv8C+0a_4%jjkdD9U@z4+>2{6%~l!f0{E!7Bh~c&n#5Q)a<=0e4)>=s2ecVnyvj4IXe5xeu$b~+Zac|Qmxy-|vfY_v`=vy=MVa?tGe6lxJUZRSuM~xeAkrcmKGFc46;f#Y6kK=Iyyn&kF~I0t z^Y4#GxN9e-xayb79Zq?vn`sq54m#F=_Viw*SX;%WjRwRj)GgYiy?W%r*y9J!x~y($ z!bkf88nO;hCdeXzdYiDju0xXpU^K5e1j$8iv)mtx9F?#CeVUb!1O4sWp^E9HkN;- zK%C;TIdr?|ywM`7ZB0=zPc-5q6^J6Ln6T5{^K3FsqVG$9dCcuNv?V=LB@4EV0#KTQYe zkga}tGY%XTK?!=QR``)mMrzBY+}VzxgBh?xHfBc)f2hLmJ5g)nN#gwgWSV#dW@Nmh zZ(o+rMQVWGt;XlsxIZ4wp?C^|KJtuG;0B#L3fSpu1$=_*Y=U9C>e~ z#h&N>(wg_X(w(S4?w_5>z+#Q%h&FY9fWhfVvxB=aLUu-6iBwF=REZzaHvDxUaM!s9 zK@Y8V7`$`fXb{wX?iYXg%h!6DQu;laa;x$N*EQ$pq!U+6gWe-bE=a+Qrdo0C)O`G! zX=JTJ2nmva<{qvowmtCeSC!Rs*|1w{b9<*41F|8Tc4pAG(;*0E6^XHBacw&UCti zBiHxul+GDgX#PTERy3;Q{%kYJWo!n!UNH!aKo^*X(u6I+hGcPdm-uqR=XXeF<}T<1 zK%1ruh{%dlITL?o9b5;i70y5^^EkgtIs}6TcWmD5x&I%tQ_Hbmxwrg z)1L70AcVsha^1u52{m(LGtB=S9y#5*2rthln=tQ?3FB2iF_v<;Ib^<2H?9Y;@m4oY z*=>)0A$nk4d=undekhIQXC+?ahR753*X@6CU?5t0wnF>&Fk34f99dPMtHa!sc46yG zQ+R*i&*cp!-bX30!@+FU80K#k5(KwcoWQ14Y%!pmC*BeW=J^^XG=5po{qrLtArHV8 zci_=F?2vKz;XMJeD#E^k`<)>On8P>P`~ih--|Gc9p40O7XQ;{e8ES?e9!p=-IKZyq z7-knlHSH2I%XAl=-yG7T-ccMdwgVQIxXz^{kb#f1h9d?{2Q^XDz<2O7mJOJ5zwB$N z$CGMr7=)(C{8ZuXDe_Lfm$1kMSm0CJ~H0HWK^kC znk{Ifo4D!w{ShzC#X2qnzvRBBwN^GlBAd>-qn97QVIaaka@6b&e-~)ii|&>)ahU1h zd9kow-#7xd)78U=-8-2lD_o!G>YVwx&MU*W3op1&W-&c`>Y%93V}3@W=!sEw1J~wq zvPgnK*>MvKwHxk;gdeQRg3P6g>-KjIpw4daNOL*a_kqjhV^=f96CLG51cS?^HsW?ZiG>#h;T)hF**0({XjC!eT8DEz-|}II9z`qx~|Y7 zmdMI6M})@>2Locwhx!AH2W*8vU%3EY99kpfj;CB&q^&rf&K;pthKdDQlqffE8* zvtBImgaVU$Tir2(3eTtX0t!A3-F^5&Fsp9i00*&r44kFU&3W+@5lf24z>^l=>=#v%-CCSyou%O7Mu@IT6^0b^Hz?_3q0UY zn#|rRY`co<9GOeD0w)uuDNQuRCHL}BaZg1X1GS6vkld=jk#49eU}3rOAew0{IB&4Ha4<)*#YW+FBG>|H)G~#zTfEyCWS5i|lbB!7 zN+_ZU?w@e>^SZ(7!Ct7WPLg1f=bKcq-5MSdhdB5;obfu;Nnz$s4udS|0-W}#I;~bO z@ME%|9CZUj^brS2uwua#?QUtOgUkBzdBxo!L=p&goLjzRn9;K75ihg(NocIX>bwz zI4%2K$ApOcku|#bQKjfo1X;dJFS&r|d%^(1UP2*?2yhH^XFaK7s#Fl5BS|JI z^k`h9nLAVLv&J$ffQp=PF_cwAz1l~?m3?hcQAR~HS-1Z*s@7=0L&H@3H-#>6DlFuX z`t4**Jil`?u&Ouc4NgTljiG;ISD>dkGICgN^bT7PkPnTh0x;4xJBQ#ZgoaXtdBW4A zv2}>Xb18_!G`YS|6F2!$JqE?!D9ARkzDL7`K@bji6q@k zzb+S|%+ZK`NXUvmJc;LP{CQenA5Ve*1}-M(E?Tjnw3OBkc8;0pzsQILYS!; zhRDyofm>eSI97u^z_Q8Lv1Swys;JBY>3T*3?YF+FRwZb{(C;bEK^bUP*9kIg57$f; z3BbzH-Md53R=7QmYwsk|eRLb# z{b6Z@)%H4wjS?7R5go+=Z1xlOxAZ-hy*Ak1dnu%9<-v-AnZH37ZXRJFrz~7VCXaKQ z12rv~!>?g*J*wVY*Q&=LMCkT_oCfL_lhh8nO1YVbnAR^*eR_?Dm^6QgjJQS zvzjN#^YJj25P9Wq=+%{2q67On|YXZ6=a{Mmau z$iU)TP~?%0aqW3pM};{Y-t0JXDRRGg&q}gH4q+g!SnRqY1;PZRY6F*r(ti~_LGE=C zK;m+RBdf!Qu_ES8;q*RVknyTqM}T-{^u3b}^vc#ToW1X~u^#zQbWi;fI^?uIeD9H# zs<>&vw9EP$K$60UM1kweD86xxOa-7{z>VqRtPN4Uo}suUoFye2#2rFi1FI?joY zxgUqprN|Y7yBN^InGZg3QI7GX#8%agQ{7L16FsBv#C&kx*nE{&SYUA>PbT0Y9Pz9; zAHxnVljSu*suS@AXnbf!TF5DTM$BxoqX67)`ypo zO?sjHdw5(0nNS@D_mR*>&y=Z(2;*Lvyf*IU1=ECu!9%5pOBDYZd9vp#CKJCvQL`Xkcr?Tkvm-S=kQ+`$^)7OC4P4q<`!{=-#Jc3&PO`c!MXnFbHQ{?uq75 zsMisslIsYkAKIPno~_C{;C&ad@7;kO-Qk17QYa#DyMvVTV=hbRIP?_W{ed^!4p@-K zcD<)Te1?6e*C)VlbVEXejy+YCM0A#0g^3ZiL%Ce{D-!DAz(V=OUdr{Mw_n6F_cMz) zP_(+jhXi9g@`X&W$p~#$xe%$53Eh%FJz=nH-I6U)9J~eReN+G>*sNe=&qhwPaT&aQ zg^=$skN)02??QKZa<$NfS1cqXWM>s*MQ-Z{Yql0+ASCTaBnMFxg2+FCSv3t4xA;Ws z5>5>;`zH6DqO{12PWRJ$3=tpjx5ded&Ym8FRHm`&7ThbT98X58L0eJ=hQb5%bE`fk zl{3#(p-{q}g)mRp4fSeknG9+r5;f7?X(V~O7LraSn+3wRHJB@@=Q=5`7I|t&7;AM- zLJL?Eb>AU_043YK4GRNAg2d?2kMwjFNyuQoWr%=vX4N5wK}ZrYagi5;0-I1n2blAa z+nvMmPlhI&LFwhTP+FMDNKQAffG6$vq(2{*5rrF97wgXkhI1e0#3DXNlF383c?Y7S zXBbJi>S>@GL160skiCo`OSc&Iti2L7f~^LBY=|wxrH1hbfDqrhN_Q?I{M4;2y^0CG)2@as@NU3-~O`O(KN0AiX&O9Gy15DVK)dweK)AaVfm$@0bF&LSbQkqak3}} zzxWhdz4r*`D2b&EtcmRs7o>GWtR3=uN9PXeD+fK9Jaz{N%=RWLNUpq~|1yQtl{EYI zVil_d*a%H=Z-BKfp7)rL1x`Wtgq0VD$Kip&tY0HWEnZo2N0?YbdfdU zDRqL)Ybp(VV1O09L+rM_1Y!1Vr$}#5(nAV3>69iStS1PF;;kq_3GJ*ah$ydZQ6IQS| z!F-p8YG7vTG{F0!9pZa#6dF*0+gq^qIFAUZ1Rof9=fKfzUJ>d{`2xHm;_%g_@NFez zO}yj;bJm~H(cj;LjpwX_wXuWYYzN^?R)?D$<`kJD6XYs38EW4aXY)O0l&`;_$Vl-qa=G_Lzh%14M`!M)mR6h!@m7Ow6M6*L9Gjr{C~i;2 zHFgZKa6Jfz2M0c08pSw%U4~{(6+2fg5d&L6x0E&e0`9-VG@_YWjh~n{QeS-3)puHA zn^8BC7_#DVR6K|o2em2x$k!=n7F1dR1V+Gjg|ldtkp?muDW~H3V)a{#Oy1n_O?(1O zIQ*E3ijMr!-xSwi_;>hug~8$Zgl|rFxY%t%iDzgK|4YC(Xo6OY%+nmM!Z&;o^8sro z&js-E240949g)~^u284n!c^(PJK$3wa0H4GEGvGz{RldyAd`4TA>yCJ0)I zJYrS5um%DXFfs6fVlKDfiK>FWlU@m{#>#>-amY0{i?S(@O#lq1_+E&)yN|K*Sy9DZ z-q1{Nj`Dgi8v~=rU_5XHI+<0o{wmeFkGf6SsXCGZaoB?3^Arub<6Kb#2P4__SMJd} zSg7IQL2rPqc=44OL#cMg%s42)D4P zu)`n+Y(&U8-n#T+yB&su;X8uxvB4h<#*TNfSanm>9faM%@H1f$L_q`(Hf5#kuhNkW zYE=f|_&kX2yiw+G26VAijGsG%3|~7KehxL?l;x`m!lwqq&xZ(7u40Rce4t_>Taqxt z(b0c=3ltZPwv`eB%wFWY$MXY!W2tt8Did6TZ7Oj4G2boba)=I#x_yF&;S&hw*4y zkK1Q!2bsZwnSDe{(G>w(LirrEJsDMAc3WOs{+atKo^(*EVh1pPlUi#2&&W9ib9WrM zGo|Gn+lFT zp>>Rk>sEQE8n(zilvU~dm2 zUkLgjv)x+hwqW8cqQV5ajPn*DUsFG&-$&uxiASl=c*7LlcKR$73f1lV&WsL)(HRg= ze*x(uLY$!YihHDJYCa!4*iP5WY_|@VKY9QPrOpcvHtB35nC%$7drT}5IDvIQ&3mdi&A=D32Mpgn7=ASj!mXj5bKHeHCB8e*;URsN zv7KJG&|0t#VZ8t+dPDpHOoG#Dm12HXn(Vj45f?A(z+k-=PYQ{e_w3}CJT;_H6v&_; z&kxPEs2{#=IID*@+v!&2phR3i>m$!pE=yJg`w1+4>Wl(mi(#cAz^SvHJZ0@~_a5nq zc1XJr7kAmh$f5n1Bj=$6M`OU&yA*>qnXXqR3?I>)kp(%bXcOMWPon0xAf79ju{(8f zK55HI77pg1bu+$LvFo+(iKs($=fP+o9}AJZ^(C6#airqZ5gg7^ch>-4*d!PR>qo}R z4+-=gpM~^-s}U29gjbWs>sNcyc+pduBG7q$!H@xmOl&7)Al+g+c???LJxW~y$I>Ub zFPz38k+_7SVQ6#$-%^`~pAbfTxw{IF9_kc09+p?BzcI5~ zbf&E*hB);jQ_(dE8SJ=j)5~_Tx9WLp+#rTL%NNd`ip_{K7OIGkWMAu?A!QS<)|DJG zOT+ynK2od~Ic@rSJm-`}Z};C?NMOl-?a+a2=>a~ApxRHOd(Tdvo|&I^ht%0Yz&!XL z`FQ1^g2&kV9)V|pTWS@2x>Rv#zAudQWi1db7aF1@R)Wl2ufk!TlgWRDbhg}`pT2TQiR^=)ph@DR> zGViXpz`7!RWwQ^t=~)e)V=}YG>M_g>HR!r4$U3og_^@;Gs=-|x&8pE}I{2XoN!ZpL zUD)MP?_r-s<`97;s9vtykVtb1m~+)=t})wj7`z8M=7?&7esJ7Z6hL^zE4bRnIJkkk z9$M7NuTE{0_Y&Anz`LMeT#Z#dt59a?#qYfAI}YDD7(O2kKYj(_F^YX`5FCJE5ii2g zt5MKVUqT7|l5JwLw_R#9B2i+V8!w8TQA{8J6EhomJ&2d4@`39DHy3(UR;x2**%l00A3!P>}sa4?1~OGO=pFSdTT1iBfmwGbpw zqw^w&cI)=`#ep3{SKL75eu-FaQ4T@f(@A$K33n~*#*xzx?sZ&;AmiOJwy>%C{$ra1 z%>XTK<)r#06T4vDT|-wu+%(Qp)Y8sZVUwf!K&qh3W^n;y0tq@OXloWr4rQ$BHVqxH z?sYgFWp{%8adwI%`w`TLD%>)S`GJFRE(UbKYOeWa^khfhNAeyy_OGY!)+&3}Or5Pd z&1oNCeRNTA8pLAj703cJI{JQa;{LDiz=!^5%nN$(hs#psR8hA=xuiw1Gm_m2AOJQH zFL)oS50fB@y`Stv&~Qv35V=hs&2?xCMt@j6#XstV+6lmBQlB_2(Uw3(4}*qkb;(uy z(&!LD6O|4&)J@0?^{U0#c4-gbX#zm+r5gU>viAC%25VhJUSM?rPtfQpo*P_)#2Z|c zQpE#DG;X@Y;)~lvWUy3*yxqZRb38O35b`Z9?7;bjKYZ`eZfpJJgoz*wME&a1H(n;m#F^qRdh7*_~? zN_#TbDjc9Y3^w$M1$pf6)o}iNxPiGNTHU7qPPkjtvrpqUawpl{FP9asQn4M?_u%5e ziLE-`OwaH5P_~={A02!<)h;OLGy;L)serQ1-e$e2Og3hkeaq{MQ2ctWKwxch$4EP3h{DHPP?`gW-vR5y@tj>f~WW!e<8d?IjfHUd$;Lc%bwE0PA{% z&0(ve>z5Zo6_E~Ygs?5S$$!%rtR%8__O7h^bvaSpkluH6WI?7tNHc^LK&Wud5OZJV z6DXrbPjF8RoM|QVTb?K%`#Gfx$9#@5IcD<-{~&5bjm9QYy+_Fi=n5swA(tR9!x0C( z<6Klyzoa}kfF%X$|90KRtz_A!!d(CH78dN0*^$dEEIDN_V2ObZL>3u8x=xP2@Fj** z4d+YXrP;rXb%iIG^PIS7W(MJ43$Wjfjy_3Ev@lv?!((i00hS2t4bf!MW}~zsU>vA?^fNI=h6YB+1+KxO#zHylZ3=oX z8^h9$y(pCexV?%B36mzaPik!wWm7^zUJ5lt&-*ApL@^c%8p1a7igBbuw-mHnI64CmaNuGfnyu6z<})IkwB1zK?oz`-9dh6rhwmEN<$i&1$6E*Xy#Q6gcBGBYcV$QV zsX@3^yr3;9tn63bl9EBLYGaCP*o0f=;9wvDZ{G+%ShQq34QVZ@@DU^lJ4}tXVDDNc zMVxi=$ayJVf$pJ3ZAxVPTee<5l@(V9+Y2$A6@L?RiRU0_ak`t^`Resd2NKVgN zZqZNDLlK9@{Ut3Ozsqk769b% z9<@Q)P=TiXlXGF%fMoM3TQaq>7JLi&Id_TZhGsY4kS$u}!mV)mOI`{&D2{xh3uaqj zvJCR;!wl~r_1;}Py+SXlSP^Kh5!P~Pj)?mBw}Aoc#GpWjV#pWP1I7fXWtknX<2GbD z_V7r%4$>JiKI%EtJ6yq-IPi&~Pf@MCBwhn>4q()L#@*f*v$bd!u`KM9lVePmGzTP-O!`%ox2NuRDFplLEUu6FTWC9t2~|+U->?zfSuF zl?`O1dDqMEGefrr4}#^-;7tFRT$XdPyR6slU?P`1$)}OXq18VB-qC^Znmr6Y)OV4t zMt`8GME2&4LcrO!*d)1}>a>CLiykv$Vq;>$;|bI1j{GthCzOda41NT@pe9J1gBZ_`u@pxT!_ z*Sd+89X-^WpY8V?m+9}e3wrjjMnBNZu0rqX02<+}&pk^2UO(g9UVr4wqh3dcQwU1klJeE>>!nlpMmB z?qHbh%84smix4~x>t3-0tp|}s_|=`4<5Mgh>gI|iLnIjYC4Qj%@!IGpr#a*!Kg|uL z?n|Djx-4wD+j;nnq5E>FQoLd+%%n=ObQ0He%Bh-M^SsH!rL!_{cTJ{A4_9)F;Aj6OeCUH#MBs#ohH!*6wCN)yU_UOOaSt0~46Ipz8$*QKYC zZimI(R>0_j8Msp=wVf)Ng-!NScFy)`M6$`LC0f^w9PU>*?wqCkaU11B!4lNSK2ais zwo~w6#4=4k%d5Gb3Eq%dEqTMP63+iZduZO>r$j#tID0@FfSRQtl|Gv@Vydoo2!eUn z!G*2n%5f)vakBKSp|d|b*dy}o!4NP63;{#H5HJJ`0YktLFa!(%L%TO0S8uv8cYW*=l!^T9o)^qxGa( zOWH>>I!?-S8ib{xi5ttMpmZ|Iev90X^I3@&%r8X zqH46+?lwupO0`+5*DwH+XD~X|4$4loY8Z~K0U+@1XmLG>R$LES{*7n@udwnCe%-7# z8c8P(zcCoTdSH0so>u$({Yg7TPt%*qUoUn*hW8~p$OHW04*7SmhkySY{kz1!Z%1W!->;zB#!poodnZG;ym6soX>!+XC`>r4V?dwnd z&eGkBt)+u^KK;jc{PEwpuJmNo_YE;#X@L<|I?-y9q;s>)Wz8@RjNDYm!mZ_HRSxXug5&#Uz|NW!#;8ddx;)@(HoB^#Tat%G3o zwIq$l7n1gc`bt6x5CrezJo$)J(`wh(FuALp=;C^PWj(r>MCp2~+o(m$;G1TY%6I5u zymy{81>x}E;B5I6ndWs;!$x(JV6Yt$g+_#XwcT)bD16Vr2u0E6Lj6?@4=q4DO z&7@gNBgigRlU&-wFk=c7>q*D?TfL1=*VooN`sg0;3oxmtkA_k8LbcwgE;n>h*lf4Z z!<2)Lk2eJLjL>QWi$+rGYbSO%VbrK?RycIoMf#7hwG?z5btX3Y4DNDdU4FEd~P8k8Yiv`qj36t_AWrk?19w#wzZ-LFV z@1CmkU;g)uO$TWI0iQLWuVjkWP8xsYI)5nkBBv}|^&;J$9t!3}zLAU2+KZ2f=?;5P=w z!*cMU+80j@1Ro3bPAeAG4GIW$*L8IatyG(s8p=i)yJLN6U8r;LAQ)sw-IRWe6PFsn zdOjVZq$$OvyT0zy#E?(S zv83Hv0M{q&jqxuHjn6G{%c`d3Pmq!KsDLhxOnzYxF#dfusR#&Jj%vZNIFel%DAK!AUU9YVrXOmZA z_MKTyTUd2P24Ml2Zq^(#r*FcmowLa*gs*;Zvb+3>Zd%=_`ZwN;H{M>J+dtiHSEo1Y z!;@*F)mf_Hi7f{2ERVb~I-7L5?WT$i{v7$AMVaH5ad30!b(_Z4ID`X6hhw5LBO8BA zHkp5&txfQEC&IExcyzEJa=K|!i^r?o&N_Iy15p*6E0x~n2+%=x>W5o{3$Mnd4@J}S zvyc-MBh~hnP`BJ@t(=eawRF9{iKaU1cm~ZCQhpAK&q|{U=3GeDh%P`VO<_hZEqCjU z+ERD3)f}Gm?<}oX)Afl_g78r3(%7A0^uT(;*$QTbOe1$ zyWxaew1#yMGFE8AXEGT-6tI$oqe`dUg}{LL zZ?yP+&eI;)p!hJB~W^Z$a<)P983nNHzC$Gpyw0XI+&t| z5!pLo8~kfaxF7Rpy?Q}JKeTkLTC7CbmLOEImbEyl1uojsFIE~=43YAhj&e7QW}D=Z zP92L(waujhq>(~dgYYLf|IjkzWsR>@p^SoQ*kU_b!xw-Sgkk-D$@bxU$@m5bfhrB^ z1#@PkeT51&S>?w$W{L>YI%O3%X-qY-9vot|P5BggoDt*$>#4t1IU*A7V~) zETh7XX%)gbaHBpvn>f0Q48 zs{F-r=^V5$zNACM(a7GG?S!n}FTCZ_V~!h&L%NM4oR+7HLOXe^Tc>FRx~D7;qV=ju zMwXD}T1Oy$aIw0!medNGu4w9|d8ce7OW-@N1dr@XTiy0b@@#pybLlOwu*8MddC(|oDZa>C!NT2YaLzW8D)fdLn7rP=zELKw z@@L`g_=MtGrioS}P?c?L+8etNDs#D;-|seun~KDb>=Y z^C&KjrdS)lSeo2_eL-YE<5M%Edlgno=&{nz)+Y5W?pQI5>^;X?$zo0MH43AAkZbz1 z699VFpsJSC$U+)%pj5-cQ_oh|BeI2QQzUX976^8-oXBbv%tODu3q$i3PL}`#v|@XV@P~AT#9xZyeun?vsHErs^bL!o~n&>zsBkZYkm$KW1m_Zp^`QD@3SovEo|4~yR6u7fEi6RRtmc7 z=aW%)ipl~t%>=BWN+Y!_iDW9TYwC0UlXBNIxxcjM@;5JU{c1b>#dhXmE~al@^q*Bk zh@{^^7Y7s>0n=eIad@+Rs&vjpc_#x_wj)Z!k`FODu?;pT`Cn~tDhArLL2!PoJUsu1 zqTA4Uc;DFh4*$x}VyHzJ+=?3Cf{j-Sf7wi$08weViAnH>_^vs%770Yoq6d9+T2Y2V zBPRnmapVuKh&Pd3IP)8bmoV@q;cxLh<0BARc~Wf7iX*K{cxWV?LDA?!%P*XZK^Mg! zlrS9RSHVH!4WK6}5>A;CHH3p9)*+KoT_jnb8;D?|=`a zLvkevfJUciWz)h4o-?*gL^U2r%YL9NwRi)LMGZQ{$LpqFNf~>Y#O7vOJU>Tq#Pbxi*~^Rh(g!YBYm1BjY!e2 zd5SsTwo#lQIZ3}rG{a}KJCfk1suKGU*sFlz4nUv({oZ`5?&z%|I>d=vXpe*3Zr}R? z&=Zx5nXn`(2Zd_DDe}My79h#&v=B}8IUrPI(2BG1m@^#xgw%WuTM35%WQvj#rHi38FFP$Hz6h=Zna@0c)X%!U z@~r4X)?vA@i{lfC5R>p%mz4x-O;c7K zhn;oe4Y-?y$y~Y02Nmvr$uQx6W0?Q5_P)LYomVty4eitJP@v$E*~dezMu9iK*Sy`X zM|%-SHud*qGo)ML!B0@>;^@$=f%tkTL9P(xRtBf;t5O@CRF->MBU_~>!Hto=V3U!91S7)2 z9$VMQ;(e=)(u?wlr|y_%cpv$HciO zxokp=*`&UUVs9}`w2v+gm2Z*6XF-yi+585QM7Nlfi1L^TYyopsCsd89jD#5&$xe!S zjcE*rQuibcWIm@zC(s6;_VG`gTLL{+mDu+BV(14>ctHLc4}EmNgqwBDfx;&8@c@|y zm#X&PkLov9O8Ljx_z`ajj7uC0rVt`%y%D##Ie`v2P$CFSNeAg-y)@CADYgn0(Kdt@ z^p>uc2?@cZ&*OA5>R2jhwS;=ed#%<&()?C`E7bxBMZI02gnhqBMJ@cr zpdx##9Zj~9ztNzQWUM#RnRw8o5*|k@M%wCp^6Bx;9DgaT+rPqp#LSs*(tL8POG=!M zywy1kCRLDgFu%lkDzDA7P3MK&xvK=i8A@T}jNXvpbYX1gUmuB+(m6c6Ke{ z-v(K|p}s`>M%xZkVGF(*M$j2PvW3FVg(Cy#x(sdO-P><}tYGy7j z?7x22JpS{&%IEm@7Xq#MwN$u#&fIy1(>tqpf8p#!Ca$lp`6WIBbH0y9|6|VY`Hh!r zNBajn>lDr&?*!)m5?zj{pNK9i>R;yv$1OOC@N34xph=a^f{w|~th2`MKX6tHcQ~pc zf{WW5`i3v32^Xg7&ai4XIFDSI*dJZ|@8p~_qdME!plM3BxDxz|6MuzTKhLZT{BFXqxlst!shPKi^t~&-`sx zX)RSR4<)+l>sO_cy(!>yNmw$H1x~}Z3ai$?k_!E6X{4Fo6sBSm1YVg8#W&f>c2IX$ zt<%$2GLm_h-5KlYi6j%H&OO^cF&rFX5yqWw6gz9SPoL+4%m9o>;m z!zeYuJSLjPMCai48Iz9EPnp-~6eqW@d|0tb7=vLn$vRr-Y`x^W_^khjr|>!A(l)>{bm=mDe(BP0<4XG{E1jK} zor>Szxa`aF_bPn9=aWCg_kT#Qk>4%n_vxkhecI(U)ZiTarz@~RzrDPV8uy2;7)um# zw*R9T*2n{GGL0su)EV&{ujhG~P7zhg0;0R-z((L^t}bo(~R*vg&u z9TvK~d`AfevU|tOnblO?Y$p<-O*X*N39epXN5g|J8n#)`>b#U&EH1i&hB+fXeW^x9 ziX3Bt;Mv{Rtf4K=BiEE;{;ynfgi_AxonxIpe`YSO2Cl8b?~AToVfL9Kwi5Wf_vQlU zSJ#dK1poco-T1ujIt%Z8?YhVDJ^5MSva|QIowAK{&C5*j(2bzX|BMWGc3waAB$tm- zVWK;htac7w4;m1=94f|ZIXkE0vvOyde)$ShG+YE0`pC{xPuT%5F0YwaZBSjLr?A*(NVwMd%dT~_MO<+)jiKwD z$PE|Kb>gKBG{$-UhV$`mjZ;iJ#P#h|;7?Dxh8q{s4(HYz%gw7z=M(>0 zW?pBC7lJg=$-im-yj^Dgg5G!pR2SK5wyNwN1hkKQzv?r?r~)0AnuFk9ISmG`8&lab!;h#lX9c`b`< zx5I5UbD)ImaeOzQhUZVexv9W=-niQo(LFTT`O3`}ru3tm=h9wrMTm->&)za2ugH$a zWAXd;*Nc4csDXFO!O#0|S;8FnmM>A(Th6neyT|?cxmz!#z0SDX*3mwv_qNiL2ZGvX z82g-CZ>y*KoS)vdd0a+9`i!FW5xYCgO!Izc-JZ762bo%GjRXAWplRSAh^Da6c-;Bk zp7nIdu|7X3{}3*Me>~|d`}};27AnBW78Q2HV%>)Ev{_KSF&^r%oxnFrobP^qbUI6K zG77qyLz`_Y0j^=iqE!HLBx=R&o=|*qz_@BjC~9@smc8BXOeO8G)zN1`J&N~P!B{-9 zDH06^>JrRb?ND!fFOVnUheE}FtF@Zw|1)@)mF%*uXsV~fj$5&fR)>7TLO*={e7mC| zk+6F@y3uxYYa||v_5cZIBrI+_KUrfp{b8?hdz%$cMUxTCf}e6?U$C;L z=_@RyV?AqaizK^ZsiYN-MWUOmP_)nL?6NyICwQzp!cD-}s1@XPg8^eTt&AmY+z2JT zE>pdm;-RpeKvUh_Rx~E>q^$_QA4ypF*BR>W2K=}yE5uJ!MWUT?JCxuq!OJ==fHeVr zKBbZ;oPgR5FanwpD9DLtO{!%D^jy2|yij+_KGX2~yLdiw+2kWUSp8O@dNYR6zS?V~ zaI@W)IBb%o+c?w6@h8vap=Q0mF&^vjTBwvQK%#AoY|p0>^`*`U-99c|IGW_En2`Ip zrADA9ht3pq5|F$}h6(1Jfum|GV9ckPGgq!^ZLFU;6F2~r!}`Y*O007S*d8)jxQwcL^W@1v#n5^TkXNS05O^gb#|thd7vMxMrW!U z-{rWJ5K*g*rP`Q^cCus*ELCLC&J$>tR)L>N7O0C^Xqe}}>zE`2YzkX8SRRv2H0iu} z`{Z;jO=zvJXC=lMRv4m&6tFK2GYZdI8j<91v++){@1V6Y7MCN|s2;FdF=G$!6|E*x zz03l`B|N`)z__%PQIPQu(AbiSoD>J1Waopi~ylEJf{?Cl{4Jx!pD5t6#1;D3^> zMWT#FxXKrJb(oOT@{*=Nms4p1wG#mg6#s@&8KFjijCmcD@eHK216EtYwu0Uq+Vv_1 z!Qv80*g8WOVelG!?v5$h>}o_=8?|Vx*GL`d0Y9+H-No*RL__hu3eA<|fU?nt0SAQ_ zyc?X$8yE)CL`{mRxfi9$&zO-;MdFxR$Yn%|3049!F8auoU;`Y4H2|=$FikLEK{--L zqZtj^%!4j;c~~xJF`)Id)P^b-j-)}Qn*Q}9Ap(M{qF{4NnDc_KM>j?`F$se>^|)MG zwR%E*Ru~iLOoF^apn$&7k{v`L7!>Dr<&9kUj_z3JX0RA5lmvh6g@lUDwi00b;gm!j zFdN0v14gg`l%tptkP}k}CB?ScVdu>|&MtkHh4S;JfqxLnb#=yJzEEep^@|hEcpVm_vL6;G-vB%tuMe;(%7>T~<f z6Ehp@l-^ZDZ##jzPQho>T_N*`>3sFBX(g`IFWMG|NYKBGcTDHiyDBCff)HDyWb|4d z(k6q-q<+e@dB~~0`$8h;+PfE4lh0qUB({w$n;akXAbdc(!G}4_XW$4;jhm3Oy|9Kdd?LXz89W&kC%zEHrUgG8m1T*7HVpVh#i+3Z}-$o6V)D)`}7WBB! zu$+#m$0YtjlrYm)`~tEgjvrFHu%xW)uvxIgZON9xfu&#)UAWRP!sTUQBhNYbrRkLK zyz-@`!-{zVr9Pw7x$mB-j`ig+&L{ScEMgZ_9e7B%y#pk(EfP+4O>{o9cM7!heS2q6 zjq~i@a_GGXzezxsbwT#-}>Kh)EO%=Y98_?%eyea*X2n zuPuaeIqshMFdkRmbGrPTZW5Txi`;^Cl3gNX4)lo~L7kXs4 zzJ9CSSzphpANx^_>*R9I{YI5<7X}*mW=Xp2a#kgoqq|7HHPjtJBcL0L+X@&BB;|Ah zdU7|c02|D7Yiu*b1*ENHxol-yU}u)3sesj_1$S>K8tDX=mCbL2(CUs{A{)L+`dwK? zPRpKIKiLM+z{<03JYYQ4ia~|7uhP{Bl@jC%rJhtG$pZ>DMZ0W9u%I!88o;To1nZ3U z#*L5(gQbP1uXERVde%sEZ#_rH2sYYz;vH=wsYOLa@b<4lsn;#K)*n%6mX)CkqRr`BN0fo-YH*xU!^J#w4-RH z-R;tLzH&!lwwC4l-=k%1AV??H+R~B~K|G%3J$7%x!+vlZ}8DYqWuLL=On&a1b%+iH!JBT=l*Zj(jMn` z-wX`9i5cH+AACVm`hyGVXu;ChwrDo>8GDY#Oz&W3x)<*n_-2@Q`;5CK=X|bzan&)o zBR_BM^BMRj`7U0)j~V9v$OAqf-S6~#dv>~#%3#1XgBe7VhOwe`F!y9HM8Iex$ugzk zm7$NnnQuPRdmc!|uJoJ>vIAU-&R{+Wb>Hm*z8dMIP{Uyk4g|o^V3zmvTA3kjf*S%1 zK}_zZv1#`3FjEZm#GtB4+ey)LM_<>4K}6u7f@AKHXrw3A(*k0Tg@YRc#$(+0@iFRl zc2u{sA4S5)dr9iS@R=m6_GT~^8F*}GLs(lJU=48NCo;Y$?LX22XEDYMoUm6z?FWua zJB0N!o(%XlEW+&(n2OS+U7=Juk#t|e}DNDFl*Vp6WjHY(cCT#e^%!HOvpD|4wQrP{R0S?F}SeRqIgL%rmA2bV^|ZM^`j zU0=`kG@GZ3EO_#w?OHI~!Fd(Wa6eM-1xt>GyD>k0!b6;P$cKCB-8{KKQh zyyTm(IMf}2ETR%9PWh4WOU@$?pJKk`lQG@@czEovm$|*eKI2u{-s`%(H?!J%-D}Ue z;*qLhZ}JPT`;51p{zsOWM|{qs2TPoSgGFg$!ZWS$P&Ba-0F+*~?g*SOa2-Hxw>s1? zq?-rAj*$r7DWH^K=qijzU%(8dn}XfnOzQ4@ma;bi(_w8#a=*X|r{>_8 zVfj$4vqw>!E?G}&r6Wlhi5DJy7#k#uP_k4zNu^$fVQJ0S1*?K2P$I|<*z93@`0>j8 z`P1A5PcvCseX$f&XK?FdcJKM2-Z<7H_24b>RA(~K0-Upxfv#jv_o+}6yJF#hJGg51 z3*)7Ph2LG0bopl6?!|SWoU7&f7vxZ@O9H$Aj9u(H($_*AaJ9IUAT4Tsh?!|NIjkq? zBvyVxPie{4NC5g69C&U|?d~^jzuoNsPCO}YdZ6p_TEVIz_8_v8zz$aea}#!aD}RID zdlXtoSmjWR5e3N16Z})+UCIttq$|CZ1LABTcMR-NlM)q=x`W3^JfWr$AnPuV1mZ|Z z9gDGmopOrKDjSK{8V-xDq!mTB1~U+NDSAU7cZn=6L84Fi2~ zsC0$NB2DeMVkbKTfq?Po(P(#o;B;w7QEtGvJq=;Uq!DC?F7p9xlDdfM!XvPr#bOo= z>#YXQ1i@s&Y?|~$qA)O(n{og_fziPlP^N>{Uzn*uR>J2)mfINs9ai+{f&=PNB`_-` zqb-bOE~nJ|3q6C}HL%M!LiXAfj0x+}s5^8O_)4;i$K@&@Uf50$*3z^&3f2HCx+0xj z3O6>TV0%TAVE@V3ZI;DAkZU$*EQ*H8L5+4rU;#{@PFR#tji32cu&pb0#78X+YUoYj z6|vanl=IZVN#_*Y+vYx}M9u)>3bCsi_IV#$d7V&DyE(Wg2?=wTWG8WT%_<~|m%!8%P{3TF*>G2K z(cP!4Pq0P%kl~n{clG0BORNWTp3mAVn`ciu$Fw~956#Up0m(rhC12o;8 z3?b-QcB%zo%gU>NBssr+PO3Ve`)N+$(U0dS?al4_dFulXrNp(lT6j+#)BU)*PE5PHr5&Vk9CDR9E&sF6+fwzjtsaPfE5xuuzai#F#}H^lZ0JiX^u5=#DZ5%nq3lcC8LGz05$IvpzJpYv<$PO z(N4gmXo5&atB@T?%~EkTECw4d@KSNIVw%Sj428p(U}n{IQ)(3k-Es9Et6?<-WgD!z zAe02o=Nee(K*~`&D)}Nf4TBz|#)v?&SXDeNN14Vc?8%K!!sU~q|TFOyAy+Ob``3IHh3EN#}t^4VO+8<+uLV7>gM*$Szmj~Skz`PKq zr{D2nfu2B}t{XjT^hytq93j+9O65vJec(lKp@+-{5Stu;WGqr8Vf9qSn|K_O?J>#1 z6~Y6H#Gx`tcAY5d2z4T5=LCR}PTCrk0thB4cGn(CWKh%a6*kZseMc>?=5We1bP>V@ zPZI0iicz``N${74DgYGrSg@;it38q2zS5YP%UdO1pgN2Tz1jf zw-}2Asq{;!(n~hPD9rZU)=;F|eRlxM;rOvD6{?}NAq6cBhQ%&CKZs~4Fj7Il(`t@A z$CX|Jki-q$E<-`-Q?hw{9ZBx=R9IX=$D2l4&BL>vJuMHM1spKU!G~^0?^4RlQzFJj zOwv`5lT!R=h&3DMB$bB2)d5jp+C@S5?Haq0w*_IjB-Wj$gk;cp>IW6+!bWNc1M?*g zx(g^(IHpJs_m~3@;^Y~)DwR*k*nvwuXr(0sQjKHbLV(;_EeJFxb@5;G(Gx;z538N= zKdek6!)6UzLM)&?#8h2-V%SwC-fL!qCe5f_4m?f7;>e3T_V^}rD{$aZhT$M4)Qtg7 z*g%S{%LfKA8i3mcZ-&S+7>bqA3#Qz)ER5hTk_-X#(ZI4nIy6I4HSlhsE2(pU|D*>n zAeVFLHY~6$=vA(s4@Kd{7_z8(`;?M^-4Rv6rHUOd$%t}`^Hp7?0{oD(C6wBP#g^2X zg~e$gl;Yjeo|Z&>lsQYhfJ)EG0?ZU<(r8Sw&r-+}DSd2M#?mkCf=aVS`M9U(NEgq>E6cRIo|iECBF{+Lo!qj73NVH* zs-Ynq42m8i-gjcuV@A9#5nO zrX;LLhK=Da)O0LzLd(%~6mA8COc9o06Bg(VU0Ttq4(Z3@fk&k@;pO3wk<6@9QF5ej zB_UWC0iwtna%Hn-ZiCHKiDq_R@sA?dT?CjA)^77yrl3_8cX(`MiURG`bszoFUuRap$BWa+G1p^5zMBY#I!G!Ix z%B6~*f`gSOGF7W=?PsFiLqUG_MjFbx?A{GxDi-6&g6!+;*x zI)aS}WIQWtwPG+%EX)MSz(X@i43>%K!>N}igeo&O-hzPEdt!^k70DeMnQTk|VF|kH_B$~5463tBiHGX5YGvnDwW89RsHpvcF`wNjs)bPYuC;II4rO3jP{)`RS zJmsY#u~TD%U#Dw<_&Es)X*+%+gcjt7iJ#c8W0(;?GKMyK+p)@iPDohmm*;t6ckK*VSJNFTE8Yvy57Cbshpx@PpC&4z+4a=`n{kv=0O zJ9*`&7yJ7B1tlLkLuTEQ=8RnmQr9vRms_kYDLaKQ zG#ESbV7h^DE)VnKOo|o)#$7`^h3v7gIGU_6Zt7` z7piD1@e`7kc#1Fuv=|^Q2fi4>RN@6K=t6PjACg>OJ=@38AJ9JzG4q7 zFA@(I79ay0+#uT}yUO*+DoC$k2V&qAtOGlU>MgCaF-u9=vb*4FUQVnC?DwUd@};|I zmyZOU#^=h?MU8*MoRpJ8O&ZDh(kcOGzG`DCE?FM(5_r27kc{^sXvW6-lDuiH<^3kw z)to)8*G^ zFcfiq_uN9?WttWI^cp(ZIq&)3(iP5`Kkvn6u6uqy3%RJj_<7d^kM$Tuh}(zz@`<&r zUfz_w%W40`EIj;~U(Bex+Mk_VdYykra_MzoMMy5?KmPpud}EhCzX0^^gnm)v{Ph>P zr8oJhdh49}dXT(q+(4G&d8hf2y)*Hbvyd3n^viS1-G1lWt4^;qb`R)m&(O~HsLuEg zHcj2(H}3fQ;qUOa*6+T+yYK$|LV)geX8dXwwrV~2tF`!q9GJ9E%Ypl|uJv6mZ{jbb>EBAMppL3IAOe
  • KuDqN?R>dNaf9_{QdLt)RNR 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 F?;meN5^Vqg delta 21334 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 Date: Sun, 14 Apr 2024 15:19:07 +0200 Subject: [PATCH 4/9] Add upgradable `Shell` contract (#1170) * Add temporary rescue mechanism to gateway contract * Simplified the implementation * Add more comments --- contracts/src/DeployGatewayLogic.sol | 2 +- contracts/src/DeployScript.sol | 3 - contracts/src/FundAgent.sol | 1 - contracts/src/Gateway.sol | 36 ++------- contracts/src/Shell.sol | 29 +++++++ contracts/src/Upgrade.sol | 37 +++++++++ contracts/src/interfaces/IGateway.sol | 3 - contracts/src/interfaces/IShell.sol | 8 ++ contracts/src/interfaces/IUpgradable.sol | 13 +++ contracts/src/upgrades/rococo/GatewayV2.sol | 5 +- contracts/test/Gateway.t.sol | 88 ++------------------- contracts/test/Shell.t.sol | 48 +++++++++++ contracts/test/mocks/GatewayMock.sol | 4 +- contracts/test/mocks/GatewayUpgradeMock.sol | 64 --------------- 14 files changed, 152 insertions(+), 189 deletions(-) create mode 100644 contracts/src/Shell.sol create mode 100644 contracts/src/Upgrade.sol create mode 100644 contracts/src/interfaces/IShell.sol create mode 100644 contracts/src/interfaces/IUpgradable.sol create mode 100644 contracts/test/Shell.t.sol delete mode 100644 contracts/test/mocks/GatewayUpgradeMock.sol diff --git a/contracts/src/DeployGatewayLogic.sol b/contracts/src/DeployGatewayLogic.sol index 8c5cc70282..b9242d20b9 100644 --- a/contracts/src/DeployGatewayLogic.sol +++ b/contracts/src/DeployGatewayLogic.sol @@ -26,7 +26,7 @@ contract DeployGatewayLogic is Script { uint8 foreignTokenDecimals = uint8(vm.envUint("FOREIGN_TOKEN_DECIMALS")); AgentExecutor executor = new AgentExecutor(); - new Gateway(address(beefyClient), address(executor), bridgeHubParaID, bridgeHubAgentID, foreignTokenDecimals); + new Gateway(beefyClient, address(executor), bridgeHubParaID, bridgeHubAgentID, foreignTokenDecimals); vm.stopBroadcast(); } diff --git a/contracts/src/DeployScript.sol b/contracts/src/DeployScript.sol index 8290d9ff8e..53d74fac2a 100644 --- a/contracts/src/DeployScript.sol +++ b/contracts/src/DeployScript.sol @@ -9,7 +9,6 @@ import {BeefyClient} from "./BeefyClient.sol"; import {IGateway} from "./interfaces/IGateway.sol"; import {GatewayProxy} from "./GatewayProxy.sol"; import {Gateway} from "./Gateway.sol"; -import {GatewayUpgradeMock} from "../test/mocks/GatewayUpgradeMock.sol"; import {Agent} from "./Agent.sol"; import {AgentExecutor} from "./AgentExecutor.sol"; import {ChannelID, ParaID, OperatingMode} from "./Types.sol"; @@ -99,8 +98,6 @@ contract DeployScript is Script { payable(bridgeHubAgent).safeNativeTransfer(initialDeposit); payable(assetHubAgent).safeNativeTransfer(initialDeposit); - new GatewayUpgradeMock(); - vm.stopBroadcast(); } } diff --git a/contracts/src/FundAgent.sol b/contracts/src/FundAgent.sol index 95192299c0..d4c3201d14 100644 --- a/contracts/src/FundAgent.sol +++ b/contracts/src/FundAgent.sol @@ -9,7 +9,6 @@ import {BeefyClient} from "./BeefyClient.sol"; import {IGateway} from "./interfaces/IGateway.sol"; import {GatewayProxy} from "./GatewayProxy.sol"; import {Gateway} from "./Gateway.sol"; -import {GatewayUpgradeMock} from "../test/mocks/GatewayUpgradeMock.sol"; import {Agent} from "./Agent.sol"; import {AgentExecutor} from "./AgentExecutor.sol"; import {ParaID} from "./Types.sol"; diff --git a/contracts/src/Gateway.sol b/contracts/src/Gateway.sol index 29900f438f..0bb2c098af 100644 --- a/contracts/src/Gateway.sol +++ b/contracts/src/Gateway.sol @@ -19,8 +19,10 @@ import { Ticket, Costs } from "./Types.sol"; +import {Upgrade} from "./Upgrade.sol"; import {IGateway} from "./interfaces/IGateway.sol"; import {IInitializable} from "./interfaces/IInitializable.sol"; +import {IUpgradable} from "./interfaces/IUpgradable.sol"; import {ERC1967} from "./utils/ERC1967.sol"; import {Address} from "./utils/Address.sol"; import {SafeNativeTransfer} from "./utils/SafeTransfer.sol"; @@ -46,7 +48,7 @@ import {AssetsStorage} from "./storage/AssetsStorage.sol"; import {UD60x18, ud60x18, convert} from "prb/math/src/UD60x18.sol"; -contract Gateway is IGateway, IInitializable { +contract Gateway is IGateway, IInitializable, IUpgradable { using Address for address; using SafeNativeTransfer for address payable; @@ -84,11 +86,9 @@ contract Gateway is IGateway, IInitializable { error InvalidChannelUpdate(); error AgentExecutionFailed(bytes returndata); error InvalidAgentExecutionPayload(); - error InvalidCodeHash(); error InvalidConstructorParams(); - error AlreadyInitialized(); - // handler functions are privileged + // Message handlers can only be dispatched by the gateway itself modifier onlySelf() { if (msg.sender != address(this)) { revert Unauthorized(); @@ -331,29 +331,7 @@ contract Gateway is IGateway, IInitializable { /// @dev Perform an upgrade of the gateway function upgrade(bytes calldata data) external onlySelf { UpgradeParams memory params = abi.decode(data, (UpgradeParams)); - - // Verify that the implementation is actually a contract - if (!params.impl.isContract()) { - revert InvalidCodeHash(); - } - - // As a sanity check, ensure that the codehash of implementation contract - // matches the codehash in the upgrade proposal - if (params.impl.codehash != params.implCodeHash) { - revert InvalidCodeHash(); - } - - // Update the proxy with the address of the new implementation - ERC1967.store(params.impl); - - // Apply the initialization function of the implementation only if params were provided - if (params.initParams.length > 0) { - (bool success, bytes memory returndata) = - params.impl.delegatecall(abi.encodeCall(IInitializable.initialize, params.initParams)); - Call.verifyResult(success, returndata); - } - - emit Upgraded(params.impl); + Upgrade.upgrade(params.impl, params.implCodeHash, params.initParams); } // @dev Set the operating mode of the gateway @@ -587,10 +565,6 @@ contract Gateway is IGateway, IInitializable { CoreStorage.Layout storage core = CoreStorage.layout(); - if (core.channels[PRIMARY_GOVERNANCE_CHANNEL_ID].agent != address(0)) { - revert AlreadyInitialized(); - } - Config memory config = abi.decode(data, (Config)); core.mode = config.mode; diff --git a/contracts/src/Shell.sol b/contracts/src/Shell.sol new file mode 100644 index 0000000000..2654a8685b --- /dev/null +++ b/contracts/src/Shell.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +pragma solidity 0.8.23; + +import {Upgrade} from "./Upgrade.sol"; +import {IInitializable} from "./interfaces/IInitializable.sol"; +import {IUpgradable} from "./interfaces/IUpgradable.sol"; +import {IShell} from "./interfaces/IShell.sol"; + +// address recoveryOperator = vm.envOr("RECOVERY_OPERATOR", address(0)); + +contract Shell is IShell, IUpgradable, IInitializable { + address public immutable operator; + + error Unauthorised(); + + constructor(address _operator) { + operator = _operator; + } + + function upgrade(address impl, bytes32 implCodeHash, bytes calldata initializerParams) external { + if (msg.sender != operator) { + revert Unauthorised(); + } + Upgrade.upgrade(impl, implCodeHash, initializerParams); + } + + function initialize(bytes memory params) external {} +} diff --git a/contracts/src/Upgrade.sol b/contracts/src/Upgrade.sol new file mode 100644 index 0000000000..bee96074a0 --- /dev/null +++ b/contracts/src/Upgrade.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +pragma solidity 0.8.23; + +import {ERC1967} from "./utils/ERC1967.sol"; +import {Call} from "./utils/Call.sol"; +import {Address} from "./utils/Address.sol"; +import {IInitializable} from "./interfaces/IInitializable.sol"; +import {IUpgradable} from "./interfaces/IUpgradable.sol"; + +/// @dev Upgrades implementation contract +library Upgrade { + using Address for address; + + function upgrade(address impl, bytes32 implCodeHash, bytes memory initializerParams) internal { + // Verify that the implementation is actually a contract + if (!impl.isContract()) { + revert IUpgradable.InvalidContract(); + } + + // As a sanity check, ensure that the codehash of implementation contract + // matches the codehash in the upgrade proposal + if (impl.codehash != implCodeHash) { + revert IUpgradable.InvalidCodeHash(); + } + + // Update the proxy with the address of the new implementation + ERC1967.store(impl); + + // Call the initializer + (bool success, bytes memory returndata) = + impl.delegatecall(abi.encodeCall(IInitializable.initialize, initializerParams)); + Call.verifyResult(success, returndata); + + emit IUpgradable.Upgraded(impl); + } +} diff --git a/contracts/src/interfaces/IGateway.sol b/contracts/src/interfaces/IGateway.sol index e0d4d81da2..5bcb2fd0dd 100644 --- a/contracts/src/interfaces/IGateway.sol +++ b/contracts/src/interfaces/IGateway.sol @@ -26,9 +26,6 @@ interface IGateway { // Emitted when a channel has been updated event ChannelUpdated(ChannelID indexed channelID); - // Emitted when the gateway is upgraded - event Upgraded(address indexed implementation); - // Emitted when the operating mode is changed event OperatingModeChanged(OperatingMode mode); diff --git a/contracts/src/interfaces/IShell.sol b/contracts/src/interfaces/IShell.sol new file mode 100644 index 0000000000..6811953848 --- /dev/null +++ b/contracts/src/interfaces/IShell.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +pragma solidity 0.8.23; + +interface IShell { + // Upgrade gateway shell to a new implementation + function upgrade(address impl, bytes32 implCodeHash, bytes calldata initializerParams) external; +} diff --git a/contracts/src/interfaces/IUpgradable.sol b/contracts/src/interfaces/IUpgradable.sol new file mode 100644 index 0000000000..3574e5c5e3 --- /dev/null +++ b/contracts/src/interfaces/IUpgradable.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +pragma solidity 0.8.23; + +interface IUpgradable { + // The new implementation address is a not a contract + error InvalidContract(); + // The supplied codehash does not match the new implementation codehash + error InvalidCodeHash(); + + // The implementation contract was upgraded + event Upgraded(address indexed implementation); +} diff --git a/contracts/src/upgrades/rococo/GatewayV2.sol b/contracts/src/upgrades/rococo/GatewayV2.sol index 3918e3d790..e671e19422 100644 --- a/contracts/src/upgrades/rococo/GatewayV2.sol +++ b/contracts/src/upgrades/rococo/GatewayV2.sol @@ -9,6 +9,7 @@ import {PricingStorage} from "../../storage/PricingStorage.sol"; contract GatewayV2 is Gateway { constructor( + address recoveryOperator, address beefyClient, address agentExecutor, ParaID bridgeHubParaID, @@ -24,10 +25,6 @@ contract GatewayV2 is Gateway { PricingStorage.Layout storage pricing = PricingStorage.layout(); - if (pricing.multiplier != convert(0)) { - revert AlreadyInitialized(); - } - pricing.multiplier = abi.decode(data, (UD60x18)); } } diff --git a/contracts/test/Gateway.t.sol b/contracts/test/Gateway.t.sol index 287f059a65..00f1682a0b 100644 --- a/contracts/test/Gateway.t.sol +++ b/contracts/test/Gateway.t.sol @@ -9,6 +9,7 @@ import {BeefyClient} from "../src/BeefyClient.sol"; import {IGateway} from "../src/interfaces/IGateway.sol"; import {IInitializable} from "../src/interfaces/IInitializable.sol"; +import {IUpgradable} from "../src/interfaces/IUpgradable.sol"; import {Gateway} from "../src/Gateway.sol"; import {GatewayMock, GatewayV2} from "./mocks/GatewayMock.sol"; @@ -19,6 +20,9 @@ import {Agent} from "../src/Agent.sol"; import {Verification} from "../src/Verification.sol"; import {Assets} from "../src/Assets.sol"; import {SubstrateTypes} from "./../src/SubstrateTypes.sol"; +import {MultiAddress} from "../src/MultiAddress.sol"; +import {Channel, InboundMessage, OperatingMode, ParaID, Command, ChannelID, MultiAddress} from "../src/Types.sol"; + import {NativeTransferFailed} from "../src/utils/SafeTransfer.sol"; import {PricingStorage} from "../src/storage/PricingStorage.sol"; @@ -46,7 +50,6 @@ import { } from "../src/Types.sol"; import {WETH9} from "canonical-weth/WETH9.sol"; -import "./mocks/GatewayUpgradeMock.sol"; import {UD60x18, ud60x18, convert} from "prb/math/src/UD60x18.sol"; contract GatewayTest is Test { @@ -477,91 +480,14 @@ contract GatewayTest is Test { // Expect the gateway to emit `Upgraded` vm.expectEmit(true, false, false, false); - emit IGateway.Upgraded(address(newLogic)); + emit IUpgradable.Upgraded(address(newLogic)); GatewayMock(address(gateway)).upgradePublic(abi.encode(params)); - // Verify that the GatewayV2.setup was called + // Verify that the GatewayV2.initialize was called assertEq(GatewayV2(address(gateway)).getValue(), 42); } - function testUpgradeInitializerRunsOnlyOnce() public { - // Upgrade to this current logic contract - AgentExecutor executor = new AgentExecutor(); - GatewayMock currentLogic = - new GatewayMock(address(0), address(executor), bridgeHubParaID, bridgeHubAgentID, foreignTokenDecimals); - - Gateway.Config memory config = Gateway.Config({ - mode: OperatingMode.Normal, - deliveryCost: outboundFee, - registerTokenFee: registerTokenFee, - assetHubParaID: assetHubParaID, - assetHubAgentID: assetHubAgentID, - assetHubCreateAssetFee: createTokenFee, - assetHubReserveTransferFee: sendTokenFee, - exchangeRate: exchangeRate, - multiplier: multiplier - }); - - UpgradeParams memory params = UpgradeParams({ - impl: address(currentLogic), - implCodeHash: address(currentLogic).codehash, - initParams: abi.encode(config) - }); - - vm.expectRevert(Gateway.AlreadyInitialized.selector); - // Expect the gateway to emit `Upgraded` - GatewayMock(address(gateway)).upgradePublic(abi.encode(params)); - } - - function testUpgradeSkipsInitializerIfNoneProvided() public { - bytes32 agentID = keccak256("123"); - - testSetPricingParameters(); - uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - assertEq(fee, 20000000000000001); - - testCreateAgent(); - assertNotEq(GatewayMock(address(gateway)).agentOf(agentID), address(0)); - - // Upgrade to this current logic contract - AgentExecutor executor = new AgentExecutor(); - GatewayMock currentLogic = - new GatewayMock(address(0), address(executor), bridgeHubParaID, bridgeHubAgentID, foreignTokenDecimals); - - bytes memory initParams; // empty - UpgradeParams memory params = UpgradeParams({ - impl: address(currentLogic), - implCodeHash: address(currentLogic).codehash, - initParams: initParams - }); - - // Expect the gateway to emit `Upgraded` - GatewayMock(address(gateway)).upgradePublic(abi.encode(params)); - - // Verify that storage was not overwritten - fee = IGateway(address(gateway)).quoteRegisterTokenFee(); - assertEq(fee, 20000000000000001); - assertNotEq(GatewayMock(address(gateway)).agentOf(agentID), address(0)); - } - - function testUpgradeGatewayMock() public { - GatewayUpgradeMock newLogic = new GatewayUpgradeMock(); - uint256 d0 = 99; - uint256 d1 = 66; - bytes memory initParams = abi.encode(d0, d1); - console.logBytes(initParams); - - UpgradeParams memory params = - UpgradeParams({impl: address(newLogic), implCodeHash: address(newLogic).codehash, initParams: initParams}); - - // Expect the gateway to emit `Initialized` - vm.expectEmit(true, false, false, true); - emit GatewayUpgradeMock.Initialized(d0, d1); - - GatewayMock(address(gateway)).upgradePublic(abi.encode(params)); - } - function testUpgradeFailOnInitializationFailure() public { GatewayV2 newLogic = new GatewayV2(); @@ -581,7 +507,7 @@ contract GatewayTest is Test { UpgradeParams memory params = UpgradeParams({impl: address(newLogic), implCodeHash: bytes32(0), initParams: abi.encode(42)}); - vm.expectRevert(Gateway.InvalidCodeHash.selector); + vm.expectRevert(IUpgradable.InvalidCodeHash.selector); GatewayMock(address(gateway)).upgradePublic(abi.encode(params)); } diff --git a/contracts/test/Shell.t.sol b/contracts/test/Shell.t.sol new file mode 100644 index 0000000000..b399ae8acc --- /dev/null +++ b/contracts/test/Shell.t.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity 0.8.23; + +import {Test} from "forge-std/Test.sol"; +import {Strings} from "openzeppelin/utils/Strings.sol"; +import {console} from "forge-std/console.sol"; + +import {IGateway} from "../src/interfaces/IGateway.sol"; +import {IInitializable} from "../src/interfaces/IInitializable.sol"; +import {IUpgradable} from "../src/interfaces/IUpgradable.sol"; +import {IShell} from "../src/interfaces/IShell.sol"; +import {Gateway} from "../src/Gateway.sol"; +import {GatewayProxy} from "../src/GatewayProxy.sol"; +import {Shell} from "../src/Shell.sol"; +import {Upgrade} from "../src/Upgrade.sol"; +import {GatewayMock, GatewayV2} from "./mocks/GatewayMock.sol"; + +contract ShellTest is Test { + GatewayProxy public gateway; + Shell public shell; + + function setUp() public { + shell = new Shell(address(this)); + gateway = new GatewayProxy(address(shell), bytes("")); + } + + function testUpgradeShell() public { + // Upgrade to this new logic contract + address newLogic = address(new GatewayV2()); + bytes memory initParams = abi.encode(42); + + // Expect the gateway to emit `Upgrade.Upgraded` + vm.expectEmit(true, false, false, true); + emit IUpgradable.Upgraded(newLogic); + + // Perform the upgrade + IShell(address(gateway)).upgrade(newLogic, newLogic.codehash, initParams); + + // Verify that the upgrade occured + + // Execute code only available in the new impl + assertEq(GatewayV2(address(gateway)).getValue(), 42); + + // Should no longer be able to upgrade via trusted operator + vm.expectRevert(); + IShell(address(gateway)).upgrade(newLogic, newLogic.codehash, initParams); + } +} diff --git a/contracts/test/mocks/GatewayMock.sol b/contracts/test/mocks/GatewayMock.sol index b1014811be..6f3f28b22b 100644 --- a/contracts/test/mocks/GatewayMock.sol +++ b/contracts/test/mocks/GatewayMock.sol @@ -89,8 +89,10 @@ library AdditionalStorage { } } +import {IInitializable} from "../../src/interfaces/IInitializable.sol"; + // Used to test upgrades. -contract GatewayV2 { +contract GatewayV2 is IInitializable { // Reinitialize gateway with some additional storage fields function initialize(bytes memory params) external { AdditionalStorage.Layout storage $ = AdditionalStorage.layout(); diff --git a/contracts/test/mocks/GatewayUpgradeMock.sol b/contracts/test/mocks/GatewayUpgradeMock.sol deleted file mode 100644 index 130ba07841..0000000000 --- a/contracts/test/mocks/GatewayUpgradeMock.sol +++ /dev/null @@ -1,64 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -pragma solidity 0.8.23; - -import {Channel, InboundMessage, OperatingMode, ParaID, Command, ChannelID, MultiAddress} from "../../src/Types.sol"; -import {IGateway} from "../../src/interfaces/IGateway.sol"; -import {IInitializable} from "../../src/interfaces/IInitializable.sol"; -import {Verification} from "../../src/Verification.sol"; -import {UD60x18, convert} from "prb/math/src/UD60x18.sol"; - -contract GatewayUpgradeMock is IGateway, IInitializable { - /** - * Getters - */ - function operatingMode() external pure returns (OperatingMode) { - return OperatingMode.Normal; - } - - function channelOperatingModeOf(ChannelID) external pure returns (OperatingMode) { - return OperatingMode.Normal; - } - - function channelNoncesOf(ChannelID) external pure returns (uint64, uint64) { - return (0, 0); - } - - function agentOf(bytes32) external pure returns (address) { - return address(0); - } - - function implementation() external pure returns (address) { - return address(0); - } - - function isTokenRegistered(address) external pure returns (bool) { - return true; - } - - function submitV1(InboundMessage calldata, bytes32[] calldata, Verification.Proof calldata) external {} - - function quoteRegisterTokenFee() external pure returns (uint256) { - return 1; - } - - function registerToken(address) external payable {} - - function quoteSendTokenFee(address, ParaID, uint128) external pure returns (uint256) { - return 1; - } - - function sendToken(address, ParaID, MultiAddress calldata, uint128, uint128) external payable {} - - event Initialized(uint256 d0, uint256 d1); - - function initialize(bytes memory data) external { - // Just decode and exit - (uint256 d0, uint256 d1) = abi.decode(data, (uint256, uint256)); - emit Initialized(d0, d1); - } - - function pricingParameters() external pure returns (UD60x18, uint128) { - return (convert(0), uint128(0)); - } -} From e266aab1affd408d3b7c6dad514ef065de0102b6 Mon Sep 17 00:00:00 2001 From: Vincent Geddes <117534+vgeddes@users.noreply.github.com> Date: Sun, 14 Apr 2024 15:31:33 +0200 Subject: [PATCH 5/9] emit event when BeefyClient.submitInitial called (#1176) --- contracts/src/BeefyClient.sol | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/contracts/src/BeefyClient.sol b/contracts/src/BeefyClient.sol index eeb27bfc42..7f46e697f2 100644 --- a/contracts/src/BeefyClient.sol +++ b/contracts/src/BeefyClient.sol @@ -35,6 +35,13 @@ contract BeefyClient { */ event NewMMRRoot(bytes32 mmrRoot, uint64 blockNumber); + /** + * @dev Emitted when a new ticket has been created + * @param relayer The relayer who created the ticket + * @param blockNumber the parent block number of the candidate MMR root + */ + event NewTicket(address relayer, uint64 blockNumber); + /* Types */ /** @@ -289,6 +296,8 @@ contract BeefyClient { prevRandao: 0, bitfieldHash: keccak256(abi.encodePacked(bitfield)) }); + + emit NewTicket(msg.sender, commitment.blockNumber); } /** From 2a66b9fa70765450e30ce09fb385d3efd1fe538d Mon Sep 17 00:00:00 2001 From: Alistair Singh Date: Sun, 14 Apr 2024 16:17:22 +0200 Subject: [PATCH 6/9] Add max destination fee (#1168) --- contracts/src/Assets.sol | 22 ++++++++++--- contracts/src/DeployGatewayLogic.sol | 11 ++++++- contracts/src/DeployScript.sol | 8 ++++- contracts/src/Gateway.sol | 15 +++++++-- contracts/src/upgrades/rococo/GatewayV2.sol | 14 +++++++-- contracts/test/Gateway.t.sol | 34 ++++++++++++++++++--- contracts/test/mocks/GatewayMock.sol | 14 +++++++-- smoketest/src/constants.rs | 4 +++ smoketest/tests/set_pricing_params.rs | 1 + web/packages/test/.gitignore | 1 + web/packages/test/scripts/set-env.sh | 1 + 11 files changed, 107 insertions(+), 18 deletions(-) diff --git a/contracts/src/Assets.sol b/contracts/src/Assets.sol index a1ccac2ff5..53a79eaedc 100644 --- a/contracts/src/Assets.sol +++ b/contracts/src/Assets.sol @@ -42,7 +42,7 @@ library Assets { IERC20(token).safeTransferFrom(sender, agent, amount); } - function sendTokenCosts(address token, ParaID destinationChain, uint128 destinationChainFee) + function sendTokenCosts(address token, ParaID destinationChain, uint128 destinationChainFee, uint128 maxDestinationChainFee) external view returns (Costs memory costs) @@ -53,10 +53,10 @@ library Assets { revert TokenNotRegistered(); } - return _sendTokenCosts(destinationChain, destinationChainFee); + return _sendTokenCosts(destinationChain, destinationChainFee, maxDestinationChainFee); } - function _sendTokenCosts(ParaID destinationChain, uint128 destinationChainFee) + function _sendTokenCosts(ParaID destinationChain, uint128 destinationChainFee, uint128 maxDestinationChainFee) internal view returns (Costs memory costs) @@ -65,6 +65,19 @@ library Assets { if ($.assetHubParaID == destinationChain) { costs.foreign = $.assetHubReserveTransferFee; } else { + // Reduce the ability for users to perform arbitrage by exploiting a + // favourable exchange rate. For example supplying Ether + // and gaining a more valuable amount of DOT on the destination chain. + // + // Also prevents users from mistakenly sending more fees than would be required + // which has negative effects like draining AssetHub's sovereign account. + // + // For safety, `maxDestinationChainFee` should be less valuable + // than the gas cost to send tokens. + if (destinationChainFee > maxDestinationChainFee) { + revert InvalidDestinationFee(); + } + // If the final destination chain is not AssetHub, then the fee needs to additionally // include the cost of executing an XCM on the final destination parachain. costs.foreign = $.assetHubReserveTransferFee + destinationChainFee; @@ -79,6 +92,7 @@ library Assets { ParaID destinationChain, MultiAddress calldata destinationAddress, uint128 destinationChainFee, + uint128 maxDestinationChainFee, uint128 amount ) external returns (Ticket memory ticket) { AssetsStorage.Layout storage $ = AssetsStorage.layout(); @@ -92,7 +106,7 @@ library Assets { _transferToAgent($.assetHubAgent, token, sender, amount); ticket.dest = $.assetHubParaID; - ticket.costs = _sendTokenCosts(destinationChain, destinationChainFee); + ticket.costs = _sendTokenCosts(destinationChain, destinationChainFee, maxDestinationChainFee); // Construct a message payload if (destinationChain == $.assetHubParaID) { diff --git a/contracts/src/DeployGatewayLogic.sol b/contracts/src/DeployGatewayLogic.sol index b9242d20b9..394da2900d 100644 --- a/contracts/src/DeployGatewayLogic.sol +++ b/contracts/src/DeployGatewayLogic.sol @@ -24,9 +24,18 @@ contract DeployGatewayLogic is Script { bytes32 bridgeHubAgentID = vm.envBytes32("BRIDGE_HUB_AGENT_ID"); uint8 foreignTokenDecimals = uint8(vm.envUint("FOREIGN_TOKEN_DECIMALS")); + uint128 maxDestinationFee = uint128(vm.envUint("RESERVE_TRANSFER_MAX_DESTINATION_FEE")); AgentExecutor executor = new AgentExecutor(); - new Gateway(beefyClient, address(executor), bridgeHubParaID, bridgeHubAgentID, foreignTokenDecimals); + + new Gateway( + address(beefyClient), + address(executor), + bridgeHubParaID, + bridgeHubAgentID, + foreignTokenDecimals, + maxDestinationFee + ); vm.stopBroadcast(); } diff --git a/contracts/src/DeployScript.sol b/contracts/src/DeployScript.sol index 53d74fac2a..c57ba3c415 100644 --- a/contracts/src/DeployScript.sol +++ b/contracts/src/DeployScript.sol @@ -57,10 +57,16 @@ contract DeployScript is Script { bytes32 assetHubAgentID = vm.envBytes32("ASSET_HUB_AGENT_ID"); uint8 foreignTokenDecimals = uint8(vm.envUint("FOREIGN_TOKEN_DECIMALS")); + uint128 maxDestinationFee = uint128(vm.envUint("RESERVE_TRANSFER_MAX_DESTINATION_FEE")); AgentExecutor executor = new AgentExecutor(); Gateway gatewayLogic = new Gateway( - address(beefyClient), address(executor), bridgeHubParaID, bridgeHubAgentID, foreignTokenDecimals + address(beefyClient), + address(executor), + bridgeHubParaID, + bridgeHubAgentID, + foreignTokenDecimals, + maxDestinationFee ); bool rejectOutboundMessages = vm.envBool("REJECT_OUTBOUND_MESSAGES"); diff --git a/contracts/src/Gateway.sol b/contracts/src/Gateway.sol index 0bb2c098af..130fee2352 100644 --- a/contracts/src/Gateway.sol +++ b/contracts/src/Gateway.sol @@ -71,6 +71,13 @@ contract Gateway is IGateway, IInitializable, IUpgradable { // 2. Calling implementation function uint256 DISPATCH_OVERHEAD_GAS = 10_000; + // The maximum fee that can be sent to a destination parachain to pay for execution (DOT). + // Has two functions: + // * Reduces the ability of users to perform arbitrage using a favourable exchange rate + // * Prevents users from mistakenly providing too much fees, which would drain AssetHub's + // sovereign account here on Ethereum. + uint128 internal immutable MAX_DESTINATION_FEE; + uint8 internal immutable FOREIGN_TOKEN_DECIMALS; error InvalidProof(); @@ -101,7 +108,8 @@ contract Gateway is IGateway, IInitializable, IUpgradable { address agentExecutor, ParaID bridgeHubParaID, bytes32 bridgeHubAgentID, - uint8 foreignTokenDecimals + uint8 foreignTokenDecimals, + uint128 maxDestinationFee ) { if (bridgeHubParaID == ParaID.wrap(0) || bridgeHubAgentID == 0) { revert InvalidConstructorParams(); @@ -113,6 +121,7 @@ contract Gateway is IGateway, IInitializable, IUpgradable { BRIDGE_HUB_PARA_ID = bridgeHubParaID; BRIDGE_HUB_AGENT_ID = bridgeHubAgentID; FOREIGN_TOKEN_DECIMALS = foreignTokenDecimals; + MAX_DESTINATION_FEE = maxDestinationFee; } /// @dev Submit a message from Polkadot for verification and dispatch @@ -395,7 +404,7 @@ contract Gateway is IGateway, IInitializable, IUpgradable { view returns (uint256) { - return _calculateFee(Assets.sendTokenCosts(token, destinationChain, destinationFee)); + return _calculateFee(Assets.sendTokenCosts(token, destinationChain, destinationFee, MAX_DESTINATION_FEE)); } // Transfer ERC20 tokens to a Polkadot parachain @@ -407,7 +416,7 @@ contract Gateway is IGateway, IInitializable, IUpgradable { uint128 amount ) external payable { _submitOutbound( - Assets.sendToken(token, msg.sender, destinationChain, destinationAddress, destinationFee, amount) + Assets.sendToken(token, msg.sender, destinationChain, destinationAddress, destinationFee, MAX_DESTINATION_FEE, amount) ); } diff --git a/contracts/src/upgrades/rococo/GatewayV2.sol b/contracts/src/upgrades/rococo/GatewayV2.sol index e671e19422..6fca76be5d 100644 --- a/contracts/src/upgrades/rococo/GatewayV2.sol +++ b/contracts/src/upgrades/rococo/GatewayV2.sol @@ -14,8 +14,18 @@ contract GatewayV2 is Gateway { address agentExecutor, ParaID bridgeHubParaID, bytes32 bridgeHubAgentID, - uint8 foreignTokenDecimals - ) Gateway(beefyClient, agentExecutor, bridgeHubParaID, bridgeHubAgentID, foreignTokenDecimals) {} + uint8 foreignTokenDecimals, + uint128 destinationMaxTransferFee + ) + Gateway( + beefyClient, + agentExecutor, + bridgeHubParaID, + bridgeHubAgentID, + foreignTokenDecimals, + destinationMaxTransferFee + ) + {} function initialize(bytes memory data) external override { // Prevent initialization of storage in implementation contract diff --git a/contracts/test/Gateway.t.sol b/contracts/test/Gateway.t.sol index 00f1682a0b..9140cd63f1 100644 --- a/contracts/test/Gateway.t.sol +++ b/contracts/test/Gateway.t.sol @@ -84,6 +84,7 @@ contract GatewayTest is Test { uint128 public registerTokenFee = 0; uint128 public sendTokenFee = 1e10; uint128 public createTokenFee = 1e10; + uint128 public maxDestinationFee = 1e11; MultiAddress public recipientAddress32; MultiAddress public recipientAddress20; @@ -97,8 +98,14 @@ contract GatewayTest is Test { function setUp() public { AgentExecutor executor = new AgentExecutor(); - gatewayLogic = - new GatewayMock(address(0), address(executor), bridgeHubParaID, bridgeHubAgentID, foreignTokenDecimals); + gatewayLogic = new GatewayMock( + address(0), + address(executor), + bridgeHubParaID, + bridgeHubAgentID, + foreignTokenDecimals, + maxDestinationFee + ); Gateway.Config memory config = Gateway.Config({ mode: OperatingMode.Normal, deliveryCost: outboundFee, @@ -784,7 +791,7 @@ contract GatewayTest is Test { SetTokenTransferFeesParams({ assetHubCreateAssetFee: createTokenFee * 2, registerTokenFee: registerTokenFee, - assetHubReserveTransferFee: sendTokenFee + assetHubReserveTransferFee: sendTokenFee * 3 }) ) ); @@ -819,7 +826,7 @@ contract GatewayTest is Test { assertEq(fee, 20000000000000001); } - function testSendTokenToForeignDestWithInvalidFee() public { + function testSendTokenWithZeroDestinationFee() public { // Let gateway lock up to 1 tokens token.approve(address(gateway), 1); @@ -829,10 +836,27 @@ contract GatewayTest is Test { // register token first uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); IGateway(address(gateway)).registerToken{value: fee}(address(token)); - fee = IGateway(address(gateway)).quoteSendTokenFee(address(token), destPara, 0); vm.expectRevert(Assets.InvalidDestinationFee.selector); IGateway(address(gateway)).sendToken{value: fee}(address(token), destPara, recipientAddress32, 0, 1); } + + function testSendTokenWithLargeDestinationFee() public { + // Let gateway lock up to 1 tokens + token.approve(address(gateway), 1); + + // Multilocation for recipient + ParaID destPara = ParaID.wrap(2043); + + // register token first + uint256 fee = IGateway(address(gateway)).quoteRegisterTokenFee(); + IGateway(address(gateway)).registerToken{value: fee}(address(token)); + + vm.expectRevert(Assets.InvalidDestinationFee.selector); + IGateway(address(gateway)).quoteSendTokenFee(address(token), destPara, maxDestinationFee + 1); + + vm.expectRevert(Assets.InvalidDestinationFee.selector); + IGateway(address(gateway)).sendToken{value: fee}(address(token), destPara, recipientAddress32, maxDestinationFee + 1, 1); + } } diff --git a/contracts/test/mocks/GatewayMock.sol b/contracts/test/mocks/GatewayMock.sol index 6f3f28b22b..4e97d6d049 100644 --- a/contracts/test/mocks/GatewayMock.sol +++ b/contracts/test/mocks/GatewayMock.sol @@ -16,8 +16,18 @@ contract GatewayMock is Gateway { address agentExecutor, ParaID bridgeHubParaID, bytes32 bridgeHubHubAgentID, - uint8 foreignTokenDecimals - ) Gateway(beefyClient, agentExecutor, bridgeHubParaID, bridgeHubHubAgentID, foreignTokenDecimals) {} + uint8 foreignTokenDecimals, + uint128 maxDestinationFee + ) + Gateway( + beefyClient, + agentExecutor, + bridgeHubParaID, + bridgeHubHubAgentID, + foreignTokenDecimals, + maxDestinationFee + ) + {} function agentExecutePublic(bytes calldata params) external { this.agentExecute(params); diff --git a/smoketest/src/constants.rs b/smoketest/src/constants.rs index f72404a595..6948caee76 100644 --- a/smoketest/src/constants.rs +++ b/smoketest/src/constants.rs @@ -69,6 +69,10 @@ lazy_static! { .unwrap_or("2500000000000000".to_string()) .parse() .unwrap(); + pub static ref FEE_MULTIPLIER: u128 = env::var("FEE_MULTIPLIER") + .unwrap_or("1000000000000000000".to_string()) + .parse() + .unwrap(); pub static ref FEE_PER_GAS: u64 = env::var("FEE_PER_GAS").unwrap_or("20000000000".to_string()).parse().unwrap(); pub static ref LOCAL_REWARD: u128 = diff --git a/smoketest/tests/set_pricing_params.rs b/smoketest/tests/set_pricing_params.rs index 850590c96c..48192584c9 100644 --- a/smoketest/tests/set_pricing_params.rs +++ b/smoketest/tests/set_pricing_params.rs @@ -34,6 +34,7 @@ async fn set_pricing_params() { exchange_rate: FixedU128(*EXCHANGE_RATE), rewards: Rewards { local: *LOCAL_REWARD, remote: U256([*REMOTE_REWARD, 0, 0, 0]) }, fee_per_gas: U256([*FEE_PER_GAS, 0, 0, 0]), + multiplier: FixedU128(*FEE_MULTIPLIER), }) .encode_call_data(&test_clients.bridge_hub_client.metadata()) .expect("encoded call"); diff --git a/web/packages/test/.gitignore b/web/packages/test/.gitignore index 6d151bfe70..de90cea292 100644 --- a/web/packages/test/.gitignore +++ b/web/packages/test/.gitignore @@ -19,4 +19,5 @@ rococo-local.json .pnp.* ethereum-goerli testdata +beacon-state .env diff --git a/web/packages/test/scripts/set-env.sh b/web/packages/test/scripts/set-env.sh index 85481110e2..eedc166d5e 100755 --- a/web/packages/test/scripts/set-env.sh +++ b/web/packages/test/scripts/set-env.sh @@ -96,6 +96,7 @@ export REJECT_OUTBOUND_MESSAGES="${REJECT_OUTBOUND_MESSAGES:-false}" export REGISTER_TOKEN_FEE="${REGISTER_TOKEN_FEE:-200000000000000000}" export CREATE_ASSET_FEE="${CREATE_ASSET_FEE:-10000000000}" export RESERVE_TRANSFER_FEE="${RESERVE_TRANSFER_FEE:-10000000000}" +export RESERVE_TRANSFER_MAX_DESTINATION_FEE="${RESERVE_TRANSFER_MAX_DESTINATION_FEE:-10000000000000}" ## Pricing Parameters export EXCHANGE_RATE="${EXCHANGE_RATE:-2500000000000000}" From 12a3470792309d735d1251e6e0d6f6f6f1becfcc Mon Sep 17 00:00:00 2001 From: Vincent Geddes <117534+vgeddes@users.noreply.github.com> Date: Sun, 14 Apr 2024 17:01:01 +0200 Subject: [PATCH 7/9] Move deployment scripts (#1177) --- codecov.yml | 2 +- contracts/foundry.toml | 1 + .../{src => scripts}/DeployGatewayLogic.sol | 6 +++--- contracts/{src => scripts}/DeployScript.sol | 18 +++++++++--------- contracts/{src => scripts}/FundAgent.sol | 18 +++++++++--------- web/packages/test/scripts/deploy-contracts.sh | 6 +++--- web/packages/test/scripts/fund-agent.sh | 2 +- 7 files changed, 27 insertions(+), 26 deletions(-) rename contracts/{src => scripts}/DeployGatewayLogic.sol (89%) rename contracts/{src => scripts}/DeployScript.sol (91%) rename contracts/{src => scripts}/FundAgent.sol (74%) diff --git a/codecov.yml b/codecov.yml index aa9bfb581b..75cb98e364 100644 --- a/codecov.yml +++ b/codecov.yml @@ -9,7 +9,7 @@ ignore: - "contracts/src/utils" - "contracts/src/ScaleCodec.sol" - "contracts/src/SubstrateTypes.sol" - - "contracts/src/DeployScript.sol" + - "contracts/scripts" flags: solidity: paths: diff --git a/contracts/foundry.toml b/contracts/foundry.toml index 24dea2d8e9..f16b5be662 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -4,6 +4,7 @@ optimizer = true optimizer_runs = 20_000 via_ir = true test = 'test' +script = 'scripts' fs_permissions = [{ access = "read-write", path = "test/data"}, { access = "read", path = "./"}] ignored_error_codes = [ diff --git a/contracts/src/DeployGatewayLogic.sol b/contracts/scripts/DeployGatewayLogic.sol similarity index 89% rename from contracts/src/DeployGatewayLogic.sol rename to contracts/scripts/DeployGatewayLogic.sol index 394da2900d..e8009d568f 100644 --- a/contracts/src/DeployGatewayLogic.sol +++ b/contracts/scripts/DeployGatewayLogic.sol @@ -2,9 +2,9 @@ // SPDX-FileCopyrightText: 2023 Snowfork pragma solidity 0.8.23; -import {AgentExecutor} from "./AgentExecutor.sol"; -import {Gateway} from "./Gateway.sol"; -import {ParaID} from "./Types.sol"; +import {AgentExecutor} from "../src/AgentExecutor.sol"; +import {Gateway} from "../src//Gateway.sol"; +import {ParaID} from "../src//Types.sol"; import {Script} from "forge-std/Script.sol"; import {stdJson} from "forge-std/StdJson.sol"; diff --git a/contracts/src/DeployScript.sol b/contracts/scripts/DeployScript.sol similarity index 91% rename from contracts/src/DeployScript.sol rename to contracts/scripts/DeployScript.sol index c57ba3c415..e3ec406ee7 100644 --- a/contracts/src/DeployScript.sol +++ b/contracts/scripts/DeployScript.sol @@ -4,15 +4,15 @@ pragma solidity 0.8.23; import {WETH9} from "canonical-weth/WETH9.sol"; import {Script} from "forge-std/Script.sol"; -import {BeefyClient} from "./BeefyClient.sol"; - -import {IGateway} from "./interfaces/IGateway.sol"; -import {GatewayProxy} from "./GatewayProxy.sol"; -import {Gateway} from "./Gateway.sol"; -import {Agent} from "./Agent.sol"; -import {AgentExecutor} from "./AgentExecutor.sol"; -import {ChannelID, ParaID, OperatingMode} from "./Types.sol"; -import {SafeNativeTransfer} from "./utils/SafeTransfer.sol"; +import {BeefyClient} from "../src/BeefyClient.sol"; + +import {IGateway} from "../src/interfaces/IGateway.sol"; +import {GatewayProxy} from "../src/GatewayProxy.sol"; +import {Gateway} from "../src/Gateway.sol"; +import {Agent} from "../src/Agent.sol"; +import {AgentExecutor} from "../src/AgentExecutor.sol"; +import {ChannelID, ParaID, OperatingMode} from "../src/Types.sol"; +import {SafeNativeTransfer} from "../src/utils/SafeTransfer.sol"; import {stdJson} from "forge-std/StdJson.sol"; import {UD60x18, ud60x18} from "prb/math/src/UD60x18.sol"; diff --git a/contracts/src/FundAgent.sol b/contracts/scripts/FundAgent.sol similarity index 74% rename from contracts/src/FundAgent.sol rename to contracts/scripts/FundAgent.sol index d4c3201d14..bda15cda17 100644 --- a/contracts/src/FundAgent.sol +++ b/contracts/scripts/FundAgent.sol @@ -4,15 +4,15 @@ pragma solidity 0.8.23; import {WETH9} from "canonical-weth/WETH9.sol"; import {Script} from "forge-std/Script.sol"; -import {BeefyClient} from "./BeefyClient.sol"; - -import {IGateway} from "./interfaces/IGateway.sol"; -import {GatewayProxy} from "./GatewayProxy.sol"; -import {Gateway} from "./Gateway.sol"; -import {Agent} from "./Agent.sol"; -import {AgentExecutor} from "./AgentExecutor.sol"; -import {ParaID} from "./Types.sol"; -import {SafeNativeTransfer} from "./utils/SafeTransfer.sol"; +import {BeefyClient} from "../src/BeefyClient.sol"; + +import {IGateway} from "../src/interfaces/IGateway.sol"; +import {GatewayProxy} from "../src/GatewayProxy.sol"; +import {Gateway} from "../src/Gateway.sol"; +import {Agent} from "../src/Agent.sol"; +import {AgentExecutor} from "../src/AgentExecutor.sol"; +import {ParaID} from "../src/Types.sol"; +import {SafeNativeTransfer} from "../src/utils/SafeTransfer.sol"; import {stdJson} from "forge-std/StdJson.sol"; contract FundAgent is Script { diff --git a/web/packages/test/scripts/deploy-contracts.sh b/web/packages/test/scripts/deploy-contracts.sh index 652720e1ed..e39b2b480e 100755 --- a/web/packages/test/scripts/deploy-contracts.sh +++ b/web/packages/test/scripts/deploy-contracts.sh @@ -5,7 +5,7 @@ source scripts/set-env.sh deploy_command() { local deploy_script=$1 - + pushd "$contract_dir" if [ "$eth_network" != "localhost" ]; then forge script \ @@ -27,7 +27,7 @@ deploy_command() { deploy_gateway_logic() { - deploy_command src/DeployGatewayLogic.sol:DeployGatewayLogic + deploy_command scripts/DeployGatewayLogic.sol:DeployGatewayLogic pushd "$test_helpers_dir" pnpm generateContracts "$output_dir/contracts.json" @@ -38,7 +38,7 @@ deploy_gateway_logic() deploy_contracts() { - deploy_command src/DeployScript.sol:DeployScript + deploy_command scripts/DeployScript.sol:DeployScript pushd "$test_helpers_dir" pnpm generateContracts "$output_dir/contracts.json" diff --git a/web/packages/test/scripts/fund-agent.sh b/web/packages/test/scripts/fund-agent.sh index 9187a4b586..e094e9c483 100755 --- a/web/packages/test/scripts/fund-agent.sh +++ b/web/packages/test/scripts/fund-agent.sh @@ -9,7 +9,7 @@ fund_agent() { --rpc-url $eth_endpoint_http \ --broadcast \ -vvv \ - src/FundAgent.sol:FundAgent + scripts/FundAgent.sol:FundAgent popd echo "Fund agent success!" From 10875e90cd1cf35cb039a382586f767ba19a8b9e Mon Sep 17 00:00:00 2001 From: Vincent Geddes <117534+vgeddes@users.noreply.github.com> Date: Sun, 14 Apr 2024 17:04:26 +0200 Subject: [PATCH 8/9] Update contract bindings (#1178) --- relayer/contracts/beefy_client.go | 137 +++++++++++++++++++++++++++- relayer/contracts/gateway.go | 146 +----------------------------- 2 files changed, 137 insertions(+), 146 deletions(-) diff --git a/relayer/contracts/beefy_client.go b/relayer/contracts/beefy_client.go index 8e270483c5..3ab1bdb2ce 100644 --- a/relayer/contracts/beefy_client.go +++ b/relayer/contracts/beefy_client.go @@ -78,7 +78,7 @@ type Uint16Array struct { // BeefyClientMetaData contains all meta data concerning the BeefyClient contract. var BeefyClientMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_randaoCommitDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_randaoCommitExpiration\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minNumRequiredSignatures\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_initialBeefyBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_initialValidatorSet\",\"type\":\"tuple\",\"internalType\":\"structBeefyClient.ValidatorSet\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"length\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_nextValidatorSet\",\"type\":\"tuple\",\"internalType\":\"structBeefyClient.ValidatorSet\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"length\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MMR_ROOT_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"commitPrevRandao\",\"inputs\":[{\"name\":\"commitmentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createFinalBitfield\",\"inputs\":[{\"name\":\"commitmentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bitfield\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createInitialBitfield\",\"inputs\":[{\"name\":\"bitsToSet\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"currentValidatorSet\",\"inputs\":[],\"outputs\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"length\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"usageCounters\",\"type\":\"tuple\",\"internalType\":\"structUint16Array\",\"components\":[{\"name\":\"data\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestBeefyBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestMMRRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minNumRequiredSignatures\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextValidatorSet\",\"inputs\":[],\"outputs\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"length\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"usageCounters\",\"type\":\"tuple\",\"internalType\":\"structUint16Array\",\"components\":[{\"name\":\"data\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"randaoCommitDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"randaoCommitExpiration\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitFinal\",\"inputs\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBeefyClient.Commitment\",\"components\":[{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"validatorSetID\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple[]\",\"internalType\":\"structBeefyClient.PayloadItem[]\",\"components\":[{\"name\":\"payloadID\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"bitfield\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeefyClient.ValidatorProof[]\",\"components\":[{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}]},{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structBeefyClient.MMRLeaf\",\"components\":[{\"name\":\"version\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"parentNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextAuthoritySetID\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextAuthoritySetLen\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"nextAuthoritySetRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parachainHeadsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"leafProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"leafProofOrder\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitInitial\",\"inputs\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBeefyClient.Commitment\",\"components\":[{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"validatorSetID\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple[]\",\"internalType\":\"structBeefyClient.PayloadItem[]\",\"components\":[{\"name\":\"payloadID\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"bitfield\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeefyClient.ValidatorProof\",\"components\":[{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"tickets\",\"inputs\":[{\"name\":\"ticketID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"blockNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"validatorSetLen\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numRequiredSignatures\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"prevRandao\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bitfieldHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyMMRLeafProof\",\"inputs\":[{\"name\":\"leafHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofOrder\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"NewMMRRoot\",\"inputs\":[{\"name\":\"mmrRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"blockNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CommitmentNotRelevant\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IndexOutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBitfield\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBitfieldLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCommitment\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMMRLeaf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMMRLeafProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMMRRootLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTicket\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEnoughClaims\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PrevRandaoAlreadyCaptured\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PrevRandaoNotCaptured\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProofSizeExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StaleCommitment\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TicketExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnsupportedCompactEncoding\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WaitPeriodNotOver\",\"inputs\":[]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_randaoCommitDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_randaoCommitExpiration\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minNumRequiredSignatures\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_initialBeefyBlock\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_initialValidatorSet\",\"type\":\"tuple\",\"internalType\":\"structBeefyClient.ValidatorSet\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"length\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_nextValidatorSet\",\"type\":\"tuple\",\"internalType\":\"structBeefyClient.ValidatorSet\",\"components\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"length\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MMR_ROOT_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"commitPrevRandao\",\"inputs\":[{\"name\":\"commitmentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createFinalBitfield\",\"inputs\":[{\"name\":\"commitmentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"bitfield\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createInitialBitfield\",\"inputs\":[{\"name\":\"bitsToSet\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"currentValidatorSet\",\"inputs\":[],\"outputs\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"length\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"usageCounters\",\"type\":\"tuple\",\"internalType\":\"structUint16Array\",\"components\":[{\"name\":\"data\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestBeefyBlock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestMMRRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minNumRequiredSignatures\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextValidatorSet\",\"inputs\":[],\"outputs\":[{\"name\":\"id\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"length\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"usageCounters\",\"type\":\"tuple\",\"internalType\":\"structUint16Array\",\"components\":[{\"name\":\"data\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"randaoCommitDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"randaoCommitExpiration\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitFinal\",\"inputs\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBeefyClient.Commitment\",\"components\":[{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"validatorSetID\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple[]\",\"internalType\":\"structBeefyClient.PayloadItem[]\",\"components\":[{\"name\":\"payloadID\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"bitfield\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeefyClient.ValidatorProof[]\",\"components\":[{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}]},{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structBeefyClient.MMRLeaf\",\"components\":[{\"name\":\"version\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"parentNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextAuthoritySetID\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextAuthoritySetLen\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"nextAuthoritySetRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parachainHeadsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"leafProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"leafProofOrder\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitInitial\",\"inputs\":[{\"name\":\"commitment\",\"type\":\"tuple\",\"internalType\":\"structBeefyClient.Commitment\",\"components\":[{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"validatorSetID\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple[]\",\"internalType\":\"structBeefyClient.PayloadItem[]\",\"components\":[{\"name\":\"payloadID\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"bitfield\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeefyClient.ValidatorProof\",\"components\":[{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"tickets\",\"inputs\":[{\"name\":\"ticketID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"blockNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"validatorSetLen\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"numRequiredSignatures\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"prevRandao\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"bitfieldHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyMMRLeafProof\",\"inputs\":[{\"name\":\"leafHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofOrder\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"NewMMRRoot\",\"inputs\":[{\"name\":\"mmrRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"blockNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NewTicket\",\"inputs\":[{\"name\":\"relayer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"blockNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CommitmentNotRelevant\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IndexOutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBitfield\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBitfieldLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCommitment\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMMRLeaf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMMRLeafProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMMRRootLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTicket\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEnoughClaims\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PrevRandaoAlreadyCaptured\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PrevRandaoNotCaptured\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProofSizeExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StaleCommitment\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TicketExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnsupportedCompactEncoding\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WaitPeriodNotOver\",\"inputs\":[]}]", } // BeefyClientABI is the input ABI used to generate the binding from. @@ -873,3 +873,138 @@ func (_BeefyClient *BeefyClientFilterer) ParseNewMMRRoot(log types.Log) (*BeefyC event.Raw = log return event, nil } + +// BeefyClientNewTicketIterator is returned from FilterNewTicket and is used to iterate over the raw logs and unpacked data for NewTicket events raised by the BeefyClient contract. +type BeefyClientNewTicketIterator struct { + Event *BeefyClientNewTicket // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *BeefyClientNewTicketIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(BeefyClientNewTicket) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(BeefyClientNewTicket) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *BeefyClientNewTicketIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *BeefyClientNewTicketIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// BeefyClientNewTicket represents a NewTicket event raised by the BeefyClient contract. +type BeefyClientNewTicket struct { + Relayer common.Address + BlockNumber uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNewTicket is a free log retrieval operation binding the contract event 0xbee983fc706c692efb9b0240bddc5666c010a53af55ed5fb42d226e7e4293869. +// +// Solidity: event NewTicket(address relayer, uint64 blockNumber) +func (_BeefyClient *BeefyClientFilterer) FilterNewTicket(opts *bind.FilterOpts) (*BeefyClientNewTicketIterator, error) { + + logs, sub, err := _BeefyClient.contract.FilterLogs(opts, "NewTicket") + if err != nil { + return nil, err + } + return &BeefyClientNewTicketIterator{contract: _BeefyClient.contract, event: "NewTicket", logs: logs, sub: sub}, nil +} + +// WatchNewTicket is a free log subscription operation binding the contract event 0xbee983fc706c692efb9b0240bddc5666c010a53af55ed5fb42d226e7e4293869. +// +// Solidity: event NewTicket(address relayer, uint64 blockNumber) +func (_BeefyClient *BeefyClientFilterer) WatchNewTicket(opts *bind.WatchOpts, sink chan<- *BeefyClientNewTicket) (event.Subscription, error) { + + logs, sub, err := _BeefyClient.contract.WatchLogs(opts, "NewTicket") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(BeefyClientNewTicket) + if err := _BeefyClient.contract.UnpackLog(event, "NewTicket", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNewTicket is a log parse operation binding the contract event 0xbee983fc706c692efb9b0240bddc5666c010a53af55ed5fb42d226e7e4293869. +// +// Solidity: event NewTicket(address relayer, uint64 blockNumber) +func (_BeefyClient *BeefyClientFilterer) ParseNewTicket(log types.Log) (*BeefyClientNewTicket, error) { + event := new(BeefyClientNewTicket) + if err := _BeefyClient.contract.UnpackLog(event, "NewTicket", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/relayer/contracts/gateway.go b/relayer/contracts/gateway.go index 814a6a5017..aa7842c263 100644 --- a/relayer/contracts/gateway.go +++ b/relayer/contracts/gateway.go @@ -91,7 +91,7 @@ type VerificationProof struct { // GatewayMetaData contains all meta data concerning the Gateway contract. var GatewayMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"agentOf\",\"inputs\":[{\"name\":\"agentID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"channelNoncesOf\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"internalType\":\"ChannelID\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"channelOperatingModeOf\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"internalType\":\"ChannelID\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumOperatingMode\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"implementation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isTokenRegistered\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatingMode\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumOperatingMode\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pricingParameters\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"UD60x18\"},{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quoteRegisterTokenFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quoteSendTokenFee\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationChain\",\"type\":\"uint32\",\"internalType\":\"ParaID\"},{\"name\":\"destinationFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationChain\",\"type\":\"uint32\",\"internalType\":\"ParaID\"},{\"name\":\"destinationAddress\",\"type\":\"tuple\",\"internalType\":\"structMultiAddress\",\"components\":[{\"name\":\"kind\",\"type\":\"uint8\",\"internalType\":\"enumKind\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"destinationFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"amount\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"submitV1\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInboundMessage\",\"components\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"internalType\":\"ChannelID\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"command\",\"type\":\"uint8\",\"internalType\":\"enumCommand\"},{\"name\":\"params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"maxDispatchGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxFeePerGas\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"reward\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"leafProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"headerProof\",\"type\":\"tuple\",\"internalType\":\"structVerification.Proof\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structVerification.ParachainHeader\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"number\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extrinsicsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"digestItems\",\"type\":\"tuple[]\",\"internalType\":\"structVerification.DigestItem[]\",\"components\":[{\"name\":\"kind\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"consensusEngineID\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"headProof\",\"type\":\"tuple\",\"internalType\":\"structVerification.HeadProof\",\"components\":[{\"name\":\"pos\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"width\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}]},{\"name\":\"leafPartial\",\"type\":\"tuple\",\"internalType\":\"structVerification.MMRLeafPartial\",\"components\":[{\"name\":\"version\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"parentNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextAuthoritySetID\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextAuthoritySetLen\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"nextAuthoritySetRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"leafProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"leafProofOrder\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AgentCreated\",\"inputs\":[{\"name\":\"agentID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"agent\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AgentFundsWithdrawn\",\"inputs\":[{\"name\":\"agentID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChannelCreated\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChannelUpdated\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InboundMessageDispatched\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatingModeChanged\",\"inputs\":[{\"name\":\"mode\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumOperatingMode\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutboundMessageAccepted\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PricingParametersChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenRegistrationSent\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destinationChain\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"ParaID\"},{\"name\":\"destinationAddress\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structMultiAddress\",\"components\":[{\"name\":\"kind\",\"type\":\"uint8\",\"internalType\":\"enumKind\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeesChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"agentOf\",\"inputs\":[{\"name\":\"agentID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"channelNoncesOf\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"internalType\":\"ChannelID\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"channelOperatingModeOf\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"internalType\":\"ChannelID\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumOperatingMode\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"implementation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isTokenRegistered\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatingMode\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumOperatingMode\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pricingParameters\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"UD60x18\"},{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quoteRegisterTokenFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quoteSendTokenFee\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationChain\",\"type\":\"uint32\",\"internalType\":\"ParaID\"},{\"name\":\"destinationFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationChain\",\"type\":\"uint32\",\"internalType\":\"ParaID\"},{\"name\":\"destinationAddress\",\"type\":\"tuple\",\"internalType\":\"structMultiAddress\",\"components\":[{\"name\":\"kind\",\"type\":\"uint8\",\"internalType\":\"enumKind\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"destinationFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"amount\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"submitV1\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInboundMessage\",\"components\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"internalType\":\"ChannelID\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"command\",\"type\":\"uint8\",\"internalType\":\"enumCommand\"},{\"name\":\"params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"maxDispatchGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxFeePerGas\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"reward\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"leafProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"headerProof\",\"type\":\"tuple\",\"internalType\":\"structVerification.Proof\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structVerification.ParachainHeader\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"number\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extrinsicsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"digestItems\",\"type\":\"tuple[]\",\"internalType\":\"structVerification.DigestItem[]\",\"components\":[{\"name\":\"kind\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"consensusEngineID\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"headProof\",\"type\":\"tuple\",\"internalType\":\"structVerification.HeadProof\",\"components\":[{\"name\":\"pos\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"width\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}]},{\"name\":\"leafPartial\",\"type\":\"tuple\",\"internalType\":\"structVerification.MMRLeafPartial\",\"components\":[{\"name\":\"version\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"parentNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextAuthoritySetID\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextAuthoritySetLen\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"nextAuthoritySetRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"leafProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"leafProofOrder\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AgentCreated\",\"inputs\":[{\"name\":\"agentID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"agent\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AgentFundsWithdrawn\",\"inputs\":[{\"name\":\"agentID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChannelCreated\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChannelUpdated\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InboundMessageDispatched\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatingModeChanged\",\"inputs\":[{\"name\":\"mode\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumOperatingMode\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutboundMessageAccepted\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PricingParametersChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenRegistrationSent\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destinationChain\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"ParaID\"},{\"name\":\"destinationAddress\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structMultiAddress\",\"components\":[{\"name\":\"kind\",\"type\":\"uint8\",\"internalType\":\"enumKind\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeesChanged\",\"inputs\":[],\"anonymous\":false}]", } // GatewayABI is the input ABI used to generate the binding from. @@ -2172,147 +2172,3 @@ func (_Gateway *GatewayFilterer) ParseTokenTransferFeesChanged(log types.Log) (* event.Raw = log return event, nil } - -// GatewayUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the Gateway contract. -type GatewayUpgradedIterator struct { - Event *GatewayUpgraded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *GatewayUpgradedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(GatewayUpgraded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(GatewayUpgraded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *GatewayUpgradedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *GatewayUpgradedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// GatewayUpgraded represents a Upgraded event raised by the Gateway contract. -type GatewayUpgraded struct { - Implementation common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_Gateway *GatewayFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*GatewayUpgradedIterator, error) { - - var implementationRule []interface{} - for _, implementationItem := range implementation { - implementationRule = append(implementationRule, implementationItem) - } - - logs, sub, err := _Gateway.contract.FilterLogs(opts, "Upgraded", implementationRule) - if err != nil { - return nil, err - } - return &GatewayUpgradedIterator{contract: _Gateway.contract, event: "Upgraded", logs: logs, sub: sub}, nil -} - -// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_Gateway *GatewayFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *GatewayUpgraded, implementation []common.Address) (event.Subscription, error) { - - var implementationRule []interface{} - for _, implementationItem := range implementation { - implementationRule = append(implementationRule, implementationItem) - } - - logs, sub, err := _Gateway.contract.WatchLogs(opts, "Upgraded", implementationRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(GatewayUpgraded) - if err := _Gateway.contract.UnpackLog(event, "Upgraded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. -// -// Solidity: event Upgraded(address indexed implementation) -func (_Gateway *GatewayFilterer) ParseUpgraded(log types.Log) (*GatewayUpgraded, error) { - event := new(GatewayUpgraded) - if err := _Gateway.contract.UnpackLog(event, "Upgraded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} From 0d7c8530c06530ae9ba9152db91db9892f60e06a Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Mon, 15 Apr 2024 19:14:23 +0200 Subject: [PATCH 9/9] update nightly version (#1179) --- flake.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index e8b302ecaa..130e52fe92 100644 --- a/flake.nix +++ b/flake.nix @@ -86,7 +86,7 @@ export CARGO_HOME=$PWD/.cargo export RUSTUP_HOME=$PWD/.rustup - export RUST_NIGHTLY_VERSION=nightly-2023-12-28 + export RUST_NIGHTLY_VERSION=nightly-2024-02-08 export PATH=$CARGO_HOME/bin:$PATH eval "$(direnv hook bash)"