Commit Graph

465 Commits

Author SHA1 Message Date
justinschuldt 33298ca722 solana-devnet init multiple guardians 2022-04-12 20:37:52 -05:00
Csongor Kiss 4227dde53b Improve and document deployment&verification workflow 2022-04-11 21:29:39 -04:00
Csongor Kiss ff15ca3a67 Document AccountState
* Don't use option_env
* Fix 'cargo test' (it was failing on ambiguous module names)
2022-04-11 21:29:39 -04:00
Hendrik Hofstadt c04d25e704 Fix solana integration tests & add test for account creation
Change-Id: I222744f194f952d03bfbd3ba4469bce59c310fc0
2022-04-11 21:29:39 -04:00
Hendrik Hofstadt 2b56fcc7da solitaire: Fix prefunded accounts blocking creation
Change-Id: I8841e6595b7f8bb217991515bb9ae1ae3d4f4607
2022-04-11 21:29:39 -04:00
Reisen 4e13d9d49c solana/token_bridge: Add blacklisted keys 2022-04-11 21:29:39 -04:00
Csongor Kiss f60acc59ab
solitaire: Infer entry point argument type in solitaire! macro (#927)
The type of the `ix_data` binding withing the solitaire! macro expansion
is explicitly annotated with its type, which comes from the macro's
pattern binding `$kind`. However, this type annotation is entirely
optional, since `ix_data` is passed in as an argument to `$fn`, whose
type forecs `ix_data` anyway, and rust will happily infer that from the
application. So we remove the explicit annotation which makes the entry
point macro easier to use.

commit-id:d428306c
2022-03-16 18:25:41 +00:00
Evan Gray a3272dce4a remove pyth2wormhole 2022-03-07 10:23:34 -05:00
Stan Drozd 972939ee31 pyth2wormhole: Fix attestation validation bug
commit-id:567942d7
2022-03-02 15:55:46 +01:00
Evan Gray 695dcac26c support custom root ca 2022-03-01 12:35:27 -05:00
Stan Drozd 0642288697 pyth2wormhole: rustfmt --config-path solana/rustfmt.toml
commit-id:a4fae495
2022-02-28 12:29:58 +00:00
Stan Drozd 1e953e637f pyth2wormhole-client: make sure we raise batch errors on exit
commit-id:65022128
2022-02-24 19:40:04 +01:00
Stanisław Drozd 2ea41b8176
[WIP] Pr/drozdziak1/p2w batching/5e704f8b (#877)
* ethereum: p2w contract -> p2w emitter, fill in essential envs

Change-Id: I6fa9364a96738d2cc02ec829a31fedba0586d8e8

commit-id:0a56f1f8

* Add p2w-relay, a p2w-sdk integration test

commit-id:6bfab639

* p2w-sdk: Expand README

Change-Id: I17cb547d6aaddc240588923561c26d11a787df2e

commit-id:6ebd6a22

* p2w-sdk: don't build ETH contracts, only the types

Change-Id: I7cbd18328227700635d7688aa24a9671e8919fcd

commit-id:adf079f7

* p2w: configurability and sane envs

commit-id:f10fd90e

* Solitaire: Implement Option<T> support in structs

commit-id:31aa12d6

* bridge/governance.rs: Stop pestering about EMITTER_ADDRESS

commit-id:d5bd7234

* p2w-attest: price batching

This commit introduces support for multiple Pyth product/price pairs
per call. The initial maximum batch size is 5 and is enforced using a
`P2W_MAX_BATCH_SIZE` constant.

solana/pyth2wormhole/program:
* On-chain batching logic
* Batch message parsing logic

solana/pyth2wormhole/client:
* Off-chain batching logic - divides any number of symbols into
largest possible batches
* Use a multi-symbol config file instead of CLI arguments

third_party/pyth/p2w-sdk:
* Expose batch parsing logic

third_party/pyth/p2w-relay:
* Comment out target chain calls until ETH contract supports batching
* Test the batch parsing function

third_party/pyth/p2w_autoattest.py:
* Generate and use the symbol config file  with pyth2wormhole-client

third_party/pyth/pyth_publisher.py:
* Add a configurable number of mock Pyth symbols
* Adjust HTTP endpoint for multiple symbols

commit-id:73787a61

* p2w-attest: mention attestation size in batch

This commit ensures that no matter the attestation format, a batch
will never contain attestations of different sizes. This guarantee
enables forward compatibility by adding new constant-size fields at
the end of a batch at all times. An older implementation will simply
not consume the remaining newer values while respecting the stated
batch member alignment.

commit-id:210da230

* pyth2wormhole-client: use fresh blockhashes, harden batch errors

This commit makes sure we don't have to deal with expired transactions
due to stale blockhashes. The problem existed with larger symbol
configs as well as on Solana mainnet. Additionally, the attestation logic
now treats transaction errors as non-critical - a failure for a batch
does not prevent attestation attempts for batches farther in the queue

commit-id:5e704f8b
2022-02-23 19:12:16 +01:00
Leopold Schabel 44c1f9e6a9
solana: compile wasm and contracts with --locked (#874) 2022-02-18 12:48:10 +01:00
Leopold Schabel 870d15d483
*: bump pyth-client to 0.2.2 (#873)
The v2 branch on the Git origin disappeared. Use the crate instead.
Updated lockfiles using `cargo update -w`.

commit-id:d2655ef8
2022-02-18 00:01:13 -06:00
Evan Gray fce0708e11 feat: use sdk in js client 2022-02-14 07:56:38 -05:00
Kevin Peters e30f92b3e0 solana-program 1.9.4 wasm-bindgen workaround
wasm-bindgen 0.2.74 generates JavaScript bindings for SystemInstruction
exported from solana-program 1.9.4. The generated JavaScript references
a non-existent function (wasm.__wbg_systeminstruction_free) that
leads to an attempted import error when importing the wasm packed for
bundler. SystemInstruction isn't used in the sdk, so we remove the non-existent
function reference as a workaround.
2022-02-10 15:51:11 -05:00
Csongor Kiss dc2e6d8990
solana: add correct spl_token_metadata.so (#815)
Co-authored-by: Csongor Kiss <ckiss@jumptrading.com>
2022-02-03 19:10:16 +00:00
Hendrik Hofstadt 7edbbd3677 Update Solana to 1.9.4
Change-Id: I9c1ce5f25b21ca81599957a7faa730558d8fc03e
2022-02-02 11:31:33 -05:00
Reisen 3cd7ea173a solana: compile token metadata with 1.8.1 toolchain
Change-Id: Ifcfa984840a33326b3dbd59f23b6cf662651c2f8
2022-01-14 14:55:40 -05:00
Reisen e561d6de02 sdk: fixes to types and builds
Change-Id: I10b753450445cc021dbeb9f28ddb0384070e9635
2022-01-14 13:09:12 +00:00
Reisen 7f1c7ec62f solitaire: expose entrypoint and relax lifetimes
The current lifetimes 'a/'b restrict the &data and &program_id lifetimes which makes the
entrypoint unusable in solana_test_program's processor!() harness, which expects the more
relaxed (but equivelent for us) type of:

    fn processor<'a, 'b: 'a, 'c, 'd>(
      program_id: &'c Pubkey,
      accounts:   &'a [AccountInfo<'b>],
      data:       &'d [u8]
    )

It has no effect on our current programs.

Change-Id: Ia657462141165064c629fdff02b5ec451aab50f0
2022-01-14 13:09:12 +00:00
Reisen ee0fea0436 sdk: add underlying sdk for wormhole programs
Change-Id: I858f3e43e6458af51131de9165a63078e4bb024c
2022-01-14 13:09:12 +00:00
Reisen d21f08d2cb rust: rename wormhole libraries
Change-Id: I9bf5255c13b13d3724d7f8809489b04612b90747
2022-01-14 13:09:12 +00:00
Hendrik Hofstadt 32e9063910 Check whether vaa recipient matches the token account
Change-Id: Iab326cd735c764649dc031d813dbb8818d5e74f3
2022-01-13 14:07:40 +01:00
Stanisław Drozd 02a1dcecbc
solana: hide wasm-bindgen dependency behind the feature flag (#730)
commit-id:480d3b7a
2022-01-10 15:31:36 +01:00
Csongor Kiss 7e212fa739
terra/nft_bridge: Implement nft-bridge for terra (#698)
commit-id:0b547fa5
2022-01-07 16:47:33 +01:00
Chase Moran 2b00826847 update solana to 1.8.1 2021-12-29 21:07:55 -05:00
Leo b0ed42681d Use stable Buildkit syntax
We no longer need to be on an experimental branch - all the
Dockerfile features we need were released on 1.3.

commit-id:b083856a
2021-12-13 15:38:17 +01:00
Reisen 124efece2a solana/token_bridge: allow updating metadata
Change-Id: I34872eaa9e931d9698808cc658840a5885c3dc5f
2021-11-19 19:42:44 +00:00
Reisen d678cb4662 solana/token_bridge: prevent transfers to self chain
Change-Id: I0c97bf87e042c64a4b77cc359a1971912a247af8
2021-11-17 17:37:21 +00:00
Reisen 0d97a2e5a3 solana/token_bridge: prevent self attestations
Change-Id: Iac42e8dcc9f04c1035334ec021c7d4ab11857227
2021-11-17 16:20:20 +00:00
Hendrik Hofstadt 78547e23e6 Allow self registration on Solana
Change-Id: Ifc791036223e35af72a847f86ae1ddfd6b4d2173
2021-11-15 19:19:31 +01:00
Stan Drozd 05edb3d14f pyth2wormhole: rename p2w-client service to p2w-attest
Change-Id: I34a53146919c12ab41b958cc8cd57108ee509faa
2021-11-15 15:22:29 +00:00
Stan Drozd a8465ef791 pyth2wormhole: implement deserialization, print sequence
Change-Id: I39308ad6431df52f35a0496e71836497561640c5
2021-11-15 15:22:29 +00:00
Evan Gray c824a99636 sdk/js: attempt jest tests
Change-Id: I139153994604f0048f690b011048daec4d760a55
2021-11-05 19:53:00 +00:00
Evan Gray 57db7e7910 solana: pin wasm-pack version
Change-Id: Ic7bdb237fd43e5632c6dae9f669284fa5bcedc4b
2021-11-01 19:37:53 -04:00
justinschuldt e5045f1c8c devnet Explorer
- Add network switcher.
- Explorer landing page with light stats:
  - summary of recent messages per chain.
  - shows most recent messages, polls for updates.
- chain-details view.
- super basic message details view: json.
- runs in devnet.
- add network switcher to guardian-list page.
- links to native explorers (etherscan, etc.)
- polygon support
- animations when data updates

Change-Id: I26616afab551a7555421a45dee9f016beecbf93e
2021-10-27 21:15:47 +00:00
Reisen 6076f9acc4 solana/token_bridge: add custody_signer derive to wasm
Change-Id: I9dc9e5d80dce3e580257877b4640df3408b4b568
2021-10-04 16:40:06 +00:00
Hendrik Hofstadt 20ce9e1e5c Fix CPI poster
Change-Id: I5a1d13f5256cdb13a431d1bf5cb2c42506de9920
2021-10-01 09:03:25 +00:00
Hendrik Hofstadt 18f3262b89 Add second eth devnet to emulate bsc
Change-Id: Ia28078cdd843540bc6d5d2a3db4787637c752245
2021-09-30 15:00:27 +00:00
Reisen 49c3be0b79 solana/token-program: derive metadata address in client
Change-Id: Ia5e54725c13cc2725efa88b9848910829de48463
2021-09-28 16:01:21 +00:00
Hendrik Hofstadt 1421e5d76f Add derivation methods for claims and spl meta
Change-Id: I4e8056b37d441caf7bca94037585c37afe25cc24
2021-09-21 16:29:42 +02:00
Hendrik Hofstadt 3968b6eb7f Split nft transfer in 2 ixs
This also changes the required confirmation level to finalized

Change-Id: I4793619634e7bac587b20d2776c0b166b95a6de7
2021-09-21 15:29:40 +02:00
Hendrik Hofstadt 416a1e7227 Add a second test NFT on Solana
Change-Id: I7dce98cbc3df625d3ce071f179dc25cf873d2047
2021-09-21 11:21:12 +02:00
Hendrik Hofstadt 64b17d851a Encode mint in token ID on Solana
Change-Id: Ice9c2b64992e60bb8a0eb5d0a109043eda2d44ac
2021-09-20 15:56:39 +02:00
Hendrik Hofstadt 371c9b3dcc Resolve warnings in the NFT bridge
Change-Id: I6d5e5a7d66e8e35418eaf9346c53b3439314c9c5
2021-09-20 12:23:40 +02:00
Stan Drozd 3e96438f4e pyth2wormhole: initial SDK skeleton
Change-Id: I8697ced892a1bf69f948c9743741d32a442a402f
2021-09-16 13:15:13 +00:00
Chase Moran d8ad37d357 Allow migration liquidity removal
Change-Id: I9ec62ffa94b26ffd1776a2b76aa7586424a77b64
2021-09-13 18:55:25 +00:00
Reisen 88dfab6e29 solana/migration: mint tokens via share mint
Change-Id: Ibaf785d8a3004c424b40a3974a8de482545ed2d0
2021-09-13 15:06:01 +00:00
Reisen 654ccfaabf solana/migration: dont transfer dust into the pool
Change-Id: I1f7c5df4f959f1a084569ad92767b05264642ffe
2021-09-13 15:05:46 +00:00
Hendrik Hofstadt 88933d13e2 Build token migration program
Change-Id: I78b10931fb09f5bca457c1fb36095fdbcea9e65f
2021-09-13 14:01:16 +00:00
Reisen c116b3c813 solana/token_bridge: fix incorrect byte iterator
Change-Id: I4bcb3217c34fda24463886aa35de691238f8bdc4
2021-09-13 12:31:11 +00:00
Reisen 2beaada181 solana/token_bridge: allow invalid utf-8 metadata
Change-Id: Ifcc45d3a654cd7aa386089728c1f354352c5ebe2
2021-09-13 11:52:41 +00:00
Reisen 3a9264f6e4 solana/nft_bridge: allow invalid utf-8 metadata
Change-Id: If2fba5d394b8afab34ed0f12714851d0121a2924
2021-09-13 11:52:41 +00:00
Hendrik Hofstadt 47c5834e6f Cache NFT bridge build
Change-Id: Ib67a3780cd146edd570111cbc443c63bae6219ef
2021-09-13 12:49:40 +02:00
Reisen 20386593ed solana/bridge: fix tests to use bool sigcheck
Change-Id: I8d59016ae926e9cdcdc6114db8c640889fc5c9ee
2021-09-13 10:29:29 +00:00
Reisen ca509f2d73 solana/bridge: re-organize account data
Change-Id: Ia215c584e5d00145d8ad0250c303ca9503d8432a
2021-09-13 10:29:29 +00:00
Reisen 3714624fb0 solana/token-bridge: add original_decimal tracking
Change-Id: I0989e2f75e7f4d2b0cf2c2e9fb35c26d288a902b
2021-09-13 08:23:50 +00:00
Evan Gray 9ea0369ab0 nft_bridge fixes
Change-Id: I9420863384e752725cfc75c8b5a21f64be2792b1
2021-09-10 20:32:46 -04:00
Hendrik Hofstadt 6ff21f8d01 add ethereum NFT bridge
Change-Id: I5cc8cfe431f5f9b043adc7baf662760ffe9e7a35
2021-09-10 23:43:14 +00:00
Hendrik Hofstadt a2b3d111f4 add nft bridge skeleton
Change-Id: I69449e95415cd94b7de4528fe4002b241e1e6b95
2021-09-10 17:12:42 +00:00
David Paryente 8d15138d57 Revert "Allow Sollet asset migration"
This reverts commit 59e0e586ef.

Reason for revert: not supporting external mints

Change-Id: Ia3ca9ccc24e1ab20c7f8097aff0868d94e4bb7af
2021-09-10 13:24:17 +00:00
David Paryente 7a504108cd Revert "solana/token_bridge: sollet mints renamed to generic external"
This reverts commit 496d2385f5.

Reason for revert: not supporting external mints

Change-Id: I996f4fcbfb71a6539094f2d4a6adbff481fefb7d
2021-09-10 13:08:23 +00:00
David Paryente e6a6c39620 Revert "solana/token_bridge: test wrapped asset transfers"
Revert submission 1325

Reason for revert: not supporting external mints
Reverted Changes:
I2bf59ecd3:solana/token_bridge: calculate diff from original ...
I598373740:solana/token_bridge: check balance and truncation
I67c7a1c7a:solana/token_bridge: test wrapped asset transfers

Change-Id: I00d3c23c16fbb985457d841139fea25c5697dab1
2021-09-10 13:08:06 +00:00
David Paryente 08fcb1e9ec Revert "solana/token_bridge: check balance and truncation"
Revert submission 1325

Reason for revert: not supporting external mints
Reverted Changes:
I2bf59ecd3:solana/token_bridge: calculate diff from original ...
I598373740:solana/token_bridge: check balance and truncation
I67c7a1c7a:solana/token_bridge: test wrapped asset transfers

Change-Id: I05a950e3142e0386351a67fc7d051000f3481c8b
2021-09-10 13:08:06 +00:00
David Paryente 698091b2b1 Revert "solana/token_bridge: calculate diff from original mint"
Revert submission 1325

Reason for revert: not supporting external mints
Reverted Changes:
I2bf59ecd3:solana/token_bridge: calculate diff from original ...
I598373740:solana/token_bridge: check balance and truncation
I67c7a1c7a:solana/token_bridge: test wrapped asset transfers

Change-Id: I655694508774e40a489b810d7b4f9c17824ab5a3
2021-09-10 13:08:06 +00:00
Stan Drozd f24f86adf5 pyth2wormhole-client: Run an automated attestation script in Tilt
Change-Id: Id2e6def6c246862601a206084867c5f1b26a6673
2021-09-09 17:24:32 +02:00
Stan Drozd 78cd4ee437 pyth2wormhole: build + deploy program into local devnet
Change-Id: I82acc6755476229d97ad20e73f4ed08b27d98ecf
2021-09-09 14:39:31 +02:00
Reisen 8fb9caf606 solana/token_bridge: calculate diff from original mint
Change-Id: I2bf59ecd353e27de4dc3a947b87c738bdff320ea
2021-09-09 10:30:08 +00:00
Reisen 4865275d95 solana/token_bridge: check balance and truncation
Change-Id: I59837374067350885b70f4b090ac4ba7a1e37d3e
2021-09-09 10:30:08 +00:00
Reisen c1c1bb26bf solana/token_bridge: test wrapped asset transfers
Change-Id: I67c7a1c7a300972c5e8a1fd415d6a965f7bba607
2021-09-09 10:30:08 +00:00
Reisen 496d2385f5 solana/token_bridge: sollet mints renamed to generic external
Change-Id: Ib9269991d95982dc5cae03844906e1f826a95d6c
2021-09-07 13:59:45 +00:00
Jordan Sexton 59e0e586ef Allow Sollet asset migration
Change-Id: Id3fde0ef232fa2e8ed1435be34fe2b885ecd2ef7
2021-09-07 14:34:34 +02:00
Hendrik Hofstadt 94695ee125 More checks on amount and fees
Change-Id: If5a7f43faa0ea39e99138c0856756bad19a4b410
2021-09-07 12:18:06 +02:00
Hendrik Hofstadt 0702ee300f Require meta in complete transfer wrapped
Change-Id: Ie5a5af23c39db7e0d29f7311ea1df385f20decef
2021-09-07 09:30:07 +00:00
Stan Drozd 7d6db92c35 pyth2wormhole-client attestation call
Change-Id: I407734b5fcf919f437a0e0a32d2b35e7ec50b999
2021-09-03 17:18:38 +02:00
Stan Drozd 5dbd3ea722 pyth2wormhole: on-chain attestation call, update Pyth-facing types
This commit takes the selected Pyth Price struct account and after
serialization places them inside a PostMessage cross-program
call to Wormhole.

Change-Id: If04123705290f4749de318c0dfaa8f1d840ed349
2021-09-03 17:17:34 +02:00
Hendrik Hofstadt 9a4af890e3 Fix warnings in generated code
Change-Id: I30c0d149b07930a4bf437b74df586ec7f50a3b6a
2021-09-01 18:48:10 +00:00
Hendrik Hofstadt 48e8ae1555 Fix guardian set expiration
Change-Id: Ie92168305db2dcd69421f369078d118a011332e1
2021-09-01 18:48:10 +00:00
Hendrik Hofstadt 1a8bf4456e Fix initial guardian set expiration on mainnet
Change-Id: I41adacc68687d0c638e79c834b7441896dc4ed98
2021-09-01 18:48:10 +00:00
Hendrik Hofstadt 610bf76902 Don't store signatures on chain
This saves 0.01 SOL per Wormhole tx and we don't need it.

Change-Id: I947a20fcbae9822c11073ba83b4dc67f9dcee19c
2021-09-01 18:48:10 +00:00
Hendrik Hofstadt 855e1d6dfa Resolve compiler warnings
Change-Id: I73c560b90ce4318d3aeb37f3dc336141dfef0e94
2021-09-01 17:56:47 +00:00
Hendrik Hofstadt 086cd0d706 Request full finalization for token bridge messages
Change-Id: Ic4631e6d36c108cc01d49c9c99a86162b6129bc4
2021-09-01 17:56:47 +00:00
Hendrik Hofstadt af67e71bfb update wrapped asset naming on Solana
Change-Id: I0dc2eb3e64d27ee50808dd549a292505bdb8e721
2021-09-01 15:32:00 +02:00
Stan Drozd f7979ee8b1 solitaire: Mention invalid value in InvalidMutability
Change-Id: I240518737243eb7dabbf8ec31bd11148b4475832
2021-08-31 12:43:58 +00:00
Reisen a69d76494c devnet: add terra chain registrations
Change-Id: Icc45674147b42d462e6e4b89c8cd43f9d1ddb49e
2021-08-30 11:11:38 +00:00
Reisen bb7a67d4c7 token_bridge/client: add emitter derivation helper
Change-Id: I403e421ebf46b76561c59c6cdd2aac0442a3c8d6
2021-08-26 14:40:10 +00:00
Hendrik Hofstadt 4469df136e Correctly pad Solana asset meta
Change-Id: Id2630bbd546695be7901927331e220406647b6da
2021-08-26 14:19:19 +00:00
Hendrik Hofstadt 56d8aa5e39 Create token meta for Solana devnet tokens
Change-Id: Ic7e2bd4a808640e10b646ee85abf963f9c6c586d
2021-08-26 14:19:19 +00:00
Hendrik Hofstadt 50afa0fe9e Prefix wormhole token names
Change-Id: Ieea61ea2833f66c29a2fa0f52ae1a914a3956146
2021-08-26 14:19:19 +00:00
Hendrik Hofstadt a8a8cbe183 👿
if you like it then you should have put a box 'round it

Change-Id: I504dd476f53bb5d0dd101a5278f485e83b32bd08
2021-08-25 19:49:57 +00:00
Stan Drozd 5f52dc6d76 solitaire: Implement Keyed for Mut<T: Keyed>
Change-Id: I6680315db9ac2fe913a85b01b471572047cbe658
2021-08-25 14:51:46 +00:00
Leo aeb673a164 Add presubmit CI test that runs "tilt ci"
- Use "npm ci" instead of "npm install" in a couple of places.

- Migrate generate-wasm.sh to a Dockerfile so it can be cached.

- Disable namespace creation and explorer build in CI.

Change-Id: I2e6ee806438863ca81ada701e14684f9f4cc0a76
2021-08-24 17:08:36 +02:00
Reisen d884f7be17 solitaire: force deserialization into a new stack frame
Change-Id: I5ffe4ed6b831f4ddbad4e36fad31487fcd1765cd
2021-08-24 07:08:48 +00:00
Hendrik Hofstadt d95e38da47 Don't verify core bridge config in token bridge
This is checked when we do CPI calls and did not work since derive is using ctx.this as context address

Change-Id: Ie8fefedb40c3c5eb4966bb0b85f207a40e0fe3be
2021-08-23 18:02:12 +00:00
Hendrik Hofstadt 72477c46a4 Allow the emitter to be mutable
This is the case when the emitter is the fee payer.

Change-Id: Ib21658c6cbbbb246a7434057c0f03f24bec8c013
2021-08-23 13:54:07 +00:00
Reisen 254f1c8674 Use bridge config to decide fee payer.
Change-Id: I5eb7601737eb5cbc687dee07567a6fab4e5ca4c5
2021-08-23 13:54:03 +00:00
Hendrik Hofstadt 2437a76ad7 Implement fees in the solana token bridge
Change-Id: I0bc29ced7e14c37294d0bde7ada173a90b5fcae4
2021-08-23 08:35:59 +00:00
Hendrik Hofstadt f42453be45 Resolve rust compiler warnings
Change-Id: Iaac63d0fb44ecb7e03d68a10df7bddbb521c73a0
2021-08-23 09:51:31 +02:00