2 Commits
veil ... pivx

Author SHA1 Message Date
tecnovert
f57888c455 preparescript: Add temporary pivx release. 2022-08-18 00:18:50 +02:00
tecnovert
e1528c9d63 coins: Add PIVX
No CSV or segwit.
sethdseed requires a fully synced chain, manual intervention required to set a key derived from the master mnemonic.
Requires a pivxd version with a backported scantxoutset command.
2022-08-17 01:05:32 +02:00
217 changed files with 5986 additions and 220536 deletions

View File

@@ -8,7 +8,7 @@ lint_task:
script:
- flake8 --version
- PYTHONWARNINGS="ignore" flake8 --ignore=E501,F841,W503 --exclude=basicswap/contrib,basicswap/interface/contrib,messages_pb2.py,.eggs,.tox,bin/install_certifi.py
- codespell --check-filenames --disable-colors --quiet-level=7 --ignore-words=tests/lint/spelling.ignore-words.txt -S .git,.eggs,.tox,pgp,*.pyc,*basicswap/contrib,*basicswap/interface/contrib,*mnemonics.py,bin/install_certifi.py,*basicswap/static
- codespell --check-filenames --disable-colors --quiet-level=7 --ignore-words=tests/lint/spelling.ignore-words.txt -S .git,.eggs,.tox,pgp,*.pyc,*basicswap/contrib,*basicswap/interface/contrib,*mnemonics.py,bin/install_certifi.py
test_task:
environment:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 KiB

1
.gitignore vendored
View File

@@ -1,5 +1,4 @@
old/
build/
*.pyc
__pycache__
/dist/

View File

@@ -53,7 +53,7 @@ jobs:
before_script:
script:
- PYTHONWARNINGS="ignore" flake8 --ignore=E501,F841,W503 --exclude=basicswap/contrib,basicswap/interface/contrib,messages_pb2.py,.eggs,.tox,bin/install_certifi.py
- codespell --check-filenames --disable-colors --quiet-level=7 --ignore-words=tests/lint/spelling.ignore-words.txt -S .git,.eggs,.tox,pgp,*.pyc,*basicswap/contrib,*basicswap/interface/contrib,*mnemonics.py,bin/install_certifi.py,*basicswap/static
- codespell --check-filenames --disable-colors --quiet-level=7 --ignore-words=tests/lint/spelling.ignore-words.txt -S .git,.eggs,.tox,pgp,*.pyc,*basicswap/contrib,*basicswap/interface/contrib,*mnemonics.py,bin/install_certifi.py
after_success:
- echo "End lint"
- stage: test

135
README.md
View File

@@ -1,131 +1,20 @@
# BasicSwap DEX (BSX)
![BasicswapDEX Preview](.github-readme/basicswap_header.jpg)
# Simple Atomic Swap Network - Proof of Concept
**[Official Website](https://basicswapdex.com)** | **[News](https://particl.news)** | **[Tutorials](https://academy.particl.io)** | **[Chat]( https://matrix.to/#/#basicswap:matrix.org )**
## Overview
Table of Contents
Simple atomic swap experiment, doesn't have many interesting features yet.
Not ready for real world use.
* [About](#about)
* [Features](#features)
* [Available Assets](#available-assets)
* [Participate](#participate)
* [Tutorials](#tutorials)
* [License](#license)
Uses Particl secure messaging and Decred style atomic swaps.
## About
The Particl node is used to hold the keys and sign for the swap transactions.
Other nodes can be run in pruned mode.
A node must be run for each coin type traded.
In the future it should be possible to use data from explorers instead of running a node.
The BasicSwap DEX is a privacy-first and decentralized exchange which features cross-chain atomic swaps and a distributed order book.
## Currently a work in progress
[BasicSwap](https://academy.particl.io/en/latest/glossary.html#term-BasicSwap) is a cross-chain and privacy-centric DEX (decentralized exchange) that lets you trade cryptocurrencies with no third party involvement. Its distributed order book lets you make or take orders at no cost and trade within a free and open environment without central points of failure.
Not ready for real-world use.
This DEX protocol was built in direct response to the increasingly invasive demands and data mining practices of todays cryptocurrency exchanges. It strives to bring more decentralized and more private cryptocurrency trading conditions for all.
BasicSwap is still in beta. This means that, while it already offers most of the vital trading features youd expect to see on centralized exchanges, it is still in heavy development, and many more features will come about in the near future.
Check out our [roadmap](https://basicswapdex.com/roadmap) to get a better idea of what we've got planned for it!
## Features
* **True cross-chain support** — Swap cryptocurrencies that live on entirely different blockchain environments, like Bitcoin and Monero.
* **Distributed order book** — Make or take limit orders on a completely distributed order book system.
* **No third-party or middleman** — Trade crypto with no intermediaries whatsoever.
* **No trading fees** — Only pay the typical cryptocurrency network fee.
* **Privacy from the ground up** — Every component of BasicSwap is built with a privacy-first commitment.
* **Full Monero support** — Swap Monero with a variety of other cryptocurrencies like Bitcoin or Particl. No wrapped assets or trickery involved.
* **User-friendly interface** — Enjoy all these features within a user-friendly and intuitive interface that handles all the complicated parts for you.
BasicSwap is still in beta. This means that, while it already offers most of the vital trading features youd expect to see on centralized exchanges, it is still in heavy development, and many more features will come about in the near future.
## Available Assets
BasicSwap is compatible with the following digital assets.
<table>
<tr>
<td><strong>Coin Name</strong>
</td>
<td><strong>Ticker</strong>
</td>
</tr>
<tr>
<td>Bitcoin
</td>
<td>BTC
</td>
</tr>
<tr>
<td>Monero
</td>
<td>XMR
</td>
</tr>
<tr>
<td>Dash
</td>
<td>DASH
</td>
</tr>
<tr>
<td>Litecoin
</td>
<td>LTC
</td>
</tr>
<tr>
<td>Firo
</td>
<td>FIRO
</td>
</tr>
<tr>
<td>PIVX
</td>
<td>PIVX
</td>
</tr>
<tr>
<td>Particl
</td>
<td>PART
</td>
</tr>
</table>
We plan on adding many other cryptocurrencies moving forward, including ETH and its ERC-20 tokens. However, due to the true cross-chain nature of the BasicSwap DEX protocol, each integration has to be done on a case-by-case basis.
If youd like to add a cryptocurrency to BasicSwap, either [apply for a listing using our listing application form](https://forms.gle/9DsHoHTJVqSiMNHW9), or try coding the integration yourself by referencing how other cryptocurrencies have been added. Follow [this link](https://academy.particl.io/en/latest/basicswap-guides/basicswapguides_apply.html) for more information on how to integrate a coin yourself.
# Participate
### Chats
* **For developers** The chat [#particl-dev:matrix.org](https://app.element.io/#/room/#particl-dev:matrix.org) using [Element](https://element.io) (formerly Riot).
* **For community** The community chat [https://discord.me/particl](https://discord.me/particl) [![Discord](https://img.shields.io/discord/391967609660112925)](https://discord.me/particl).
[![Twitter Follow](https://img.shields.io/twitter/follow/BasicSwapDEX?label=follow%20us&style=social)](http://twitter.com/BasicSwapDEX)
[![Subreddit subscribers](https://img.shields.io/reddit/subreddit-subscribers/particl?style=social)](http://reddit.com/r/particl)
### Documentation, installation
For non-developers curious to explore a new world of commerce, binaries can be downloaded and installed. It is the easiest way to get started. Following the guides on [Particl Academy](https://academy.particl.io), a reference book in straightforward language, is recommended.
* [Download BasicSwapDEX](https://github.com/tecnovert/basicswap/tree/master/doc)
#### Community chat support
* [Discord](https://discord.me/particl) navigate to the #support channel
* [Telegram](https://t.me/particlhelp)
* [Element](https://app.element.io/#/room/#particlhelp:matrix.org)
# Tutorials
You can find a wide variety of tutorials and step-by-step guides about BasicSwap on the [Particl Academy](https://academy.particl.io) or on Particls Youtube channel.
If you encounter an issue or try to accomplish something not mentioned in any of the tutorials included in the links above, please join the community chat support channels; youll be sure to find help and support from our awesome community and open-source team there!
# License
BasicSwap is released under MIT software license.
Discuss development and help with testing in the matrix channel [#basicswap:matrix.org](https://riot.im/app/#/room/#basicswap:matrix.org)

View File

@@ -1,3 +1,3 @@
name = "basicswap"
__version__ = "0.11.66"
__version__ = "0.11.36"

View File

@@ -1,21 +1,20 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2019-2023 tecnovert
# Copyright (c) 2019-2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
import os
import time
import shlex
import socks
import socket
import urllib
import logging
import threading
import traceback
import subprocess
from sockshandler import SocksiPyHandler
import basicswap.config as cfg
import basicswap.contrib.segwit_addr as segwit_addr
from .rpc import (
callrpc,
@@ -39,7 +38,6 @@ class BaseApp:
self.fp = fp
self.is_running = True
self.fail_code = 0
self.mock_time_offset = 0
self.data_dir = data_dir
self.chain = chain
@@ -94,7 +92,7 @@ class BaseApp:
except Exception:
return {}
def setDaemonPID(self, name, pid) -> None:
def setDaemonPID(self, name, pid):
if isinstance(name, Coins):
self.coin_clients[name]['pid'] = pid
return
@@ -102,17 +100,23 @@ class BaseApp:
if v['name'] == name:
v['pid'] = pid
def getChainDatadirPath(self, coin) -> str:
def getChainDatadirPath(self, coin):
datadir = self.coin_clients[coin]['datadir']
testnet_name = '' if self.chain == 'mainnet' else chainparams[coin][self.chain].get('name', self.chain)
return os.path.join(datadir, testnet_name)
def getCoinIdFromName(self, coin_name: str):
def getCoinIdFromName(self, coin_name):
for c, params in chainparams.items():
if coin_name.lower() == params['name'].lower():
return c
raise ValueError('Unknown coin: {}'.format(coin_name))
def encodeSegwit(self, coin_type, raw):
return segwit_addr.encode(chainparams[coin_type][self.chain]['hrp'], 0, raw)
def decodeSegwit(self, coin_type, addr):
return bytes(segwit_addr.decode(chainparams[coin_type][self.chain]['hrp'], addr)[1])
def callrpc(self, method, params=[], wallet=None):
cc = self.coin_clients[Coins.PART]
return callrpc(cc['rpcport'], cc['rpcauth'], method, params, wallet, cc['rpchost'])
@@ -121,6 +125,18 @@ class BaseApp:
cc = self.coin_clients[coin]
return callrpc(cc['rpcport'], cc['rpcauth'], method, params, wallet, cc['rpchost'])
def calltx(self, cmd):
bindir = self.coin_clients[Coins.PART]['bindir']
args = [os.path.join(bindir, cfg.PARTICL_TX), ]
if self.chain != 'mainnet':
args.append('-' + self.chain)
args += shlex.split(cmd)
p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out = p.communicate()
if len(out[1]) > 0:
raise ValueError('TX error ' + str(out[1]))
return out[0].decode('utf-8').strip()
def callcoincli(self, coin_type, params, wallet=None, timeout=None):
bindir = self.coin_clients[coin_type]['bindir']
datadir = self.coin_clients[coin_type]['datadir']
@@ -136,7 +152,7 @@ class BaseApp:
raise ValueError('CLI error ' + str(out[1]))
return out[0].decode('utf-8').strip()
def is_transient_error(self, ex) -> bool:
def is_transient_error(self, ex):
if isinstance(ex, TemporaryError):
return True
str_error = str(ex).lower()
@@ -154,26 +170,12 @@ class BaseApp:
socket.setdefaulttimeout(timeout)
def popConnectionParameters(self) -> None:
def popConnectionParameters(self):
if self.use_tor_proxy:
socket.socket = self.default_socket
socket.getaddrinfo = self.default_socket_getaddrinfo
socket.setdefaulttimeout(self.default_socket_timeout)
def readURL(self, url: str, timeout: int = 120, headers=None) -> bytes:
open_handler = None
if self.use_tor_proxy:
open_handler = SocksiPyHandler(socks.PROXY_TYPE_SOCKS5, self.tor_proxy_host, self.tor_proxy_port)
opener = urllib.request.build_opener(open_handler) if self.use_tor_proxy else urllib.request.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
request = urllib.request.Request(url, headers=headers)
return opener.open(request, timeout=timeout).read()
def logException(self, message) -> None:
self.log.error(message)
if self.debug:
self.log.error(traceback.format_exc())
def torControl(self, query):
try:
command = 'AUTHENTICATE "{}"\r\n{}\r\nQUIT\r\n'.format(self.tor_control_password, query).encode('utf-8')
@@ -190,10 +192,3 @@ class BaseApp:
except Exception as e:
self.log.error(f'torControl {e}')
return
def getTime(self) -> int:
return int(time.time()) + self.mock_time_offset
def setMockTimeOffset(self, new_offset: int) -> None:
self.log.warning(f'Setting mocktime to {new_offset}')
self.mock_time_offset = new_offset

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2021-2023 tecnovert
# Copyright (c) 2021-2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
@@ -9,8 +9,8 @@ import struct
import hashlib
from enum import IntEnum, auto
from .util.address import (
encodeAddress,
decodeAddress,
encodeAddress,
)
from .chainparams import (
chainparams,
@@ -47,9 +47,6 @@ class MessageTypes(IntEnum):
XMR_BID_LOCK_RELEASE_LF = auto()
OFFER_REVOKE = auto()
ADS_BID_LF = auto()
ADS_BID_ACCEPT_FL = auto()
class AddressTypes(IntEnum):
OFFER = auto()
@@ -101,8 +98,6 @@ class BidStates(IntEnum):
BID_STATE_UNKNOWN = 26
XMR_SWAP_MSG_SCRIPT_LOCK_TX_SIGS = 27 # XmrBidLockTxSigsMessage
XMR_SWAP_MSG_SCRIPT_LOCK_SPEND_TX = 28 # XmrBidLockSpendTxMessage
BID_REQUEST_SENT = 29
BID_REQUEST_ACCEPTED = 30
class TxStates(IntEnum):
@@ -111,8 +106,6 @@ class TxStates(IntEnum):
TX_CONFIRMED = auto()
TX_REDEEMED = auto()
TX_REFUNDED = auto()
TX_IN_MEMPOOL = auto()
TX_IN_CHAIN = auto()
class TxTypes(IntEnum):
@@ -129,10 +122,6 @@ class TxTypes(IntEnum):
XMR_SWAP_A_LOCK_REFUND_SPEND = auto()
XMR_SWAP_A_LOCK_REFUND_SWIPE = auto()
XMR_SWAP_B_LOCK = auto()
XMR_SWAP_B_LOCK_SPEND = auto()
XMR_SWAP_B_LOCK_REFUND = auto()
ITX_PRE_FUNDED = auto()
class ActionTypes(IntEnum):
@@ -147,7 +136,6 @@ class ActionTypes(IntEnum):
RECOVER_XMR_SWAP_LOCK_TX_B = auto()
SEND_XMR_SWAP_LOCK_SPEND_MSG = auto()
REDEEM_ITX = auto()
ACCEPT_AS_REV_BID = auto()
class EventLogTypes(IntEnum):
@@ -174,12 +162,6 @@ class EventLogTypes(IntEnum):
ERROR = auto()
AUTOMATION_CONSTRAINT = auto()
AUTOMATION_ACCEPTING_BID = auto()
ITX_PUBLISHED = auto()
ITX_REDEEM_PUBLISHED = auto()
ITX_REFUND_PUBLISHED = auto()
PTX_PUBLISHED = auto()
PTX_REDEEM_PUBLISHED = auto()
PTX_REFUND_PUBLISHED = auto()
class XmrSplitMsgTypes(IntEnum):
@@ -196,47 +178,6 @@ class DebugTypes(IntEnum):
MAKE_INVALID_PTX = auto()
DONT_SPEND_ITX = auto()
SKIP_LOCK_TX_REFUND = auto()
SEND_LOCKED_XMR = auto()
B_LOCK_TX_MISSED_SEND = auto()
class NotificationTypes(IntEnum):
NONE = 0
OFFER_RECEIVED = auto()
BID_RECEIVED = auto()
BID_ACCEPTED = auto()
class AutomationOverrideOptions(IntEnum):
DEFAULT = 0
ALWAYS_ACCEPT = 1
NEVER_ACCEPT = auto()
def strAutomationOverrideOption(option):
if option == AutomationOverrideOptions.DEFAULT:
return 'Default'
if option == AutomationOverrideOptions.ALWAYS_ACCEPT:
return 'Always Accept'
if option == AutomationOverrideOptions.NEVER_ACCEPT:
return 'Never Accept'
return 'Unknown'
class VisibilityOverrideOptions(IntEnum):
DEFAULT = 0
HIDE = 1
BLOCK = auto()
def strVisibilityOverrideOption(option):
if option == VisibilityOverrideOptions.DEFAULT:
return 'Default'
if option == VisibilityOverrideOptions.HIDE:
return 'Hide'
if option == VisibilityOverrideOptions.BLOCK:
return 'Block'
return 'Unknown'
def strOfferState(state):
@@ -249,6 +190,13 @@ def strOfferState(state):
return 'Unknown'
class NotificationTypes(IntEnum):
NONE = 0
OFFER_RECEIVED = auto()
BID_RECEIVED = auto()
BID_ACCEPTED = auto()
def strBidState(state):
if state == BidStates.BID_SENT:
return 'Sent'
@@ -304,13 +252,6 @@ def strBidState(state):
return 'Exchanged script lock tx sigs msg'
if state == BidStates.XMR_SWAP_MSG_SCRIPT_LOCK_SPEND_TX:
return 'Exchanged script lock spend tx msg'
if state == BidStates.BID_REQUEST_SENT:
return 'Request sent'
if state == BidStates.BID_REQUEST_ACCEPTED:
return 'Request accepted'
if state == BidStates.BID_STATE_UNKNOWN:
return 'Unknown bid state'
return 'Unknown' + ' ' + str(state)
@@ -325,10 +266,6 @@ def strTxState(state):
return 'Redeemed'
if state == TxStates.TX_REFUNDED:
return 'Refunded'
if state == TxStates.TX_IN_MEMPOOL:
return 'In Mempool'
if state == TxStates.TX_IN_CHAIN:
return 'In Chain'
return 'Unknown'
@@ -345,8 +282,6 @@ def strTxType(tx_type):
return 'Chain A Lock Refund Swipe Tx'
if tx_type == TxTypes.XMR_SWAP_B_LOCK:
return 'Chain B Lock Tx'
if tx_type == TxTypes.ITX_PRE_FUNDED:
return 'Funded mock initiate tx'
return 'Unknown'
@@ -374,6 +309,8 @@ def getLockName(lock_type):
def describeEventEntry(event_type, event_msg):
if event_type == EventLogTypes.FAILED_TX_B_LOCK_PUBLISH:
return 'Failed to publish lock tx B'
if event_type == EventLogTypes.FAILED_TX_B_LOCK_PUBLISH:
return 'Failed to publish lock tx B'
if event_type == EventLogTypes.LOCK_TX_A_PUBLISHED:
@@ -420,25 +357,11 @@ def describeEventEntry(event_type, event_msg):
return 'Failed auto accepting'
if event_type == EventLogTypes.AUTOMATION_ACCEPTING_BID:
return 'Auto accepting'
if event_type == EventLogTypes.ITX_PUBLISHED:
return 'Initiate tx published'
if event_type == EventLogTypes.ITX_REDEEM_PUBLISHED:
return 'Initiate tx redeem tx published'
if event_type == EventLogTypes.ITX_REFUND_PUBLISHED:
return 'Initiate tx refund tx published'
if event_type == EventLogTypes.PTX_PUBLISHED:
return 'Participate tx published'
if event_type == EventLogTypes.PTX_REDEEM_PUBLISHED:
return 'Participate tx redeem tx published'
if event_type == EventLogTypes.PTX_REFUND_PUBLISHED:
return 'Participate tx refund tx published'
def getVoutByAddress(txjs, p2sh):
for o in txjs['vout']:
try:
if 'address' in o['scriptPubKey'] and o['scriptPubKey']['address'] == p2sh:
return o['n']
if p2sh in o['scriptPubKey']['addresses']:
return o['n']
except Exception:
@@ -483,62 +406,27 @@ def getLastBidState(packed_states):
return BidStates.BID_STATE_UNKNOWN
def strSwapType(swap_type):
if swap_type == SwapTypes.SELLER_FIRST:
return 'seller_first'
if swap_type == SwapTypes.XMR_SWAP:
return 'xmr_swap'
return None
def strSwapDesc(swap_type):
if swap_type == SwapTypes.SELLER_FIRST:
return 'Secret Hash'
if swap_type == SwapTypes.XMR_SWAP:
return 'Adaptor Sig'
return None
inactive_states = [BidStates.SWAP_COMPLETED, BidStates.BID_ERROR, BidStates.BID_REJECTED, BidStates.SWAP_TIMEDOUT, BidStates.BID_ABANDONED]
def isActiveBidState(state):
if state >= BidStates.BID_ACCEPTED and state < BidStates.SWAP_COMPLETED:
return True
return state in (
BidStates.SWAP_DELAYING,
BidStates.XMR_SWAP_HAVE_SCRIPT_COIN_SPEND_TX,
BidStates.XMR_SWAP_SCRIPT_COIN_LOCKED,
BidStates.XMR_SWAP_NOSCRIPT_COIN_LOCKED,
BidStates.XMR_SWAP_LOCK_RELEASED,
BidStates.XMR_SWAP_NOSCRIPT_TX_REDEEMED,
BidStates.XMR_SWAP_SCRIPT_TX_REDEEMED,
BidStates.XMR_SWAP_SCRIPT_TX_PREREFUND,
BidStates.XMR_SWAP_MSG_SCRIPT_LOCK_TX_SIGS,
BidStates.XMR_SWAP_MSG_SCRIPT_LOCK_SPEND_TX,
BidStates.XMR_SWAP_FAILED,
BidStates.BID_REQUEST_ACCEPTED,
)
def isErrorBidState(state):
return state in (
BidStates.BID_STALLED_FOR_TEST,
BidStates.BID_ERROR,
)
def isFailingBidState(state):
return state in (
BidStates.BID_STALLED_FOR_TEST,
BidStates.BID_ERROR,
BidStates.XMR_SWAP_SCRIPT_TX_PREREFUND,
BidStates.XMR_SWAP_NOSCRIPT_TX_RECOVERED,
BidStates.XMR_SWAP_FAILED_REFUNDED,
BidStates.XMR_SWAP_FAILED_SWIPED,
BidStates.XMR_SWAP_FAILED,
)
def isFinalBidState(state):
return state in inactive_states
if state == BidStates.SWAP_DELAYING:
return True
if state == BidStates.XMR_SWAP_HAVE_SCRIPT_COIN_SPEND_TX:
return True
if state == BidStates.XMR_SWAP_SCRIPT_COIN_LOCKED:
return True
if state == BidStates.XMR_SWAP_NOSCRIPT_COIN_LOCKED:
return True
if state == BidStates.XMR_SWAP_LOCK_RELEASED:
return True
if state == BidStates.XMR_SWAP_NOSCRIPT_TX_REDEEMED:
return True
if state == BidStates.XMR_SWAP_SCRIPT_TX_REDEEMED:
return True
if state == BidStates.XMR_SWAP_SCRIPT_TX_PREREFUND:
return True
if state == BidStates.XMR_SWAP_MSG_SCRIPT_LOCK_TX_SIGS:
return True
if state == BidStates.XMR_SWAP_MSG_SCRIPT_LOCK_SPEND_TX:
return True
return False

View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2019-2023 tecnovert
# Copyright (c) 2019-2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
@@ -29,9 +29,6 @@ class Coins(IntEnum):
# ZANO = 9
# NDAU = 10
PIVX = 11
DASH = 12
FIRO = 13
VEIL = 14
chainparams = {
@@ -221,7 +218,6 @@ chainparams = {
'decimal_places': 8,
'has_csv': False,
'has_segwit': False,
'use_ticker_as_name': True,
'mainnet': {
'rpcport': 51473,
'pubkey_address': 30,
@@ -251,123 +247,6 @@ chainparams = {
'max_amount': 100000 * COIN,
}
},
Coins.DASH: {
'name': 'dash',
'ticker': 'DASH',
'message_magic': 'DarkCoin Signed Message:\n',
'blocks_target': 60 * 2.5,
'decimal_places': 8,
'has_csv': True,
'has_segwit': False,
'mainnet': {
'rpcport': 9998,
'pubkey_address': 76,
'script_address': 16,
'key_prefix': 204,
'hrp': '',
'bip44': 5,
'min_amount': 1000,
'max_amount': 100000 * COIN,
},
'testnet': {
'rpcport': 19998,
'pubkey_address': 140,
'script_address': 19,
'key_prefix': 239,
'hrp': '',
'bip44': 1,
'min_amount': 1000,
'max_amount': 100000 * COIN,
},
'regtest': {
'rpcport': 18332,
'pubkey_address': 140,
'script_address': 19,
'key_prefix': 239,
'hrp': '',
'bip44': 1,
'min_amount': 1000,
'max_amount': 100000 * COIN,
}
},
Coins.FIRO: {
'name': 'firo',
'ticker': 'FIRO',
'message_magic': 'Zcoin Signed Message:\n',
'blocks_target': 60 * 10,
'decimal_places': 8,
'has_csv': True,
'has_segwit': False,
'mainnet': {
'rpcport': 8888,
'pubkey_address': 82,
'script_address': 7,
'key_prefix': 210,
'hrp': '',
'bip44': 136,
'min_amount': 1000,
'max_amount': 100000 * COIN,
},
'testnet': {
'rpcport': 18888,
'pubkey_address': 65,
'script_address': 178,
'key_prefix': 185,
'hrp': '',
'bip44': 1,
'min_amount': 1000,
'max_amount': 100000 * COIN,
},
'regtest': {
'rpcport': 28888,
'pubkey_address': 65,
'script_address': 178,
'key_prefix': 239,
'hrp': '',
'bip44': 1,
'min_amount': 1000,
'max_amount': 100000 * COIN,
}
},
Coins.VEIL: {
'name': 'veil',
'ticker': 'VEIL',
'message_magic': 'Veil Signed Message:\n',
'blocks_target': 120,
'decimal_places': 8,
'has_csv': True,
'has_segwit': False,
'mainnet': {
'rpcport': 58812,
'pubkey_address': 70,
'script_address': 5,
'key_prefix': 128,
'hrp': 'bv',
'bip44': 698,
'min_amount': 1000,
'max_amount': 100000 * COIN,
},
'testnet': {
'rpcport': 58813,
'pubkey_address': 111,
'script_address': 196,
'key_prefix': 239,
'hrp': 'tv',
'bip44': 1,
'min_amount': 1000,
'max_amount': 100000 * COIN,
},
'regtest': {
'rpcport': 58823,
'pubkey_address': 111,
'script_address': 196,
'key_prefix': 239,
'hrp': 'tv',
'bip44': 1,
'min_amount': 1000,
'max_amount': 100000 * COIN,
}
},
}
ticker_map = {}
@@ -393,20 +272,17 @@ class CoinInterface:
self._unknown_wallet_seed = True
self._restore_height = None
def make_int(self, amount_in: int, r: int = 0) -> int:
def make_int(self, amount_in, r=0):
return make_int(amount_in, self.exp(), r=r)
def format_amount(self, amount_in, conv_int=False, r=0):
amount_int = make_int(amount_in, self.exp(), r=r) if conv_int else amount_in
return format_amount(amount_int, self.exp())
def coin_name(self) -> str:
coin_chainparams = chainparams[self.coin_type()]
if coin_chainparams.get('use_ticker_as_name', False):
return coin_chainparams['ticker']
return coin_chainparams['name'].capitalize()
def coin_name(self):
return chainparams[self.coin_type()]['name'].capitalize()
def ticker(self) -> str:
def ticker(self):
ticker = chainparams[self.coin_type()]['ticker']
if self._network == 'testnet':
ticker = 't' + ticker
@@ -414,29 +290,23 @@ class CoinInterface:
ticker = 'rt' + ticker
return ticker
def getExchangeTicker(self, exchange_name: str) -> str:
return chainparams[self.coin_type()]['ticker']
def getExchangeName(self, exchange_name: str) -> str:
return chainparams[self.coin_type()]['name']
def ticker_mainnet(self) -> str:
def ticker_mainnet(self):
ticker = chainparams[self.coin_type()]['ticker']
return ticker
def min_amount(self) -> int:
def min_amount(self):
return chainparams[self.coin_type()][self._network]['min_amount']
def max_amount(self) -> int:
def max_amount(self):
return chainparams[self.coin_type()][self._network]['max_amount']
def setWalletSeedWarning(self, value: bool) -> None:
def setWalletSeedWarning(self, value):
self._unknown_wallet_seed = value
def setWalletRestoreHeight(self, value: int) -> None:
def setWalletRestoreHeight(self, value):
self._restore_height = value
def knownWalletSeed(self) -> bool:
def knownWalletSeed(self):
return not self._unknown_wallet_seed
def chainparams(self):
@@ -445,17 +315,12 @@ class CoinInterface:
def chainparams_network(self):
return chainparams[self.coin_type()][self._network]
def has_segwit(self) -> bool:
return chainparams[self.coin_type()].get('has_segwit', True)
def is_transient_error(self, ex) -> bool:
def is_transient_error(self, ex):
if isinstance(ex, TemporaryError):
return True
str_error: str = str(ex).lower()
str_error = str(ex).lower()
if 'not enough unlocked money' in str_error:
return True
if 'no unlocked balance' in str_error:
return True
if 'transaction was rejected by daemon' in str_error:
return True
if 'invalid unlocked_balance' in str_error:

View File

@@ -10,7 +10,7 @@ CONFIG_FILENAME = 'basicswap.json'
BASICSWAP_DATADIR = os.getenv('BASICSWAP_DATADIR', '~/.basicswap')
DEFAULT_ALLOW_CORS = False
TEST_DATADIRS = os.path.expanduser(os.getenv('DATADIRS', '/tmp/basicswap'))
DEFAULT_TEST_BINDIR = os.path.expanduser(os.getenv('DEFAULT_TEST_BINDIR', '~/.basicswap/bin'))
DEFAULT_TEST_BINDIR = os.path.expanduser(os.getenv('DEFAULT_TEST_BINDIR', '~/tmp/bin'))
bin_suffix = ('.exe' if os.name == 'nt' else '')
PARTICL_BINDIR = os.path.expanduser(os.getenv('PARTICL_BINDIR', os.path.join(DEFAULT_TEST_BINDIR, 'particl')))
@@ -41,13 +41,3 @@ PIVX_BINDIR = os.path.expanduser(os.getenv('PIVX_BINDIR', os.path.join(DEFAULT_T
PIVXD = os.getenv('PIVXD', 'pivxd' + bin_suffix)
PIVX_CLI = os.getenv('PIVX_CLI', 'pivx-cli' + bin_suffix)
PIVX_TX = os.getenv('PIVX_TX', 'pivx-tx' + bin_suffix)
DASH_BINDIR = os.path.expanduser(os.getenv('DASH_BINDIR', os.path.join(DEFAULT_TEST_BINDIR, 'dash')))
DASHD = os.getenv('DASHD', 'dashd' + bin_suffix)
DASH_CLI = os.getenv('DASH_CLI', 'dash-cli' + bin_suffix)
DASH_TX = os.getenv('DASH_TX', 'dash-tx' + bin_suffix)
FIRO_BINDIR = os.path.expanduser(os.getenv('FIRO_BINDIR', os.path.join(DEFAULT_TEST_BINDIR, 'firo')))
FIROD = os.getenv('FIROD', 'firod' + bin_suffix)
FIRO_CLI = os.getenv('FIRO_CLI', 'firo-cli' + bin_suffix)
FIRO_TX = os.getenv('FIRO_TX', 'firo-tx' + bin_suffix)

View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2019-2023 tecnovert
# Copyright (c) 2019-2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
@@ -12,8 +12,8 @@ from enum import IntEnum, auto
from sqlalchemy.ext.declarative import declarative_base
CURRENT_DB_VERSION = 21
CURRENT_DB_DATA_VERSION = 4
CURRENT_DB_VERSION = 15
CURRENT_DB_DATA_VERSION = 2
Base = declarative_base()
@@ -74,7 +74,7 @@ class Offer(Base):
addr_to = sa.Column(sa.String)
created_at = sa.Column(sa.BigInteger)
expire_at = sa.Column(sa.BigInteger)
was_sent = sa.Column(sa.Boolean) # Sent by node
was_sent = sa.Column(sa.Boolean)
from_feerate = sa.Column(sa.BigInteger)
to_feerate = sa.Column(sa.BigInteger)
@@ -86,7 +86,6 @@ class Offer(Base):
auto_accept_bids = sa.Column(sa.Boolean)
withdraw_to_addr = sa.Column(sa.String) # Address to spend lock tx to - address from wallet if empty TODO
security_token = sa.Column(sa.LargeBinary)
bid_reversed = sa.Column(sa.Boolean)
state = sa.Column(sa.Integer)
states = sa.Column(sa.LargeBinary) # Packed states and times
@@ -108,7 +107,7 @@ class Bid(Base):
active_ind = sa.Column(sa.Integer)
protocol_version = sa.Column(sa.Integer)
was_sent = sa.Column(sa.Boolean) # Sent by node
was_sent = sa.Column(sa.Boolean)
was_received = sa.Column(sa.Boolean)
contract_count = sa.Column(sa.Integer)
created_at = sa.Column(sa.BigInteger)
@@ -124,6 +123,7 @@ class Bid(Base):
amount = sa.Column(sa.BigInteger)
rate = sa.Column(sa.BigInteger)
accept_msg_id = sa.Column(sa.LargeBinary)
pkhash_seller = sa.Column(sa.LargeBinary)
initiate_txn_redeem = sa.Column(sa.LargeBinary)
@@ -217,25 +217,10 @@ class SwapTx(Base):
states = sa.Column(sa.LargeBinary) # Packed states and times
def setState(self, new_state):
if self.state == new_state:
return
self.state = new_state
self.states = (self.states if self.states is not None else bytes()) + struct.pack('<iq', new_state, int(time.time()))
class PrefundedTx(Base):
__tablename__ = 'prefunded_transactions'
record_id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
active_ind = sa.Column(sa.Integer)
created_at = sa.Column(sa.BigInteger)
linked_type = sa.Column(sa.Integer)
linked_id = sa.Column(sa.LargeBinary)
tx_type = sa.Column(sa.Integer) # TxTypes
tx_data = sa.Column(sa.LargeBinary)
used_by = sa.Column(sa.LargeBinary)
class PooledAddress(Base):
__tablename__ = 'addresspool'
@@ -292,13 +277,12 @@ class EventLog(Base):
class XmrOffer(Base):
__tablename__ = 'xmr_offers'
# TODO: Merge to Offer
swap_id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
offer_id = sa.Column(sa.LargeBinary, sa.ForeignKey('offers.offer_id'))
a_fee_rate = sa.Column(sa.BigInteger) # Chain a fee rate
b_fee_rate = sa.Column(sa.BigInteger) # Chain b fee rate
a_fee_rate = sa.Column(sa.BigInteger)
b_fee_rate = sa.Column(sa.BigInteger)
lock_time_1 = sa.Column(sa.Integer) # Delay before the chain a lock refund tx can be mined
lock_time_2 = sa.Column(sa.Integer) # Delay before the follower can spend from the chain a lock refund tx
@@ -309,6 +293,16 @@ class XmrSwap(Base):
swap_id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
bid_id = sa.Column(sa.LargeBinary, sa.ForeignKey('bids.bid_id'))
bid_msg_id2 = sa.Column(sa.LargeBinary)
bid_msg_id3 = sa.Column(sa.LargeBinary)
bid_accept_msg_id = sa.Column(sa.LargeBinary)
bid_accept_msg_id2 = sa.Column(sa.LargeBinary)
bid_accept_msg_id3 = sa.Column(sa.LargeBinary)
coin_a_lock_tx_sigs_l_msg_id = sa.Column(sa.LargeBinary) # MSG3L F -> L
coin_a_lock_spend_tx_msg_id = sa.Column(sa.LargeBinary) # MSG4F L -> F
coin_a_lock_release_msg_id = sa.Column(sa.LargeBinary) # MSG5F L -> F
contract_count = sa.Column(sa.Integer)
@@ -369,8 +363,6 @@ class XmrSplitData(Base):
__tablename__ = 'xmr_split_data'
record_id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
addr_from = sa.Column(sa.String)
addr_to = sa.Column(sa.String)
bid_id = sa.Column(sa.LargeBinary)
msg_type = sa.Column(sa.Integer)
msg_sequence = sa.Column(sa.Integer)
@@ -416,9 +408,6 @@ class KnownIdentity(Base):
num_recv_bids_rejected = sa.Column(sa.Integer)
num_sent_bids_failed = sa.Column(sa.Integer)
num_recv_bids_failed = sa.Column(sa.Integer)
automation_override = sa.Column(sa.Integer) # AutomationOverrideOptions
visibility_override = sa.Column(sa.Integer) # VisibilityOverrideOptions
data = sa.Column(sa.LargeBinary)
note = sa.Column(sa.String)
updated_at = sa.Column(sa.BigInteger)
created_at = sa.Column(sa.BigInteger)
@@ -480,35 +469,6 @@ class BidState(Base):
state_id = sa.Column(sa.Integer)
label = sa.Column(sa.String)
in_progress = sa.Column(sa.Integer)
in_error = sa.Column(sa.Integer)
swap_failed = sa.Column(sa.Integer)
swap_ended = sa.Column(sa.Integer)
note = sa.Column(sa.String)
created_at = sa.Column(sa.BigInteger)
class Notification(Base):
__tablename__ = 'notifications'
record_id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
active_ind = sa.Column(sa.Integer)
created_at = sa.Column(sa.BigInteger)
event_type = sa.Column(sa.Integer)
event_data = sa.Column(sa.LargeBinary)
class MessageLink(Base):
__tablename__ = 'message_links'
record_id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
active_ind = sa.Column(sa.Integer)
created_at = sa.Column(sa.BigInteger)
linked_type = sa.Column(sa.Integer)
linked_id = sa.Column(sa.LargeBinary)
# linked_row_id = sa.Column(sa.Integer) # TODO: Find a way to use table rowids
msg_type = sa.Column(sa.Integer)
msg_sequence = sa.Column(sa.Integer)
msg_id = sa.Column(sa.LargeBinary)

View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2022-2023 tecnovert
# Copyright (c) 2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
@@ -18,11 +18,7 @@ from .db import (
from .basicswap_util import (
BidStates,
strBidState,
isActiveBidState,
isErrorBidState,
isFailingBidState,
isFinalBidState,
)
isActiveBidState)
def upgradeDatabaseData(self, data_version):
@@ -60,13 +56,10 @@ def upgradeDatabaseData(self, data_version):
active_ind=1,
state_id=int(state),
in_progress=isActiveBidState(state),
in_error=isErrorBidState(state),
swap_failed=isFailingBidState(state),
swap_ended=isFinalBidState(state),
label=strBidState(state),
created_at=now))
if data_version > 0 and data_version < 2:
if data_version < 2:
for state in (BidStates.XMR_SWAP_MSG_SCRIPT_LOCK_TX_SIGS, BidStates.XMR_SWAP_MSG_SCRIPT_LOCK_SPEND_TX):
session.add(BidState(
active_ind=1,
@@ -74,23 +67,6 @@ def upgradeDatabaseData(self, data_version):
in_progress=isActiveBidState(state),
label=strBidState(state),
created_at=now))
if data_version > 0 and data_version < 3:
for state in BidStates:
in_error = isErrorBidState(state)
swap_failed = isFailingBidState(state)
swap_ended = isFinalBidState(state)
session.execute('UPDATE bidstates SET in_error = :in_error, swap_failed = :swap_failed, swap_ended = :swap_ended WHERE state_id = :state_id', {'in_error': in_error, 'swap_failed': swap_failed, 'swap_ended': swap_ended, 'state_id': int(state)})
if data_version > 0 and data_version < 4:
for state in (BidStates.BID_REQUEST_SENT, BidStates.BID_REQUEST_ACCEPTED):
session.add(BidState(
active_ind=1,
state_id=int(state),
in_progress=isActiveBidState(state),
in_error=isErrorBidState(state),
swap_failed=isFailingBidState(state),
swap_ended=isFinalBidState(state),
label=strBidState(state),
created_at=now))
self.db_data_version = CURRENT_DB_DATA_VERSION
self.setIntKVInSession('db_data_version', self.db_data_version, session)
@@ -239,60 +215,6 @@ def upgradeDatabase(self, db_version):
db_version += 1
session.execute('ALTER TABLE xmr_swaps ADD COLUMN coin_a_lock_release_msg_id BLOB')
session.execute('ALTER TABLE xmr_swaps RENAME COLUMN coin_a_lock_refund_spend_tx_msg_id TO coin_a_lock_spend_tx_msg_id')
elif current_version == 15:
db_version += 1
session.execute('''
CREATE TABLE notifications (
record_id INTEGER NOT NULL,
active_ind INTEGER,
event_type INTEGER,
event_data BLOB,
created_at BIGINT,
PRIMARY KEY (record_id))''')
elif current_version == 16:
db_version += 1
session.execute('''
CREATE TABLE prefunded_transactions (
record_id INTEGER NOT NULL,
active_ind INTEGER,
created_at BIGINT,
linked_type INTEGER,
linked_id BLOB,
tx_type INTEGER,
tx_data BLOB,
used_by BLOB,
PRIMARY KEY (record_id))''')
elif current_version == 17:
db_version += 1
session.execute('ALTER TABLE knownidentities ADD COLUMN automation_override INTEGER')
session.execute('ALTER TABLE knownidentities ADD COLUMN visibility_override INTEGER')
session.execute('ALTER TABLE knownidentities ADD COLUMN data BLOB')
session.execute('UPDATE knownidentities SET active_ind = 1')
elif current_version == 18:
db_version += 1
session.execute('ALTER TABLE xmr_split_data ADD COLUMN addr_from STRING')
session.execute('ALTER TABLE xmr_split_data ADD COLUMN addr_to STRING')
elif current_version == 19:
db_version += 1
session.execute('ALTER TABLE bidstates ADD COLUMN in_error INTEGER')
session.execute('ALTER TABLE bidstates ADD COLUMN swap_failed INTEGER')
session.execute('ALTER TABLE bidstates ADD COLUMN swap_ended INTEGER')
elif current_version == 20:
db_version += 1
session.execute('''
CREATE TABLE message_links (
record_id INTEGER NOT NULL,
active_ind INTEGER,
created_at BIGINT,
linked_type INTEGER,
linked_id BLOB,
msg_type INTEGER,
msg_sequence INTEGER,
msg_id BLOB,
PRIMARY KEY (record_id))''')
session.execute('ALTER TABLE offers ADD COLUMN bid_reversed INTEGER')
if current_version != db_version:
self.db_version = db_version

View File

@@ -1,56 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2023 The BSX Developers
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
from .db import (
Concepts,
)
def remove_expired_data(self, time_offset: int = 0):
now: int = self.getTime()
try:
session = self.openSession()
active_bids_insert = self.activeBidsQueryStr(now, '', 'b2')
query_str = f'''
SELECT o.offer_id FROM offers o
WHERE o.expire_at <= :expired_at AND 0 = (SELECT COUNT(*) FROM bids b2 WHERE b2.offer_id = o.offer_id AND {active_bids_insert})
'''
num_offers = 0
num_bids = 0
offer_rows = session.execute(query_str, {'expired_at': now - time_offset})
for offer_row in offer_rows:
num_offers += 1
bid_rows = session.execute('SELECT bids.bid_id FROM bids WHERE bids.offer_id = :offer_id', {'offer_id': offer_row[0]})
for bid_row in bid_rows:
num_bids += 1
session.execute('DELETE FROM transactions WHERE transactions.bid_id = :bid_id', {'bid_id': bid_row[0]})
session.execute('DELETE FROM eventlog WHERE eventlog.linked_type = :type_ind AND eventlog.linked_id = :bid_id', {'type_ind': int(Concepts.BID), 'bid_id': bid_row[0]})
session.execute('DELETE FROM automationlinks WHERE automationlinks.linked_type = :type_ind AND automationlinks.linked_id = :bid_id', {'type_ind': int(Concepts.BID), 'bid_id': bid_row[0]})
session.execute('DELETE FROM prefunded_transactions WHERE prefunded_transactions.linked_type = :type_ind AND prefunded_transactions.linked_id = :bid_id', {'type_ind': int(Concepts.BID), 'bid_id': bid_row[0]})
session.execute('DELETE FROM history WHERE history.concept_type = :type_ind AND history.concept_id = :bid_id', {'type_ind': int(Concepts.BID), 'bid_id': bid_row[0]})
session.execute('DELETE FROM xmr_swaps WHERE xmr_swaps.bid_id = :bid_id', {'bid_id': bid_row[0]})
session.execute('DELETE FROM actions WHERE actions.linked_id = :bid_id', {'bid_id': bid_row[0]})
session.execute('DELETE FROM addresspool WHERE addresspool.bid_id = :bid_id', {'bid_id': bid_row[0]})
session.execute('DELETE FROM xmr_split_data WHERE xmr_split_data.bid_id = :bid_id', {'bid_id': bid_row[0]})
session.execute('DELETE FROM bids WHERE bids.bid_id = :bid_id', {'bid_id': bid_row[0]})
session.execute('DELETE FROM message_links WHERE linked_type = :type_ind AND linked_id = :linked_id', {'type_ind': int(Concepts.BID), 'linked_id': bid_row[0]})
session.execute('DELETE FROM eventlog WHERE eventlog.linked_type = :type_ind AND eventlog.linked_id = :offer_id', {'type_ind': int(Concepts.OFFER), 'offer_id': offer_row[0]})
session.execute('DELETE FROM automationlinks WHERE automationlinks.linked_type = :type_ind AND automationlinks.linked_id = :offer_id', {'type_ind': int(Concepts.OFFER), 'offer_id': offer_row[0]})
session.execute('DELETE FROM prefunded_transactions WHERE prefunded_transactions.linked_type = :type_ind AND prefunded_transactions.linked_id = :offer_id', {'type_ind': int(Concepts.OFFER), 'offer_id': offer_row[0]})
session.execute('DELETE FROM history WHERE history.concept_type = :type_ind AND history.concept_id = :offer_id', {'type_ind': int(Concepts.OFFER), 'offer_id': offer_row[0]})
session.execute('DELETE FROM xmr_offers WHERE xmr_offers.offer_id = :offer_id', {'offer_id': offer_row[0]})
session.execute('DELETE FROM sentoffers WHERE sentoffers.offer_id = :offer_id', {'offer_id': offer_row[0]})
session.execute('DELETE FROM actions WHERE actions.linked_id = :offer_id', {'offer_id': offer_row[0]})
session.execute('DELETE FROM offers WHERE offers.offer_id = :offer_id', {'offer_id': offer_row[0]})
session.execute('DELETE FROM message_links WHERE linked_type = :type_ind AND linked_id = :offer_id', {'type_ind': int(Concepts.OFFER), 'offer_id': offer_row[0]})
if num_offers > 0 or num_bids > 0:
self.log.info('Removed data for {} expired offer{} and {} bid{}.'.format(num_offers, 's' if num_offers != 1 else '', num_bids, 's' if num_bids != 1 else ''))
finally:
self.closeSession(session)

View File

@@ -1,10 +1,11 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2019-2023 tecnovert
# Copyright (c) 2019-2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
import json
import urllib.request
class Explorer():
@@ -16,7 +17,12 @@ class Explorer():
def readURL(self, url):
self.log.debug('Explorer url: {}'.format(url))
return self.swapclient.readURL(url)
try:
self.swapclient.setConnectionParameters()
req = urllib.request.Request(url)
return urllib.request.urlopen(req).read()
finally:
self.swapclient.popConnectionParameters()
class ExplorerInsight(Explorer):

View File

@@ -1,24 +1,23 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2019-2023 tecnovert
# Copyright (c) 2019-2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
import os
import json
import shlex
import traceback
import threading
import http.client
from urllib import parse
import urllib.parse
from http.server import BaseHTTPRequestHandler, HTTPServer
from jinja2 import Environment, PackageLoader
from . import __version__
from .util import (
dumpj,
ensure,
toBool,
LockedCoinError,
format_timestamp,
)
from .chainparams import (
@@ -26,40 +25,65 @@ from .chainparams import (
chainparams,
)
from .basicswap_util import (
strTxState,
BidStates,
SwapTypes,
DebugTypes,
strBidState,
strTxState,
strAddressType,
)
from .js_server import (
js_coins,
js_error,
js_url_to_function,
js_wallets,
js_offers,
js_sentoffers,
js_bids,
js_sentbids,
js_network,
js_revokeoffer,
js_smsgaddresses,
js_rates_list,
js_rates,
js_rate,
js_index,
)
from .ui.util import (
PAGE_LIMIT,
describeBid,
getCoinName,
listBidStates,
get_data_entry,
have_data_entry,
listOldBidStates,
get_data_entry_or,
listAvailableCoins,
set_pagination_filters,
)
from .ui.page_tor import page_tor
from .ui.page_offers import page_offers, page_offer, page_newoffer
from .ui.page_wallet import page_wallets, page_wallet
from .ui.page_automation import (
page_automation_strategies,
page_automation_strategy,
page_automation_strategy_new,
)
from .ui.page_bids import page_bids, page_bid
from .ui.page_offers import page_offers, page_offer, page_newoffer
from .ui.page_tor import page_tor, get_tor_established_state
from .ui.page_wallet import page_wallets, page_wallet
from .ui.page_settings import page_settings
from .ui.page_encryption import page_changepassword, page_unlock, page_lock
from .ui.page_identity import page_identity
from .ui.page_smsgaddresses import page_smsgaddresses
from .ui.page_debug import page_debug
env = Environment(loader=PackageLoader('basicswap', 'templates'))
env.filters['formatts'] = format_timestamp
def validateTextInput(text, name, messages, max_length=None):
if max_length is not None and len(text) > max_length:
messages.append(f'Error: {name} is too long')
return False
if len(text) > 0 and all(c.isalnum() or c.isspace() for c in text) is False:
messages.append(f'Error: {name} must consist of only letters and digits')
return False
return True
def extractDomain(url):
return url.split('://', 1)[1].split('/', 1)[0]
@@ -70,7 +94,7 @@ def listAvailableExplorers(swap_client):
if c not in chainparams:
continue
for i, e in enumerate(swap_client.coin_clients[c]['explorers']):
explorers.append(('{}_{}'.format(int(c), i), getCoinName(c) + ' - ' + extractDomain(e.base_url)))
explorers.append(('{}_{}'.format(int(c), i), swap_client.coin_clients[c]['name'].capitalize() + ' - ' + extractDomain(e.base_url)))
return explorers
@@ -83,146 +107,60 @@ def listExplorerActions(swap_client):
return actions
def parse_cmd(cmd: str, type_map: str):
params = shlex.split(cmd)
if len(params) < 1:
return '', []
method = params[0]
typed_params = []
params = params[1:]
for i, param in enumerate(params):
if i >= len(type_map):
type_ind = 's'
else:
type_ind = type_map[i]
if type_ind == 'i':
typed_params.append(int(param))
elif type_ind == 'b':
typed_params.append(toBool(param))
elif type_ind == 'j':
typed_params.append(json.loads(param))
else:
typed_params.append(param)
return method, typed_params
def html_content_start(title, h2=None, refresh=None):
content = '<!DOCTYPE html><html lang="en">\n<head>' \
+ '<meta charset="UTF-8">' \
+ ('' if not refresh else '<meta http-equiv="refresh" content="{}">'.format(refresh)) \
+ '<title>' + title + '</title></head>\n' \
+ '<body>'
if h2 is not None:
content += '<h2>' + h2 + '</h2>'
return content
class HttpHandler(BaseHTTPRequestHandler):
def page_info(self, info_str):
content = html_content_start('BasicSwap Info') \
+ '<p>Info: ' + info_str + '</p>' \
+ '<p><a href=\'/\'>home</a></p></body></html>'
return bytes(content, 'UTF-8')
def log_error(self, format, *args):
super().log_message(format, *args)
def log_message(self, format, *args):
# TODO: Add debug flag to re-enable.
pass
def generate_form_id(self):
return os.urandom(8).hex()
def page_error(self, error_str):
content = html_content_start('BasicSwap Error') \
+ '<p>Error: ' + error_str + '</p>' \
+ '<p><a href=\'/\'>home</a></p></body></html>'
return bytes(content, 'UTF-8')
def checkForm(self, post_string, name, messages):
if post_string == '':
return None
form_data = parse.parse_qs(post_string)
form_data = urllib.parse.parse_qs(post_string)
form_id = form_data[b'formid'][0].decode('utf-8')
if self.server.last_form_id.get(name, None) == form_id:
messages.append('Prevented double submit for form {}.'.format(form_id))
return None
self.server.last_form_id[name] = form_id
else:
self.server.last_form_id[name] = form_id
return form_data
def render_template(self, template, args_dict, status_code=200, version=__version__):
def render_template(self, template, args_dict):
swap_client = self.server.swap_client
if swap_client.ws_server:
args_dict['ws_url'] = swap_client.ws_server.url
if swap_client.debug:
args_dict['debug_mode'] = True
if swap_client.debug_ui:
args_dict['debug_ui_mode'] = True
if swap_client.use_tor_proxy:
args_dict['use_tor_proxy'] = True
# TODO: Cache value?
try:
args_dict['tor_established'] = True if get_tor_established_state(swap_client) == '1' else False
except Exception:
if swap_client.debug:
swap_client.log.error(traceback.format_exc())
if swap_client._show_notifications:
args_dict['notifications'] = swap_client.getNotifications()
if 'messages' in args_dict:
messages_with_ids = []
for msg in args_dict['messages']:
messages_with_ids.append((self.server.msg_id_counter, msg))
self.server.msg_id_counter += 1
args_dict['messages'] = messages_with_ids
if 'err_messages' in args_dict:
err_messages_with_ids = []
for msg in args_dict['err_messages']:
err_messages_with_ids.append((self.server.msg_id_counter, msg))
self.server.msg_id_counter += 1
args_dict['err_messages'] = err_messages_with_ids
shutdown_token = os.urandom(8).hex()
self.server.session_tokens['shutdown'] = shutdown_token
args_dict['shutdown_token'] = shutdown_token
encrypted, locked = swap_client.getLockedState()
args_dict['encrypted'] = encrypted
args_dict['locked'] = locked
if self.server.msg_id_counter >= 0x7FFFFFFF:
self.server.msg_id_counter = 0
args_dict['version'] = version
self.putHeaders(status_code, 'text/html')
return bytes(template.render(
title=self.server.title,
h2=self.server.title,
form_id=self.generate_form_id(),
form_id=os.urandom(8).hex(),
**args_dict,
), 'UTF-8')
def render_simple_template(self, template, args_dict):
swap_client = self.server.swap_client
return bytes(template.render(
title=self.server.title,
**args_dict,
), 'UTF-8')
def page_info(self, info_str, post_string=None):
template = env.get_template('info.html')
swap_client = self.server.swap_client
summary = swap_client.getSummary()
return self.render_template(template, {
'title_str': 'BasicSwap Info',
'message_str': info_str,
'summary': summary,
})
def page_error(self, error_str, post_string=None):
template = env.get_template('error.html')
swap_client = self.server.swap_client
summary = swap_client.getSummary()
return self.render_template(template, {
'title_str': 'BasicSwap Error',
'message_str': error_str,
'summary': summary,
})
def page_explorers(self, url_split, post_string):
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
summary = swap_client.getSummary()
result = None
explorer = -1
action = -1
messages = []
err_messages = []
form_data = self.checkForm(post_string, 'explorers', err_messages)
form_data = self.checkForm(post_string, 'explorers', messages)
if form_data:
explorer = form_data[b'explorer'][0].decode('utf-8')
@@ -249,46 +187,34 @@ class HttpHandler(BaseHTTPRequestHandler):
template = env.get_template('explorers.html')
return self.render_template(template, {
'messages': messages,
'err_messages': err_messages,
'explorers': listAvailableExplorers(swap_client),
'explorer': explorer,
'actions': listExplorerActions(swap_client),
'action': action,
'result': result,
'summary': summary,
'result': result
})
def page_rpc(self, url_split, post_string):
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
summary = swap_client.getSummary()
result = None
coin_type = -1
coin_id = -1
call_type = 'cli'
type_map = ''
messages = []
err_messages = []
form_data = self.checkForm(post_string, 'rpc', err_messages)
form_data = self.checkForm(post_string, 'rpc', messages)
if form_data:
try:
call_type = get_data_entry_or(form_data, 'call_type', 'cli')
type_map = get_data_entry_or(form_data, 'type_map', '')
try:
coin_id = int(get_data_entry(form_data, 'coin_type'))
if coin_id in (-2, -3, -4):
coin_type = Coins(Coins.XMR)
else:
coin_type = Coins(coin_id)
except Exception:
raise ValueError('Unknown Coin Type')
coin_id = int(form_data[b'coin_type'][0])
if coin_id in (-2, -3, -4):
coin_type = Coins(Coins.XMR)
else:
coin_type = Coins(coin_id)
except Exception:
raise ValueError('Unknown Coin Type')
try:
cmd = get_data_entry(form_data, 'cmd')
except Exception:
raise ValueError('Invalid command')
cmd = form_data[b'cmd'][0].decode('utf-8')
try:
if coin_type == Coins.XMR:
ci = swap_client.ci(coin_type)
arr = cmd.split(None, 1)
@@ -306,11 +232,7 @@ class HttpHandler(BaseHTTPRequestHandler):
raise ValueError('Unknown XMR RPC variant')
result = json.dumps(rv, indent=4)
else:
if call_type == 'http':
method, params = parse_cmd(cmd, type_map)
result = cmd + '\n' + swap_client.ci(coin_type).rpc_callback(method, params)
else:
result = cmd + '\n' + swap_client.callcoincli(coin_type, cmd)
result = cmd + '\n' + swap_client.callcoincli(coin_type, cmd)
except Exception as ex:
result = str(ex)
if self.server.swap_client.debug is True:
@@ -325,41 +247,369 @@ class HttpHandler(BaseHTTPRequestHandler):
coins.append((-4, 'Monero Wallet'))
return self.render_template(template, {
'messages': messages,
'err_messages': err_messages,
'coins': coins,
'coin_type': coin_id,
'call_type': call_type,
'result': result,
'messages': messages,
'summary': summary,
})
def page_debug(self, url_split, post_string):
swap_client = self.server.swap_client
result = None
messages = []
form_data = self.checkForm(post_string, 'wallets', messages)
if form_data:
if have_data_entry(form_data, 'reinit_xmr'):
try:
swap_client.initialiseWallet(Coins.XMR)
messages.append('Done.')
except Exception as a:
messages.append('Failed.')
template = env.get_template('debug.html')
return self.render_template(template, {
'messages': messages,
'result': result,
})
def page_active(self, url_split, post_string):
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
active_swaps = swap_client.listSwapsInProgress()
summary = swap_client.getSummary()
template = env.get_template('active.html')
return self.render_template(template, {
'refresh': 30,
'active_swaps': [(s[0].hex(), s[1], strBidState(s[2]), strTxState(s[3]), strTxState(s[4])) for s in active_swaps],
'summary': summary,
})
def page_settings(self, url_split, post_string):
swap_client = self.server.swap_client
messages = []
form_data = self.checkForm(post_string, 'settings', messages)
if form_data:
for name, c in swap_client.settings['chainclients'].items():
if have_data_entry(form_data, 'apply_' + name):
data = {'lookups': get_data_entry(form_data, 'lookups_' + name)}
if name == 'monero':
data['fee_priority'] = int(get_data_entry(form_data, 'fee_priority_' + name))
data['manage_daemon'] = True if get_data_entry(form_data, 'managedaemon_' + name) == 'true' else False
data['rpchost'] = get_data_entry(form_data, 'rpchost_' + name)
data['rpcport'] = int(get_data_entry(form_data, 'rpcport_' + name))
data['remotedaemonurls'] = get_data_entry(form_data, 'remotedaemonurls_' + name)
data['automatically_select_daemon'] = True if get_data_entry(form_data, 'autosetdaemon_' + name) == 'true' else False
else:
data['conf_target'] = int(get_data_entry(form_data, 'conf_target_' + name))
if name == 'particl':
data['anon_tx_ring_size'] = int(get_data_entry(form_data, 'rct_ring_size_' + name))
settings_changed, suggest_reboot = swap_client.editSettings(name, data)
if settings_changed is True:
messages.append('Settings applied.')
if suggest_reboot is True:
messages.append('Please restart BasicSwap.')
elif have_data_entry(form_data, 'enable_' + name):
swap_client.enableCoin(name)
messages.append(name.capitalize() + ' enabled, shutting down.')
swap_client.stopRunning()
elif have_data_entry(form_data, 'disable_' + name):
swap_client.disableCoin(name)
messages.append(name.capitalize() + ' disabled, shutting down.')
swap_client.stopRunning()
chains_formatted = []
sorted_names = sorted(swap_client.settings['chainclients'].keys())
for name in sorted_names:
c = swap_client.settings['chainclients'][name]
chains_formatted.append({
'name': name,
'lookups': c.get('chain_lookups', 'local'),
'manage_daemon': c.get('manage_daemon', 'Unknown'),
'connection_type': c.get('connection_type', 'Unknown'),
})
if name == 'monero':
chains_formatted[-1]['fee_priority'] = c.get('fee_priority', 0)
chains_formatted[-1]['manage_wallet_daemon'] = c.get('manage_wallet_daemon', 'Unknown')
chains_formatted[-1]['rpchost'] = c.get('rpchost', 'localhost')
chains_formatted[-1]['rpcport'] = int(c.get('rpcport', 18081))
chains_formatted[-1]['remotedaemonurls'] = '\n'.join(c.get('remote_daemon_urls', []))
chains_formatted[-1]['autosetdaemon'] = c.get('automatically_select_daemon', False)
else:
chains_formatted[-1]['conf_target'] = c.get('conf_target', 2)
if name == 'particl':
chains_formatted[-1]['anon_tx_ring_size'] = c.get('anon_tx_ring_size', 12)
else:
if c.get('connection_type', 'Unknown') == 'none':
if 'connection_type_prev' in c:
chains_formatted[-1]['can_reenable'] = True
else:
chains_formatted[-1]['can_disable'] = True
template = env.get_template('settings.html')
return self.render_template(template, {
'messages': messages,
'chains': chains_formatted,
})
def page_bid(self, url_split, post_string):
ensure(len(url_split) > 2, 'Bid ID not specified')
try:
bid_id = bytes.fromhex(url_split[2])
assert len(bid_id) == 28
except Exception:
raise ValueError('Bad bid ID')
swap_client = self.server.swap_client
messages = []
show_txns = False
show_offerer_seq_diagram = False
show_bidder_seq_diagram = False
show_lock_transfers = False
edit_bid = False
view_tx_ind = None
form_data = self.checkForm(post_string, 'bid', messages)
if form_data:
if b'abandon_bid' in form_data:
try:
swap_client.abandonBid(bid_id)
messages.append('Bid abandoned')
except Exception as ex:
messages.append('Abandon failed ' + str(ex))
elif b'accept_bid' in form_data:
try:
swap_client.acceptBid(bid_id)
messages.append('Bid accepted')
except Exception as ex:
messages.append('Accept failed ' + str(ex))
elif b'show_txns' in form_data:
show_txns = True
elif b'show_offerer_seq_diagram' in form_data:
show_offerer_seq_diagram = True
elif b'show_bidder_seq_diagram' in form_data:
show_bidder_seq_diagram = True
elif b'edit_bid' in form_data:
edit_bid = True
elif b'edit_bid_submit' in form_data:
data = {
'bid_state': int(form_data[b'new_state'][0]),
'debug_ind': int(get_data_entry_or(form_data, 'debugind', -1)),
'kbs_other': get_data_entry_or(form_data, 'kbs_other', None),
}
try:
swap_client.manualBidUpdate(bid_id, data)
messages.append('Bid edited')
except Exception as ex:
messages.append('Edit failed ' + str(ex))
elif b'view_tx_submit' in form_data:
show_txns = True
view_tx_ind = form_data[b'view_tx'][0].decode('utf-8')
elif b'view_lock_transfers' in form_data:
show_txns = True
show_lock_transfers = True
bid, xmr_swap, offer, xmr_offer, events = swap_client.getXmrBidAndOffer(bid_id)
ensure(bid, 'Unknown bid ID')
data = describeBid(swap_client, bid, xmr_swap, offer, xmr_offer, events, edit_bid, show_txns, view_tx_ind, show_lock_transfers=show_lock_transfers)
if bid.debug_ind is not None and bid.debug_ind > 0:
messages.append('Debug flag set: {}, {}'.format(bid.debug_ind, DebugTypes(bid.debug_ind).name))
data['show_bidder_seq_diagram'] = show_bidder_seq_diagram
data['show_offerer_seq_diagram'] = show_offerer_seq_diagram
old_states = listOldBidStates(bid)
if len(data['addr_from_label']) > 0:
data['addr_from_label'] = '(' + data['addr_from_label'] + ')'
template = env.get_template('bid_xmr.html') if offer.swap_type == SwapTypes.XMR_SWAP else env.get_template('bid.html')
return self.render_template(template, {
'bid_id': bid_id.hex(),
'messages': messages,
'data': data,
'edit_bid': edit_bid,
'old_states': old_states,
})
def page_bids(self, url_split, post_string, sent=False, available=False):
swap_client = self.server.swap_client
filters = {
'page_no': 1,
'bid_state_ind': -1,
'with_expired': True,
'limit': PAGE_LIMIT,
'sort_by': 'created_at',
'sort_dir': 'desc',
}
if available:
filters['bid_state_ind'] = BidStates.BID_RECEIVED
filters['with_expired'] = False
messages = []
form_data = self.checkForm(post_string, 'bids', messages)
if form_data and have_data_entry(form_data, 'applyfilters'):
if have_data_entry(form_data, 'sort_by'):
sort_by = get_data_entry(form_data, 'sort_by')
ensure(sort_by in ['created_at', ], 'Invalid sort by')
filters['sort_by'] = sort_by
if have_data_entry(form_data, 'sort_dir'):
sort_dir = get_data_entry(form_data, 'sort_dir')
ensure(sort_dir in ['asc', 'desc'], 'Invalid sort dir')
filters['sort_dir'] = sort_dir
if have_data_entry(form_data, 'state'):
state_ind = get_data_entry(form_data, 'state')
if state_ind != -1:
try:
state = BidStates(state_ind)
except Exception:
raise ValueError('Invalid state')
filters['bid_state_ind'] = state_ind
if have_data_entry(form_data, 'with_expired'):
with_expired = toBool(get_data_entry(form_data, 'with_expired'))
filters['with_expired'] = with_expired
set_pagination_filters(form_data, filters)
bids = swap_client.listBids(sent=sent, filters=filters)
page_data = {
'bid_states': listBidStates()
}
template = env.get_template('bids.html')
return self.render_template(template, {
'page_type': 'Sent' if sent else 'Received',
'messages': messages,
'filters': filters,
'data': page_data,
'bids': [(format_timestamp(b[0]),
b[2].hex(), b[3].hex(), strBidState(b[5]), strTxState(b[7]), strTxState(b[8]), b[11]) for b in bids],
})
def page_watched(self, url_split, post_string):
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
watched_outputs, last_scanned = swap_client.listWatchedOutputs()
summary = swap_client.getSummary()
template = env.get_template('watched.html')
return self.render_template(template, {
'refresh': 30,
'last_scanned': [(getCoinName(ls[0]), ls[1]) for ls in last_scanned],
'watched_outputs': [(wo[1].hex(), getCoinName(wo[0]), wo[2], wo[3], int(wo[4])) for wo in watched_outputs],
'summary': summary,
})
def page_smsgaddresses(self, url_split, post_string):
swap_client = self.server.swap_client
page_data = {}
messages = []
smsgaddresses = []
listaddresses = True
form_data = self.checkForm(post_string, 'smsgaddresses', messages)
if form_data:
edit_address_id = None
for key in form_data:
if key.startswith(b'editaddr_'):
edit_address_id = int(key.split(b'_')[1])
break
if edit_address_id is not None:
listaddresses = False
page_data['edit_address'] = edit_address_id
page_data['addr_data'] = swap_client.listAllSMSGAddresses(addr_id=edit_address_id)[0]
elif b'saveaddr' in form_data:
edit_address_id = int(form_data[b'edit_address_id'][0].decode('utf-8'))
edit_addr = form_data[b'edit_address'][0].decode('utf-8')
active_ind = int(form_data[b'active_ind'][0].decode('utf-8'))
ensure(active_ind in (0, 1), 'Invalid sort by')
addressnote = '' if b'addressnote' not in form_data else form_data[b'addressnote'][0].decode('utf-8')
if not validateTextInput(addressnote, 'Address note', messages, max_length=30):
listaddresses = False
page_data['edit_address'] = edit_address_id
else:
swap_client.editSMSGAddress(edit_addr, active_ind=active_ind, addressnote=addressnote)
messages.append(f'Edited address {edit_addr}')
elif b'shownewaddr' in form_data:
listaddresses = False
page_data['new_address'] = True
elif b'showaddaddr' in form_data:
listaddresses = False
page_data['new_send_address'] = True
elif b'createnewaddr' in form_data:
addressnote = '' if b'addressnote' not in form_data else form_data[b'addressnote'][0].decode('utf-8')
if not validateTextInput(addressnote, 'Address note', messages, max_length=30):
listaddresses = False
page_data['new_address'] = True
else:
new_addr, pubkey = swap_client.newSMSGAddress(addressnote=addressnote)
messages.append(f'Created address {new_addr}, pubkey {pubkey}')
elif b'createnewsendaddr' in form_data:
pubkey_hex = form_data[b'addresspubkey'][0].decode('utf-8')
addressnote = '' if b'addressnote' not in form_data else form_data[b'addressnote'][0].decode('utf-8')
if not validateTextInput(addressnote, 'Address note', messages, max_length=30) or \
not validateTextInput(pubkey_hex, 'Pubkey', messages, max_length=66):
listaddresses = False
page_data['new_send_address'] = True
else:
new_addr = swap_client.addSMSGAddress(pubkey_hex, addressnote=addressnote)
messages.append(f'Added address {new_addr}')
if listaddresses is True:
smsgaddresses = swap_client.listAllSMSGAddresses()
network_addr = swap_client.network_addr
for addr in smsgaddresses:
addr['type'] = strAddressType(addr['type'])
template = env.get_template('smsgaddresses.html')
return self.render_template(template, {
'messages': messages,
'data': page_data,
'smsgaddresses': smsgaddresses,
'network_addr': network_addr,
})
def page_identity(self, url_split, post_string):
ensure(len(url_split) > 2, 'Address not specified')
identity_address = url_split[2]
swap_client = self.server.swap_client
page_data = {'identity_address': identity_address}
messages = []
form_data = self.checkForm(post_string, 'identity', messages)
if form_data:
if have_data_entry(form_data, 'edit'):
page_data['show_edit_form'] = True
if have_data_entry(form_data, 'apply'):
new_label = get_data_entry(form_data, 'label')
try:
swap_client.updateIdentity(identity_address, new_label)
messages.append('Updated')
except Exception as e:
messages.append('Error')
try:
identity = swap_client.getIdentity(identity_address)
if identity is None:
raise ValueError('Unknown address')
page_data['label'] = identity.label
page_data['num_sent_bids_successful'] = identity.num_sent_bids_successful
page_data['num_recv_bids_successful'] = identity.num_recv_bids_successful
page_data['num_sent_bids_rejected'] = identity.num_sent_bids_rejected
page_data['num_recv_bids_rejected'] = identity.num_recv_bids_rejected
page_data['num_sent_bids_failed'] = identity.num_sent_bids_failed
page_data['num_recv_bids_failed'] = identity.num_recv_bids_failed
except Exception as e:
messages.append(e)
template = env.get_template('identity.html')
return self.render_template(template, {
'messages': messages,
'data': page_data,
})
def page_shutdown(self, url_split, post_string):
@@ -377,22 +627,25 @@ class HttpHandler(BaseHTTPRequestHandler):
def page_index(self, url_split):
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
summary = swap_client.getSummary()
shutdown_token = os.urandom(8).hex()
self.server.session_tokens['shutdown'] = shutdown_token
template = env.get_template('index.html')
return self.render_template(template, {
'refresh': 30,
'version': __version__,
'summary': summary,
'use_tor_proxy': swap_client.use_tor_proxy
'use_tor_proxy': swap_client.use_tor_proxy,
'shutdown_token': shutdown_token
})
def page_404(self, url_split):
swap_client = self.server.swap_client
summary = swap_client.getSummary()
template = env.get_template('404.html')
return self.render_template(template, {
'summary': summary,
})
return bytes(template.render(
title=self.server.title,
), 'UTF-8')
def putHeaders(self, status_code, content_type):
self.send_response(status_code)
@@ -402,24 +655,39 @@ class HttpHandler(BaseHTTPRequestHandler):
self.end_headers()
def handle_http(self, status_code, path, post_string='', is_json=False):
swap_client = self.server.swap_client
parsed = parse.urlparse(self.path)
parsed = urllib.parse.urlparse(self.path)
url_split = parsed.path.split('/')
if post_string == '' and len(parsed.query) > 0:
post_string = parsed.query
if len(url_split) > 1 and url_split[1] == 'json':
try:
self.putHeaders(status_code, 'text/plain')
func = js_url_to_function(url_split)
func = js_index
if len(url_split) > 2:
func = {
'coins': js_coins,
'wallets': js_wallets,
'offers': js_offers,
'sentoffers': js_sentoffers,
'bids': js_bids,
'sentbids': js_sentbids,
'network': js_network,
'revokeoffer': js_revokeoffer,
'smsgaddresses': js_smsgaddresses,
'rate': js_rate,
'rates': js_rates,
'rateslist': js_rates_list,
}.get(url_split[2], js_index)
return func(self, url_split, post_string, is_json)
except Exception as ex:
if swap_client.debug is True:
swap_client.log.error(traceback.format_exc())
if self.server.swap_client.debug is True:
self.server.swap_client.log.error(traceback.format_exc())
return js_error(self, str(ex))
if len(url_split) > 1 and url_split[1] == 'static':
try:
static_path = os.path.join(os.path.dirname(__file__), 'static')
if len(url_split) > 3 and url_split[2] == 'sequence_diagrams':
with open(os.path.join(static_path, 'sequence_diagrams', url_split[3]), 'rb') as fp:
self.putHeaders(status_code, 'image/svg+xml')
@@ -431,8 +699,6 @@ class HttpHandler(BaseHTTPRequestHandler):
'.svg': 'image/svg+xml',
'.png': 'image/png',
'.jpg': 'image/jpeg',
'.gif': 'image/gif',
'.ico': 'image/x-icon',
}.get(extension, '')
if mime_type == '':
raise ValueError('Unknown file type ' + filename)
@@ -450,18 +716,21 @@ class HttpHandler(BaseHTTPRequestHandler):
self.putHeaders(status_code, 'application/javascript')
return fp.read()
else:
self.putHeaders(status_code, 'text/html')
return self.page_404(url_split)
except FileNotFoundError:
self.putHeaders(status_code, 'text/html')
return self.page_404(url_split)
except Exception as ex:
if swap_client.debug is True:
swap_client.log.error(traceback.format_exc())
if self.server.swap_client.debug is True:
self.server.swap_client.log.error(traceback.format_exc())
self.putHeaders(status_code, 'text/html')
return self.page_error(str(ex))
try:
self.putHeaders(status_code, 'text/html')
if len(url_split) > 1:
page = url_split[1]
if page == 'active':
return self.page_active(url_split, post_string)
if page == 'wallets':
@@ -469,15 +738,11 @@ class HttpHandler(BaseHTTPRequestHandler):
if page == 'wallet':
return page_wallet(self, url_split, post_string)
if page == 'settings':
return page_settings(self, url_split, post_string)
if page == 'error':
return self.page_error(url_split, post_string)
if page == 'info':
return self.page_info(url_split, post_string)
return self.page_settings(url_split, post_string)
if page == 'rpc':
return self.page_rpc(url_split, post_string)
if page == 'debug':
return page_debug(self, url_split, post_string)
return self.page_debug(url_split, post_string)
if page == 'explorers':
return self.page_explorers(url_split, post_string)
if page == 'offer':
@@ -489,19 +754,19 @@ class HttpHandler(BaseHTTPRequestHandler):
if page == 'sentoffers':
return page_offers(self, url_split, post_string, sent=True)
if page == 'bid':
return page_bid(self, url_split, post_string)
if page == 'receivedbids':
return page_bids(self, url_split, post_string, received=True)
return self.page_bid(url_split, post_string)
if page == 'bids':
return self.page_bids(url_split, post_string)
if page == 'sentbids':
return page_bids(self, url_split, post_string, sent=True)
return self.page_bids(url_split, post_string, sent=True)
if page == 'availablebids':
return page_bids(self, url_split, post_string, available=True)
return self.page_bids(url_split, post_string, available=True)
if page == 'watched':
return self.page_watched(url_split, post_string)
if page == 'smsgaddresses':
return page_smsgaddresses(self, url_split, post_string)
return self.page_smsgaddresses(url_split, post_string)
if page == 'identity':
return page_identity(self, url_split, post_string)
return self.page_identity(url_split, post_string)
if page == 'tor':
return page_tor(self, url_split, post_string)
if page == 'automation':
@@ -512,20 +777,10 @@ class HttpHandler(BaseHTTPRequestHandler):
return page_automation_strategy_new(self, url_split, post_string)
if page == 'shutdown':
return self.page_shutdown(url_split, post_string)
if page == 'changepassword':
return page_changepassword(self, url_split, post_string)
if page == 'unlock':
return page_unlock(self, url_split, post_string)
if page == 'lock':
return page_lock(self, url_split, post_string)
if page != '':
return self.page_404(url_split)
return self.page_index(url_split)
except LockedCoinError:
return page_unlock(self, url_split, post_string)
except Exception as ex:
if swap_client.debug is True:
swap_client.log.error(traceback.format_exc())
if self.server.swap_client.debug is True:
self.server.swap_client.log.error(traceback.format_exc())
return self.page_error(str(ex))
def do_GET(self):
@@ -560,11 +815,10 @@ class HttpThread(threading.Thread, HTTPServer):
self.port_no = port_no
self.allow_cors = allow_cors
self.swap_client = swap_client
self.title = 'BasicSwap - ' + __version__
self.title = 'BasicSwap, ' + self.swap_client.chain
self.last_form_id = dict()
self.session_tokens = dict()
self.env = env
self.msg_id_counter = 0
self.timeout = 60
HTTPServer.__init__(self, (self.host_name, self.port_no), HttpHandler)
@@ -580,8 +834,11 @@ class HttpThread(threading.Thread, HTTPServer):
data = response.read()
conn.close()
def stopped(self):
return self.stop_event.is_set()
def serve_forever(self):
while not self.stop_event.is_set():
while not self.stopped():
self.handle_request()
self.socket.close()

View File

@@ -1,13 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2023 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
from enum import IntEnum
class Curves(IntEnum):
secp256k1 = 1
ed25519 = 2

File diff suppressed because it is too large Load Diff

View File

@@ -184,18 +184,11 @@ def ser_string_vector(l):
return r
# Deserialize from bytes
def FromBytes(obj, tx_bytes):
obj.deserialize(BytesIO(tx_bytes))
return obj
# Deserialize from a hex string representation (eg from RPC)
def FromHex(obj, hex_string):
obj.deserialize(BytesIO(hex_str_to_bytes(hex_string)))
return obj
# Convert a binary-serializable object to hex (eg for submission via RPC)
def ToHex(obj):
return bytes_to_hex_str(obj.serialize())
@@ -425,114 +418,43 @@ class CTxOut:
bytes_to_hex_str(self.scriptPubKey))
class SpendDescription:
def deserialize(self, f):
self.cv = deser_uint256(f)
self.anchor = deser_uint256(f)
self.nullifier = deser_uint256(f)
self.rk = deser_uint256(f)
self.zkproof = f.read(192)
self.spendAuthSig = f.read(64)
def serialize(self):
r = b""
r += ser_uint256(self.cv)
r += ser_uint256(self.anchor)
r += ser_uint256(self.nullifier)
r += ser_uint256(self.rk)
r += self.zkproof
r += self.spendAuthSig
return r
class OutputDescription:
def deserialize(self, f):
self.cv = deser_uint256(f)
self.cmu = deser_uint256(f)
self.ephemeralKey = deser_uint256(f)
self.encCiphertext = f.read(580)
self.outCiphertext = f.read(80)
self.zkproof = f.read(192)
def serialize(self):
r = b""
r += ser_uint256(self.cv)
r += ser_uint256(self.cmu)
r += ser_uint256(self.ephemeralKey)
r += self.encCiphertext
r += self.outCiphertext
r += self.zkproof
return r
class SaplingTxData:
def deserialize(self, f):
self.pre = f.read(1)
self.valueBalance = struct.unpack("<q", f.read(8))[0]
self.vShieldedSpend = deser_vector(f, SpendDescription)
self.vShieldedOutput = deser_vector(f, OutputDescription)
self.bindingSig = f.read(64)
def serialize(self):
r = b""
r += self.pre
r += struct.pack("<q", self.valueBalance)
r += ser_vector(self.vShieldedSpend)
r += ser_vector(self.vShieldedOutput)
r += self.bindingSig
return r
class CTransaction:
def __init__(self, tx=None):
if tx is None:
self.nVersion = 1
self.nType = 0
self.vin = []
self.vout = []
self.sapData = None
self.extraData = b""
self.sapData = b""
self.nLockTime = 0
self.sha256 = None
self.hash = None
else:
self.nVersion = tx.nVersion
self.nType = tx.nType
self.vin = copy.deepcopy(tx.vin)
self.vout = copy.deepcopy(tx.vout)
self.nLockTime = tx.nLockTime
self.sapData = tx.sapData
self.extraData = tx.extraData
self.sha256 = tx.sha256
self.hash = tx.hash
def deserialize(self, f):
self.nVersion = struct.unpack("<h", f.read(2))[0]
self.nType = struct.unpack("<h", f.read(2))[0]
self.nVersion = struct.unpack("<i", f.read(4))[0]
self.vin = deser_vector(f, CTxIn)
self.vout = deser_vector(f, CTxOut)
self.nLockTime = struct.unpack("<I", f.read(4))[0]
if self.nVersion >= 3:
self.sapData = SaplingTxData()
self.sapData.deserialize(f)
if self.nType != 0:
self.extraData = deser_string(f)
if self.nVersion >= 2:
self.sapData = deser_string(f)
self.sha256 = None
self.hash = None
def serialize_without_witness(self):
r = b""
r += struct.pack("<h", self.nVersion)
r += struct.pack("<h", self.nType)
r += struct.pack("<i", self.nVersion)
r += ser_vector(self.vin)
r += ser_vector(self.vout)
r += struct.pack("<I", self.nLockTime)
if self.nVersion >= 3:
r += self.sapData.serialize()
if self.nType != 0:
r += ser_string(self.extraData)
if self.nVersion >= 2:
r += ser_string(self.sapData)
return r
# Regular serialization is with witness -- must explicitly
@@ -582,8 +504,8 @@ class CTransaction:
x.prevout.hash == outpoint.hash and x.prevout.n == outpoint.n]) > 0
def __repr__(self):
return "CTransaction(nVersion=%i nType=%i vin=%s vout=%s nLockTime=%i)" \
% (self.nVersion, self.nType, repr(self.vin), repr(self.vout), self.nLockTime)
return "CTransaction(nVersion=%i vin=%s vout=%s nLockTime=%i)" \
% (self.nVersion, repr(self.vin), repr(self.vout), self.nLockTime)
class CBlockHeader:

View File

@@ -1,94 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
from .btc import BTCInterface
from basicswap.chainparams import Coins
from basicswap.util.address import decodeAddress
from mnemonic import Mnemonic
from basicswap.contrib.test_framework.script import (
CScript,
OP_DUP, OP_HASH160, OP_EQUALVERIFY, OP_CHECKSIG
)
class DASHInterface(BTCInterface):
@staticmethod
def coin_type():
return Coins.DASH
def __init__(self, coin_settings, network, swap_client=None):
super().__init__(coin_settings, network, swap_client)
self._wallet_passphrase = ''
self._have_checked_seed = False
def seedToMnemonic(self, key):
return Mnemonic('english').to_mnemonic(key)
def initialiseWallet(self, key):
words = self.seedToMnemonic(key)
mnemonic_passphrase = ''
self.rpc_callback('upgradetohd', [words, mnemonic_passphrase, self._wallet_passphrase])
self._have_checked_seed = False
if self._wallet_passphrase != '':
self.unlockWallet(self._wallet_passphrase)
def decodeAddress(self, address):
return decodeAddress(address)[1:]
def checkExpectedSeed(self, key_hash):
try:
rv = self.rpc_callback('dumphdinfo')
entropy = Mnemonic('english').to_entropy(rv['mnemonic'].split(' '))
entropy_hash = self.getAddressHashFromKey(entropy)[::-1].hex()
self._have_checked_seed = True
return entropy_hash == key_hash
except Exception as e:
self._log.warning('checkExpectedSeed failed: {}'.format(str(e)))
return False
def withdrawCoin(self, value, addr_to, subfee):
params = [addr_to, value, '', '', subfee, False, False, self._conf_target]
return self.rpc_callback('sendtoaddress', params)
def getSpendableBalance(self) -> int:
return self.make_int(self.rpc_callback('getwalletinfo')['balance'])
def getScriptForPubkeyHash(self, pkh: bytes) -> bytearray:
# Return P2PKH
return CScript([OP_DUP, OP_HASH160, pkh, OP_EQUALVERIFY, OP_CHECKSIG])
def getBLockSpendTxFee(self, tx, fee_rate: int) -> int:
add_bytes = 107
size = len(tx.serialize_with_witness()) + add_bytes
pay_fee = round(fee_rate * size / 1000)
self._log.info(f'BLockSpendTx fee_rate, size, fee: {fee_rate}, {size}, {pay_fee}.')
return pay_fee
def findTxnByHash(self, txid_hex: str):
# Only works for wallet txns
try:
rv = self.rpc_callback('gettransaction', [txid_hex])
except Exception as ex:
self._log.debug('findTxnByHash getrawtransaction failed: {}'.format(txid_hex))
return None
if 'confirmations' in rv and rv['confirmations'] >= self.blocks_confirmed:
block_height = self.getBlockHeader(rv['blockhash'])['height']
return {'txid': txid_hex, 'amount': 0, 'height': block_height}
return None
def unlockWallet(self, password: str):
super().unlockWallet(password)
# Store password for initialiseWallet
self._wallet_passphrase = password
if not self._have_checked_seed:
self._sc.checkWalletSeed(self.coin_type())
def lockWallet(self):
super().lockWallet()
self._wallet_passphrase = ''

View File

@@ -1,209 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
import hashlib
from .btc import BTCInterface, find_vout_for_address_from_txobj
from basicswap.chainparams import Coins
from basicswap.util.address import decodeAddress
from basicswap.contrib.test_framework.script import (
CScript,
OP_0,
OP_DUP,
OP_EQUAL,
OP_HASH160,
OP_CHECKSIG,
OP_EQUALVERIFY,
hash160,
)
from basicswap.contrib.test_framework.messages import (
CTransaction,
)
class FIROInterface(BTCInterface):
@staticmethod
def coin_type():
return Coins.FIRO
def getExchangeName(self, exchange_name):
return 'zcoin'
def initialiseWallet(self, key):
# load with -hdseed= parameter
pass
def getNewAddress(self, use_segwit, label='swap_receive'):
return self.rpc_callback('getnewaddress', [label])
# addr_plain = self.rpc_callback('getnewaddress', [label])
# return self.rpc_callback('addwitnessaddress', [addr_plain])
def decodeAddress(self, address):
return decodeAddress(address)[1:]
def encodeSegwitAddress(self, script):
raise ValueError('TODO')
def decodeSegwitAddress(self, addr):
raise ValueError('TODO')
def isWatchOnlyAddress(self, address):
addr_info = self.rpc_callback('validateaddress', [address])
return addr_info['iswatchonly']
def isAddressMine(self, address: str, or_watch_only: bool = False) -> bool:
addr_info = self.rpc_callback('validateaddress', [address])
if not or_watch_only:
return addr_info['ismine']
return addr_info['ismine'] or addr_info['iswatchonly']
def getSCLockScriptAddress(self, lock_script):
lock_tx_dest = self.getScriptDest(lock_script)
address = self.encodeScriptDest(lock_tx_dest)
if not self.isAddressMine(address, or_watch_only=True):
# Expects P2WSH nested in BIP16_P2SH
ro = self.rpc_callback('importaddress', [lock_tx_dest.hex(), 'bid lock', False, True])
addr_info = self.rpc_callback('validateaddress', [address])
return address
def getLockTxHeightFiro(self, txid, lock_script, bid_amount, rescan_from, find_index=False):
# Add watchonly address and rescan if required
lock_tx_dest = self.getScriptDest(lock_script)
dest_address = self.encodeScriptDest(lock_tx_dest)
if not self.isAddressMine(dest_address, or_watch_only=True):
self.rpc_callback('importaddress', [lock_tx_dest.hex(), 'bid lock', False, True])
self._log.info('Imported watch-only addr: {}'.format(dest_address))
self._log.info('Rescanning {} chain from height: {}'.format(self.coin_name(), rescan_from))
self.rpc_callback('rescanblockchain', [rescan_from])
return_txid = True if txid is None else False
if txid is None:
txns = self.rpc_callback('listunspent', [0, 9999999, [dest_address, ]])
for tx in txns:
if self.make_int(tx['amount']) == bid_amount:
txid = bytes.fromhex(tx['txid'])
break
if txid is None:
return None
try:
tx = self.rpc_callback('gettransaction', [txid.hex()])
block_height = 0
if 'blockhash' in tx:
block_header = self.rpc_callback('getblockheader', [tx['blockhash']])
block_height = block_header['height']
rv = {
'depth': 0 if 'confirmations' not in tx else tx['confirmations'],
'height': block_height}
except Exception as e:
self._log.debug('getLockTxHeight gettransaction failed: %s, %s', txid.hex(), str(e))
return None
if find_index:
tx_obj = self.rpc_callback('decoderawtransaction', [tx['hex']])
rv['index'] = find_vout_for_address_from_txobj(tx_obj, dest_address)
if return_txid:
rv['txid'] = txid.hex()
return rv
def createSCLockTx(self, value: int, script: bytearray, vkbv: bytes = None) -> bytes:
tx = CTransaction()
tx.nVersion = self.txVersion()
tx.vout.append(self.txoType()(value, self.getScriptDest(script)))
return tx.serialize()
def fundSCLockTx(self, tx_bytes, feerate, vkbv=None):
return self.fundTx(tx_bytes, feerate)
def signTxWithWallet(self, tx):
rv = self.rpc_callback('signrawtransaction', [tx.hex()])
return bytes.fromhex(rv['hex'])
def createRawFundedTransaction(self, addr_to: str, amount: int, sub_fee: bool = False, lock_unspents: bool = True) -> str:
txn = self.rpc_callback('createrawtransaction', [[], {addr_to: self.format_amount(amount)}])
fee_rate, fee_src = self.get_fee_rate(self._conf_target)
self._log.debug(f'Fee rate: {fee_rate}, source: {fee_src}, block target: {self._conf_target}')
options = {
'lockUnspents': lock_unspents,
'feeRate': fee_rate,
}
if sub_fee:
options['subtractFeeFromOutputs'] = [0,]
return self.rpc_callback('fundrawtransaction', [txn, options])['hex']
def createRawSignedTransaction(self, addr_to, amount) -> str:
txn_funded = self.createRawFundedTransaction(addr_to, amount)
return self.rpc_callback('signrawtransaction', [txn_funded])['hex']
def getScriptForPubkeyHash(self, pkh: bytes) -> bytearray:
# Return P2PKH
return CScript([OP_DUP, OP_HASH160, pkh, OP_EQUALVERIFY, OP_CHECKSIG])
def getScriptDest(self, script: bytearray) -> bytearray:
# P2WSH nested in BIP16_P2SH
script_hash = hashlib.sha256(script).digest()
assert len(script_hash) == 32
script_hash_hash = hash160(script_hash)
assert len(script_hash_hash) == 20
return CScript([OP_HASH160, script_hash_hash, OP_EQUAL])
def getSeedHash(self, seed) -> bytes:
return hash160(seed)[::-1]
def encodeScriptDest(self, script):
# Extract hash from script
script_hash = script[2:-1]
return self.sh_to_address(script_hash)
def getScriptScriptSig(self, script):
return CScript([OP_0, hashlib.sha256(script).digest()])
def withdrawCoin(self, value, addr_to, subfee):
params = [addr_to, value, '', '', subfee]
return self.rpc_callback('sendtoaddress', params)
def getWalletSeedID(self):
return self.rpc_callback('getwalletinfo')['hdmasterkeyid']
def getSpendableBalance(self) -> int:
return self.make_int(self.rpc_callback('getwalletinfo')['balance'])
def getBLockSpendTxFee(self, tx, fee_rate: int) -> int:
add_bytes = 107
size = len(tx.serialize_with_witness()) + add_bytes
pay_fee = round(fee_rate * size / 1000)
self._log.info(f'BLockSpendTx fee_rate, size, fee: {fee_rate}, {size}, {pay_fee}.')
return pay_fee
def signTxWithKey(self, tx: bytes, key: bytes) -> bytes:
key_wif = self.encodeKey(key)
rv = self.rpc_callback('signrawtransaction', [tx.hex(), [], [key_wif, ]])
return bytes.fromhex(rv['hex'])
def findTxnByHash(self, txid_hex: str):
# Only works for wallet txns
try:
rv = self.rpc_callback('gettransaction', [txid_hex])
except Exception as ex:
self._log.debug('findTxnByHash getrawtransaction failed: {}'.format(txid_hex))
return None
if 'confirmations' in rv and rv['confirmations'] >= self.blocks_confirmed:
block_height = self.getBlockHeader(rv['blockhash'])['height']
return {'txid': txid_hex, 'amount': 0, 'height': block_height}
return None

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2020-2023 tecnovert
# Copyright (c) 2020-2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
@@ -17,6 +17,7 @@ from basicswap.contrib.test_framework.script import (
OP_DUP, OP_HASH160, OP_EQUALVERIFY, OP_CHECKSIG
)
from basicswap.util import (
i2b,
ensure,
make_int,
TemporaryError,
@@ -42,8 +43,6 @@ class BalanceTypes(IntEnum):
class PARTInterface(BTCInterface):
@staticmethod
def coin_type():
# Returns the base coin type
# ANON and BLIND PART will return Coins.PART
return Coins.PART
@staticmethod
@@ -59,12 +58,8 @@ class PARTInterface(BTCInterface):
return 0xa0
@staticmethod
def xmr_swap_a_lock_spend_tx_vsize() -> int:
return 200
@staticmethod
def xmr_swap_b_lock_spend_tx_vsize() -> int:
return 138
def xmr_swap_alock_spend_tx_vsize() -> int:
return 213
@staticmethod
def txoType():
@@ -82,10 +77,10 @@ class PARTInterface(BTCInterface):
# TODO: Double check
return True
def getNewAddress(self, use_segwit, label='swap_receive') -> str:
def getNewAddress(self, use_segwit, label='swap_receive'):
return self.rpc_callback('getnewaddress', [label])
def getNewStealthAddress(self, label='swap_stealth') -> str:
def getNewStealthAddress(self, label='swap_stealth'):
return self.rpc_callback('getnewstealthaddress', [label])
def haveSpentIndex(self):
@@ -107,21 +102,21 @@ class PARTInterface(BTCInterface):
{'conf_target': self._conf_target}]
return self.rpc_callback('sendtypeto', params)
def getScriptForPubkeyHash(self, pkh: bytes) -> CScript:
def getScriptForPubkeyHash(self, pkh):
return CScript([OP_DUP, OP_HASH160, pkh, OP_EQUALVERIFY, OP_CHECKSIG])
def formatStealthAddress(self, scan_pubkey, spend_pubkey) -> str:
def formatStealthAddress(self, scan_pubkey, spend_pubkey):
prefix_byte = chainparams[self.coin_type()][self._network]['stealth_key_prefix']
return encodeStealthAddress(prefix_byte, scan_pubkey, spend_pubkey)
def getWitnessStackSerialisedLength(self, witness_stack) -> int:
length: int = getCompactSizeLen(len(witness_stack))
def getWitnessStackSerialisedLength(self, witness_stack):
length = getCompactSizeLen(len(witness_stack))
for e in witness_stack:
length += getWitnessElementLen(len(e))
length += getWitnessElementLen(len(e) // 2) # hex -> bytes
return length
def getWalletRestoreHeight(self) -> int:
def getWalletRestoreHeight(self):
start_time = self.rpc_callback('getwalletinfo')['keypoololdest']
blockchaininfo = self.rpc_callback('getblockchaininfo')
@@ -142,15 +137,7 @@ class PARTInterfaceBlind(PARTInterface):
def balance_type():
return BalanceTypes.BLIND
@staticmethod
def xmr_swap_a_lock_spend_tx_vsize() -> int:
return 1032
@staticmethod
def xmr_swap_b_lock_spend_tx_vsize() -> int:
return 980
def coin_name(self) -> str:
def coin_name(self):
return super().coin_name() + ' Blind'
def getScriptLockTxNonce(self, data):
@@ -179,10 +166,11 @@ class PARTInterfaceBlind(PARTInterface):
ensure(v['result'] is True, 'verifycommitment failed')
return output_n, blinded_info
def createSCLockTx(self, value: int, script: bytearray, vkbv: bytes) -> bytes:
def createScriptLockTx(self, value, Kal, Kaf, vkbv):
script = self.genScriptLockTxScript(Kal, Kaf)
# Nonce is derived from vkbv, ephemeral_key isn't used
ephemeral_key = self.getNewSecretKey()
ephemeral_key = i2b(self.getNewSecretKey())
ephemeral_pubkey = self.getPubkey(ephemeral_key)
assert (len(ephemeral_pubkey) == 33)
nonce = self.getScriptLockTxNonce(vkbv)
@@ -193,9 +181,9 @@ class PARTInterfaceBlind(PARTInterface):
rv = self.rpc_callback('createrawparttransaction', params)
tx_bytes = bytes.fromhex(rv['hex'])
return tx_bytes
return tx_bytes, script
def fundSCLockTx(self, tx_bytes: bytes, feerate: int, vkbv: bytes) -> bytes:
def fundScriptLockTx(self, tx_bytes, feerate, vkbv):
feerate_str = self.format_amount(feerate)
# TODO: unlock unspents if bid cancelled
@@ -217,11 +205,11 @@ class PARTInterfaceBlind(PARTInterface):
rv = self.rpc_callback('fundrawtransactionfrom', ['blind', tx_hex, {}, outputs_info, options])
return bytes.fromhex(rv['hex'])
def createSCLockRefundTx(self, tx_lock_bytes, script_lock, Kal, Kaf, lock1_value, csv_val, tx_fee_rate, vkbv):
def createScriptLockRefundTx(self, tx_lock_bytes, script_lock, Kal, Kaf, lock1_value, csv_val, tx_fee_rate, vkbv):
lock_tx_obj = self.rpc_callback('decoderawtransaction', [tx_lock_bytes.hex()])
assert (self.getTxid(tx_lock_bytes).hex() == lock_tx_obj['txid'])
# Nonce is derived from vkbv, ephemeral_key isn't used
ephemeral_key = self.getNewSecretKey()
ephemeral_key = i2b(self.getNewSecretKey())
ephemeral_pubkey = self.getPubkey(ephemeral_key)
assert (len(ephemeral_pubkey) == 33)
nonce = self.getScriptLockTxNonce(vkbv)
@@ -244,10 +232,9 @@ class PARTInterfaceBlind(PARTInterface):
# Set dummy witness data for fee estimation
dummy_witness_stack = self.getScriptLockTxDummyWitness(script_lock)
dummy_witness_stack = [x.hex() for x in dummy_witness_stack]
# Use a junk change pubkey to avoid adding unused keys to the wallet
zero_change_key = self.getNewSecretKey()
zero_change_key = i2b(self.getNewSecretKey())
zero_change_pubkey = self.getPubkey(zero_change_key)
inputs_info = {'0': {'value': input_blinded_info['amount'], 'blind': input_blinded_info['blind'], 'witnessstack': dummy_witness_stack}}
outputs_info = rv['amounts']
@@ -265,7 +252,7 @@ class PARTInterfaceBlind(PARTInterface):
return bytes.fromhex(lock_refund_tx_hex), refund_script, refunded_value
def createSCLockRefundSpendTx(self, tx_lock_refund_bytes, script_lock_refund, pkh_refund_to, tx_fee_rate, vkbv):
def createScriptLockRefundSpendTx(self, tx_lock_refund_bytes, script_lock_refund, pkh_refund_to, tx_fee_rate, vkbv):
# Returns the coinA locked coin to the leader
# The follower will sign the multisig path with a signature encumbered by the leader's coinB spend pubkey
# If the leader publishes the decrypted signature the leader's coinB spend privatekey will be revealed to the follower
@@ -293,10 +280,9 @@ class PARTInterfaceBlind(PARTInterface):
# Set dummy witness data for fee estimation
dummy_witness_stack = self.getScriptLockRefundSpendTxDummyWitness(script_lock_refund)
dummy_witness_stack = [x.hex() for x in dummy_witness_stack]
# Use a junk change pubkey to avoid adding unused keys to the wallet
zero_change_key = self.getNewSecretKey()
zero_change_key = i2b(self.getNewSecretKey())
zero_change_pubkey = self.getPubkey(zero_change_key)
inputs_info = {'0': {'value': input_blinded_info['amount'], 'blind': input_blinded_info['blind'], 'witnessstack': dummy_witness_stack}}
outputs_info = rv['amounts']
@@ -311,11 +297,11 @@ class PARTInterfaceBlind(PARTInterface):
return bytes.fromhex(lock_refund_spend_tx_hex)
def verifySCLockTx(self, tx_bytes, script_out,
swap_value,
Kal, Kaf,
feerate,
check_lock_tx_inputs, vkbv):
def verifyLockTx(self, tx_bytes, script_out,
swap_value,
Kal, Kaf,
feerate,
check_lock_tx_inputs, vkbv):
lock_tx_obj = self.rpc_callback('decoderawtransaction', [tx_bytes.hex()])
lock_txid_hex = lock_tx_obj['txid']
self._log.info('Verifying lock tx: {}.'.format(lock_txid_hex))
@@ -355,9 +341,9 @@ class PARTInterfaceBlind(PARTInterface):
return bytes.fromhex(lock_txid_hex), lock_output_n
def verifySCLockRefundTx(self, tx_bytes, lock_tx_bytes, script_out,
prevout_id, prevout_n, prevout_seq, prevout_script,
Kal, Kaf, csv_val_expect, swap_value, feerate, vkbv):
def verifyLockRefundTx(self, tx_bytes, lock_tx_bytes, script_out,
prevout_id, prevout_n, prevout_seq, prevout_script,
Kal, Kaf, csv_val_expect, swap_value, feerate, vkbv):
lock_refund_tx_obj = self.rpc_callback('decoderawtransaction', [tx_bytes.hex()])
lock_refund_txid_hex = lock_refund_tx_obj['txid']
self._log.info('Verifying lock refund tx: {}.'.format(lock_refund_txid_hex))
@@ -413,10 +399,10 @@ class PARTInterfaceBlind(PARTInterface):
return bytes.fromhex(lock_refund_txid_hex), lock_refund_txo_value, lock_refund_output_n
def verifySCLockRefundSpendTx(self, tx_bytes, lock_refund_tx_bytes,
lock_refund_tx_id, prevout_script,
Kal,
prevout_n, prevout_value, feerate, vkbv):
def verifyLockRefundSpendTx(self, tx_bytes, lock_refund_tx_bytes,
lock_refund_tx_id, prevout_script,
Kal,
prevout_n, prevout_value, feerate, vkbv):
lock_refund_spend_tx_obj = self.rpc_callback('decoderawtransaction', [tx_bytes.hex()])
lock_refund_spend_txid_hex = lock_refund_spend_tx_obj['txid']
self._log.info('Verifying lock refund spend tx: {}.'.format(lock_refund_spend_txid_hex))
@@ -474,7 +460,7 @@ class PARTInterfaceBlind(PARTInterface):
ensure(output_n is not None, 'Output not found in tx')
return output_n
def createSCLockSpendTx(self, tx_lock_bytes: bytes, script_lock: bytes, pk_dest: bytes, tx_fee_rate: int, vkbv: bytes, fee_info={}) -> bytes:
def createScriptLockSpendTx(self, tx_lock_bytes, script_lock, pk_dest, tx_fee_rate, vkbv):
lock_tx_obj = self.rpc_callback('decoderawtransaction', [tx_lock_bytes.hex()])
lock_txid_hex = lock_tx_obj['txid']
@@ -498,9 +484,9 @@ class PARTInterfaceBlind(PARTInterface):
dummy_witness_stack = self.getScriptLockTxDummyWitness(script_lock)
# Use a junk change pubkey to avoid adding unused keys to the wallet
zero_change_key = self.getNewSecretKey()
zero_change_key = i2b(self.getNewSecretKey())
zero_change_pubkey = self.getPubkey(zero_change_key)
inputs_info = {'0': {'value': blinded_info['amount'], 'blind': blinded_info['blind'], 'witnessstack': [x.hex() for x in dummy_witness_stack]}}
inputs_info = {'0': {'value': blinded_info['amount'], 'blind': blinded_info['blind'], 'witnessstack': dummy_witness_stack}}
outputs_info = rv['amounts']
options = {
'changepubkey': zero_change_pubkey.hex(),
@@ -511,25 +497,18 @@ class PARTInterfaceBlind(PARTInterface):
rv = self.rpc_callback('fundrawtransactionfrom', ['blind', lock_spend_tx_hex, inputs_info, outputs_info, options])
lock_spend_tx_hex = rv['hex']
lock_spend_tx_obj = self.rpc_callback('decoderawtransaction', [lock_spend_tx_hex])
vsize = lock_spend_tx_obj['vsize']
pay_fee = make_int(lock_spend_tx_obj['vout'][0]['ct_fee'])
# lock_spend_tx_hex does not include the dummy witness stack
witness_bytes = self.getWitnessStackSerialisedLength(dummy_witness_stack)
vsize = self.getTxVSize(self.loadTx(bytes.fromhex(lock_spend_tx_hex)), add_witness_bytes=witness_bytes)
actual_tx_fee_rate = pay_fee * 1000 // vsize
self._log.info('createSCLockSpendTx %s:\n fee_rate, vsize, fee: %ld, %ld, %ld.',
self._log.info('createScriptLockSpendTx %s:\n fee_rate, vsize, fee: %ld, %ld, %ld.',
lock_spend_tx_obj['txid'], actual_tx_fee_rate, vsize, pay_fee)
fee_info['vsize'] = vsize
fee_info['fee_paid'] = pay_fee
fee_info['rate_input'] = tx_fee_rate
fee_info['rate_actual'] = actual_tx_fee_rate
return bytes.fromhex(lock_spend_tx_hex)
def verifySCLockSpendTx(self, tx_bytes,
lock_tx_bytes, lock_tx_script,
a_pk_f, feerate, vkbv):
def verifyLockSpendTx(self, tx_bytes,
lock_tx_bytes, lock_tx_script,
a_pk_f, feerate, vkbv):
lock_spend_tx_obj = self.rpc_callback('decoderawtransaction', [tx_bytes.hex()])
lock_spend_txid_hex = lock_spend_tx_obj['txid']
self._log.info('Verifying lock spend tx: {}.'.format(lock_spend_txid_hex))
@@ -599,7 +578,7 @@ class PARTInterfaceBlind(PARTInterface):
return True
def createSCLockRefundSpendToFTx(self, tx_lock_refund_bytes, script_lock_refund, pkh_dest, tx_fee_rate, vkbv):
def createScriptLockRefundSpendToFTx(self, tx_lock_refund_bytes, script_lock_refund, pkh_dest, tx_fee_rate, vkbv):
# lock refund swipe tx
# Sends the coinA locked coin to the follower
lock_refund_tx_obj = self.rpc_callback('decoderawtransaction', [tx_lock_refund_bytes.hex()])
@@ -627,10 +606,9 @@ class PARTInterfaceBlind(PARTInterface):
# Set dummy witness data for fee estimation
dummy_witness_stack = self.getScriptLockRefundSwipeTxDummyWitness(script_lock_refund)
dummy_witness_stack = [x.hex() for x in dummy_witness_stack]
# Use a junk change pubkey to avoid adding unused keys to the wallet
zero_change_key = self.getNewSecretKey()
zero_change_key = i2b(self.getNewSecretKey())
zero_change_pubkey = self.getPubkey(zero_change_key)
inputs_info = {'0': {'value': input_blinded_info['amount'], 'blind': input_blinded_info['blind'], 'witnessstack': dummy_witness_stack}}
outputs_info = rv['amounts']
@@ -645,150 +623,25 @@ class PARTInterfaceBlind(PARTInterface):
return bytes.fromhex(lock_refund_swipe_tx_hex)
def getSpendableBalance(self) -> int:
def getSpendableBalance(self):
return self.make_int(self.rpc_callback('getbalances')['mine']['blind_trusted'])
def publishBLockTx(self, vkbv: bytes, Kbs: bytes, output_amount: int, feerate: int, delay_for: int = 10, unlock_time: int = 0) -> bytes:
Kbv = self.getPubkey(vkbv)
sx_addr = self.formatStealthAddress(Kbv, Kbs)
self._log.debug('sx_addr: {}'.format(sx_addr))
# TODO: Fund from other balances
params = ['blind', 'blind',
[{'address': sx_addr, 'amount': self.format_amount(output_amount)}, ],
'', '', self._anon_tx_ring_size, 1, False,
{'conf_target': self._conf_target, 'blind_watchonly_visible': True}]
txid = self.rpc_callback('sendtypeto', params)
return bytes.fromhex(txid)
def findTxB(self, kbv, Kbs, cb_swap_value, cb_block_confirmed, restore_height: int, bid_sender: bool):
Kbv = self.getPubkey(kbv)
sx_addr = self.formatStealthAddress(Kbv, Kbs)
# Tx recipient must import the stealth address as watch only
if bid_sender:
cb_swap_value *= -1
else:
addr_info = self.rpc_callback('getaddressinfo', [sx_addr])
if not addr_info['iswatchonly']:
wif_prefix = self.chainparams_network()['key_prefix']
wif_scan_key = toWIF(wif_prefix, kbv)
self.rpc_callback('importstealthaddress', [wif_scan_key, Kbs.hex()])
self._log.info('Imported watch-only sx_addr: {}'.format(sx_addr))
self._log.info('Rescanning {} chain from height: {}'.format(self.coin_name(), restore_height))
self.rpc_callback('rescanblockchain', [restore_height])
params = [{'include_watchonly': True, 'search': sx_addr}]
txns = self.rpc_callback('filtertransactions', params)
if len(txns) == 1:
tx = txns[0]
assert (tx['outputs'][0]['stealth_address'] == sx_addr) # Should not be possible
ensure(tx['outputs'][0]['type'] == 'blind', 'Output is not anon')
if make_int(tx['outputs'][0]['amount']) == cb_swap_value:
height = 0
if tx['confirmations'] > 0:
chain_height = self.rpc_callback('getblockcount')
height = chain_height - (tx['confirmations'] - 1)
return {'txid': tx['txid'], 'amount': cb_swap_value, 'height': height}
else:
self._log.warning('Incorrect amount detected for coin b lock txn: {}'.format(tx['txid']))
return -1
return None
def spendBLockTx(self, chain_b_lock_txid: bytes, address_to: str, kbv: bytes, kbs: bytes, cb_swap_value: int, b_fee: int, restore_height: int, spend_actual_balance: bool = False) -> bytes:
Kbv = self.getPubkey(kbv)
Kbs = self.getPubkey(kbs)
sx_addr = self.formatStealthAddress(Kbv, Kbs)
addr_info = self.rpc_callback('getaddressinfo', [sx_addr])
if not addr_info['ismine']:
wif_prefix = self.chainparams_network()['key_prefix']
wif_scan_key = toWIF(wif_prefix, kbv)
wif_spend_key = toWIF(wif_prefix, kbs)
self.rpc_callback('importstealthaddress', [wif_scan_key, wif_spend_key])
self._log.info('Imported spend key for sx_addr: {}'.format(sx_addr))
self._log.info('Rescanning {} chain from height: {}'.format(self.coin_name(), restore_height))
self.rpc_callback('rescanblockchain', [restore_height])
# TODO: Remove workaround
# utxos = self.rpc_callback('listunspentblind', [1, 9999999, [sx_addr]])
utxos = []
all_utxos = self.rpc_callback('listunspentblind', [1, 9999999])
for utxo in all_utxos:
if utxo.get('stealth_address', '_') == sx_addr:
utxos.append(utxo)
if len(utxos) < 1:
raise TemporaryError('No spendable outputs')
elif len(utxos) > 1:
raise ValueError('Too many spendable outputs')
utxo = utxos[0]
utxo_sats = make_int(utxo['amount'])
if spend_actual_balance and utxo_sats != cb_swap_value:
self._log.warning('Spending actual balance {}, not swap value {}.'.format(utxo_sats, cb_swap_value))
cb_swap_value = utxo_sats
inputs = [{'tx': utxo['txid'], 'n': utxo['vout']}, ]
params = ['blind', 'blind',
[{'address': address_to, 'amount': self.format_amount(cb_swap_value), 'subfee': True}, ],
'', '', self._anon_tx_ring_size, 1, False,
{'conf_target': self._conf_target, 'inputs': inputs, 'show_fee': True}]
rv = self.rpc_callback('sendtypeto', params)
return bytes.fromhex(rv['txid'])
def findTxnByHash(self, txid_hex):
# txindex is enabled for Particl
try:
rv = self.rpc_callback('getrawtransaction', [txid_hex, True])
except Exception as ex:
self._log.debug('findTxnByHash getrawtransaction failed: {}'.format(txid_hex))
return None
if 'confirmations' in rv and rv['confirmations'] >= self.blocks_confirmed:
return {'txid': txid_hex, 'amount': 0, 'height': rv['height']}
return None
def createRawFundedTransaction(self, addr_to: str, amount: int, sub_fee: bool = False, lock_unspents: bool = True) -> str:
txn = self.rpc_callback('createrawtransaction', [[], {addr_to: self.format_amount(amount)}])
options = {
'lockUnspents': lock_unspents,
'conf_target': self._conf_target,
}
if sub_fee:
options['subtractFeeFromOutputs'] = [0,]
return self.rpc_callback('fundrawtransactionfrom', ['blind', txn, options])['hex']
class PARTInterfaceAnon(PARTInterface):
@staticmethod
def balance_type():
return BalanceTypes.ANON
@staticmethod
def xmr_swap_a_lock_spend_tx_vsize() -> int:
raise ValueError('Not possible')
@staticmethod
def xmr_swap_b_lock_spend_tx_vsize() -> int:
# TODO: Estimate with ringsize
return 1153
@staticmethod
def depth_spendable() -> int:
return 12
def coin_name(self) -> str:
def coin_name(self):
return super().coin_name() + ' Anon'
def publishBLockTx(self, kbv: bytes, Kbs: bytes, output_amount: int, feerate: int, delay_for: int = 10, unlock_time: int = 0) -> bytes:
Kbv = self.getPubkey(kbv)
def publishBLockTx(self, Kbv, Kbs, output_amount, feerate):
sx_addr = self.formatStealthAddress(Kbv, Kbs)
self._log.debug('sx_addr: {}'.format(sx_addr))
# TODO: Fund from other balances
params = ['anon', 'anon',
@@ -836,7 +689,7 @@ class PARTInterfaceAnon(PARTInterface):
return -1
return None
def spendBLockTx(self, chain_b_lock_txid: bytes, address_to: str, kbv: bytes, kbs: bytes, cb_swap_value: int, b_fee: int, restore_height: int, spend_actual_balance: bool = False) -> bytes:
def spendBLockTx(self, chain_b_lock_txid, address_to, kbv, kbs, cb_swap_value, b_fee, restore_height, spend_actual_balance=False):
Kbv = self.getPubkey(kbv)
Kbs = self.getPubkey(kbs)
sx_addr = self.formatStealthAddress(Kbv, Kbs)
@@ -872,7 +725,7 @@ class PARTInterfaceAnon(PARTInterface):
rv = self.rpc_callback('sendtypeto', params)
return bytes.fromhex(rv['txid'])
def findTxnByHash(self, txid_hex: str):
def findTxnByHash(self, txid_hex):
# txindex is enabled for Particl
try:
@@ -886,5 +739,5 @@ class PARTInterfaceAnon(PARTInterface):
return None
def getSpendableBalance(self) -> int:
def getSpendableBalance(self):
return self.make_int(self.rpc_callback('getbalances')['mine']['anon_trusted'])

View File

@@ -1,27 +1,16 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2022 tecnovert
# Copyright (c) 2020 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
from io import BytesIO
from .btc import BTCInterface
from basicswap.chainparams import Coins
from basicswap.util.address import decodeAddress
from .contrib.pivx_test_framework.messages import (
CBlock,
ToHex,
FromHex,
CTransaction)
from basicswap.contrib.test_framework.script import (
CScript,
OP_DUP,
OP_HASH160,
OP_CHECKSIG,
OP_EQUALVERIFY,
)
FromHex)
class PIVXInterface(BTCInterface):
@@ -29,28 +18,19 @@ class PIVXInterface(BTCInterface):
def coin_type():
return Coins.PIVX
def signTxWithWallet(self, tx):
rv = self.rpc_callback('signrawtransaction', [tx.hex()])
return bytes.fromhex(rv['hex'])
def createRawFundedTransaction(self, addr_to: str, amount: int, sub_fee: bool = False, lock_unspents: bool = True) -> str:
def createRawSignedTransaction(self, addr_to, amount):
txn = self.rpc_callback('createrawtransaction', [[], {addr_to: self.format_amount(amount)}])
fee_rate, fee_src = self.get_fee_rate(self._conf_target)
self._log.debug(f'Fee rate: {fee_rate}, source: {fee_src}, block target: {self._conf_target}')
options = {
'lockUnspents': lock_unspents,
'lockUnspents': True,
'feeRate': fee_rate,
}
if sub_fee:
options['subtractFeeFromOutputs'] = [0,]
return self.rpc_callback('fundrawtransaction', [txn, options])['hex']
def createRawSignedTransaction(self, addr_to, amount) -> str:
txn_funded = self.createRawFundedTransaction(addr_to, amount)
return self.rpc_callback('signrawtransaction', [txn_funded])['hex']
def decodeAddress(self, address):
return decodeAddress(address)[1:]
txn_funded = self.rpc_callback('fundrawtransaction', [txn, options])['hex']
txn_signed = self.rpc_callback('signrawtransaction', [txn_funded])['hex']
return txn_signed
def getBlockWithTxns(self, block_hash):
# TODO: Bypass decoderawtransaction and getblockheader
@@ -74,44 +54,3 @@ class PIVXInterface(BTCInterface):
}
return block_rv
def withdrawCoin(self, value, addr_to, subfee):
params = [addr_to, value, '', '', subfee]
return self.rpc_callback('sendtoaddress', params)
def getSpendableBalance(self) -> int:
return self.make_int(self.rpc_callback('getwalletinfo')['balance'])
def loadTx(self, tx_bytes):
# Load tx from bytes to internal representation
tx = CTransaction()
tx.deserialize(BytesIO(tx_bytes))
return tx
def getScriptForPubkeyHash(self, pkh: bytes) -> bytearray:
# Return P2PKH
return CScript([OP_DUP, OP_HASH160, pkh, OP_EQUALVERIFY, OP_CHECKSIG])
def getBLockSpendTxFee(self, tx, fee_rate: int) -> int:
add_bytes = 107
size = len(tx.serialize_with_witness()) + add_bytes
pay_fee = round(fee_rate * size / 1000)
self._log.info(f'BLockSpendTx fee_rate, size, fee: {fee_rate}, {size}, {pay_fee}.')
return pay_fee
def signTxWithKey(self, tx: bytes, key: bytes) -> bytes:
key_wif = self.encodeKey(key)
rv = self.rpc_callback('signrawtransaction', [tx.hex(), [], [key_wif, ]])
return bytes.fromhex(rv['hex'])
def findTxnByHash(self, txid_hex: str):
# Only works for wallet txns
try:
rv = self.rpc_callback('gettransaction', [txid_hex])
except Exception as ex:
self._log.debug('findTxnByHash getrawtransaction failed: {}'.format(txid_hex))
return None
if 'confirmations' in rv and rv['confirmations'] >= self.blocks_confirmed:
block_height = self.getBlockHeader(rv['blockhash'])['height']
return {'txid': txid_hex, 'amount': 0, 'height': block_height}
return None

View File

@@ -1,19 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2023 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
from .btc import BTCInterface
from basicswap.chainparams import Coins
class VEILInterface(BTCInterface):
@staticmethod
def coin_type():
return Coins.VEIL
@staticmethod
def txVersion() -> int:
return 2

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2020-2023 tecnovert
# Copyright (c) 2020-2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
@@ -24,27 +24,21 @@ from coincurve.dleag import (
verify_ed25519_point,
)
from basicswap.interface import (
Curves)
from basicswap.util import (
i2b,
dumpj,
ensure,
make_int,
TemporaryError)
from basicswap.rpc_xmr import (
make_xmr_rpc_func,
make_xmr_rpc2_func)
make_xmr_rpc2_func,
make_xmr_wallet_rpc_func)
from basicswap.util import (
b2i, b2h)
from basicswap.chainparams import XMR_COIN, CoinInterface, Coins
class XMRInterface(CoinInterface):
@staticmethod
def curve_type():
return Curves.ed25519
@staticmethod
def coin_type():
return Coins.XMR
@@ -69,31 +63,17 @@ class XMRInterface(CoinInterface):
def depth_spendable() -> int:
return 10
@staticmethod
def xmr_swap_a_lock_spend_tx_vsize() -> int:
raise ValueError('Not possible')
@staticmethod
def xmr_swap_b_lock_spend_tx_vsize() -> int:
# TODO: Estimate with ringsize
return 1507
def __init__(self, coin_settings, network, swap_client=None):
super().__init__(network)
daemon_login = None
if coin_settings.get('rpcuser', '') != '':
daemon_login = (coin_settings.get('rpcuser', ''), coin_settings.get('rpcpassword', ''))
self.rpc_cb = make_xmr_rpc_func(coin_settings['rpcport'], daemon_login, host=coin_settings.get('rpchost', '127.0.0.1'))
self.rpc_cb2 = make_xmr_rpc2_func(coin_settings['rpcport'], daemon_login, host=coin_settings.get('rpchost', '127.0.0.1')) # non-json endpoint
self.rpc_wallet_cb = make_xmr_rpc_func(coin_settings['walletrpcport'], coin_settings['walletrpcauth'], host=coin_settings.get('walletrpchost', '127.0.0.1'))
self.rpc_cb = make_xmr_rpc_func(coin_settings['rpcport'], host=coin_settings.get('rpchost', '127.0.0.1'))
self.rpc_cb2 = make_xmr_rpc2_func(coin_settings['rpcport'], host=coin_settings.get('rpchost', '127.0.0.1')) # non-json endpoint
self.rpc_wallet_cb = make_xmr_wallet_rpc_func(coin_settings['walletrpcport'], coin_settings['walletrpcauth'], host=coin_settings.get('walletrpchost', '127.0.0.1'))
self.blocks_confirmed = coin_settings['blocks_confirmed']
self._restore_height = coin_settings.get('restore_height', 0)
self.setFeePriority(coin_settings.get('fee_priority', 0))
self._sc = swap_client
self._log = self._sc.log if self._sc and self._sc.log else logging
self._wallet_password = None
self._have_checked_seed = False
def setFeePriority(self, new_priority):
ensure(new_priority >= 0 and new_priority < 4, 'Invalid fee_priority value')
@@ -102,28 +82,10 @@ class XMRInterface(CoinInterface):
def setWalletFilename(self, wallet_filename):
self._wallet_filename = wallet_filename
def createWallet(self, params):
if self._wallet_password is not None:
params['password'] = self._wallet_password
rv = self.rpc_wallet_cb('generate_from_keys', params)
self._log.info('generate_from_keys %s', dumpj(rv))
def openWallet(self, filename):
params = {'filename': filename}
if self._wallet_password is not None:
params['password'] = self._wallet_password
try:
# Can't reopen the same wallet in windows, !is_keys_file_locked()
self.rpc_wallet_cb('close_wallet')
except Exception:
pass
self.rpc_wallet_cb('open_wallet', params)
def initialiseWallet(self, key_view, key_spend, restore_height=None):
with self._mx_wallet:
try:
self.openWallet(self._wallet_filename)
self.rpc_wallet_cb('open_wallet', {'filename': self._wallet_filename})
# TODO: Check address
return # Wallet exists
except Exception as e:
@@ -140,12 +102,13 @@ class XMRInterface(CoinInterface):
'spendkey': b2h(key_spend[::-1]),
'restore_height': self._restore_height,
}
self.createWallet(params)
self.openWallet(self._wallet_filename)
rv = self.rpc_wallet_cb('generate_from_keys', params)
self._log.info('generate_from_keys %s', dumpj(rv))
self.rpc_wallet_cb('open_wallet', {'filename': self._wallet_filename})
def ensureWalletExists(self) -> None:
def ensureWalletExists(self):
with self._mx_wallet:
self.openWallet(self._wallet_filename)
self.rpc_wallet_cb('open_wallet', {'filename': self._wallet_filename})
def testDaemonRPC(self, with_wallet=True):
self.rpc_wallet_cb('get_languages')
@@ -186,54 +149,41 @@ class XMRInterface(CoinInterface):
def getWalletInfo(self):
with self._mx_wallet:
try:
self.openWallet(self._wallet_filename)
except Exception as e:
if 'Failed to open wallet' in str(e):
rv = {'encrypted': True, 'locked': True, 'balance': 0, 'unconfirmed_balance': 0}
return rv
raise e
self.rpc_wallet_cb('open_wallet', {'filename': self._wallet_filename})
rv = {}
self.rpc_wallet_cb('refresh')
balance_info = self.rpc_wallet_cb('get_balance')
rv['balance'] = self.format_amount(balance_info['unlocked_balance'])
rv['unconfirmed_balance'] = self.format_amount(balance_info['balance'] - balance_info['unlocked_balance'])
rv['encrypted'] = False if self._wallet_password is None else True
rv['locked'] = False
return rv
def walletRestoreHeight(self):
return self._restore_height
def getMainWalletAddress(self) -> str:
def getMainWalletAddress(self):
with self._mx_wallet:
self.openWallet(self._wallet_filename)
self.rpc_wallet_cb('open_wallet', {'filename': self._wallet_filename})
return self.rpc_wallet_cb('get_address')['address']
def getNewAddress(self, placeholder) -> str:
def getNewAddress(self, placeholder):
with self._mx_wallet:
self.openWallet(self._wallet_filename)
self.rpc_wallet_cb('open_wallet', {'filename': self._wallet_filename})
return self.rpc_wallet_cb('create_address', {'account_index': 0})['address']
def get_fee_rate(self, conf_target: int = 2):
def get_fee_rate(self, conf_target=2):
self._log.warning('TODO - estimate fee rate?')
return 0.0, 'unused'
def getNewSecretKey(self) -> bytes:
# Note: Returned bytes are in big endian order
return i2b(edu.get_secret())
def getNewSecretKey(self):
return edu.get_secret()
def pubkey(self, key: bytes) -> bytes:
def pubkey(self, key):
return edf.scalarmult_B(key)
def encodeKey(self, vk: bytes) -> str:
return vk[::-1].hex()
def encodeKey(self, vk):
return vk.hex()
def decodeKey(self, k_hex: str) -> bytes:
return bytes.fromhex(k_hex)[::-1]
def encodePubkey(self, pk: bytes) -> str:
def encodePubkey(self, pk):
return edu.encodepoint(pk)
def decodePubkey(self, pke):
@@ -242,12 +192,12 @@ class XMRInterface(CoinInterface):
def getPubkey(self, privkey):
return ed25519_get_pubkey(privkey)
def getAddressFromKeys(self, key_view: bytes, key_spend: bytes) -> str:
def getAddressFromKeys(self, key_view, key_spend):
pk_view = self.getPubkey(key_view)
pk_spend = self.getPubkey(key_spend)
return xmr_util.encode_address(pk_view, pk_spend)
def verifyKey(self, k: int) -> bool:
def verifyKey(self, k):
i = b2i(k)
return (i < edf.l and i > 8)
@@ -256,34 +206,35 @@ class XMRInterface(CoinInterface):
# Checks for small order
return verify_ed25519_point(pubkey_bytes)
def proveDLEAG(self, key: bytes) -> bytes:
def proveDLEAG(self, key):
privkey = PrivateKey(key)
return dleag_prove(privkey)
def verifyDLEAG(self, dleag_bytes: bytes) -> bool:
def verifyDLEAG(self, dleag_bytes):
return dleag_verify(dleag_bytes)
def lengthDLEAG(self) -> int:
def lengthDLEAG(self):
return dleag_proof_len()
def sumKeys(self, ka: bytes, kb: bytes) -> bytes:
def decodeKey(self, k_hex):
return bytes.fromhex(k_hex)
def sumKeys(self, ka, kb):
return ed25519_scalar_add(ka, kb)
def sumPubkeys(self, Ka: bytes, Kb: bytes) -> bytes:
def sumPubkeys(self, Ka, Kb):
return ed25519_add(Ka, Kb)
def encodeSharedAddress(self, Kbv: bytes, Kbs: bytes) -> str:
def encodeSharedAddress(self, Kbv, Kbs):
return xmr_util.encode_address(Kbv, Kbs)
def publishBLockTx(self, kbv: bytes, Kbs: bytes, output_amount: int, feerate: int, delay_for: int = 10, unlock_time: int = 0) -> bytes:
def publishBLockTx(self, Kbv, Kbs, output_amount, feerate, delay_for=10):
with self._mx_wallet:
self.openWallet(self._wallet_filename)
self.rpc_wallet_cb('refresh')
self.rpc_wallet_cb('open_wallet', {'filename': self._wallet_filename})
Kbv = self.getPubkey(kbv)
shared_addr = xmr_util.encode_address(Kbv, Kbs)
params = {'destinations': [{'amount': output_amount, 'address': shared_addr}], 'unlock_time': unlock_time}
params = {'destinations': [{'amount': output_amount, 'address': shared_addr}]}
if self._fee_priority > 0:
params['priority'] = self._fee_priority
rv = self.rpc_wallet_cb('transfer', params)
@@ -293,8 +244,8 @@ class XMRInterface(CoinInterface):
if self._sc.debug:
i = 0
while not self._sc.delay_event.is_set():
gt_params = {'out': True, 'pending': True, 'failed': True, 'pool': True, }
rv = self.rpc_wallet_cb('get_transfers', gt_params)
params = {'out': True, 'pending': True, 'failed': True, 'pool': True, }
rv = self.rpc_wallet_cb('get_transfers', params)
self._log.debug('get_transfers {}'.format(dumpj(rv)))
if 'pending' not in rv:
break
@@ -309,6 +260,11 @@ class XMRInterface(CoinInterface):
Kbv = self.getPubkey(kbv)
address_b58 = xmr_util.encode_address(Kbv, Kbs)
try:
self.rpc_wallet_cb('close_wallet')
except Exception as e:
self._log.warning('close_wallet failed %s', str(e))
kbv_le = kbv[::-1]
params = {
'restore_height': restore_height,
@@ -318,10 +274,11 @@ class XMRInterface(CoinInterface):
}
try:
self.openWallet(address_b58)
rv = self.rpc_wallet_cb('open_wallet', {'filename': address_b58})
except Exception as e:
self.createWallet(params)
self.openWallet(address_b58)
rv = self.rpc_wallet_cb('generate_from_keys', params)
self._log.info('generate_from_keys %s', dumpj(rv))
rv = self.rpc_wallet_cb('open_wallet', {'filename': address_b58})
self.rpc_wallet_cb('refresh', timeout=600)
@@ -336,29 +293,82 @@ class XMRInterface(CoinInterface):
# and (current_height is None or current_height - transfer['block_height'] > cb_block_confirmed):
'''
params = {'transfer_type': 'available'}
transfers = self.rpc_wallet_cb('incoming_transfers', params)
rv = None
if 'transfers' in transfers:
for transfer in transfers['transfers']:
# unlocked <- wallet->is_transfer_unlocked() checks unlock_time and CRYPTONOTE_DEFAULT_TX_SPENDABLE_AGE
if not transfer['unlocked']:
full_tx = self.rpc_wallet_cb('get_transfer_by_txid', {'txid': transfer['tx_hash']})
unlock_time = full_tx['transfer']['unlock_time']
if unlock_time != 0:
self._log.warning('Coin b lock txn is locked: {}, unlock_time {}'.format(transfer['tx_hash'], unlock_time))
rv = -1
continue
rv = self.rpc_wallet_cb('incoming_transfers', params)
if 'transfers' in rv:
for transfer in rv['transfers']:
if transfer['amount'] == cb_swap_value:
return {'txid': transfer['tx_hash'], 'amount': transfer['amount'], 'height': 0 if 'block_height' not in transfer else transfer['block_height']}
else:
self._log.warning('Incorrect amount detected for coin b lock txn: {}'.format(transfer['tx_hash']))
rv = -1
return rv
return -1
return None
def waitForLockTxB(self, kbv, Kbs, cb_swap_value, cb_block_confirmed, restore_height):
with self._mx_wallet:
Kbv_enc = self.encodePubkey(self.pubkey(kbv))
address_b58 = xmr_util.encode_address(Kbv_enc, self.encodePubkey(Kbs))
try:
self.rpc_wallet_cb('close_wallet')
except Exception as e:
self._log.warning('close_wallet failed %s', str(e))
params = {
'filename': address_b58,
'address': address_b58,
'viewkey': b2h(kbv[::-1]),
'restore_height': restore_height,
}
self.rpc_wallet_cb('generate_from_keys', params)
self.rpc_wallet_cb('open_wallet', {'filename': address_b58})
# For a while after opening the wallet rpc cmds return empty data
num_tries = 40
for i in range(num_tries + 1):
try:
current_height = self.rpc_cb2('get_height')['height']
print('current_height', current_height)
except Exception as e:
self._log.warning('rpc_cb failed %s', str(e))
current_height = None # If the transfer is available it will be deep enough
# TODO: Make accepting current_height == None a user selectable option
# Or look for all transfers and check height
params = {'transfer_type': 'available'}
rv = self.rpc_wallet_cb('incoming_transfers', params)
print('rv', rv)
if 'transfers' in rv:
for transfer in rv['transfers']:
if transfer['amount'] == cb_swap_value \
and (current_height is None or current_height - transfer['block_height'] > cb_block_confirmed):
return True
# TODO: Is it necessary to check the address?
'''
rv = self.rpc_wallet_cb('get_balance')
print('get_balance', rv)
if 'per_subaddress' in rv:
for sub_addr in rv['per_subaddress']:
if sub_addr['address'] == address_b58:
'''
if i >= num_tries:
raise ValueError('Balance not confirming on node')
self._sc.delay_event.wait(1.0)
if self._sc.delay_event.is_set():
raise ValueError('Stopped')
return False
def findTxnByHash(self, txid):
with self._mx_wallet:
self.openWallet(self._wallet_filename)
self.rpc_wallet_cb('refresh', timeout=600)
self.rpc_wallet_cb('open_wallet', {'filename': self._wallet_filename})
self.rpc_wallet_cb('refresh')
try:
current_height = self.rpc_cb2('get_height', timeout=30)['height']
@@ -377,16 +387,17 @@ class XMRInterface(CoinInterface):
return None
def spendBLockTx(self, chain_b_lock_txid: bytes, address_to: str, kbv: bytes, kbs: bytes, cb_swap_value: int, b_fee_rate: int, restore_height: int, spend_actual_balance: bool = False) -> bytes:
'''
Notes:
"Error: No unlocked balance in the specified subaddress(es)" can mean not enough funds after tx fee.
'''
def spendBLockTx(self, chain_b_lock_txid, address_to, kbv, kbs, cb_swap_value, b_fee_rate, restore_height, spend_actual_balance=False):
with self._mx_wallet:
Kbv = self.getPubkey(kbv)
Kbs = self.getPubkey(kbs)
address_b58 = xmr_util.encode_address(Kbv, Kbs)
try:
self.rpc_wallet_cb('close_wallet')
except Exception as e:
self._log.warning('close_wallet failed %s', str(e))
wallet_filename = address_b58 + '_spend'
params = {
@@ -398,13 +409,15 @@ class XMRInterface(CoinInterface):
}
try:
self.openWallet(wallet_filename)
self.rpc_wallet_cb('open_wallet', {'filename': wallet_filename})
except Exception as e:
self.createWallet(params)
self.openWallet(wallet_filename)
rv = self.rpc_wallet_cb('generate_from_keys', params)
self._log.info('generate_from_keys %s', dumpj(rv))
self.rpc_wallet_cb('open_wallet', {'filename': wallet_filename})
self.rpc_wallet_cb('refresh')
rv = self.rpc_wallet_cb('get_balance')
if rv['balance'] < cb_swap_value:
self._log.warning('Balance is too low, checking for existing spend.')
txns = self.rpc_wallet_cb('get_transfers', {'out': True})
@@ -437,17 +450,15 @@ class XMRInterface(CoinInterface):
return bytes.fromhex(rv['tx_hash_list'][0])
def withdrawCoin(self, value: int, addr_to: str, subfee: bool) -> str:
def withdrawCoin(self, value, addr_to, subfee):
with self._mx_wallet:
value_sats = make_int(value, self.exp())
self.openWallet(self._wallet_filename)
self.rpc_wallet_cb('refresh')
self.rpc_wallet_cb('open_wallet', {'filename': self._wallet_filename})
if subfee:
balance = self.rpc_wallet_cb('get_balance')
diff = balance['unlocked_balance'] - value_sats
if diff >= 0 and diff <= 10:
if balance['unlocked_balance'] - value_sats <= 10:
self._log.info('subfee enabled and value close to total, using sweep_all.')
params = {'address': addr_to}
if self._fee_priority > 0:
@@ -462,29 +473,16 @@ class XMRInterface(CoinInterface):
rv = self.rpc_wallet_cb('transfer', params)
return rv['tx_hash']
def showLockTransfers(self, kbv, Kbs, restore_height):
def showLockTransfers(self, Kbv, Kbs):
with self._mx_wallet:
try:
Kbv = self.getPubkey(kbv)
address_b58 = xmr_util.encode_address(Kbv, Kbs)
wallet_file = address_b58 + '_spend'
try:
self.openWallet(wallet_file)
self.rpc_wallet_cb('open_wallet', {'filename': wallet_file})
except Exception:
wallet_file = address_b58
try:
self.openWallet(wallet_file)
except Exception:
self._log.info(f'showLockTransfers trying to create wallet for address {address_b58}.')
kbv_le = kbv[::-1]
params = {
'restore_height': restore_height,
'filename': address_b58,
'address': address_b58,
'viewkey': b2h(kbv_le),
}
self.createWallet(params)
self.openWallet(address_b58)
self.rpc_wallet_cb('open_wallet', {'filename': wallet_file})
self.rpc_wallet_cb('refresh')
@@ -494,44 +492,10 @@ class XMRInterface(CoinInterface):
except Exception as e:
return {'error': str(e)}
def getSpendableBalance(self) -> int:
def getSpendableBalance(self):
with self._mx_wallet:
self.openWallet(self._wallet_filename)
self.rpc_wallet_cb('open_wallet', {'filename': self._wallet_filename})
self.rpc_wallet_cb('refresh')
balance_info = self.rpc_wallet_cb('get_balance')
return balance_info['unlocked_balance']
def changeWalletPassword(self, old_password, new_password):
self._log.info('changeWalletPassword - {}'.format(self.ticker()))
orig_password = self._wallet_password
if old_password != '':
self._wallet_password = old_password
try:
self.openWallet(self._wallet_filename)
self.rpc_wallet_cb('change_wallet_password', {'old_password': old_password, 'new_password': new_password})
except Exception as e:
self._wallet_password = orig_password
raise e
def unlockWallet(self, password: str) -> None:
self._log.info('unlockWallet - {}'.format(self.ticker()))
self._wallet_password = password
if not self._have_checked_seed:
self._sc.checkWalletSeed(self.coin_type())
def lockWallet(self) -> None:
self._log.info('lockWallet - {}'.format(self.ticker()))
self._wallet_password = None
def isAddressMine(self, address):
# TODO
return True
def ensureFunds(self, amount: int) -> None:
if self.getSpendableBalance() < amount:
raise ValueError('Balance too low')
def getTransaction(self, txid: bytes):
return self.rpc_cb2('get_transactions', {'txs_hashes': [txid.hex(), ]})

View File

@@ -1,21 +1,18 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2020-2023 tecnovert
# Copyright (c) 2020-2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
import json
import random
import urllib.parse
from .util import (
ensure,
toBool,
)
from .basicswap_util import (
strBidState,
SwapTypes,
NotificationTypes as NT,
)
from .chainparams import (
Coins,
@@ -23,7 +20,6 @@ from .chainparams import (
)
from .ui.util import (
PAGE_LIMIT,
getCoinName,
getCoinType,
inputAmount,
describeBid,
@@ -33,25 +29,22 @@ from .ui.util import (
have_data_entry,
tickerToCoinId,
listOldBidStates,
checkAddressesOwned,
)
from .ui.page_offers import postNewOffer
from .protocols.xmr_swap_1 import recoverNoScriptTxnWithKey, getChainBSplitKey
def getFormData(post_string: str, is_json: bool):
if post_string == '':
raise ValueError('No post data')
if is_json:
form_data = json.loads(post_string)
form_data['is_json'] = True
else:
form_data = urllib.parse.parse_qs(post_string)
return form_data
def js_error(self, error_str):
error_str_json = json.dumps({'error': error_str})
return bytes(error_str_json, 'UTF-8')
def withdraw_coin(swap_client, coin_type, post_string, is_json):
post_data = getFormData(post_string, is_json)
if is_json:
post_data = json.loads(post_string)
post_data['is_json'] = True
else:
post_data = urllib.parse.parse_qs(post_string)
value = get_data_entry(post_data, 'value')
address = get_data_entry(post_data, 'address')
@@ -69,24 +62,17 @@ def withdraw_coin(swap_client, coin_type, post_string, is_json):
return {'txid': txid_hex}
def js_error(self, error_str) -> bytes:
error_str_json = json.dumps({'error': error_str})
return bytes(error_str_json, 'UTF-8')
def js_coins(self, url_split, post_string, is_json) -> bytes:
def js_coins(self, url_split, post_string, is_json):
swap_client = self.server.swap_client
coins = []
for coin in Coins:
cc = swap_client.coin_clients[coin]
coin_chainparams = chainparams[cc['coin']]
entry = {
'id': int(coin),
'ticker': coin_chainparams['ticker'],
'name': getCoinName(coin),
'ticker': chainparams[cc['coin']]['ticker'],
'name': cc['name'].capitalize(),
'active': False if cc['connection_type'] == 'none' else True,
'decimal_places': coin_chainparams['decimal_places'],
}
if coin == Coins.PART_ANON:
entry['variant'] = 'Anon'
@@ -99,7 +85,6 @@ def js_coins(self, url_split, post_string, is_json) -> bytes:
def js_wallets(self, url_split, post_string, is_json):
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
if len(url_split) > 3:
ticker_str = url_split[3]
coin_type = tickerToCoinId(ticker_str)
@@ -110,39 +95,31 @@ def js_wallets(self, url_split, post_string, is_json):
return bytes(json.dumps(withdraw_coin(swap_client, coin_type, post_string, is_json)), 'UTF-8')
if cmd == 'nextdepositaddr':
return bytes(json.dumps(swap_client.cacheNewAddressForCoin(coin_type)), 'UTF-8')
if cmd == 'createutxo':
post_data = getFormData(post_string, is_json)
ci = swap_client.ci(coin_type)
value = ci.make_int(get_data_entry(post_data, 'value'))
txid_hex, new_addr = ci.createUTXO(value)
return bytes(json.dumps({'txid': txid_hex, 'address': new_addr}), 'UTF-8')
if cmd == 'reseed':
swap_client.reseedWallet(coin_type)
return bytes(json.dumps({'reseeded': True}), 'UTF-8')
raise ValueError('Unknown command')
rv = swap_client.getWalletInfo(coin_type)
rv.update(swap_client.getBlockchainInfo(coin_type))
ci = swap_client.ci(coin_type)
checkAddressesOwned(swap_client, ci, rv)
return bytes(json.dumps(rv), 'UTF-8')
return bytes(json.dumps(swap_client.getWalletsInfo({'ticker_key': True})), 'UTF-8')
return bytes(json.dumps(self.server.swap_client.getWalletsInfo({'ticker_key': True})), 'UTF-8')
def js_offers(self, url_split, post_string, is_json, sent=False) -> bytes:
def js_offers(self, url_split, post_string, is_json, sent=False):
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
offer_id = None
if len(url_split) > 3:
if url_split[3] == 'new':
form_data = getFormData(post_string, is_json)
if post_string == '':
raise ValueError('No post data')
if is_json:
form_data = json.loads(post_string)
form_data['is_json'] = True
else:
form_data = urllib.parse.parse_qs(post_string)
offer_id = postNewOffer(swap_client, form_data)
rv = {'offer_id': offer_id.hex()}
return bytes(json.dumps(rv), 'UTF-8')
offer_id = bytes.fromhex(url_split[3])
with_extra_info = False
filters = {
'coin_from': -1,
'coin_to': -1,
@@ -156,7 +133,11 @@ def js_offers(self, url_split, post_string, is_json, sent=False) -> bytes:
filters['offer_id'] = offer_id
if post_string != '':
post_data = getFormData(post_string, is_json)
if is_json:
post_data = json.loads(post_string)
post_data['is_json'] = True
else:
post_data = urllib.parse.parse_qs(post_string)
filters['coin_from'] = setCoinFilter(post_data, 'coin_from')
filters['coin_to'] = setCoinFilter(post_data, 'coin_to')
@@ -169,26 +150,18 @@ def js_offers(self, url_split, post_string, is_json, sent=False) -> bytes:
assert (sort_dir in ['asc', 'desc']), 'Invalid sort dir'
filters['sort_dir'] = sort_dir
if have_data_entry(post_data, 'offset'):
if b'offset' in post_data:
filters['offset'] = int(get_data_entry(post_data, 'offset'))
if have_data_entry(post_data, 'limit'):
if b'limit' in post_data:
filters['limit'] = int(get_data_entry(post_data, 'limit'))
assert (filters['limit'] > 0 and filters['limit'] <= PAGE_LIMIT), 'Invalid limit'
if have_data_entry(post_data, 'active'):
filters['active'] = get_data_entry(post_data, 'active')
if have_data_entry(post_data, 'include_sent'):
filters['include_sent'] = toBool(get_data_entry(post_data, 'include_sent'))
if have_data_entry(post_data, 'with_extra_info'):
with_extra_info = toBool(get_data_entry(post_data, 'with_extra_info'))
offers = swap_client.listOffers(sent, filters)
offers = self.server.swap_client.listOffers(sent, filters)
rv = []
for o in offers:
ci_from = swap_client.ci(o.coin_from)
ci_to = swap_client.ci(o.coin_to)
offer_data = {
'swap_type': o.swap_type,
ci_from = self.server.swap_client.ci(o.coin_from)
ci_to = self.server.swap_client.ci(o.coin_to)
rv.append({
'addr_from': o.addr_from,
'addr_to': o.addr_to,
'offer_id': o.offer_id.hex(),
@@ -199,90 +172,26 @@ def js_offers(self, url_split, post_string, is_json, sent=False) -> bytes:
'amount_from': ci_from.format_amount(o.amount_from),
'amount_to': ci_to.format_amount((o.amount_from * o.rate) // ci_from.COIN()),
'rate': ci_to.format_amount(o.rate),
}
if with_extra_info:
offer_data['amount_negotiable'] = o.amount_negotiable
offer_data['rate_negotiable'] = o.rate_negotiable
})
if o.swap_type == SwapTypes.XMR_SWAP:
_, xmr_offer = swap_client.getXmrOffer(o.offer_id)
offer_data['lock_time_1'] = xmr_offer.lock_time_1
offer_data['lock_time_2'] = xmr_offer.lock_time_2
offer_data['feerate_from'] = xmr_offer.a_fee_rate
offer_data['feerate_to'] = xmr_offer.b_fee_rate
else:
offer_data['feerate_from'] = o.from_feerate
offer_data['feerate_to'] = o.to_feerate
rv.append(offer_data)
return bytes(json.dumps(rv), 'UTF-8')
def js_sentoffers(self, url_split, post_string, is_json) -> bytes:
return js_offers(self, url_split, post_string, is_json, True)
def js_sentoffers(self, url_split, post_string, is_json):
return self.js_offers(url_split, post_string, is_json, True)
def parseBidFilters(post_data):
offer_id = None
filters = {}
if have_data_entry(post_data, 'offer_id'):
offer_id = bytes.fromhex(get_data_entry(post_data, 'offer_id'))
assert (len(offer_id) == 28)
if have_data_entry(post_data, 'sort_by'):
sort_by = get_data_entry(post_data, 'sort_by')
assert (sort_by in ['created_at', ]), 'Invalid sort by'
filters['sort_by'] = sort_by
if have_data_entry(post_data, 'sort_dir'):
sort_dir = get_data_entry(post_data, 'sort_dir')
assert (sort_dir in ['asc', 'desc']), 'Invalid sort dir'
filters['sort_dir'] = sort_dir
if have_data_entry(post_data, 'offset'):
filters['offset'] = int(get_data_entry(post_data, 'offset'))
if have_data_entry(post_data, 'limit'):
filters['limit'] = int(get_data_entry(post_data, 'limit'))
assert (filters['limit'] > 0 and filters['limit'] <= PAGE_LIMIT), 'Invalid limit'
if have_data_entry(post_data, 'with_available_or_active'):
filters['with_available_or_active'] = toBool(get_data_entry(post_data, 'with_available_or_active'))
elif have_data_entry(post_data, 'with_expired'):
filters['with_expired'] = toBool(get_data_entry(post_data, 'with_expired'))
if have_data_entry(post_data, 'with_extra_info'):
filters['with_extra_info'] = toBool(get_data_entry(post_data, 'with_extra_info'))
return offer_id, filters
def formatBids(swap_client, bids, filters) -> bytes:
with_extra_info = filters.get('with_extra_info', False)
rv = []
for b in bids:
bid_data = {
'bid_id': b[2].hex(),
'offer_id': b[3].hex(),
'created_at': b[0],
'expire_at': b[1],
'coin_from': b[9],
'amount_from': swap_client.ci(b[9]).format_amount(b[4]),
'bid_rate': swap_client.ci(b[14]).format_amount(b[10]),
'bid_state': strBidState(b[5])
}
if with_extra_info:
bid_data['addr_from'] = b[11]
rv.append(bid_data)
return bytes(json.dumps(rv), 'UTF-8')
def js_bids(self, url_split, post_string: str, is_json: bool) -> bytes:
def js_bids(self, url_split, post_string, is_json):
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
if len(url_split) > 3:
if url_split[3] == 'new':
post_data = getFormData(post_string, is_json)
if post_string == '':
raise ValueError('No post data')
if is_json:
post_data = json.loads(post_string)
post_data['is_json'] = True
else:
post_data = urllib.parse.parse_qs(post_string)
offer_id = bytes.fromhex(get_data_entry(post_data, 'offer_id'))
assert (len(offer_id) == 28)
@@ -329,19 +238,17 @@ def js_bids(self, url_split, post_string: str, is_json: bool) -> bytes:
bid_id = bytes.fromhex(url_split[3])
assert (len(bid_id) == 28)
show_txns = False
if post_string != '':
post_data = getFormData(post_string, is_json)
if is_json:
post_data = json.loads(post_string)
post_data['is_json'] = True
else:
post_data = urllib.parse.parse_qs(post_string)
if have_data_entry(post_data, 'accept'):
swap_client.acceptBid(bid_id)
elif have_data_entry(post_data, 'abandon'):
swap_client.abandonBid(bid_id)
elif have_data_entry(post_data, 'debugind'):
swap_client.setBidDebugInd(bid_id, int(get_data_entry(post_data, 'debugind')))
if have_data_entry(post_data, 'show_extra'):
show_txns = True
bid, xmr_swap, offer, xmr_offer, events = swap_client.getXmrBidAndOffer(bid_id)
assert (bid), 'Unknown bid ID'
@@ -357,46 +264,47 @@ def js_bids(self, url_split, post_string: str, is_json: bool) -> bytes:
return bytes(json.dumps(old_states), 'UTF-8')
edit_bid = False
show_txns = False
data = describeBid(swap_client, bid, xmr_swap, offer, xmr_offer, events, edit_bid, show_txns, for_api=True)
return bytes(json.dumps(data), 'UTF-8')
post_data = {} if post_string == '' else getFormData(post_string, is_json)
offer_id, filters = parseBidFilters(post_data)
bids = swap_client.listBids(offer_id=offer_id, filters=filters)
return formatBids(swap_client, bids, filters)
bids = swap_client.listBids()
return bytes(json.dumps([{
'bid_id': b[2].hex(),
'offer_id': b[3].hex(),
'created_at': b[0],
'expire_at': b[1],
'coin_from': b[9],
'amount_from': swap_client.ci(b[9]).format_amount(b[4]),
'bid_state': strBidState(b[5])
} for b in bids]), 'UTF-8')
def js_sentbids(self, url_split, post_string, is_json) -> bytes:
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
post_data = getFormData(post_string, is_json)
offer_id, filters = parseBidFilters(post_data)
bids = swap_client.listBids(sent=True, offer_id=offer_id, filters=filters)
return formatBids(swap_client, bids, filters)
def js_sentbids(self, url_split, post_string, is_json):
return bytes(json.dumps(self.server.swap_client.listBids(sent=True)), 'UTF-8')
def js_network(self, url_split, post_string, is_json) -> bytes:
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
return bytes(json.dumps(swap_client.get_network_info()), 'UTF-8')
def js_network(self, url_split, post_string, is_json):
return bytes(json.dumps(self.server.swap_client.get_network_info()), 'UTF-8')
def js_revokeoffer(self, url_split, post_string, is_json) -> bytes:
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
def js_revokeoffer(self, url_split, post_string, is_json):
offer_id = bytes.fromhex(url_split[3])
assert (len(offer_id) == 28)
swap_client.revokeOffer(offer_id)
self.server.swap_client.revokeOffer(offer_id)
return bytes(json.dumps({'revoked_offer': offer_id.hex()}), 'UTF-8')
def js_smsgaddresses(self, url_split, post_string, is_json) -> bytes:
def js_smsgaddresses(self, url_split, post_string, is_json):
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
post_data = {} if post_string == '' else getFormData(post_string, is_json)
if len(url_split) > 3:
if post_string == '':
raise ValueError('No post data')
if is_json:
post_data = json.loads(post_string)
post_data['is_json'] = True
else:
post_data = urllib.parse.parse_qs(post_string)
if url_split[3] == 'new':
addressnote = get_data_entry_or(post_data, 'addressnote', '')
new_addr, pubkey = swap_client.newSMSGAddress(addressnote=addressnote)
@@ -413,15 +321,17 @@ def js_smsgaddresses(self, url_split, post_string, is_json) -> bytes:
new_addr = swap_client.editSMSGAddress(address, activeind, addressnote)
return bytes(json.dumps({'edited_address': address}), 'UTF-8')
filters = {
'exclude_inactive': post_data.get('exclude_inactive', True),
}
return bytes(json.dumps(swap_client.listAllSMSGAddresses(filters)), 'UTF-8')
return bytes(json.dumps(swap_client.listAllSMSGAddresses()), 'UTF-8')
def js_rates(self, url_split, post_string, is_json) -> bytes:
post_data = getFormData(post_string, is_json)
def js_rates(self, url_split, post_string, is_json):
if post_string == '':
raise ValueError('No post data')
if is_json:
post_data = json.loads(post_string)
post_data['is_json'] = True
else:
post_data = urllib.parse.parse_qs(post_string)
sc = self.server.swap_client
coin_from = get_data_entry(post_data, 'coin_from')
@@ -429,7 +339,7 @@ def js_rates(self, url_split, post_string, is_json) -> bytes:
return bytes(json.dumps(sc.lookupRates(coin_from, coin_to)), 'UTF-8')
def js_rates_list(self, url_split, query_string, is_json) -> bytes:
def js_rates_list(self, url_split, query_string, is_json):
get_data = urllib.parse.parse_qs(query_string)
sc = self.server.swap_client
@@ -438,8 +348,14 @@ def js_rates_list(self, url_split, query_string, is_json) -> bytes:
return bytes(json.dumps(sc.lookupRates(coin_from, coin_to, True)), 'UTF-8')
def js_rate(self, url_split, post_string, is_json) -> bytes:
post_data = getFormData(post_string, is_json)
def js_rate(self, url_split, post_string, is_json):
if post_string == '':
raise ValueError('No post data')
if is_json:
post_data = json.loads(post_string)
post_data['is_json'] = True
else:
post_data = urllib.parse.parse_qs(post_string)
sc = self.server.swap_client
coin_from = getCoinType(get_data_entry(post_data, 'coin_from'))
@@ -471,263 +387,5 @@ def js_rate(self, url_split, post_string, is_json) -> bytes:
return bytes(json.dumps({'rate': rate}), 'UTF-8')
def js_index(self, url_split, post_string, is_json) -> bytes:
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
return bytes(json.dumps(swap_client.getSummary()), 'UTF-8')
def js_generatenotification(self, url_split, post_string, is_json) -> bytes:
swap_client = self.server.swap_client
if not swap_client.debug:
raise ValueError('Debug mode not active.')
r = random.randint(0, 3)
if r == 0:
swap_client.notify(NT.OFFER_RECEIVED, {'offer_id': random.randbytes(28).hex()})
elif r == 1:
swap_client.notify(NT.BID_RECEIVED, {'type': 'atomic', 'bid_id': random.randbytes(28).hex(), 'offer_id': random.randbytes(28).hex()})
elif r == 2:
swap_client.notify(NT.BID_ACCEPTED, {'bid_id': random.randbytes(28).hex()})
elif r == 3:
swap_client.notify(NT.BID_RECEIVED, {'type': 'ads', 'bid_id': random.randbytes(28).hex(), 'offer_id': random.randbytes(28).hex()})
return bytes(json.dumps({'type': r}), 'UTF-8')
def js_notifications(self, url_split, post_string, is_json) -> bytes:
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
return bytes(json.dumps(swap_client.getNotifications()), 'UTF-8')
def js_identities(self, url_split, post_string: str, is_json: bool) -> bytes:
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
filters = {
'page_no': 1,
'limit': PAGE_LIMIT,
'sort_by': 'created_at',
'sort_dir': 'desc',
}
if len(url_split) > 3:
address = url_split[3]
filters['address'] = address
if post_string != '':
post_data = getFormData(post_string, is_json)
if have_data_entry(post_data, 'sort_by'):
sort_by = get_data_entry(post_data, 'sort_by')
assert (sort_by in ['created_at', 'rate']), 'Invalid sort by'
filters['sort_by'] = sort_by
if have_data_entry(post_data, 'sort_dir'):
sort_dir = get_data_entry(post_data, 'sort_dir')
assert (sort_dir in ['asc', 'desc']), 'Invalid sort dir'
filters['sort_dir'] = sort_dir
if have_data_entry(post_data, 'offset'):
filters['offset'] = int(get_data_entry(post_data, 'offset'))
if have_data_entry(post_data, 'limit'):
filters['limit'] = int(get_data_entry(post_data, 'limit'))
assert (filters['limit'] > 0 and filters['limit'] <= PAGE_LIMIT), 'Invalid limit'
set_data = {}
if have_data_entry(post_data, 'set_label'):
set_data['label'] = get_data_entry(post_data, 'set_label')
if have_data_entry(post_data, 'set_automation_override'):
set_data['automation_override'] = get_data_entry(post_data, 'set_automation_override')
if have_data_entry(post_data, 'set_visibility_override'):
set_data['visibility_override'] = get_data_entry(post_data, 'set_visibility_override')
if have_data_entry(post_data, 'set_note'):
set_data['note'] = get_data_entry(post_data, 'set_note')
if set_data:
ensure('address' in filters, 'Must provide an address to modify data')
swap_client.setIdentityData(filters, set_data)
return bytes(json.dumps(swap_client.listIdentities(filters)), 'UTF-8')
def js_automationstrategies(self, url_split, post_string: str, is_json: bool) -> bytes:
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
filters = {
'page_no': 1,
'limit': PAGE_LIMIT,
'sort_by': 'created_at',
'sort_dir': 'desc',
}
if post_string != '':
post_data = getFormData(post_string, is_json)
if have_data_entry(post_data, 'sort_by'):
sort_by = get_data_entry(post_data, 'sort_by')
assert (sort_by in ['created_at', 'rate']), 'Invalid sort by'
filters['sort_by'] = sort_by
if have_data_entry(post_data, 'sort_dir'):
sort_dir = get_data_entry(post_data, 'sort_dir')
assert (sort_dir in ['asc', 'desc']), 'Invalid sort dir'
filters['sort_dir'] = sort_dir
if have_data_entry(post_data, 'offset'):
filters['offset'] = int(get_data_entry(post_data, 'offset'))
if have_data_entry(post_data, 'limit'):
filters['limit'] = int(get_data_entry(post_data, 'limit'))
assert (filters['limit'] > 0 and filters['limit'] <= PAGE_LIMIT), 'Invalid limit'
if len(url_split) > 3:
strat_id = int(url_split[3])
strat_data = swap_client.getAutomationStrategy(strat_id)
rv = {
'record_id': strat_data.record_id,
'label': strat_data.label,
'type_ind': strat_data.type_ind,
'only_known_identities': strat_data.only_known_identities,
'num_concurrent': strat_data.num_concurrent,
'data': json.loads(strat_data.data.decode('utf-8')),
'note': '' if strat_data.note is None else strat_data.note,
}
return bytes(json.dumps(rv), 'UTF-8')
rv = []
strats = swap_client.listAutomationStrategies(filters)
for row in strats:
rv.append((row[0], row[1], row[2]))
return bytes(json.dumps(rv), 'UTF-8')
def js_vacuumdb(self, url_split, post_string, is_json) -> bytes:
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
swap_client.vacuumDB()
return bytes(json.dumps({'completed': True}), 'UTF-8')
def js_getcoinseed(self, url_split, post_string, is_json) -> bytes:
swap_client = self.server.swap_client
swap_client.checkSystemStatus()
post_data = getFormData(post_string, is_json)
coin = getCoinType(get_data_entry(post_data, 'coin'))
if coin in (Coins.PART, Coins.PART_ANON, Coins.PART_BLIND):
raise ValueError('Particl wallet seed is set from the Basicswap mnemonic.')
ci = swap_client.ci(coin)
if coin == Coins.XMR:
key_view = swap_client.getWalletKey(coin, 1, for_ed25519=True)
key_spend = swap_client.getWalletKey(coin, 2, for_ed25519=True)
address = ci.getAddressFromKeys(key_view, key_spend)
return bytes(json.dumps({'coin': ci.ticker(), 'key_view': ci.encodeKey(key_view), 'key_spend': ci.encodeKey(key_spend), 'address': address}), 'UTF-8')
seed_key = swap_client.getWalletKey(coin, 1)
if coin == Coins.DASH:
return bytes(json.dumps({'coin': ci.ticker(), 'seed': seed_key.hex(), 'mnemonic': ci.seedToMnemonic(seed_key)}), 'UTF-8')
seed_id = ci.getSeedHash(seed_key)
return bytes(json.dumps({'coin': ci.ticker(), 'seed': seed_key.hex(), 'seed_id': seed_id.hex()}), 'UTF-8')
def js_setpassword(self, url_split, post_string, is_json) -> bytes:
# Set or change wallet passwords
# Only works with currently enabled coins
# Will fail if any coin does not unlock on the old password
swap_client = self.server.swap_client
post_data = getFormData(post_string, is_json)
old_password = get_data_entry(post_data, 'oldpassword')
new_password = get_data_entry(post_data, 'newpassword')
if have_data_entry(post_data, 'coin'):
# Set password for one coin
coin = getCoinType(get_data_entry(post_data, 'coin'))
if coin in (Coins.PART_ANON, Coins.PART_BLIND):
raise ValueError('Invalid coin.')
swap_client.changeWalletPasswords(old_password, new_password, coin)
return bytes(json.dumps({'success': True}), 'UTF-8')
# Set password for all coins
swap_client.changeWalletPasswords(old_password, new_password)
return bytes(json.dumps({'success': True}), 'UTF-8')
def js_unlock(self, url_split, post_string, is_json) -> bytes:
swap_client = self.server.swap_client
post_data = getFormData(post_string, is_json)
password = get_data_entry(post_data, 'password')
if have_data_entry(post_data, 'coin'):
coin = getCoinType(str(get_data_entry(post_data, 'coin')))
if coin in (Coins.PART_ANON, Coins.PART_BLIND):
raise ValueError('Invalid coin.')
swap_client.unlockWallets(password, coin)
return bytes(json.dumps({'success': True}), 'UTF-8')
swap_client.unlockWallets(password)
return bytes(json.dumps({'success': True}), 'UTF-8')
def js_lock(self, url_split, post_string, is_json) -> bytes:
swap_client = self.server.swap_client
post_data = {} if post_string == '' else getFormData(post_string, is_json)
if have_data_entry(post_data, 'coin'):
coin = getCoinType(get_data_entry(post_data, 'coin'))
if coin in (Coins.PART_ANON, Coins.PART_BLIND):
raise ValueError('Invalid coin.')
swap_client.lockWallets(coin)
return bytes(json.dumps({'success': True}), 'UTF-8')
swap_client.lockWallets()
return bytes(json.dumps({'success': True}), 'UTF-8')
def js_404(self, url_split, post_string, is_json) -> bytes:
return bytes(json.dumps({'Error': 'path unknown'}), 'UTF-8')
def js_help(self, url_split, post_string, is_json) -> bytes:
# TODO: Add details and examples
commands = []
for k in pages:
commands.append(k)
return bytes(json.dumps({'commands': commands}), 'UTF-8')
pages = {
'coins': js_coins,
'wallets': js_wallets,
'offers': js_offers,
'sentoffers': js_sentoffers,
'bids': js_bids,
'sentbids': js_sentbids,
'network': js_network,
'revokeoffer': js_revokeoffer,
'smsgaddresses': js_smsgaddresses,
'rate': js_rate,
'rates': js_rates,
'rateslist': js_rates_list,
'generatenotification': js_generatenotification,
'notifications': js_notifications,
'identities': js_identities,
'automationstrategies': js_automationstrategies,
'vacuumdb': js_vacuumdb,
'getcoinseed': js_getcoinseed,
'setpassword': js_setpassword,
'unlock': js_unlock,
'lock': js_lock,
'help': js_help,
}
def js_url_to_function(url_split):
if len(url_split) > 2:
return pages.get(url_split[2], js_404)
return js_index
def js_index(self, url_split, post_string, is_json):
return bytes(json.dumps(self.server.swap_client.getSummary()), 'UTF-8')

View File

@@ -40,6 +40,8 @@ message BidMessage {
bytes offer_msg_id = 1;
uint64 time_valid = 2; /* seconds bid is valid for */
uint64 amount = 3; /* amount of amount_from bid is for */
/* optional */
uint64 rate = 4;
bytes pkhash_buyer = 5; /* buyer's address to receive amount_from */
string proof_address = 6;
@@ -129,24 +131,3 @@ message XmrBidLockReleaseMessage {
bytes al_lock_spend_tx_esig = 2;
}
message ADSBidIntentMessage {
/* L -> F Sent from bidder, construct a reverse bid */
bytes offer_msg_id = 1;
uint64 time_valid = 2; /* seconds bid is valid for */
uint64 amount_from = 3; /* amount of offer.coin_from bid is for */
uint64 amount_to = 4; /* amount of offer.coin_to bid is for, equivalent to bid.amount */
uint64 rate = 5; /* amount of offer.coin_from bid is for */
uint32 protocol_version = 6;
}
message ADSBidIntentAcceptMessage {
/* F -> L Sent from offerer, construct a reverse bid */
bytes bid_msg_id = 1;
bytes pkaf = 2;
bytes kbvf = 3;
bytes kbsf_dleag = 4;
bytes dest_af = 5;
}

View File

@@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0emessages.proto\x12\tbasicswap\"\xa6\x04\n\x0cOfferMessage\x12\x11\n\tcoin_from\x18\x01 \x01(\r\x12\x0f\n\x07\x63oin_to\x18\x02 \x01(\r\x12\x13\n\x0b\x61mount_from\x18\x03 \x01(\x04\x12\x0c\n\x04rate\x18\x04 \x01(\x04\x12\x16\n\x0emin_bid_amount\x18\x05 \x01(\x04\x12\x12\n\ntime_valid\x18\x06 \x01(\x04\x12\x33\n\tlock_type\x18\x07 \x01(\x0e\x32 .basicswap.OfferMessage.LockType\x12\x12\n\nlock_value\x18\x08 \x01(\r\x12\x11\n\tswap_type\x18\t \x01(\r\x12\x15\n\rproof_address\x18\n \x01(\t\x12\x17\n\x0fproof_signature\x18\x0b \x01(\t\x12\x15\n\rpkhash_seller\x18\x0c \x01(\x0c\x12\x13\n\x0bsecret_hash\x18\r \x01(\x0c\x12\x15\n\rfee_rate_from\x18\x0e \x01(\x04\x12\x13\n\x0b\x66\x65\x65_rate_to\x18\x0f \x01(\x04\x12\x18\n\x10protocol_version\x18\x10 \x01(\r\x12\x19\n\x11\x61mount_negotiable\x18\x11 \x01(\x08\x12\x17\n\x0frate_negotiable\x18\x12 \x01(\x08\"q\n\x08LockType\x12\x0b\n\x07NOT_SET\x10\x00\x12\x18\n\x14SEQUENCE_LOCK_BLOCKS\x10\x01\x12\x16\n\x12SEQUENCE_LOCK_TIME\x10\x02\x12\x13\n\x0f\x41\x42S_LOCK_BLOCKS\x10\x03\x12\x11\n\rABS_LOCK_TIME\x10\x04\"\xb4\x01\n\nBidMessage\x12\x14\n\x0coffer_msg_id\x18\x01 \x01(\x0c\x12\x12\n\ntime_valid\x18\x02 \x01(\x04\x12\x0e\n\x06\x61mount\x18\x03 \x01(\x04\x12\x0c\n\x04rate\x18\x04 \x01(\x04\x12\x14\n\x0cpkhash_buyer\x18\x05 \x01(\x0c\x12\x15\n\rproof_address\x18\x06 \x01(\t\x12\x17\n\x0fproof_signature\x18\x07 \x01(\t\x12\x18\n\x10protocol_version\x18\x08 \x01(\r\"V\n\x10\x42idAcceptMessage\x12\x12\n\nbid_msg_id\x18\x01 \x01(\x0c\x12\x15\n\rinitiate_txid\x18\x02 \x01(\x0c\x12\x17\n\x0f\x63ontract_script\x18\x03 \x01(\x0c\"=\n\x12OfferRevokeMessage\x12\x14\n\x0coffer_msg_id\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\";\n\x10\x42idRejectMessage\x12\x12\n\nbid_msg_id\x18\x01 \x01(\x0c\x12\x13\n\x0breject_code\x18\x02 \x01(\r\"\xb2\x01\n\rXmrBidMessage\x12\x14\n\x0coffer_msg_id\x18\x01 \x01(\x0c\x12\x12\n\ntime_valid\x18\x02 \x01(\x04\x12\x0e\n\x06\x61mount\x18\x03 \x01(\x04\x12\x0c\n\x04rate\x18\x04 \x01(\x04\x12\x0c\n\x04pkaf\x18\x05 \x01(\x0c\x12\x0c\n\x04kbvf\x18\x06 \x01(\x0c\x12\x12\n\nkbsf_dleag\x18\x07 \x01(\x0c\x12\x0f\n\x07\x64\x65st_af\x18\x08 \x01(\x0c\x12\x18\n\x10protocol_version\x18\t \x01(\r\"T\n\x0fXmrSplitMessage\x12\x0e\n\x06msg_id\x18\x01 \x01(\x0c\x12\x10\n\x08msg_type\x18\x02 \x01(\r\x12\x10\n\x08sequence\x18\x03 \x01(\r\x12\r\n\x05\x64leag\x18\x04 \x01(\x0c\"\x80\x02\n\x13XmrBidAcceptMessage\x12\x12\n\nbid_msg_id\x18\x01 \x01(\x0c\x12\x0c\n\x04pkal\x18\x03 \x01(\x0c\x12\x0c\n\x04kbvl\x18\x04 \x01(\x0c\x12\x12\n\nkbsl_dleag\x18\x05 \x01(\x0c\x12\x11\n\ta_lock_tx\x18\x06 \x01(\x0c\x12\x18\n\x10\x61_lock_tx_script\x18\x07 \x01(\x0c\x12\x18\n\x10\x61_lock_refund_tx\x18\x08 \x01(\x0c\x12\x1f\n\x17\x61_lock_refund_tx_script\x18\t \x01(\x0c\x12\x1e\n\x16\x61_lock_refund_spend_tx\x18\n \x01(\x0c\x12\x1d\n\x15\x61l_lock_refund_tx_sig\x18\x0b \x01(\x0c\"r\n\x17XmrBidLockTxSigsMessage\x12\x12\n\nbid_msg_id\x18\x01 \x01(\x0c\x12$\n\x1c\x61\x66_lock_refund_spend_tx_esig\x18\x02 \x01(\x0c\x12\x1d\n\x15\x61\x66_lock_refund_tx_sig\x18\x03 \x01(\x0c\"X\n\x18XmrBidLockSpendTxMessage\x12\x12\n\nbid_msg_id\x18\x01 \x01(\x0c\x12\x17\n\x0f\x61_lock_spend_tx\x18\x02 \x01(\x0c\x12\x0f\n\x07kal_sig\x18\x03 \x01(\x0c\"M\n\x18XmrBidLockReleaseMessage\x12\x12\n\nbid_msg_id\x18\x01 \x01(\x0c\x12\x1d\n\x15\x61l_lock_spend_tx_esig\x18\x02 \x01(\x0c\"\x8f\x01\n\x13\x41\x44SBidIntentMessage\x12\x14\n\x0coffer_msg_id\x18\x01 \x01(\x0c\x12\x12\n\ntime_valid\x18\x02 \x01(\x04\x12\x13\n\x0b\x61mount_from\x18\x03 \x01(\x04\x12\x11\n\tamount_to\x18\x04 \x01(\x04\x12\x0c\n\x04rate\x18\x05 \x01(\x04\x12\x18\n\x10protocol_version\x18\x06 \x01(\r\"p\n\x19\x41\x44SBidIntentAcceptMessage\x12\x12\n\nbid_msg_id\x18\x01 \x01(\x0c\x12\x0c\n\x04pkaf\x18\x02 \x01(\x0c\x12\x0c\n\x04kbvf\x18\x03 \x01(\x0c\x12\x12\n\nkbsf_dleag\x18\x04 \x01(\x0c\x12\x0f\n\x07\x64\x65st_af\x18\x05 \x01(\x0c\x62\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0emessages.proto\x12\tbasicswap\"\xa6\x04\n\x0cOfferMessage\x12\x11\n\tcoin_from\x18\x01 \x01(\r\x12\x0f\n\x07\x63oin_to\x18\x02 \x01(\r\x12\x13\n\x0b\x61mount_from\x18\x03 \x01(\x04\x12\x0c\n\x04rate\x18\x04 \x01(\x04\x12\x16\n\x0emin_bid_amount\x18\x05 \x01(\x04\x12\x12\n\ntime_valid\x18\x06 \x01(\x04\x12\x33\n\tlock_type\x18\x07 \x01(\x0e\x32 .basicswap.OfferMessage.LockType\x12\x12\n\nlock_value\x18\x08 \x01(\r\x12\x11\n\tswap_type\x18\t \x01(\r\x12\x15\n\rproof_address\x18\n \x01(\t\x12\x17\n\x0fproof_signature\x18\x0b \x01(\t\x12\x15\n\rpkhash_seller\x18\x0c \x01(\x0c\x12\x13\n\x0bsecret_hash\x18\r \x01(\x0c\x12\x15\n\rfee_rate_from\x18\x0e \x01(\x04\x12\x13\n\x0b\x66\x65\x65_rate_to\x18\x0f \x01(\x04\x12\x18\n\x10protocol_version\x18\x10 \x01(\r\x12\x19\n\x11\x61mount_negotiable\x18\x11 \x01(\x08\x12\x17\n\x0frate_negotiable\x18\x12 \x01(\x08\"q\n\x08LockType\x12\x0b\n\x07NOT_SET\x10\x00\x12\x18\n\x14SEQUENCE_LOCK_BLOCKS\x10\x01\x12\x16\n\x12SEQUENCE_LOCK_TIME\x10\x02\x12\x13\n\x0f\x41\x42S_LOCK_BLOCKS\x10\x03\x12\x11\n\rABS_LOCK_TIME\x10\x04\"\xb4\x01\n\nBidMessage\x12\x14\n\x0coffer_msg_id\x18\x01 \x01(\x0c\x12\x12\n\ntime_valid\x18\x02 \x01(\x04\x12\x0e\n\x06\x61mount\x18\x03 \x01(\x04\x12\x0c\n\x04rate\x18\x04 \x01(\x04\x12\x14\n\x0cpkhash_buyer\x18\x05 \x01(\x0c\x12\x15\n\rproof_address\x18\x06 \x01(\t\x12\x17\n\x0fproof_signature\x18\x07 \x01(\t\x12\x18\n\x10protocol_version\x18\x08 \x01(\r\"V\n\x10\x42idAcceptMessage\x12\x12\n\nbid_msg_id\x18\x01 \x01(\x0c\x12\x15\n\rinitiate_txid\x18\x02 \x01(\x0c\x12\x17\n\x0f\x63ontract_script\x18\x03 \x01(\x0c\"=\n\x12OfferRevokeMessage\x12\x14\n\x0coffer_msg_id\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\";\n\x10\x42idRejectMessage\x12\x12\n\nbid_msg_id\x18\x01 \x01(\x0c\x12\x13\n\x0breject_code\x18\x02 \x01(\r\"\xb2\x01\n\rXmrBidMessage\x12\x14\n\x0coffer_msg_id\x18\x01 \x01(\x0c\x12\x12\n\ntime_valid\x18\x02 \x01(\x04\x12\x0e\n\x06\x61mount\x18\x03 \x01(\x04\x12\x0c\n\x04rate\x18\x04 \x01(\x04\x12\x0c\n\x04pkaf\x18\x05 \x01(\x0c\x12\x0c\n\x04kbvf\x18\x06 \x01(\x0c\x12\x12\n\nkbsf_dleag\x18\x07 \x01(\x0c\x12\x0f\n\x07\x64\x65st_af\x18\x08 \x01(\x0c\x12\x18\n\x10protocol_version\x18\t \x01(\r\"T\n\x0fXmrSplitMessage\x12\x0e\n\x06msg_id\x18\x01 \x01(\x0c\x12\x10\n\x08msg_type\x18\x02 \x01(\r\x12\x10\n\x08sequence\x18\x03 \x01(\r\x12\r\n\x05\x64leag\x18\x04 \x01(\x0c\"\x80\x02\n\x13XmrBidAcceptMessage\x12\x12\n\nbid_msg_id\x18\x01 \x01(\x0c\x12\x0c\n\x04pkal\x18\x03 \x01(\x0c\x12\x0c\n\x04kbvl\x18\x04 \x01(\x0c\x12\x12\n\nkbsl_dleag\x18\x05 \x01(\x0c\x12\x11\n\ta_lock_tx\x18\x06 \x01(\x0c\x12\x18\n\x10\x61_lock_tx_script\x18\x07 \x01(\x0c\x12\x18\n\x10\x61_lock_refund_tx\x18\x08 \x01(\x0c\x12\x1f\n\x17\x61_lock_refund_tx_script\x18\t \x01(\x0c\x12\x1e\n\x16\x61_lock_refund_spend_tx\x18\n \x01(\x0c\x12\x1d\n\x15\x61l_lock_refund_tx_sig\x18\x0b \x01(\x0c\"r\n\x17XmrBidLockTxSigsMessage\x12\x12\n\nbid_msg_id\x18\x01 \x01(\x0c\x12$\n\x1c\x61\x66_lock_refund_spend_tx_esig\x18\x02 \x01(\x0c\x12\x1d\n\x15\x61\x66_lock_refund_tx_sig\x18\x03 \x01(\x0c\"X\n\x18XmrBidLockSpendTxMessage\x12\x12\n\nbid_msg_id\x18\x01 \x01(\x0c\x12\x17\n\x0f\x61_lock_spend_tx\x18\x02 \x01(\x0c\x12\x0f\n\x07kal_sig\x18\x03 \x01(\x0c\"M\n\x18XmrBidLockReleaseMessage\x12\x12\n\nbid_msg_id\x18\x01 \x01(\x0c\x12\x1d\n\x15\x61l_lock_spend_tx_esig\x18\x02 \x01(\x0c\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'messages_pb2', globals())
@@ -44,8 +44,4 @@ if _descriptor._USE_C_DESCRIPTORS == False:
_XMRBIDLOCKSPENDTXMESSAGE._serialized_end=1707
_XMRBIDLOCKRELEASEMESSAGE._serialized_start=1709
_XMRBIDLOCKRELEASEMESSAGE._serialized_end=1786
_ADSBIDINTENTMESSAGE._serialized_start=1789
_ADSBIDINTENTMESSAGE._serialized_end=1932
_ADSBIDINTENTACCEPTMESSAGE._serialized_start=1934
_ADSBIDINTENTACCEPTMESSAGE._serialized_end=2046
# @@protoc_insertion_point(module_scope)

View File

@@ -1,38 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
from basicswap.script import (
OpCodes,
)
from basicswap.util.script import (
getP2WSH,
)
from basicswap.interface.btc import (
find_vout_for_address_from_txobj,
)
class ProtocolInterface:
swap_type = None
def getFundedInitiateTxTemplate(self, ci, amount: int, sub_fee: bool) -> bytes:
raise ValueError('base class')
def getMockScript(self) -> bytearray:
return bytearray([
OpCodes.OP_RETURN, OpCodes.OP_1])
def getMockScriptScriptPubkey(self, ci) -> bytearray:
script = self.getMockScript()
return ci.get_p2wsh_script_pubkey(script) if ci._use_segwit else ci.get_p2sh_script_pubkey(script)
def getMockAddrTo(self, ci):
script = self.getMockScript()
return ci.encode_p2wsh(getP2WSH(script)) if ci._use_segwit else ci.encode_p2sh(script)
def findMockVout(self, ci, itx_decoded):
mock_addr = self.getMockAddrTo(ci)
return find_vout_for_address_from_txobj(itx_decoded, mock_addr)

View File

@@ -1,29 +1,20 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2020-2023 tecnovert
# Copyright (c) 2020-2022 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
from basicswap.db import (
Concepts,
)
from basicswap.util import (
SerialiseNum,
)
from basicswap.script import (
OpCodes,
)
from basicswap.basicswap_util import (
SwapTypes,
EventLogTypes,
)
from . import ProtocolInterface
INITIATE_TX_TIMEOUT = 40 * 60 # TODO: make variable per coin
ABS_LOCK_TIME_LEEWAY = 10 * 60
def buildContractScript(lock_val: int, secret_hash: bytes, pkh_redeem: bytes, pkh_refund: bytes, op_lock=OpCodes.OP_CHECKSEQUENCEVERIFY) -> bytearray:
def buildContractScript(lock_val, secret_hash, pkh_redeem, pkh_refund, op_lock=OpCodes.OP_CHECKSEQUENCEVERIFY):
script = bytearray([
OpCodes.OP_IF,
OpCodes.OP_SIZE,
@@ -58,7 +49,7 @@ def extractScriptSecretHash(script):
return script[7:39]
def redeemITx(self, bid_id: bytes, session):
def redeemITx(self, bid_id, session):
bid, offer = self.getBidAndOffer(bid_id, session)
ci_from = self.ci(offer.coin_from)
@@ -67,34 +58,3 @@ def redeemITx(self, bid_id: bytes, session):
bid.initiate_tx.spend_txid = bytes.fromhex(txid)
self.log.debug('Submitted initiate redeem txn %s to %s chain for bid %s', txid, ci_from.coin_name(), bid_id.hex())
self.logEvent(Concepts.BID, bid_id, EventLogTypes.ITX_REDEEM_PUBLISHED, '', session)
class AtomicSwapInterface(ProtocolInterface):
swap_type = SwapTypes.SELLER_FIRST
def getFundedInitiateTxTemplate(self, ci, amount: int, sub_fee: bool) -> bytes:
addr_to = self.getMockAddrTo(ci)
funded_tx = ci.createRawFundedTransaction(addr_to, amount, sub_fee, lock_unspents=False)
return bytes.fromhex(funded_tx)
def promoteMockTx(self, ci, mock_tx: bytes, script: bytearray) -> bytearray:
mock_txo_script = self.getMockScriptScriptPubkey(ci)
real_txo_script = ci.get_p2wsh_script_pubkey(script) if ci._use_segwit else ci.get_p2sh_script_pubkey(script)
found: int = 0
ctx = ci.loadTx(mock_tx)
for txo in ctx.vout:
if txo.scriptPubKey == mock_txo_script:
txo.scriptPubKey = real_txo_script
found += 1
if found < 1:
raise ValueError('Mocked output not found')
if found > 1:
raise ValueError('Too many mocked outputs found')
ctx.nLockTime = 0
funded_tx = ctx.serialize()
return ci.signTxWithWallet(funded_tx)

View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2020-2023 tecnovert
# Copyright (c) 2020 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
@@ -9,19 +9,13 @@ from sqlalchemy.orm import scoped_session
from basicswap.util import (
ensure,
)
from basicswap.interface import Curves
from basicswap.chainparams import (
Coins,
)
from basicswap.basicswap_util import (
KeyTypes,
SwapTypes,
EventLogTypes,
)
from . import ProtocolInterface
from basicswap.contrib.test_framework.script import (
CScript, CScriptOp,
OP_CHECKMULTISIG)
def addLockRefundSigs(self, xmr_swap, ci):
@@ -38,17 +32,17 @@ def addLockRefundSigs(self, xmr_swap, ci):
xmr_swap.a_lock_refund_tx = signed_tx
def recoverNoScriptTxnWithKey(self, bid_id: bytes, encoded_key):
def recoverNoScriptTxnWithKey(self, bid_id, encoded_key):
self.log.info('Manually recovering %s', bid_id.hex())
# Manually recover txn if other key is known
session = scoped_session(self.session_factory)
try:
bid, xmr_swap = self.getXmrBidFromSession(session, bid_id)
ensure(bid, 'Bid not found: {}.'.format(bid_id.hex()))
ensure(xmr_swap, 'Adaptor-sig swap not found: {}.'.format(bid_id.hex()))
ensure(xmr_swap, 'XMR swap not found: {}.'.format(bid_id.hex()))
offer, xmr_offer = self.getXmrOfferFromSession(session, bid.offer_id, sent=False)
ensure(offer, 'Offer not found: {}.'.format(bid.offer_id.hex()))
ensure(xmr_offer, 'Adaptor-sig offer not found: {}.'.format(bid.offer_id.hex()))
ensure(xmr_offer, 'XMR offer not found: {}.'.format(bid.offer_id.hex()))
ci_to = self.ci(offer.coin_to)
for_ed25519 = True if Coins(offer.coin_to) == Coins.XMR else False
@@ -86,78 +80,7 @@ def recoverNoScriptTxnWithKey(self, bid_id: bytes, encoded_key):
def getChainBSplitKey(swap_client, bid, xmr_swap, offer):
reverse_bid: bool = offer.bid_reversed
ci_follower = swap_client.ci(offer.coin_from if reverse_bid else offer.coin_to)
ci_to = swap_client.ci(offer.coin_to)
key_type = KeyTypes.KBSF if bid.was_sent else KeyTypes.KBSL
return ci_follower.encodeKey(swap_client.getPathKey(offer.coin_from, offer.coin_to, bid.created_at, xmr_swap.contract_count, key_type, True if ci_follower.coin_type() == Coins.XMR else False))
def getChainBRemoteSplitKey(swap_client, bid, xmr_swap, offer):
reverse_bid: bool = offer.bid_reversed
ci_leader = swap_client.ci(offer.coin_to if reverse_bid else offer.coin_from)
ci_follower = swap_client.ci(offer.coin_from if reverse_bid else offer.coin_to)
if bid.was_sent:
if xmr_swap.a_lock_refund_spend_tx:
af_lock_refund_spend_tx_sig = ci_leader.extractFollowerSig(xmr_swap.a_lock_refund_spend_tx)
kbsl = ci_leader.recoverEncKey(xmr_swap.af_lock_refund_spend_tx_esig, af_lock_refund_spend_tx_sig, xmr_swap.pkasl)
return ci_follower.encodeKey(kbsl)
else:
if xmr_swap.a_lock_spend_tx:
al_lock_spend_tx_sig = ci_leader.extractLeaderSig(xmr_swap.a_lock_spend_tx)
kbsf = ci_leader.recoverEncKey(xmr_swap.al_lock_spend_tx_esig, al_lock_spend_tx_sig, xmr_swap.pkasf)
return ci_follower.encodeKey(kbsf)
return None
def setDLEAG(xmr_swap, ci_to, kbsf: bytes) -> None:
if ci_to.curve_type() == Curves.ed25519:
xmr_swap.kbsf_dleag = ci_to.proveDLEAG(kbsf)
xmr_swap.pkasf = xmr_swap.kbsf_dleag[0: 33]
elif ci_to.curve_type() == Curves.secp256k1:
for i in range(10):
xmr_swap.kbsf_dleag = ci_to.signRecoverable(kbsf, 'proof kbsf owned for swap')
pk_recovered: bytes = ci_to.verifySigAndRecover(xmr_swap.kbsf_dleag, 'proof kbsf owned for swap')
if pk_recovered == xmr_swap.pkbsf:
break
# self.log.debug('kbsl recovered pubkey mismatch, retrying.')
assert (pk_recovered == xmr_swap.pkbsf)
xmr_swap.pkasf = xmr_swap.pkbsf
else:
raise ValueError('Unknown curve')
class XmrSwapInterface(ProtocolInterface):
swap_type = SwapTypes.XMR_SWAP
def genScriptLockTxScript(self, ci, Kal: bytes, Kaf: bytes) -> CScript:
Kal_enc = Kal if len(Kal) == 33 else ci.encodePubkey(Kal)
Kaf_enc = Kaf if len(Kaf) == 33 else ci.encodePubkey(Kaf)
return CScript([2, Kal_enc, Kaf_enc, 2, CScriptOp(OP_CHECKMULTISIG)])
def getFundedInitiateTxTemplate(self, ci, amount: int, sub_fee: bool) -> bytes:
addr_to = self.getMockAddrTo(ci)
funded_tx = ci.createRawFundedTransaction(addr_to, amount, sub_fee, lock_unspents=False)
return bytes.fromhex(funded_tx)
def promoteMockTx(self, ci, mock_tx: bytes, script: bytearray) -> bytearray:
mock_txo_script = self.getMockScriptScriptPubkey(ci)
real_txo_script = ci.getScriptDest(script)
found: int = 0
ctx = ci.loadTx(mock_tx)
for txo in ctx.vout:
if txo.scriptPubKey == mock_txo_script:
txo.scriptPubKey = real_txo_script
found += 1
if found < 1:
raise ValueError('Mocked output not found')
if found > 1:
raise ValueError('Too many mocked outputs found')
ctx.nLockTime = 0
return ctx.serialize()
return ci_to.encodeKey(swap_client.getPathKey(offer.coin_from, offer.coin_to, bid.created_at, xmr_swap.contract_count, key_type, True if offer.coin_to == Coins.XMR else False))

View File

@@ -130,15 +130,13 @@ def openrpc(rpc_port, auth, wallet=None, host='127.0.0.1'):
raise ValueError('RPC error ' + str(ex))
def callrpc_cli(bindir, datadir, chain, cmd, cli_bin='particl-cli', wallet=None):
def callrpc_cli(bindir, datadir, chain, cmd, cli_bin='particl-cli'):
cli_bin = os.path.join(bindir, cli_bin)
args = [cli_bin, ]
if chain != 'mainnet':
args.append('-' + chain)
args.append('-datadir=' + datadir)
if wallet is not None:
args.append('-rpcwallet=' + wallet)
args += shlex.split(cmd)
p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

View File

@@ -37,15 +37,12 @@ class JsonrpcDigest():
self.__verbose = verbose
self.__allow_none = allow_none
self.__request_id = 0
self.__request_id = 1
def close(self):
if self.__transport is not None:
self.__transport.close()
def request_id(self):
return self.__request_id
def post_request(self, method, params, timeout=None):
try:
connection = self.__transport.make_connection(self.__host)
@@ -69,7 +66,7 @@ class JsonrpcDigest():
self.__transport.close()
raise
def json_request(self, request_body, username='', password='', timeout=None):
def json_request(self, method, params, username='', password='', timeout=None):
try:
connection = self.__transport.make_connection(self.__host)
if timeout:
@@ -77,11 +74,18 @@ class JsonrpcDigest():
headers = self.__transport._extra_headers[:]
request_body = {
'method': method,
'params': params,
'jsonrpc': '2.0',
'id': self.__request_id
}
connection.putrequest('POST', self.__handler)
headers.append(('Content-Type', 'application/json'))
headers.append(('Connection', 'keep-alive'))
self.__transport.send_headers(connection, headers)
self.__transport.send_content(connection, json.dumps(request_body, default=jsonDecimal).encode('utf-8') if request_body else '')
self.__transport.send_content(connection, json.dumps(request_body, default=jsonDecimal).encode('utf-8'))
resp = connection.getresponse()
if resp.status == 401:
@@ -131,11 +135,18 @@ class JsonrpcDigest():
headers = self.__transport._extra_headers[:]
headers.append(('Authorization', header_value))
request_body = {
'method': method,
'params': params,
'jsonrpc': '2.0',
'id': self.__request_id
}
connection.putrequest('POST', self.__handler)
headers.append(('Content-Type', 'application/json'))
headers.append(('Connection', 'keep-alive'))
self.__transport.send_headers(connection, headers)
self.__transport.send_content(connection, json.dumps(request_body, default=jsonDecimal).encode('utf-8') if request_body else '')
self.__transport.send_content(connection, json.dumps(request_body, default=jsonDecimal).encode('utf-8'))
resp = connection.getresponse()
self.__request_id += 1
@@ -148,7 +159,7 @@ class JsonrpcDigest():
raise
def callrpc_xmr(rpc_port, method, params=[], rpc_host='127.0.0.1', path='json_rpc', auth=None, timeout=120):
def callrpc_xmr(rpc_port, auth, method, params=[], rpc_host='127.0.0.1', path='json_rpc', timeout=120):
# auth is a tuple: (username, password)
try:
if rpc_host.count('://') > 0:
@@ -157,16 +168,7 @@ def callrpc_xmr(rpc_port, method, params=[], rpc_host='127.0.0.1', path='json_rp
url = 'http://{}:{}/{}'.format(rpc_host, rpc_port, path)
x = JsonrpcDigest(url)
request_body = {
'method': method,
'params': params,
'jsonrpc': '2.0',
'id': x.request_id()
}
if auth:
v = x.json_request(request_body, username=auth[0], password=auth[1], timeout=timeout)
else:
v = x.json_request(request_body, timeout=timeout)
v = x.json_request(method, params, username=auth[0], password=auth[1], timeout=timeout)
x.close()
r = json.loads(v.decode('utf-8'))
except Exception as ex:
@@ -178,7 +180,27 @@ def callrpc_xmr(rpc_port, method, params=[], rpc_host='127.0.0.1', path='json_rp
return r['result']
def callrpc_xmr2(rpc_port: int, method: str, params=None, auth=None, rpc_host='127.0.0.1', timeout=120):
def callrpc_xmr_na(rpc_port, method, params=[], rpc_host='127.0.0.1', path='json_rpc', timeout=120):
try:
if rpc_host.count('://') > 0:
url = '{}:{}/{}'.format(rpc_host, rpc_port, path)
else:
url = 'http://{}:{}/{}'.format(rpc_host, rpc_port, path)
x = JsonrpcDigest(url)
v = x.json_request(method, params, timeout=timeout)
x.close()
r = json.loads(v.decode('utf-8'))
except Exception as ex:
raise ValueError('RPC Server Error: {}'.format(str(ex)))
if 'error' in r and r['error'] is not None:
raise ValueError('RPC error ' + str(r['error']))
return r['result']
def callrpc_xmr2(rpc_port, method, params=None, rpc_host='127.0.0.1', timeout=120):
try:
if rpc_host.count('://') > 0:
url = '{}:{}/{}'.format(rpc_host, rpc_port, method)
@@ -186,10 +208,7 @@ def callrpc_xmr2(rpc_port: int, method: str, params=None, auth=None, rpc_host='1
url = 'http://{}:{}/{}'.format(rpc_host, rpc_port, method)
x = JsonrpcDigest(url)
if auth:
v = x.json_request(params, username=auth[0], password=auth[1], timeout=timeout)
else:
v = x.json_request(params, timeout=timeout)
v = x.post_request(method, params, timeout=timeout)
x.close()
r = json.loads(v.decode('utf-8'))
except Exception as ex:
@@ -198,23 +217,34 @@ def callrpc_xmr2(rpc_port: int, method: str, params=None, auth=None, rpc_host='1
return r
def make_xmr_rpc2_func(port, auth, host='127.0.0.1'):
def make_xmr_rpc_func(port, host='127.0.0.1'):
port = port
host = host
def rpc_func(method, params=None, wallet=None, timeout=120):
nonlocal port
nonlocal host
return callrpc_xmr_na(port, method, params, rpc_host=host, timeout=timeout)
return rpc_func
def make_xmr_rpc2_func(port, host='127.0.0.1'):
port = port
host = host
def rpc_func(method, params=None, wallet=None, timeout=120):
nonlocal port
nonlocal host
return callrpc_xmr2(port, method, params, rpc_host=host, timeout=timeout)
return rpc_func
def make_xmr_wallet_rpc_func(port, auth, host='127.0.0.1'):
port = port
auth = auth
host = host
def rpc_func(method, params=None, wallet=None, timeout=120):
nonlocal port, auth, host
return callrpc_xmr2(port, method, params, auth=auth, rpc_host=host, timeout=timeout)
return rpc_func
def make_xmr_rpc_func(port, auth, host='127.0.0.1'):
port = port
auth = auth
host = host
def rpc_func(method, params=None, wallet=None, timeout=120):
nonlocal port, auth, host
return callrpc_xmr(port, method, params, rpc_host=host, auth=auth, timeout=timeout)
return callrpc_xmr(port, auth, method, params, rpc_host=host, timeout=timeout)
return rpc_func

View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2019-2022 tecnovert
# Copyright (c) 2019 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
@@ -15,7 +15,6 @@ class OpCodes(IntEnum):
OP_IF = 0x63,
OP_ELSE = 0x67,
OP_ENDIF = 0x68,
OP_RETURN = 0x6a,
OP_DROP = 0x75,
OP_DUP = 0x76,
OP_SIZE = 0x82,

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,34 @@
.padded_row td
{
padding-top:1.5em;
}
.bold
{
font-weight:bold;
}
.monospace
{
font-family:monospace;
}
.floatright
{
position:fixed;
top:10px;
right:18px;
margin: 0;
width:calc(33.33% - 25px);
}
.error
{
background:#ff5b5b;
}
.error_msg
{
color:red;
}

View File

@@ -1,130 +0,0 @@
.padded_row td
{
padding-top:1.5em;
}
.bold
{
font-weight:bold;
}
.monospace
{
font-family:monospace;
}
.floatright
{
position: fixed;
top:1.25rem;
right:1.25rem;
z-index: 9999;
}
.error_msg
{
color:red;
}
#hide {
-moz-animation: cssAnimation 0s ease-in 15s forwards;
/* Firefox */
-webkit-animation: cssAnimation 0s ease-in 15s forwards;
/* Safari and Chrome */
-o-animation: cssAnimation 0s ease-in 15s forwards;
/* Opera */
animation: cssAnimation 0s ease-in 15s forwards;
-webkit-animation-fill-mode: forwards;
animation-fill-mode: forwards;
}
@keyframes cssAnimation {
to {
width:0;
height:0;
overflow:hidden;
}
}
@-webkit-keyframes cssAnimation {
to {
width:0;
height:0;
visibility:hidden;
}
}
.custom-select .select {
appearance: none;
background-image: url('/static/images/other/coin.png');
background-position: 10px center;
background-repeat: no-repeat;
position: relative;
}
.custom-select select::-webkit-scrollbar {
width: 0;
}
.custom-select .select option {
padding-left: 0;
text-indent: 0;
background-repeat: no-repeat;
background-position: 0 50%;
}
.custom-select .select option.no-space {
padding-left: 0;
}
.custom-select .select option[data-image] {
background-image: url('');
}
.custom-select .select-icon {
position: absolute;
top: 50%;
left: 10px;
transform: translateY(-50%);
}
.custom-select .select-image {
display: none;
margin-top: 10px;
}
.custom-select .select:focus + .select-dropdown .select-image {
display: block;
}
/* Disable opacity on disabled form elements in Chrome */
@media screen and (-webkit-min-device-pixel-ratio:0) {
select:disabled,
input:disabled,
textarea:disabled {
opacity: 1 !important;
}
}
/* Add this to your existing CSS file */
.error {
border: 1px solid red !important;
}
.active-container {
position: relative;
border-radius: 5px;
}
.active-container::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
border: 1px solid rgb(77, 132, 240);
border-radius: inherit;
pointer-events: none;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

View File

@@ -1,25 +0,0 @@
<svg width="289" height="289" viewBox="0 0 289 289" fill="none" xmlns="http://www.w3.org/2000/svg">
<mask id="mask0_1384_22144" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="289" height="289">
<circle cx="144.5" cy="144.5" r="142.507" fill="#C4C4C4" stroke="#F8BB54" stroke-width="3.98621"/>
</mask>
<g mask="url(#mask0_1384_22144)">
<path d="M-83.9766 60.6005C-83.9766 60.6005 -16.689 48.136 0.672082 4.51091C17.2756 -37.3086 85.6704 -48.5495 85.6704 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 81.5681C-83.9766 81.5681 -1.42521 67.182 19.8389 14.529C40.1127 -35.736 123.946 -48.5495 123.946 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 102.595C-83.9766 102.595 13.7801 86.2279 38.9475 24.6636C62.9497 -34.2214 162.221 -48.5495 162.221 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 123.563C-83.9766 123.563 29.0437 105.274 58.1143 34.6817C85.7869 -32.6488 200.497 -48.5495 200.497 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 144.531C-83.9766 144.531 44.3072 124.32 77.2812 44.7578C108.624 -31.0762 238.714 -48.5495 238.714 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 165.557C-83.9766 165.557 59.5125 143.424 96.3898 54.8339C131.519 -29.562 276.989 -48.5495 276.989 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 186.525C-83.9766 186.525 74.7761 162.411 115.557 64.9105C154.356 -27.9894 315.265 -48.5495 315.265 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 207.493C-83.9766 207.493 90.0398 181.457 134.665 74.9286C177.193 -26.4168 353.54 -48.5495 353.54 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 228.519C-83.9766 228.519 105.245 200.562 153.832 85.0628C200.031 -24.9026 391.758 -48.5495 391.758 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 249.485C-83.9766 249.485 120.509 219.608 172.941 95.1393C222.868 -23.33 430.033 -48.5495 430.033 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 270.512C-83.9766 270.512 135.772 238.653 192.108 105.215C245.705 -21.7574 468.308 -48.5495 468.308 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 291.482C-83.9766 291.482 150.977 257.7 211.216 115.292C268.542 -20.2428 506.583 -48.5495 506.583 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 312.447C-83.9766 312.447 166.241 276.746 230.383 125.31C291.379 -18.6701 544.858 -48.5495 544.858 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 333.473C-83.9766 333.473 181.505 295.792 249.55 135.444C314.216 -17.0975 583.076 -48.5495 583.076 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 354.443C-83.9766 354.443 196.71 314.837 268.658 145.462C337.053 -15.5833 621.352 -48.5495 621.352 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 375.413C-83.9766 375.413 211.974 333.883 287.825 155.538C359.89 -14.0107 659.627 -48.5495 659.627 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 396.439C-83.9766 396.439 227.237 352.986 306.934 165.615C382.727 -12.4381 697.902 -48.5495 697.902 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
<path d="M-83.9766 417.405C-83.9766 417.405 242.442 371.975 326.101 175.691C405.565 -10.9239 736.121 -48.5495 736.121 -48.5495" stroke="#A855F7" stroke-width="4.48062" stroke-miterlimit="10"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -1,25 +0,0 @@
<svg width="219" height="219" viewBox="0 0 219 219" fill="none" xmlns="http://www.w3.org/2000/svg">
<mask id="mask0_1384_30420" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="219" height="219">
<circle cx="109.5" cy="109.5" r="107.99" fill="#C4C4C4" stroke="#F8BB54" stroke-width="3.02069"/>
</mask>
<g mask="url(#mask0_1384_30420)">
<path d="M-63.6362 45.9223C-63.6362 45.9223 -12.6466 36.4769 0.509327 3.41839C13.0912 -28.2719 64.9198 -36.79 64.9198 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 61.8112C-63.6362 61.8112 -1.07997 50.9096 15.0337 11.01C30.3968 -27.0802 93.9243 -36.79 93.9243 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 77.7447C-63.6362 77.7447 10.4424 65.3423 29.5139 18.6898C47.7024 -25.9324 122.929 -36.79 122.929 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 93.634C-63.6362 93.634 22.0089 79.7751 44.0382 26.2814C65.0081 -24.7407 151.934 -36.79 151.934 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 109.523C-63.6362 109.523 33.5754 94.2079 58.5626 33.9169C82.3136 -23.549 180.894 -36.79 180.894 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 125.456C-63.6362 125.456 45.0978 108.685 73.0428 41.5524C99.6633 -22.4016 209.898 -36.79 209.898 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 141.346C-63.6362 141.346 56.6643 123.073 87.5672 49.1883C116.969 -21.2099 238.903 -36.79 238.903 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 157.235C-63.6362 157.235 68.2309 137.506 102.047 56.7799C134.275 -20.0182 267.908 -36.79 267.908 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 173.169C-63.6362 173.169 79.753 151.983 116.572 64.4594C151.58 -18.8707 296.868 -36.79 296.868 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 189.056C-63.6362 189.056 91.3198 166.416 131.052 72.0953C168.886 -17.679 325.873 -36.79 325.873 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 204.99C-63.6362 204.99 102.886 180.848 145.576 79.7308C186.192 -16.4873 354.877 -36.79 354.877 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 220.881C-63.6362 220.881 114.409 195.281 160.057 87.3667C203.497 -15.3396 383.881 -36.79 383.881 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 236.768C-63.6362 236.768 125.975 209.714 174.581 94.9579C220.803 -14.1479 412.885 -36.79 412.885 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 252.701C-63.6362 252.701 137.542 224.147 189.105 102.638C238.108 -12.9562 441.847 -36.79 441.847 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 268.592C-63.6362 268.592 149.064 238.579 203.585 110.229C255.414 -11.8087 470.851 -36.79 470.851 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 284.483C-63.6362 284.483 160.631 253.012 218.11 117.865C272.72 -10.617 499.856 -36.79 499.856 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 300.416C-63.6362 300.416 172.197 267.488 232.59 125.501C290.025 -9.42532 528.86 -36.79 528.86 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
<path d="M-63.6362 316.303C-63.6362 316.303 183.719 281.878 247.114 133.136C307.331 -8.27792 557.822 -36.79 557.822 -36.79" stroke="#A855F7" stroke-width="3.39535" stroke-miterlimit="10"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -1,84 +0,0 @@
<svg width="149" height="199" viewBox="0 0 149 199" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1384_22237)">
<path d="M146.249 198.91C147.707 198.91 148.889 197.728 148.889 196.27C148.889 194.812 147.707 193.63 146.249 193.63C144.791 193.63 143.609 194.812 143.609 196.27C143.609 197.728 144.791 198.91 146.249 198.91Z" fill="#3B82F6"/>
<path d="M122.31 198.91C123.768 198.91 124.95 197.728 124.95 196.27C124.95 194.812 123.768 193.63 122.31 193.63C120.852 193.63 119.67 194.812 119.67 196.27C119.67 197.728 120.852 198.91 122.31 198.91Z" fill="#3B82F6"/>
<path d="M98.3802 198.91C98.9048 198.912 99.4181 198.759 99.8552 198.469C100.292 198.179 100.634 197.765 100.836 197.281C101.038 196.797 101.092 196.264 100.991 195.75C100.889 195.235 100.638 194.762 100.268 194.39C99.8975 194.018 99.4253 193.765 98.911 193.662C98.3967 193.559 97.8633 193.611 97.3785 193.811C96.8937 194.011 96.4793 194.351 96.1876 194.787C95.896 195.223 95.7402 195.736 95.7402 196.26C95.7402 196.961 96.0181 197.634 96.5129 198.131C97.0078 198.627 97.6792 198.908 98.3802 198.91V198.91Z" fill="#3B82F6"/>
<path d="M74.4498 198.91C74.9739 198.91 75.4863 198.755 75.9221 198.464C76.3579 198.173 76.6975 197.759 76.8981 197.274C77.0986 196.79 77.1511 196.257 77.0488 195.743C76.9466 195.229 76.6942 194.757 76.3236 194.387C75.953 194.016 75.4808 193.764 74.9668 193.661C74.4527 193.559 73.9199 193.612 73.4357 193.812C72.9514 194.013 72.5376 194.352 72.2465 194.788C71.9553 195.224 71.7998 195.736 71.7998 196.26C71.7998 196.608 71.8683 196.953 72.0015 197.274C72.1346 197.596 72.3299 197.888 72.5759 198.134C72.822 198.38 73.1142 198.576 73.4357 198.709C73.7572 198.842 74.1018 198.91 74.4498 198.91V198.91Z" fill="#3B82F6"/>
<path d="M50.5101 198.91C51.9681 198.91 53.1501 197.728 53.1501 196.27C53.1501 194.812 51.9681 193.63 50.5101 193.63C49.0521 193.63 47.8701 194.812 47.8701 196.27C47.8701 197.728 49.0521 198.91 50.5101 198.91Z" fill="#3B82F6"/>
<path d="M27.5901 198.595C28.9386 198.041 29.5823 196.498 29.0279 195.15C28.4735 193.801 26.9308 193.157 25.5823 193.712C24.2338 194.266 23.5901 195.809 24.1445 197.157C24.6989 198.506 26.2416 199.15 27.5901 198.595Z" fill="#3B82F6"/>
<path d="M2.65017 193.66C2.1252 193.658 1.61153 193.812 1.17421 194.103C0.736895 194.393 0.395678 194.807 0.193868 195.291C-0.00794293 195.776 -0.0612624 196.31 0.0406694 196.825C0.142601 197.34 0.395167 197.813 0.766377 198.184C1.13759 198.555 1.61065 198.808 2.12563 198.91C2.64061 199.012 3.17433 198.958 3.65896 198.756C4.14359 198.555 4.55737 198.214 4.8478 197.776C5.13822 197.339 5.29216 196.825 5.29018 196.3C5.28755 195.601 5.00858 194.931 4.51406 194.436C4.01953 193.942 3.34953 193.663 2.65017 193.66V193.66Z" fill="#3B82F6"/>
<path d="M146.249 177.5C147.707 177.5 148.889 176.318 148.889 174.86C148.889 173.402 147.707 172.22 146.249 172.22C144.791 172.22 143.609 173.402 143.609 174.86C143.609 176.318 144.791 177.5 146.249 177.5Z" fill="#3B82F6"/>
<path d="M122.31 177.5C123.768 177.5 124.95 176.318 124.95 174.86C124.95 173.402 123.768 172.22 122.31 172.22C120.852 172.22 119.67 173.402 119.67 174.86C119.67 176.318 120.852 177.5 122.31 177.5Z" fill="#3B82F6"/>
<path d="M98.3803 177.5C98.9052 177.502 99.419 177.348 99.8563 177.058C100.294 176.767 100.635 176.354 100.837 175.869C101.038 175.384 101.092 174.851 100.99 174.336C100.888 173.821 100.635 173.348 100.264 172.976C99.893 172.605 99.4198 172.353 98.9048 172.251C98.3898 172.149 97.8562 172.202 97.3716 172.404C96.887 172.606 96.4732 172.947 96.1828 173.384C95.8923 173.821 95.7383 174.335 95.7403 174.86C95.7429 175.56 96.022 176.229 96.5165 176.724C97.011 177.219 97.6809 177.498 98.3803 177.5V177.5Z" fill="#3B82F6"/>
<path d="M74.4498 177.5C74.9744 177.5 75.4871 177.345 75.9231 177.053C76.3591 176.761 76.6988 176.347 76.8991 175.862C77.0993 175.377 77.1512 174.844 77.0481 174.329C76.9451 173.815 76.6917 173.343 76.3201 172.973C75.9485 172.603 75.4753 172.351 74.9606 172.25C74.4459 172.149 73.9128 172.203 73.4287 172.405C72.9447 172.607 72.5316 172.948 72.2416 173.385C71.9516 173.822 71.7978 174.336 71.7998 174.86C71.7998 175.208 71.8684 175.552 72.0017 175.873C72.135 176.194 72.3304 176.485 72.5766 176.73C72.8228 176.976 73.115 177.17 73.4364 177.302C73.7579 177.434 74.1023 177.502 74.4498 177.5V177.5Z" fill="#3B82F6"/>
<path d="M50.5101 177.5C51.9681 177.5 53.1501 176.318 53.1501 174.86C53.1501 173.402 51.9681 172.22 50.5101 172.22C49.0521 172.22 47.8701 173.402 47.8701 174.86C47.8701 176.318 49.0521 177.5 50.5101 177.5Z" fill="#3B82F6"/>
<path d="M27.5921 177.193C28.9406 176.639 29.5843 175.096 29.0299 173.747C28.4754 172.399 26.9328 171.755 25.5843 172.31C24.2358 172.864 23.592 174.407 24.1465 175.755C24.7009 177.104 26.2436 177.747 27.5921 177.193Z" fill="#3B82F6"/>
<path d="M2.65004 177.5C3.17459 177.5 3.68731 177.345 4.12331 177.053C4.55931 176.761 4.89899 176.347 5.09926 175.862C5.29954 175.377 5.3515 174.844 5.24843 174.329C5.14537 173.815 4.89189 173.343 4.52028 172.973C4.14867 172.603 3.67561 172.351 3.16091 172.25C2.6462 172.149 2.11309 172.203 1.62905 172.405C1.145 172.607 0.731771 172.948 0.441791 173.385C0.151812 173.822 -0.00196055 174.336 1.88721e-05 174.86C1.63788e-05 175.208 0.0686259 175.552 0.201923 175.873C0.33522 176.194 0.530667 176.485 0.776874 176.73C1.02308 176.976 1.31528 177.17 1.63674 177.302C1.95819 177.434 2.30251 177.502 2.65004 177.5Z" fill="#3B82F6"/>
<path d="M146.249 156.09C147.707 156.09 148.889 154.908 148.889 153.45C148.889 151.992 147.707 150.81 146.249 150.81C144.791 150.81 143.609 151.992 143.609 153.45C143.609 154.908 144.791 156.09 146.249 156.09Z" fill="#3B82F6"/>
<path d="M122.31 156.09C123.768 156.09 124.95 154.908 124.95 153.45C124.95 151.992 123.768 150.81 122.31 150.81C120.852 150.81 119.67 151.992 119.67 153.45C119.67 154.908 120.852 156.09 122.31 156.09Z" fill="#3B82F6"/>
<path d="M98.3802 156.1C98.9048 156.102 99.4181 155.948 99.8552 155.658C100.292 155.368 100.634 154.955 100.836 154.471C101.038 153.987 101.092 153.454 100.991 152.939C100.889 152.424 100.638 151.951 100.268 151.58C99.8975 151.208 99.4253 150.955 98.911 150.851C98.3967 150.748 97.8633 150.8 97.3785 151.001C96.8937 151.201 96.4793 151.541 96.1876 151.977C95.896 152.413 95.7402 152.925 95.7402 153.45C95.7402 154.151 96.0181 154.823 96.5129 155.32C97.0078 155.817 97.6792 156.097 98.3802 156.1V156.1Z" fill="#3B82F6"/>
<path d="M74.4498 156.1C74.9739 156.1 75.4863 155.944 75.9221 155.653C76.3579 155.362 76.6975 154.948 76.8981 154.464C77.0986 153.98 77.1511 153.447 77.0488 152.933C76.9466 152.419 76.6942 151.947 76.3236 151.576C75.953 151.205 75.4808 150.953 74.9668 150.851C74.4527 150.748 73.9199 150.801 73.4357 151.002C72.9514 151.202 72.5376 151.542 72.2465 151.978C71.9553 152.413 71.7998 152.926 71.7998 153.45C71.7998 153.798 71.8683 154.142 72.0015 154.464C72.1346 154.785 72.3299 155.078 72.5759 155.324C72.822 155.57 73.1142 155.765 73.4357 155.898C73.7572 156.031 74.1018 156.1 74.4498 156.1V156.1Z" fill="#3B82F6"/>
<path d="M50.5101 156.09C51.9681 156.09 53.1501 154.908 53.1501 153.45C53.1501 151.992 51.9681 150.81 50.5101 150.81C49.0521 150.81 47.8701 151.992 47.8701 153.45C47.8701 154.908 49.0521 156.09 50.5101 156.09Z" fill="#3B82F6"/>
<path d="M27.5911 155.791C28.9396 155.237 29.5833 153.694 29.0289 152.346C28.4744 150.997 26.9318 150.354 25.5833 150.908C24.2348 151.463 23.591 153.005 24.1455 154.354C24.6999 155.702 26.2426 156.346 27.5911 155.791Z" fill="#3B82F6"/>
<path d="M2.65002 156.1C3.17414 156.1 3.68652 155.944 4.12231 155.653C4.5581 155.362 4.89769 154.948 5.09827 154.464C5.29884 153.98 5.3514 153.447 5.24915 152.933C5.14689 152.419 4.89453 151.947 4.52393 151.576C4.15332 151.205 3.68104 150.953 3.16699 150.851C2.65294 150.748 2.12021 150.801 1.63599 151.002C1.15176 151.202 0.737841 151.542 0.446655 151.978C0.15547 152.413 0 152.926 0 153.45C0 154.153 0.279274 154.827 0.776245 155.324C1.27322 155.821 1.9472 156.1 2.65002 156.1V156.1Z" fill="#3B82F6"/>
<path d="M146.249 134.69C147.707 134.69 148.889 133.508 148.889 132.05C148.889 130.592 147.707 129.41 146.249 129.41C144.791 129.41 143.609 130.592 143.609 132.05C143.609 133.508 144.791 134.69 146.249 134.69Z" fill="#3B82F6"/>
<path d="M122.31 134.69C123.768 134.69 124.95 133.508 124.95 132.05C124.95 130.592 123.768 129.41 122.31 129.41C120.852 129.41 119.67 130.592 119.67 132.05C119.67 133.508 120.852 134.69 122.31 134.69Z" fill="#3B82F6"/>
<path d="M98.3803 134.66C98.9052 134.662 99.419 134.508 99.8563 134.218C100.294 133.927 100.635 133.514 100.837 133.029C101.038 132.544 101.092 132.011 100.99 131.496C100.888 130.981 100.635 130.508 100.264 130.137C99.893 129.765 99.4198 129.513 98.9048 129.411C98.3898 129.309 97.8562 129.362 97.3716 129.564C96.887 129.766 96.4732 130.107 96.1828 130.544C95.8923 130.982 95.7383 131.495 95.7403 132.02C95.7429 132.72 96.022 133.39 96.5165 133.884C97.011 134.379 97.6809 134.658 98.3803 134.66V134.66Z" fill="#3B82F6"/>
<path d="M74.4498 134.66C74.9744 134.66 75.4871 134.505 75.9231 134.213C76.3591 133.921 76.6988 133.507 76.8991 133.022C77.0993 132.537 77.1512 132.004 77.0481 131.49C76.9451 130.975 76.6917 130.503 76.3201 130.133C75.9485 129.763 75.4753 129.511 74.9606 129.41C74.4459 129.309 73.9128 129.363 73.4287 129.565C72.9447 129.767 72.5316 130.108 72.2416 130.545C71.9516 130.982 71.7978 131.496 71.7998 132.02C71.7998 132.368 71.8684 132.712 72.0017 133.033C72.135 133.354 72.3304 133.645 72.5766 133.891C72.8228 134.136 73.115 134.33 73.4364 134.462C73.7579 134.594 74.1023 134.662 74.4498 134.66V134.66Z" fill="#3B82F6"/>
<path d="M50.5101 134.69C51.9681 134.69 53.1501 133.508 53.1501 132.05C53.1501 130.592 51.9681 129.41 50.5101 129.41C49.0521 129.41 47.8701 130.592 47.8701 132.05C47.8701 133.508 49.0521 134.69 50.5101 134.69Z" fill="#3B82F6"/>
<path d="M27.594 134.389C28.9425 133.835 29.5863 132.292 29.0318 130.944C28.4774 129.595 26.9347 128.951 25.5862 129.506C24.2377 130.06 23.594 131.603 24.1484 132.951C24.7029 134.3 26.2455 134.944 27.594 134.389Z" fill="#3B82F6"/>
<path d="M2.65004 134.66C3.17459 134.66 3.68731 134.505 4.12331 134.213C4.55931 133.921 4.89899 133.507 5.09926 133.022C5.29954 132.537 5.3515 132.004 5.24843 131.49C5.14537 130.975 4.89189 130.503 4.52028 130.133C4.14867 129.763 3.67561 129.511 3.16091 129.41C2.6462 129.309 2.11309 129.363 1.62905 129.565C1.145 129.767 0.731771 130.108 0.441791 130.545C0.151812 130.982 -0.00196055 131.496 1.88721e-05 132.02C1.63788e-05 132.368 0.0686259 132.712 0.201923 133.033C0.33522 133.354 0.530667 133.645 0.776874 133.891C1.02308 134.136 1.31528 134.33 1.63674 134.462C1.95819 134.594 2.30251 134.662 2.65004 134.66V134.66Z" fill="#3B82F6"/>
<path d="M146.249 113.28C147.707 113.28 148.889 112.098 148.889 110.64C148.889 109.182 147.707 108 146.249 108C144.791 108 143.609 109.182 143.609 110.64C143.609 112.098 144.791 113.28 146.249 113.28Z" fill="#3B82F6"/>
<path d="M122.31 113.28C123.768 113.28 124.95 112.098 124.95 110.64C124.95 109.182 123.768 108 122.31 108C120.852 108 119.67 109.182 119.67 110.64C119.67 112.098 120.852 113.28 122.31 113.28Z" fill="#3B82F6"/>
<path d="M98.3802 113.29C98.9048 113.292 99.4181 113.139 99.8552 112.849C100.292 112.559 100.634 112.145 100.836 111.661C101.038 111.177 101.092 110.644 100.991 110.129C100.889 109.615 100.638 109.142 100.268 108.77C99.8975 108.398 99.4253 108.145 98.911 108.042C98.3967 107.939 97.8633 107.991 97.3785 108.191C96.8937 108.391 96.4793 108.731 96.1876 109.167C95.896 109.603 95.7402 110.116 95.7402 110.64C95.7402 111.341 96.0181 112.014 96.5129 112.511C97.0078 113.007 97.6792 113.288 98.3802 113.29V113.29Z" fill="#3B82F6"/>
<path d="M74.4498 113.29C74.9739 113.29 75.4863 113.135 75.9221 112.844C76.3579 112.552 76.6975 112.139 76.8981 111.654C77.0986 111.17 77.1511 110.637 77.0488 110.123C76.9466 109.609 76.6942 109.137 76.3236 108.766C75.953 108.396 75.4808 108.143 74.9668 108.041C74.4527 107.939 73.9199 107.991 73.4357 108.192C72.9514 108.393 72.5376 108.732 72.2465 109.168C71.9553 109.604 71.7998 110.116 71.7998 110.64C71.7998 110.988 71.8683 111.333 72.0015 111.654C72.1346 111.976 72.3299 112.268 72.5759 112.514C72.822 112.76 73.1142 112.955 73.4357 113.089C73.7572 113.222 74.1018 113.29 74.4498 113.29V113.29Z" fill="#3B82F6"/>
<path d="M50.5101 113.28C51.9681 113.28 53.1501 112.098 53.1501 110.64C53.1501 109.182 51.9681 108 50.5101 108C49.0521 108 47.8701 109.182 47.8701 110.64C47.8701 112.098 49.0521 113.28 50.5101 113.28Z" fill="#3B82F6"/>
<path d="M27.592 112.977C28.9406 112.423 29.5843 110.88 29.0298 109.531C28.4754 108.183 26.9328 107.539 25.5843 108.094C24.2358 108.648 23.592 110.191 24.1465 111.539C24.7009 112.888 26.2435 113.532 27.592 112.977Z" fill="#3B82F6"/>
<path d="M2.65002 113.29C3.17414 113.29 3.68652 113.135 4.12231 112.844C4.5581 112.552 4.89769 112.139 5.09827 111.654C5.29884 111.17 5.3514 110.637 5.24915 110.123C5.14689 109.609 4.89453 109.137 4.52393 108.766C4.15332 108.396 3.68104 108.143 3.16699 108.041C2.65294 107.939 2.12021 107.991 1.63599 108.192C1.15176 108.393 0.737841 108.732 0.446655 109.168C0.15547 109.604 0 110.116 0 110.64C0 111.343 0.279274 112.017 0.776245 112.514C1.27322 113.011 1.9472 113.29 2.65002 113.29V113.29Z" fill="#3B82F6"/>
</g>
<g clip-path="url(#clip1_1384_22237)">
<path d="M146.249 90.9099C147.707 90.9099 148.889 89.7279 148.889 88.2699C148.889 86.8119 147.707 85.6299 146.249 85.6299C144.791 85.6299 143.609 86.8119 143.609 88.2699C143.609 89.7279 144.791 90.9099 146.249 90.9099Z" fill="#3B82F6"/>
<path d="M122.31 90.9099C123.768 90.9099 124.95 89.7279 124.95 88.2699C124.95 86.8119 123.768 85.6299 122.31 85.6299C120.852 85.6299 119.67 86.8119 119.67 88.2699C119.67 89.7279 120.852 90.9099 122.31 90.9099Z" fill="#3B82F6"/>
<path d="M98.3802 90.9104C98.9048 90.9123 99.4181 90.7586 99.8552 90.4686C100.292 90.1787 100.634 89.7654 100.836 89.2814C101.038 88.7973 101.092 88.2642 100.991 87.7495C100.889 87.2348 100.638 86.7617 100.268 86.3901C99.8975 86.0185 99.4253 85.7651 98.911 85.662C98.3967 85.5589 97.8633 85.6108 97.3785 85.8111C96.8937 86.0114 96.4793 86.3511 96.1876 86.7871C95.896 87.2231 95.7402 87.7358 95.7402 88.2603C95.7402 88.9614 96.0181 89.6339 96.5129 90.1306C97.0078 90.6273 97.6792 90.9077 98.3802 90.9104V90.9104Z" fill="#3B82F6"/>
<path d="M74.4498 90.9104C74.9739 90.9104 75.4863 90.7549 75.9221 90.4638C76.3579 90.1726 76.6975 89.7587 76.8981 89.2745C77.0986 88.7903 77.1511 88.2574 77.0488 87.7434C76.9466 87.2293 76.6942 86.7572 76.3236 86.3865C75.953 86.0159 75.4808 85.7635 74.9668 85.6613C74.4527 85.559 73.9199 85.6115 73.4357 85.8121C72.9514 86.0127 72.5376 86.3523 72.2465 86.7881C71.9553 87.2239 71.7998 87.7362 71.7998 88.2603C71.7998 88.6083 71.8683 88.953 72.0015 89.2745C72.1346 89.596 72.3299 89.8881 72.5759 90.1342C72.822 90.3802 73.1142 90.5755 73.4357 90.7087C73.7572 90.8419 74.1018 90.9104 74.4498 90.9104V90.9104Z" fill="#3B82F6"/>
<path d="M50.5101 90.9099C51.9681 90.9099 53.1501 89.7279 53.1501 88.2699C53.1501 86.8119 51.9681 85.6299 50.5101 85.6299C49.0521 85.6299 47.8701 86.8119 47.8701 88.2699C47.8701 89.7279 49.0521 90.9099 50.5101 90.9099Z" fill="#3B82F6"/>
<path d="M27.5901 90.5952C28.9386 90.0408 29.5823 88.4982 29.0279 87.1497C28.4735 85.8012 26.9308 85.1575 25.5823 85.7119C24.2338 86.2664 23.5901 87.809 24.1445 89.1575C24.6989 90.506 26.2416 91.1497 27.5901 90.5952Z" fill="#3B82F6"/>
<path d="M2.65017 85.6602C2.1252 85.6582 1.61153 85.8122 1.17421 86.1026C0.736895 86.393 0.395678 86.8068 0.193868 87.2915C-0.00794293 87.7761 -0.0612624 88.3097 0.0406694 88.8247C0.142601 89.3397 0.395167 89.8128 0.766377 90.184C1.13759 90.5552 1.61065 90.8078 2.12563 90.9097C2.64061 91.0116 3.17433 90.9583 3.65896 90.7565C4.14359 90.5547 4.55737 90.2135 4.8478 89.7762C5.13822 89.3389 5.29216 88.8252 5.29018 88.3002C5.28755 87.6008 5.00858 86.9308 4.51406 86.4363C4.01953 85.9418 3.34953 85.6628 2.65017 85.6602V85.6602Z" fill="#3B82F6"/>
<path d="M146.249 69.4997C147.707 69.4997 148.889 68.3178 148.889 66.8597C148.889 65.4017 147.707 64.2197 146.249 64.2197C144.791 64.2197 143.609 65.4017 143.609 66.8597C143.609 68.3178 144.791 69.4997 146.249 69.4997Z" fill="#3B82F6"/>
<path d="M122.31 69.4997C123.768 69.4997 124.95 68.3178 124.95 66.8597C124.95 65.4017 123.768 64.2197 122.31 64.2197C120.852 64.2197 119.67 65.4017 119.67 66.8597C119.67 68.3178 120.852 69.4997 122.31 69.4997Z" fill="#3B82F6"/>
<path d="M98.3803 69.5002C98.9052 69.5022 99.419 69.3482 99.8563 69.0578C100.294 68.7673 100.635 68.3535 100.837 67.8689C101.038 67.3843 101.092 66.8506 100.99 66.3357C100.888 65.8207 100.635 65.3475 100.264 64.9763C99.893 64.6051 99.4198 64.3526 98.9048 64.2506C98.3898 64.1487 97.8562 64.202 97.3716 64.4038C96.887 64.6056 96.4732 64.9469 96.1828 65.3842C95.8923 65.8215 95.7383 66.3352 95.7403 66.8602C95.7429 67.5595 96.022 68.2295 96.5165 68.724C97.011 69.2185 97.6809 69.4976 98.3803 69.5002V69.5002Z" fill="#3B82F6"/>
<path d="M74.4498 69.5002C74.9744 69.5002 75.4871 69.3445 75.9231 69.0529C76.3591 68.7612 76.6988 68.3468 76.8991 67.862C77.0993 67.3772 77.1512 66.8438 77.0481 66.3295C76.9451 65.8152 76.6917 65.343 76.3201 64.9728C75.9485 64.6026 75.4753 64.351 74.9606 64.2499C74.4459 64.1488 73.9128 64.2027 73.4287 64.4048C72.9447 64.6069 72.5316 64.9481 72.2416 65.3852C71.9516 65.8223 71.7978 66.3356 71.7998 66.8602C71.7998 67.2077 71.8684 67.5518 72.0017 67.8728C72.135 68.1937 72.3304 68.4852 72.5766 68.7305C72.8228 68.9758 73.115 69.17 73.4364 69.3021C73.7579 69.4342 74.1023 69.5015 74.4498 69.5002V69.5002Z" fill="#3B82F6"/>
<path d="M50.5101 69.4997C51.9681 69.4997 53.1501 68.3178 53.1501 66.8597C53.1501 65.4017 51.9681 64.2197 50.5101 64.2197C49.0521 64.2197 47.8701 65.4017 47.8701 66.8597C47.8701 68.3178 49.0521 69.4997 50.5101 69.4997Z" fill="#3B82F6"/>
<path d="M27.5921 69.193C28.9406 68.6385 29.5843 67.0959 29.0299 65.7474C28.4754 64.3989 26.9328 63.7551 25.5843 64.3096C24.2358 64.864 23.592 66.4067 24.1465 67.7552C24.7009 69.1037 26.2436 69.7474 27.5921 69.193Z" fill="#3B82F6"/>
<path d="M2.65004 69.5002C3.17459 69.5002 3.68731 69.3445 4.12331 69.0529C4.55931 68.7612 4.89899 68.3468 5.09926 67.862C5.29954 67.3772 5.3515 66.8438 5.24843 66.3295C5.14537 65.8152 4.89189 65.343 4.52028 64.9728C4.14867 64.6026 3.67561 64.351 3.16091 64.2499C2.6462 64.1488 2.11309 64.2027 1.62905 64.4048C1.145 64.6069 0.731771 64.9481 0.441791 65.3852C0.151812 65.8223 -0.00196055 66.3356 1.88721e-05 66.8602C1.63788e-05 67.2077 0.0686259 67.5518 0.201923 67.8728C0.33522 68.1937 0.530667 68.4852 0.776874 68.7305C1.02308 68.9758 1.31528 69.17 1.63674 69.3021C1.95819 69.4342 2.30251 69.5015 2.65004 69.5002Z" fill="#3B82F6"/>
<path d="M146.249 48.0896C147.707 48.0896 148.889 46.9076 148.889 45.4496C148.889 43.9915 147.707 42.8096 146.249 42.8096C144.791 42.8096 143.609 43.9915 143.609 45.4496C143.609 46.9076 144.791 48.0896 146.249 48.0896Z" fill="#3B82F6"/>
<path d="M122.31 48.0896C123.768 48.0896 124.95 46.9076 124.95 45.4496C124.95 43.9915 123.768 42.8096 122.31 42.8096C120.852 42.8096 119.67 43.9915 119.67 45.4496C119.67 46.9076 120.852 48.0896 122.31 48.0896Z" fill="#3B82F6"/>
<path d="M98.3802 48.0998C98.9048 48.1018 99.4181 47.9481 99.8552 47.6581C100.292 47.3681 100.634 46.9549 100.836 46.4708C101.038 45.9868 101.092 45.4537 100.991 44.939C100.889 44.4243 100.638 43.9512 100.268 43.5795C99.8975 43.2079 99.4253 42.9545 98.911 42.8515C98.3967 42.7484 97.8633 42.8003 97.3785 43.0006C96.8937 43.2008 96.4793 43.5405 96.1876 43.9765C95.896 44.4125 95.7402 44.9252 95.7402 45.4498C95.7402 46.1509 96.0181 46.8234 96.5129 47.3201C97.0078 47.8168 97.6792 48.0972 98.3802 48.0998V48.0998Z" fill="#3B82F6"/>
<path d="M74.4498 48.0998C74.9739 48.0998 75.4863 47.9444 75.9221 47.6532C76.3579 47.362 76.6975 46.9482 76.8981 46.4639C77.0986 45.9797 77.1511 45.4469 77.0488 44.9328C76.9466 44.4188 76.6942 43.9465 76.3236 43.5759C75.953 43.2053 75.4808 42.953 74.9668 42.8507C74.4527 42.7485 73.9199 42.801 73.4357 43.0015C72.9514 43.2021 72.5376 43.5418 72.2465 43.9776C71.9553 44.4133 71.7998 44.9257 71.7998 45.4498C71.7998 45.7978 71.8683 46.1424 72.0015 46.4639C72.1346 46.7855 72.3299 47.0775 72.5759 47.3236C72.822 47.5697 73.1142 47.7649 73.4357 47.8981C73.7572 48.0313 74.1018 48.0998 74.4498 48.0998V48.0998Z" fill="#3B82F6"/>
<path d="M50.5101 48.0896C51.9681 48.0896 53.1501 46.9076 53.1501 45.4496C53.1501 43.9915 51.9681 42.8096 50.5101 42.8096C49.0521 42.8096 47.8701 43.9915 47.8701 45.4496C47.8701 46.9076 49.0521 48.0896 50.5101 48.0896Z" fill="#3B82F6"/>
<path d="M27.5911 47.7915C28.9396 47.237 29.5833 45.6944 29.0289 44.3459C28.4744 42.9974 26.9318 42.3537 25.5833 42.9081C24.2348 43.4626 23.591 45.0052 24.1455 46.3537C24.6999 47.7022 26.2426 48.3459 27.5911 47.7915Z" fill="#3B82F6"/>
<path d="M2.65002 48.0998C3.17414 48.0998 3.68652 47.9444 4.12231 47.6532C4.5581 47.362 4.89769 46.9482 5.09827 46.4639C5.29884 45.9797 5.3514 45.4469 5.24915 44.9328C5.14689 44.4188 4.89453 43.9465 4.52393 43.5759C4.15332 43.2053 3.68104 42.953 3.16699 42.8507C2.65294 42.7485 2.12021 42.801 1.63599 43.0015C1.15176 43.2021 0.737841 43.5418 0.446655 43.9776C0.15547 44.4133 0 44.9257 0 45.4498C0 46.1526 0.279274 46.8266 0.776245 47.3236C1.27322 47.8206 1.9472 48.0998 2.65002 48.0998V48.0998Z" fill="#3B82F6"/>
<path d="M146.249 26.6902C147.707 26.6902 148.889 25.5082 148.889 24.0502C148.889 22.5921 147.707 21.4102 146.249 21.4102C144.791 21.4102 143.609 22.5921 143.609 24.0502C143.609 25.5082 144.791 26.6902 146.249 26.6902Z" fill="#3B82F6"/>
<path d="M122.31 26.6902C123.768 26.6902 124.95 25.5082 124.95 24.0502C124.95 22.5921 123.768 21.4102 122.31 21.4102C120.852 21.4102 119.67 22.5921 119.67 24.0502C119.67 25.5082 120.852 26.6902 122.31 26.6902Z" fill="#3B82F6"/>
<path d="M98.3803 26.6604C98.9052 26.6623 99.419 26.5083 99.8563 26.2179C100.294 25.9275 100.635 25.5137 100.837 25.0291C101.038 24.5444 101.092 24.0108 100.99 23.4958C100.888 22.9808 100.635 22.5078 100.264 22.1366C99.893 21.7653 99.4198 21.5127 98.9048 21.4108C98.3898 21.3089 97.8562 21.3622 97.3716 21.564C96.887 21.7658 96.4732 22.107 96.1828 22.5443C95.8923 22.9817 95.7383 23.4954 95.7403 24.0203C95.7429 24.7197 96.022 25.3897 96.5165 25.8842C97.011 26.3788 97.6809 26.6577 98.3803 26.6604V26.6604Z" fill="#3B82F6"/>
<path d="M74.4498 26.6604C74.9744 26.6604 75.4871 26.5047 75.9231 26.213C76.3591 25.9214 76.6988 25.507 76.8991 25.0222C77.0993 24.5374 77.1512 24.004 77.0481 23.4897C76.9451 22.9754 76.6917 22.5032 76.3201 22.133C75.9485 21.7628 75.4753 21.5112 74.9606 21.4101C74.4459 21.3089 73.9128 21.3629 73.4287 21.565C72.9447 21.7671 72.5316 22.1083 72.2416 22.5454C71.9516 22.9825 71.7978 23.4958 71.7998 24.0203C71.7998 24.3679 71.8684 24.712 72.0017 25.033C72.135 25.3539 72.3304 25.6454 72.5766 25.8906C72.8228 26.1359 73.115 26.3302 73.4364 26.4623C73.7579 26.5944 74.1023 26.6617 74.4498 26.6604V26.6604Z" fill="#3B82F6"/>
<path d="M50.5101 26.6902C51.9681 26.6902 53.1501 25.5082 53.1501 24.0502C53.1501 22.5921 51.9681 21.4102 50.5101 21.4102C49.0521 21.4102 47.8701 22.5921 47.8701 24.0502C47.8701 25.5082 49.0521 26.6902 50.5101 26.6902Z" fill="#3B82F6"/>
<path d="M27.594 26.3892C28.9425 25.8348 29.5863 24.2922 29.0318 22.9437C28.4774 21.5952 26.9347 20.9514 25.5862 21.5059C24.2377 22.0603 23.594 23.603 24.1484 24.9515C24.7029 26.3 26.2455 26.9437 27.594 26.3892Z" fill="#3B82F6"/>
<path d="M2.65004 26.6604C3.17459 26.6604 3.68731 26.5047 4.12331 26.213C4.55931 25.9214 4.89899 25.507 5.09926 25.0222C5.29954 24.5374 5.3515 24.004 5.24843 23.4897C5.14537 22.9754 4.89189 22.5032 4.52028 22.133C4.14867 21.7628 3.67561 21.5112 3.16091 21.4101C2.6462 21.3089 2.11309 21.3629 1.62905 21.565C1.145 21.7671 0.731771 22.1083 0.441791 22.5454C0.151812 22.9825 -0.00196055 23.4958 1.88721e-05 24.0203C1.63788e-05 24.3679 0.0686259 24.712 0.201923 25.033C0.33522 25.3539 0.530667 25.6454 0.776874 25.8906C1.02308 26.1359 1.31528 26.3302 1.63674 26.4623C1.95819 26.5944 2.30251 26.6617 2.65004 26.6604V26.6604Z" fill="#3B82F6"/>
<path d="M146.249 5.28C147.707 5.28 148.889 4.09803 148.889 2.64C148.889 1.18197 147.707 0 146.249 0C144.791 0 143.609 1.18197 143.609 2.64C143.609 4.09803 144.791 5.28 146.249 5.28Z" fill="#3B82F6"/>
<path d="M122.31 5.28C123.768 5.28 124.95 4.09803 124.95 2.64C124.95 1.18197 123.768 0 122.31 0C120.852 0 119.67 1.18197 119.67 2.64C119.67 4.09803 120.852 5.28 122.31 5.28Z" fill="#3B82F6"/>
<path d="M98.3802 5.29024C98.9048 5.29222 99.4181 5.13851 99.8552 4.84853C100.292 4.55855 100.634 4.14532 100.836 3.66127C101.038 3.17723 101.092 2.64412 100.991 2.12941C100.889 1.61471 100.638 1.14159 100.268 0.769978C99.8975 0.398368 99.4253 0.144953 98.911 0.0418894C98.3967 -0.0611745 97.8633 -0.00927669 97.3785 0.190998C96.8937 0.391273 96.4793 0.730946 96.1876 1.16695C95.896 1.60295 95.7402 2.11567 95.7402 2.64022C95.7402 3.34131 96.0181 4.01383 96.5129 4.51052C97.0078 5.0072 97.6792 5.2876 98.3802 5.29024V5.29024Z" fill="#3B82F6"/>
<path d="M74.4498 5.29023C74.9739 5.29023 75.4863 5.13483 75.9221 4.84364C76.3579 4.55245 76.6975 4.13859 76.8981 3.65437C77.0986 3.17015 77.1511 2.63729 77.0488 2.12324C76.9466 1.60919 76.6942 1.13698 76.3236 0.76637C75.953 0.395761 75.4808 0.143401 74.9668 0.04115C74.4527 -0.0611008 73.9199 -0.00860433 73.4357 0.191968C72.9514 0.39254 72.5376 0.732191 72.2465 1.16798C71.9553 1.60377 71.7998 2.11609 71.7998 2.64021C71.7998 2.98821 71.8683 3.33286 72.0015 3.65437C72.1346 3.97588 72.3299 4.26798 72.5759 4.51405C72.822 4.76013 73.1142 4.95534 73.4357 5.08851C73.7572 5.22169 74.1018 5.29023 74.4498 5.29023V5.29023Z" fill="#3B82F6"/>
<path d="M50.5101 5.28C51.9681 5.28 53.1501 4.09803 53.1501 2.64C53.1501 1.18197 51.9681 0 50.5101 0C49.0521 0 47.8701 1.18197 47.8701 2.64C47.8701 4.09803 49.0521 5.28 50.5101 5.28Z" fill="#3B82F6"/>
<path d="M27.592 4.97708C28.9406 4.42265 29.5843 2.87999 29.0298 1.53149C28.4754 0.182988 26.9328 -0.460681 25.5843 0.0937553C24.2358 0.648191 23.592 2.19079 24.1465 3.53929C24.7009 4.88779 26.2435 5.53152 27.592 4.97708Z" fill="#3B82F6"/>
<path d="M2.65002 5.29023C3.17414 5.29023 3.68652 5.13483 4.12231 4.84364C4.5581 4.55245 4.89769 4.13859 5.09827 3.65437C5.29884 3.17015 5.3514 2.63729 5.24915 2.12324C5.14689 1.60919 4.89453 1.13698 4.52393 0.76637C4.15332 0.395761 3.68104 0.143401 3.16699 0.04115C2.65294 -0.0611008 2.12021 -0.00860433 1.63599 0.191968C1.15176 0.39254 0.737841 0.732191 0.446655 1.16798C0.15547 1.60377 0 2.11609 0 2.64021C0 3.34303 0.279274 4.01708 0.776245 4.51405C1.27322 5.01102 1.9472 5.29023 2.65002 5.29023V5.29023Z" fill="#3B82F6"/>
</g>
<defs>
<clipPath id="clip0_1384_22237">
<rect width="148.89" height="90.91" fill="white" transform="translate(0 108)"/>
</clipPath>
<clipPath id="clip1_1384_22237">
<rect width="148.89" height="90.91" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -1,44 +0,0 @@
<svg width="149" height="91" viewBox="0 0 149 91" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_623_24537)">
<path d="M146.25 90.91C147.708 90.91 148.89 89.728 148.89 88.27C148.89 86.812 147.708 85.63 146.25 85.63C144.792 85.63 143.61 86.812 143.61 88.27C143.61 89.728 144.792 90.91 146.25 90.91Z" fill="#2AD168"/>
<path d="M122.31 90.91C123.768 90.91 124.95 89.728 124.95 88.27C124.95 86.812 123.768 85.63 122.31 85.63C120.852 85.63 119.67 86.812 119.67 88.27C119.67 89.728 120.852 90.91 122.31 90.91Z" fill="#2AD168"/>
<path d="M98.3798 90.91C98.9043 90.912 99.4176 90.7583 99.8547 90.4683C100.292 90.1783 100.633 89.7651 100.835 89.2811C101.037 88.797 101.091 88.2639 100.99 87.7492C100.889 87.2345 100.637 86.7614 100.267 86.3898C99.897 86.0181 99.4248 85.7647 98.9105 85.6617C98.3962 85.5586 97.8629 85.6105 97.3781 85.8108C96.8932 86.0111 96.4788 86.3507 96.1871 86.7867C95.8955 87.2227 95.7397 87.7355 95.7397 88.26C95.7397 88.9611 96.0176 89.6336 96.5125 90.1303C97.0073 90.627 97.6787 90.9074 98.3798 90.91V90.91Z" fill="#2AD168"/>
<path d="M74.4498 90.91C74.9739 90.91 75.4863 90.7546 75.9221 90.4634C76.3579 90.1722 76.6975 89.7584 76.8981 89.2742C77.0986 88.7899 77.1511 88.2571 77.0488 87.743C76.9466 87.229 76.6942 86.7568 76.3236 86.3862C75.953 86.0156 75.4808 85.7632 74.9668 85.6609C74.4527 85.5587 73.9199 85.6112 73.4357 85.8117C72.9514 86.0123 72.5376 86.352 72.2465 86.7878C71.9553 87.2236 71.7998 87.7359 71.7998 88.26C71.7998 88.608 71.8683 88.9526 72.0015 89.2742C72.1346 89.5957 72.3299 89.8878 72.5759 90.1338C72.822 90.3799 73.1142 90.5752 73.4357 90.7084C73.7572 90.8415 74.1018 90.91 74.4498 90.91V90.91Z" fill="#2AD168"/>
<path d="M50.5101 90.91C51.9681 90.91 53.1501 89.728 53.1501 88.27C53.1501 86.812 51.9681 85.63 50.5101 85.63C49.0521 85.63 47.8701 86.812 47.8701 88.27C47.8701 89.728 49.0521 90.91 50.5101 90.91Z" fill="#2AD168"/>
<path d="M27.5901 90.5955C28.9386 90.0411 29.5823 88.4984 29.0279 87.1499C28.4735 85.8014 26.9308 85.1578 25.5823 85.7122C24.2338 86.2666 23.5901 87.8092 24.1445 89.1577C24.6989 90.5062 26.2416 91.15 27.5901 90.5955Z" fill="#2AD168"/>
<path d="M2.65017 85.66C2.1252 85.658 1.61153 85.812 1.17421 86.1025C0.736895 86.3929 0.395678 86.8067 0.193868 87.2913C-0.00794293 87.7759 -0.0612624 88.3096 0.0406694 88.8246C0.142601 89.3396 0.395167 89.8126 0.766377 90.1838C1.13759 90.555 1.61065 90.8076 2.12563 90.9095C2.64061 91.0115 3.17433 90.9581 3.65896 90.7563C4.14359 90.5545 4.55737 90.2134 4.8478 89.7761C5.13822 89.3387 5.29216 88.825 5.29018 88.3C5.28755 87.6007 5.00858 86.9307 4.51406 86.4361C4.01953 85.9416 3.34953 85.6627 2.65017 85.66V85.66Z" fill="#2AD168"/>
<path d="M146.25 69.5C147.708 69.5 148.89 68.318 148.89 66.86C148.89 65.402 147.708 64.22 146.25 64.22C144.792 64.22 143.61 65.402 143.61 66.86C143.61 68.318 144.792 69.5 146.25 69.5Z" fill="#2AD168"/>
<path d="M122.31 69.5C123.768 69.5 124.95 68.318 124.95 66.86C124.95 65.402 123.768 64.22 122.31 64.22C120.852 64.22 119.67 65.402 119.67 66.86C119.67 68.318 120.852 69.5 122.31 69.5Z" fill="#2AD168"/>
<path d="M98.3798 69.5001C98.9047 69.502 99.4185 69.348 99.8559 69.0576C100.293 68.7672 100.634 68.3534 100.836 67.8688C101.038 67.3841 101.091 66.8505 100.989 66.3355C100.887 65.8205 100.635 65.3474 100.264 64.9762C99.8925 64.605 99.4193 64.3524 98.9043 64.2505C98.3893 64.1485 97.8557 64.2019 97.3711 64.4037C96.8865 64.6055 96.4727 64.9467 96.1823 65.384C95.8918 65.8213 95.7378 66.3351 95.7398 66.86C95.7424 67.5594 96.0215 68.2293 96.516 68.7239C97.0105 69.2184 97.6804 69.4974 98.3798 69.5001V69.5001Z" fill="#2AD168"/>
<path d="M74.4498 69.5001C74.9744 69.5 75.4871 69.3444 75.9231 69.0527C76.3591 68.7611 76.6988 68.3466 76.8991 67.8618C77.0993 67.377 77.1512 66.8437 77.0481 66.3293C76.9451 65.815 76.6917 65.3429 76.3201 64.9726C75.9485 64.6024 75.4753 64.3509 74.9606 64.2497C74.4459 64.1486 73.9128 64.2025 73.4287 64.4047C72.9447 64.6068 72.5316 64.948 72.2416 65.3851C71.9516 65.8222 71.7978 66.3355 71.7998 66.86C71.7998 67.2076 71.8684 67.5517 72.0017 67.8726C72.135 68.1936 72.3304 68.4851 72.5766 68.7303C72.8228 68.9756 73.115 69.1698 73.4364 69.3019C73.7579 69.434 74.1023 69.5014 74.4498 69.5001V69.5001Z" fill="#2AD168"/>
<path d="M50.5101 69.5C51.9681 69.5 53.1501 68.318 53.1501 66.86C53.1501 65.402 51.9681 64.22 50.5101 64.22C49.0521 64.22 47.8701 65.402 47.8701 66.86C47.8701 68.318 49.0521 69.5 50.5101 69.5Z" fill="#2AD168"/>
<path d="M27.5926 69.1932C28.9411 68.6387 29.5848 67.0961 29.0304 65.7476C28.4759 64.3991 26.9333 63.7554 25.5848 64.3098C24.2363 64.8642 23.5925 66.4069 24.147 67.7554C24.7014 69.1039 26.2441 69.7476 27.5926 69.1932Z" fill="#2AD168"/>
<path d="M2.65004 69.5001C3.17459 69.5 3.68731 69.3444 4.12331 69.0527C4.55931 68.7611 4.89899 68.3466 5.09926 67.8618C5.29954 67.377 5.3515 66.8437 5.24843 66.3293C5.14537 65.815 4.89189 65.3429 4.52028 64.9726C4.14867 64.6024 3.67561 64.3509 3.16091 64.2497C2.6462 64.1486 2.11309 64.2025 1.62905 64.4047C1.145 64.6068 0.731771 64.948 0.441791 65.3851C0.151812 65.8222 -0.00196055 66.3355 1.88721e-05 66.86C1.63788e-05 67.2076 0.0686259 67.5517 0.201923 67.8726C0.33522 68.1936 0.530667 68.4851 0.776874 68.7303C1.02308 68.9756 1.31528 69.1698 1.63674 69.3019C1.95819 69.434 2.30251 69.5014 2.65004 69.5001Z" fill="#2AD168"/>
<path d="M146.25 48.09C147.708 48.09 148.89 46.908 148.89 45.45C148.89 43.992 147.708 42.81 146.25 42.81C144.792 42.81 143.61 43.992 143.61 45.45C143.61 46.908 144.792 48.09 146.25 48.09Z" fill="#2AD168"/>
<path d="M122.31 48.09C123.768 48.09 124.95 46.908 124.95 45.45C124.95 43.992 123.768 42.81 122.31 42.81C120.852 42.81 119.67 43.992 119.67 45.45C119.67 46.908 120.852 48.09 122.31 48.09Z" fill="#2AD168"/>
<path d="M98.3798 48.1C98.9043 48.102 99.4176 47.9483 99.8547 47.6583C100.292 47.3683 100.633 46.9551 100.835 46.4711C101.037 45.987 101.091 45.4539 100.99 44.9392C100.889 44.4245 100.637 43.9514 100.267 43.5798C99.897 43.2082 99.4248 42.9547 98.9105 42.8517C98.3962 42.7486 97.8629 42.8005 97.3781 43.0008C96.8932 43.2011 96.4788 43.5407 96.1871 43.9767C95.8955 44.4127 95.7397 44.9255 95.7397 45.45C95.7397 46.1511 96.0176 46.8236 96.5125 47.3203C97.0073 47.817 97.6787 48.0974 98.3798 48.1V48.1Z" fill="#2AD168"/>
<path d="M74.4498 48.1C74.9739 48.1 75.4863 47.9446 75.9221 47.6534C76.3579 47.3622 76.6975 46.9484 76.8981 46.4642C77.0986 45.9799 77.1511 45.4471 77.0488 44.933C76.9466 44.419 76.6942 43.9468 76.3236 43.5762C75.953 43.2055 75.4808 42.9532 74.9668 42.8509C74.4527 42.7487 73.9199 42.8012 73.4357 43.0018C72.9514 43.2023 72.5376 43.542 72.2465 43.9778C71.9553 44.4136 71.7998 44.9259 71.7998 45.45C71.7998 45.798 71.8683 46.1426 72.0015 46.4642C72.1346 46.7857 72.3299 47.0778 72.5759 47.3238C72.822 47.5699 73.1142 47.7651 73.4357 47.8983C73.7572 48.0315 74.1018 48.1 74.4498 48.1V48.1Z" fill="#2AD168"/>
<path d="M50.5101 48.09C51.9681 48.09 53.1501 46.908 53.1501 45.45C53.1501 43.992 51.9681 42.81 50.5101 42.81C49.0521 42.81 47.8701 43.992 47.8701 45.45C47.8701 46.908 49.0521 48.09 50.5101 48.09Z" fill="#2AD168"/>
<path d="M27.5911 47.7915C28.9396 47.2371 29.5833 45.6944 29.0289 44.3459C28.4744 42.9974 26.9318 42.3537 25.5833 42.9082C24.2348 43.4626 23.591 45.0052 24.1455 46.3537C24.6999 47.7022 26.2426 48.3459 27.5911 47.7915Z" fill="#2AD168"/>
<path d="M2.65002 48.1C3.17414 48.1 3.68652 47.9446 4.12231 47.6534C4.5581 47.3622 4.89769 46.9484 5.09827 46.4642C5.29884 45.9799 5.3514 45.4471 5.24915 44.933C5.14689 44.419 4.89453 43.9468 4.52393 43.5762C4.15332 43.2055 3.68104 42.9532 3.16699 42.8509C2.65294 42.7487 2.12021 42.8012 1.63599 43.0018C1.15176 43.2023 0.737841 43.542 0.446655 43.9778C0.15547 44.4136 0 44.9259 0 45.45C0 46.1528 0.279274 46.8269 0.776245 47.3238C1.27322 47.8208 1.9472 48.1 2.65002 48.1V48.1Z" fill="#2AD168"/>
<path d="M146.25 26.69C147.708 26.69 148.89 25.508 148.89 24.05C148.89 22.592 147.708 21.41 146.25 21.41C144.792 21.41 143.61 22.592 143.61 24.05C143.61 25.508 144.792 26.69 146.25 26.69Z" fill="#2AD168"/>
<path d="M122.31 26.69C123.768 26.69 124.95 25.508 124.95 24.05C124.95 22.592 123.768 21.41 122.31 21.41C120.852 21.41 119.67 22.592 119.67 24.05C119.67 25.508 120.852 26.69 122.31 26.69Z" fill="#2AD168"/>
<path d="M98.3798 26.66C98.9047 26.662 99.4185 26.508 99.8559 26.2176C100.293 25.9272 100.634 25.5134 100.836 25.0287C101.038 24.5441 101.091 24.0105 100.989 23.4955C100.887 22.9805 100.635 22.5074 100.264 22.1362C99.8925 21.765 99.4193 21.5124 98.9043 21.4105C98.3893 21.3085 97.8557 21.3618 97.3711 21.5636C96.8865 21.7655 96.4727 22.1067 96.1823 22.544C95.8918 22.9813 95.7378 23.495 95.7398 24.02C95.7424 24.7194 96.0215 25.3894 96.516 25.8839C97.0105 26.3784 97.6804 26.6574 98.3798 26.66V26.66Z" fill="#2AD168"/>
<path d="M74.4498 26.66C74.9744 26.66 75.4871 26.5043 75.9231 26.2127C76.3591 25.9211 76.6988 25.5066 76.8991 25.0218C77.0993 24.537 77.1512 24.0037 77.0481 23.4894C76.9451 22.975 76.6917 22.5029 76.3201 22.1327C75.9485 21.7625 75.4753 21.5108 74.9606 21.4097C74.4459 21.3086 73.9128 21.3625 73.4287 21.5646C72.9447 21.7667 72.5316 22.1079 72.2416 22.545C71.9516 22.9821 71.7978 23.4955 71.7998 24.02C71.7998 24.3675 71.8684 24.7117 72.0017 25.0326C72.135 25.3536 72.3304 25.645 72.5766 25.8903C72.8228 26.1356 73.115 26.3299 73.4364 26.462C73.7579 26.594 74.1023 26.6613 74.4498 26.66V26.66Z" fill="#2AD168"/>
<path d="M50.5101 26.69C51.9681 26.69 53.1501 25.508 53.1501 24.05C53.1501 22.592 51.9681 21.41 50.5101 21.41C49.0521 21.41 47.8701 22.592 47.8701 24.05C47.8701 25.508 49.0521 26.69 50.5101 26.69Z" fill="#2AD168"/>
<path d="M27.5935 26.3891C28.942 25.8347 29.5858 24.292 29.0313 22.9435C28.4769 21.595 26.9342 20.9513 25.5857 21.5057C24.2372 22.0602 23.5935 23.6028 24.1479 24.9513C24.7024 26.2998 26.245 26.9436 27.5935 26.3891Z" fill="#2AD168"/>
<path d="M2.65004 26.66C3.17459 26.66 3.68731 26.5043 4.12331 26.2127C4.55931 25.9211 4.89899 25.5066 5.09926 25.0218C5.29954 24.537 5.3515 24.0037 5.24843 23.4894C5.14537 22.975 4.89189 22.5029 4.52028 22.1327C4.14867 21.7625 3.67561 21.5108 3.16091 21.4097C2.6462 21.3086 2.11309 21.3625 1.62905 21.5646C1.145 21.7667 0.731771 22.1079 0.441791 22.545C0.151812 22.9821 -0.00196055 23.4955 1.88721e-05 24.02C1.63788e-05 24.3675 0.0686259 24.7117 0.201923 25.0326C0.33522 25.3536 0.530667 25.645 0.776874 25.8903C1.02308 26.1356 1.31528 26.3299 1.63674 26.462C1.95819 26.594 2.30251 26.6613 2.65004 26.66V26.66Z" fill="#2AD168"/>
<path d="M146.25 5.28C147.708 5.28 148.89 4.09803 148.89 2.64C148.89 1.18197 147.708 0 146.25 0C144.792 0 143.61 1.18197 143.61 2.64C143.61 4.09803 144.792 5.28 146.25 5.28Z" fill="#2AD168"/>
<path d="M122.31 5.28C123.768 5.28 124.95 4.09803 124.95 2.64C124.95 1.18197 123.768 0 122.31 0C120.852 0 119.67 1.18197 119.67 2.64C119.67 4.09803 120.852 5.28 122.31 5.28Z" fill="#2AD168"/>
<path d="M98.3798 5.29003C98.9043 5.29201 99.4176 5.1383 99.8547 4.84832C100.292 4.55834 100.633 4.14511 100.835 3.66106C101.037 3.17701 101.091 2.64391 100.99 2.1292C100.889 1.61449 100.637 1.14137 100.267 0.769764C99.897 0.398154 99.4248 0.14474 98.9105 0.0416758C98.3962 -0.0613881 97.8629 -0.00949031 97.3781 0.190785C96.8932 0.39106 96.4788 0.730733 96.1871 1.16674C95.8955 1.60274 95.7397 2.11546 95.7397 2.64C95.7397 3.3411 96.0176 4.01362 96.5125 4.5103C97.0073 5.00699 97.6787 5.28738 98.3798 5.29003V5.29003Z" fill="#2AD168"/>
<path d="M74.4498 5.29002C74.9739 5.29002 75.4863 5.13461 75.9221 4.84343C76.3579 4.55224 76.6975 4.13838 76.8981 3.65416C77.0986 3.16993 77.1511 2.63708 77.0488 2.12303C76.9466 1.60898 76.6942 1.13677 76.3236 0.766156C75.953 0.395547 75.4808 0.143187 74.9668 0.0409364C74.4527 -0.0613144 73.9199 -0.00881796 73.4357 0.191754C72.9514 0.392326 72.5376 0.731977 72.2465 1.16777C71.9553 1.60356 71.7998 2.11588 71.7998 2.64C71.7998 2.988 71.8683 3.33264 72.0015 3.65416C72.1346 3.97567 72.3299 4.26776 72.5759 4.51384C72.822 4.75991 73.1142 4.95512 73.4357 5.0883C73.7572 5.22147 74.1018 5.29002 74.4498 5.29002V5.29002Z" fill="#2AD168"/>
<path d="M50.5101 5.28C51.9681 5.28 53.1501 4.09803 53.1501 2.64C53.1501 1.18197 51.9681 0 50.5101 0C49.0521 0 47.8701 1.18197 47.8701 2.64C47.8701 4.09803 49.0521 5.28 50.5101 5.28Z" fill="#2AD168"/>
<path d="M27.592 4.97745C28.9406 4.42301 29.5843 2.88036 29.0298 1.53186C28.4754 0.183354 26.9328 -0.460315 25.5843 0.0941215C24.2358 0.648558 23.592 2.19116 24.1465 3.53966C24.7009 4.88816 26.2435 5.53189 27.592 4.97745Z" fill="#2AD168"/>
<path d="M2.65002 5.29002C3.17414 5.29002 3.68652 5.13461 4.12231 4.84343C4.5581 4.55224 4.89769 4.13838 5.09827 3.65416C5.29884 3.16993 5.3514 2.63708 5.24915 2.12303C5.14689 1.60898 4.89453 1.13677 4.52393 0.766156C4.15332 0.395547 3.68104 0.143187 3.16699 0.0409364C2.65294 -0.0613144 2.12021 -0.00881796 1.63599 0.191754C1.15176 0.392326 0.737841 0.731977 0.446655 1.16777C0.15547 1.60356 0 2.11588 0 2.64C0 3.34282 0.279274 4.01687 0.776245 4.51384C1.27322 5.01081 1.9472 5.29002 2.65002 5.29002V5.29002Z" fill="#2AD168"/>
</g>
<defs>
<clipPath id="clip0_623_24537">
<rect width="148.89" height="90.91" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -1,44 +0,0 @@
<svg width="79" height="48" viewBox="0 0 79 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2892_21290)">
<path d="M77.5993 48C78.3729 48 79 47.3759 79 46.6061C79 45.8362 78.3729 45.2122 77.5993 45.2122C76.8256 45.2122 76.1985 45.8362 76.1985 46.6061C76.1985 47.3759 76.8256 48 77.5993 48Z" fill="#F48B7C"/>
<path d="M64.8969 48C65.6705 48 66.2976 47.3759 66.2976 46.6061C66.2976 45.8362 65.6705 45.2122 64.8969 45.2122C64.1232 45.2122 63.4961 45.8362 63.4961 46.6061C63.4961 47.3759 64.1232 48 64.8969 48Z" fill="#F48B7C"/>
<path d="M52.1997 48C52.478 48.0011 52.7504 47.9199 52.9823 47.7668C53.2143 47.6137 53.3953 47.3955 53.5026 47.1399C53.6098 46.8844 53.6384 46.6029 53.5848 46.3311C53.5311 46.0594 53.3976 45.8096 53.2012 45.6134C53.0048 45.4172 52.7542 45.2834 52.4813 45.2289C52.2084 45.1745 51.9255 45.2019 51.6682 45.3077C51.411 45.4134 51.1911 45.5928 51.0363 45.823C50.8816 46.0532 50.799 46.3239 50.799 46.6008C50.7989 46.971 50.9464 47.3261 51.2089 47.5883C51.4715 47.8506 51.8277 47.9986 52.1997 48Z" fill="#F48B7C"/>
<path d="M39.5026 48C39.7807 48 40.0526 47.918 40.2838 47.7642C40.5151 47.6105 40.6952 47.392 40.8017 47.1363C40.9081 46.8806 40.9359 46.5993 40.8816 46.3279C40.8274 46.0565 40.6935 45.8072 40.4969 45.6115C40.3002 45.4158 40.0497 45.2825 39.7769 45.2285C39.5042 45.1746 39.2215 45.2023 38.9645 45.3082C38.7076 45.4141 38.4881 45.5934 38.3335 45.8235C38.179 46.0536 38.0966 46.3241 38.0966 46.6008C38.0966 46.7846 38.1329 46.9666 38.2036 47.1363C38.2742 47.3061 38.3778 47.4603 38.5084 47.5902C38.6389 47.7201 38.7939 47.8232 38.9645 47.8936C39.1351 47.9639 39.318 48 39.5026 48Z" fill="#F48B7C"/>
<path d="M26.8003 48C27.5739 48 28.2011 47.3759 28.2011 46.6061C28.2011 45.8362 27.5739 45.2122 26.8003 45.2122C26.0267 45.2122 25.3995 45.8362 25.3995 46.6061C25.3995 47.3759 26.0267 48 26.8003 48Z" fill="#F48B7C"/>
<path d="M14.6392 47.834C15.3547 47.5412 15.6962 46.7267 15.4021 46.0147C15.1079 45.3027 14.2894 44.9629 13.5739 45.2556C12.8584 45.5483 12.5168 46.3628 12.811 47.0748C13.1052 47.7868 13.9237 48.1267 14.6392 47.834Z" fill="#F48B7C"/>
<path d="M1.40609 45.228C1.12755 45.227 0.855001 45.3083 0.622963 45.4616C0.390924 45.615 0.209877 45.8335 0.102797 46.0893C-0.00428191 46.3452 -0.0325729 46.627 0.0215115 46.8989C0.0755958 47.1708 0.209606 47.4206 0.406567 47.6166C0.603529 47.8126 0.854533 47.9459 1.12778 47.9998C1.40102 48.0536 1.68421 48.0254 1.94135 47.9189C2.19849 47.8123 2.41804 47.6322 2.57214 47.4013C2.72624 47.1704 2.80792 46.8991 2.80687 46.622C2.80547 46.2527 2.65745 45.8989 2.39506 45.6378C2.13267 45.3767 1.77717 45.2294 1.40609 45.228Z" fill="#F48B7C"/>
<path d="M77.5993 36.6956C78.3729 36.6956 79 36.0716 79 35.3017C79 34.5319 78.3729 33.9078 77.5993 33.9078C76.8256 33.9078 76.1985 34.5319 76.1985 35.3017C76.1985 36.0716 76.8256 36.6956 77.5993 36.6956Z" fill="#F48B7C"/>
<path d="M64.8969 36.6956C65.6705 36.6956 66.2976 36.0716 66.2976 35.3017C66.2976 34.5319 65.6705 33.9078 64.8969 33.9078C64.1232 33.9078 63.4961 34.5319 63.4961 35.3017C63.4961 36.0716 64.1232 36.6956 64.8969 36.6956Z" fill="#F48B7C"/>
<path d="M52.1997 36.6957C52.4783 36.6967 52.7509 36.6154 52.9829 36.462C53.215 36.3087 53.396 36.0902 53.5031 35.8343C53.6102 35.5785 53.6385 35.2967 53.5844 35.0248C53.5303 34.7529 53.3963 34.5031 53.1993 34.3071C53.0024 34.1111 52.7513 33.9777 52.478 33.9239C52.2048 33.8701 51.9217 33.8982 51.6645 34.0048C51.4074 34.1114 51.1878 34.2915 51.0337 34.5224C50.8797 34.7533 50.7979 35.0246 50.799 35.3017C50.8004 35.671 50.9484 36.0247 51.2108 36.2858C51.4732 36.5469 51.8287 36.6943 52.1997 36.6957Z" fill="#F48B7C"/>
<path d="M39.5027 36.6957C39.781 36.6957 40.053 36.6135 40.2844 36.4595C40.5157 36.3055 40.6959 36.0866 40.8022 35.8307C40.9085 35.5747 40.936 35.2931 40.8813 35.0215C40.8266 34.75 40.6922 34.5007 40.495 34.3052C40.2978 34.1097 40.0467 33.9769 39.7736 33.9235C39.5005 33.8701 39.2177 33.8986 38.9609 34.0053C38.704 34.112 38.4848 34.2922 38.331 34.523C38.1771 34.7538 38.0955 35.0248 38.0966 35.3017C38.0966 35.4852 38.133 35.6669 38.2037 35.8364C38.2744 36.0058 38.3781 36.1597 38.5087 36.2893C38.6393 36.4188 38.7944 36.5213 38.9649 36.5911C39.1355 36.6608 39.3183 36.6964 39.5027 36.6957Z" fill="#F48B7C"/>
<path d="M26.8003 36.6956C27.5739 36.6956 28.2011 36.0716 28.2011 35.3017C28.2011 34.5319 27.5739 33.9078 26.8003 33.9078C26.0267 33.9078 25.3995 34.5319 25.3995 35.3017C25.3995 36.0716 26.0267 36.6956 26.8003 36.6956Z" fill="#F48B7C"/>
<path d="M14.6405 36.5336C15.356 36.2409 15.6976 35.4264 15.4034 34.7144C15.1092 34.0024 14.2907 33.6625 13.5752 33.9552C12.8597 34.248 12.5181 35.0625 12.8123 35.7745C13.1065 36.4865 13.925 36.8264 14.6405 36.5336Z" fill="#F48B7C"/>
<path d="M1.40609 36.6957C1.68441 36.6957 1.95646 36.6135 2.1878 36.4595C2.41914 36.3055 2.59937 36.0866 2.70563 35.8307C2.8119 35.5747 2.83947 35.2931 2.78478 35.0215C2.7301 34.75 2.5956 34.5007 2.39843 34.3052C2.20126 34.1097 1.95026 33.9769 1.67716 33.9235C1.40406 33.8701 1.12119 33.8986 0.864361 34.0053C0.607529 34.112 0.388273 34.2922 0.234411 34.523C0.0805501 34.7538 -0.00104025 35.0248 1.00134e-05 35.3017C8.6905e-06 35.4852 0.0364124 35.6669 0.107139 35.8364C0.177866 36.0058 0.281568 36.1597 0.412204 36.2893C0.54284 36.4188 0.69788 36.5213 0.868442 36.5911C1.039 36.6608 1.2217 36.6964 1.40609 36.6957Z" fill="#F48B7C"/>
<path d="M77.5993 25.3913C78.3729 25.3913 79 24.7672 79 23.9974C79 23.2275 78.3729 22.6035 77.5993 22.6035C76.8256 22.6035 76.1985 23.2275 76.1985 23.9974C76.1985 24.7672 76.8256 25.3913 77.5993 25.3913Z" fill="#F48B7C"/>
<path d="M64.8969 25.3913C65.6705 25.3913 66.2976 24.7672 66.2976 23.9974C66.2976 23.2275 65.6705 22.6035 64.8969 22.6035C64.1232 22.6035 63.4961 23.2275 63.4961 23.9974C63.4961 24.7672 64.1232 25.3913 64.8969 25.3913Z" fill="#F48B7C"/>
<path d="M52.1997 25.3966C52.478 25.3976 52.7504 25.3165 52.9823 25.1634C53.2143 25.0103 53.3953 24.7921 53.5026 24.5365C53.6098 24.2809 53.6384 23.9994 53.5848 23.7277C53.5311 23.4559 53.3976 23.2061 53.2012 23.0099C53.0048 22.8137 52.7542 22.6799 52.4813 22.6255C52.2084 22.5711 51.9255 22.5985 51.6682 22.7042C51.411 22.81 51.1911 22.9893 51.0363 23.2195C50.8816 23.4497 50.799 23.7204 50.799 23.9974C50.7989 24.3676 50.9464 24.7226 51.2089 24.9849C51.4715 25.2471 51.8277 25.3952 52.1997 25.3966Z" fill="#F48B7C"/>
<path d="M39.5026 25.3966C39.7807 25.3966 40.0526 25.3145 40.2838 25.1608C40.5151 25.007 40.6952 24.7885 40.8017 24.5328C40.9081 24.2772 40.9359 23.9958 40.8816 23.7244C40.8274 23.453 40.6935 23.2037 40.4969 23.008C40.3002 22.8123 40.0497 22.6791 39.7769 22.6251C39.5042 22.5711 39.2215 22.5988 38.9645 22.7047C38.7076 22.8106 38.4881 22.99 38.3335 23.22C38.179 23.4501 38.0966 23.7206 38.0966 23.9974C38.0966 24.1811 38.1329 24.3631 38.2036 24.5328C38.2742 24.7026 38.3778 24.8568 38.5084 24.9868C38.6389 25.1167 38.7939 25.2198 38.9645 25.2901C39.1351 25.3604 39.318 25.3966 39.5026 25.3966Z" fill="#F48B7C"/>
<path d="M26.8003 25.3913C27.5739 25.3913 28.2011 24.7672 28.2011 23.9974C28.2011 23.2275 27.5739 22.6035 26.8003 22.6035C26.0267 22.6035 25.3995 23.2275 25.3995 23.9974C25.3995 24.7672 26.0267 25.3913 26.8003 25.3913Z" fill="#F48B7C"/>
<path d="M14.6397 25.2337C15.3552 24.9409 15.6967 24.1264 15.4025 23.4144C15.1084 22.7024 14.2899 22.3626 13.5744 22.6553C12.8588 22.948 12.5173 23.7625 12.8115 24.4745C13.1056 25.1865 13.9242 25.5264 14.6397 25.2337Z" fill="#F48B7C"/>
<path d="M1.40608 25.3966C1.68418 25.3966 1.95604 25.3145 2.18727 25.1608C2.4185 25.007 2.59868 24.7885 2.70511 24.5328C2.81153 24.2772 2.83941 23.9958 2.78516 23.7244C2.73091 23.453 2.59701 23.2037 2.40036 23.008C2.20372 22.8123 1.95314 22.6791 1.68038 22.6251C1.40763 22.5711 1.12497 22.5988 0.868043 22.7047C0.611117 22.8106 0.391493 22.99 0.236992 23.22C0.0824911 23.4501 0 23.7206 0 23.9974C0 24.3685 0.148181 24.7244 0.41187 24.9868C0.67556 25.2492 1.03317 25.3966 1.40608 25.3966Z" fill="#F48B7C"/>
<path d="M77.5993 14.0922C78.3729 14.0922 79 13.4681 79 12.6983C79 11.9285 78.3729 11.3044 77.5993 11.3044C76.8256 11.3044 76.1985 11.9285 76.1985 12.6983C76.1985 13.4681 76.8256 14.0922 77.5993 14.0922Z" fill="#F48B7C"/>
<path d="M64.8969 14.0922C65.6705 14.0922 66.2976 13.4681 66.2976 12.6983C66.2976 11.9285 65.6705 11.3044 64.8969 11.3044C64.1232 11.3044 63.4961 11.9285 63.4961 12.6983C63.4961 13.4681 64.1232 14.0922 64.8969 14.0922Z" fill="#F48B7C"/>
<path d="M52.1997 14.0763C52.4783 14.0774 52.7509 13.9961 52.9829 13.8427C53.215 13.6894 53.396 13.4709 53.5031 13.215C53.6102 12.9591 53.6385 12.6774 53.5844 12.4055C53.5303 12.1336 53.3963 11.8838 53.1993 11.6878C53.0024 11.4918 52.7513 11.3584 52.478 11.3046C52.2048 11.2508 51.9217 11.2789 51.6645 11.3855C51.4074 11.492 51.1878 11.6722 51.0337 11.9031C50.8797 12.134 50.7979 12.4052 50.799 12.6824C50.8004 13.0517 50.9484 13.4054 51.2108 13.6665C51.4732 13.9276 51.8287 14.0749 52.1997 14.0763Z" fill="#F48B7C"/>
<path d="M39.5027 14.0763C39.781 14.0763 40.053 13.9941 40.2844 13.8401C40.5157 13.6862 40.6959 13.4674 40.8022 13.2114C40.9085 12.9554 40.936 12.6738 40.8813 12.4022C40.8266 12.1307 40.6922 11.8814 40.495 11.6859C40.2978 11.4904 40.0467 11.3576 39.7736 11.3042C39.5005 11.2508 39.2177 11.2793 38.9609 11.386C38.704 11.4927 38.4848 11.6728 38.331 11.9036C38.1771 12.1344 38.0955 12.4055 38.0966 12.6824C38.0966 12.8659 38.133 13.0476 38.2037 13.2171C38.2744 13.3865 38.3781 13.5404 38.5087 13.6699C38.6393 13.7994 38.7944 13.902 38.9649 13.9718C39.1355 14.0415 39.3183 14.077 39.5027 14.0763Z" fill="#F48B7C"/>
<path d="M26.8003 14.0922C27.5739 14.0922 28.2011 13.4681 28.2011 12.6983C28.2011 11.9285 27.5739 11.3044 26.8003 11.3044C26.0267 11.3044 25.3995 11.9285 25.3995 12.6983C25.3995 13.4681 26.0267 14.0922 26.8003 14.0922Z" fill="#F48B7C"/>
<path d="M14.641 13.9333C15.3565 13.6406 15.6981 12.826 15.4039 12.114C15.1097 11.402 14.2912 11.0622 13.5757 11.3549C12.8602 11.6476 12.5186 12.4621 12.8128 13.1741C13.107 13.8862 13.9255 14.226 14.641 13.9333Z" fill="#F48B7C"/>
<path d="M1.40609 14.0763C1.68441 14.0763 1.95646 13.9941 2.1878 13.8401C2.41914 13.6862 2.59937 13.4674 2.70563 13.2114C2.8119 12.9554 2.83947 12.6738 2.78478 12.4022C2.7301 12.1307 2.5956 11.8814 2.39843 11.6859C2.20126 11.4904 1.95026 11.3576 1.67716 11.3042C1.40406 11.2508 1.12119 11.2793 0.864361 11.386C0.607529 11.4927 0.388273 11.6728 0.234411 11.9036C0.0805501 12.1344 -0.00104025 12.4055 1.00134e-05 12.6824C8.6905e-06 12.8659 0.0364124 13.0476 0.107139 13.2171C0.177866 13.3865 0.281568 13.5404 0.412204 13.6699C0.54284 13.7994 0.69788 13.902 0.868442 13.9718C1.039 14.0415 1.2217 14.077 1.40609 14.0763Z" fill="#F48B7C"/>
<path d="M77.5993 2.78781C78.3729 2.78781 79 2.16374 79 1.39391C79 0.624073 78.3729 0 77.5993 0C76.8256 0 76.1985 0.624073 76.1985 1.39391C76.1985 2.16374 76.8256 2.78781 77.5993 2.78781Z" fill="#F48B7C"/>
<path d="M64.8969 2.78781C65.6705 2.78781 66.2976 2.16374 66.2976 1.39391C66.2976 0.624073 65.6705 0 64.8969 0C64.1232 0 63.4961 0.624073 63.4961 1.39391C63.4961 2.16374 64.1232 2.78781 64.8969 2.78781Z" fill="#F48B7C"/>
<path d="M52.1997 2.79313C52.478 2.79417 52.7504 2.71301 52.9823 2.55991C53.2143 2.4068 53.3953 2.18861 53.5026 1.93304C53.6098 1.67747 53.6384 1.39599 53.5848 1.12423C53.5311 0.852464 53.3976 0.60266 53.2012 0.406451C53.0048 0.210243 52.7542 0.0764418 52.4813 0.0220246C52.2084 -0.0323926 51.9255 -0.00499087 51.6682 0.100753C51.411 0.206497 51.1911 0.385843 51.0363 0.616051C50.8816 0.846259 50.799 1.11697 50.799 1.39393C50.7989 1.7641 50.9464 2.11919 51.2089 2.38144C51.4715 2.64368 51.8277 2.79173 52.1997 2.79313Z" fill="#F48B7C"/>
<path d="M39.5026 2.79312C39.7807 2.79312 40.0526 2.71107 40.2838 2.55732C40.5151 2.40358 40.6952 2.18506 40.8017 1.9294C40.9081 1.67373 40.9359 1.39238 40.8816 1.12097C40.8274 0.849553 40.6935 0.600226 40.4969 0.404546C40.3002 0.208867 40.0497 0.0756221 39.7769 0.0216342C39.5042 -0.0323537 39.2215 -0.00463587 38.9645 0.101265C38.7076 0.207166 38.4881 0.3865 38.3335 0.616595C38.179 0.84669 38.0966 1.11719 38.0966 1.39392C38.0966 1.57767 38.1329 1.75964 38.2036 1.9294C38.2742 2.09915 38.3778 2.25338 38.5084 2.3833C38.6389 2.51323 38.7939 2.6163 38.9645 2.68662C39.1351 2.75693 39.318 2.79312 39.5026 2.79312Z" fill="#F48B7C"/>
<path d="M26.8003 2.78781C27.5739 2.78781 28.2011 2.16374 28.2011 1.39391C28.2011 0.624073 27.5739 0 26.8003 0C26.0267 0 25.3995 0.624073 25.3995 1.39391C25.3995 2.16374 26.0267 2.78781 26.8003 2.78781Z" fill="#F48B7C"/>
<path d="M14.6403 2.62809C15.3558 2.33535 15.6973 1.52084 15.4032 0.808835C15.109 0.096833 14.2905 -0.243021 13.575 0.0497186C12.8595 0.342458 12.5179 1.15694 12.8121 1.86894C13.1062 2.58095 13.9248 2.92083 14.6403 2.62809Z" fill="#F48B7C"/>
<path d="M1.40608 2.79312C1.68418 2.79312 1.95604 2.71107 2.18727 2.55732C2.4185 2.40358 2.59868 2.18506 2.70511 1.9294C2.81153 1.67373 2.83941 1.39238 2.78516 1.12097C2.73091 0.849553 2.59701 0.600226 2.40036 0.404546C2.20372 0.208867 1.95314 0.0756221 1.68038 0.0216342C1.40763 -0.0323537 1.12497 -0.00463587 0.868043 0.101265C0.611117 0.207166 0.391493 0.3865 0.236992 0.616595C0.0824911 0.84669 0 1.11719 0 1.39392C0 1.76501 0.148181 2.1209 0.41187 2.3833C0.67556 2.6457 1.03317 2.79312 1.40608 2.79312Z" fill="#F48B7C"/>
</g>
<defs>
<clipPath id="clip0_2892_21290">
<rect width="79" height="48" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -1,44 +0,0 @@
<svg width="149" height="91" viewBox="0 0 149 91" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_627_14183)">
<path d="M146.25 90.91C147.708 90.91 148.89 89.728 148.89 88.27C148.89 86.812 147.708 85.63 146.25 85.63C144.792 85.63 143.61 86.812 143.61 88.27C143.61 89.728 144.792 90.91 146.25 90.91Z" fill="#A855F7"/>
<path d="M122.31 90.91C123.768 90.91 124.95 89.728 124.95 88.27C124.95 86.812 123.768 85.63 122.31 85.63C120.852 85.63 119.67 86.812 119.67 88.27C119.67 89.728 120.852 90.91 122.31 90.91Z" fill="#A855F7"/>
<path d="M98.3799 90.91C98.9045 90.912 99.4178 90.7583 99.8549 90.4683C100.292 90.1783 100.633 89.7651 100.835 89.281C101.037 88.797 101.091 88.2639 100.99 87.7492C100.889 87.2345 100.638 86.7613 100.267 86.3897C99.8972 86.0181 99.425 85.7647 98.9107 85.6616C98.3964 85.5586 97.863 85.6105 97.3782 85.8107C96.8934 86.011 96.4789 86.3507 96.1873 86.7867C95.8957 87.2227 95.7399 87.7354 95.7399 88.26C95.7399 88.9611 96.0178 89.6336 96.5126 90.1303C97.0074 90.627 97.6789 90.9073 98.3799 90.91Z" fill="#A855F7"/>
<path d="M74.45 90.91C74.9741 90.91 75.4865 90.7546 75.9223 90.4634C76.3581 90.1722 76.6977 89.7583 76.8983 89.2741C77.0988 88.7899 77.1513 88.257 77.049 87.743C76.9468 87.2289 76.6944 86.7568 76.3238 86.3862C75.9532 86.0156 75.481 85.7632 74.967 85.6609C74.4529 85.5587 73.9201 85.6111 73.4359 85.8117C72.9516 86.0123 72.5378 86.3519 72.2466 86.7877C71.9555 87.2235 71.8 87.7358 71.8 88.26C71.8 88.608 71.8685 88.9526 72.0016 89.2741C72.1348 89.5956 72.33 89.8877 72.5761 90.1338C72.8222 90.3799 73.1143 90.5752 73.4359 90.7083C73.7574 90.8415 74.102 90.91 74.45 90.91Z" fill="#A855F7"/>
<path d="M50.51 90.91C51.968 90.91 53.15 89.728 53.15 88.27C53.15 86.812 51.968 85.63 50.51 85.63C49.052 85.63 47.87 86.812 47.87 88.27C47.87 89.728 49.052 90.91 50.51 90.91Z" fill="#A855F7"/>
<path d="M27.5903 90.5955C28.9388 90.0411 29.5826 88.4984 29.0281 87.1499C28.4737 85.8014 26.9311 85.1577 25.5826 85.7122C24.2341 86.2666 23.5903 87.8092 24.1447 89.1577C24.6992 90.5062 26.2418 91.1499 27.5903 90.5955Z" fill="#A855F7"/>
<path d="M2.64998 85.6601C2.12502 85.6581 1.61135 85.8121 1.17403 86.1025C0.736712 86.3929 0.395495 86.8067 0.193685 87.2913C-0.00812604 87.776 -0.0614455 88.3096 0.0404863 88.8246C0.142418 89.3396 0.394984 89.8126 0.766194 90.1839C1.1374 90.5551 1.61047 90.8076 2.12545 90.9096C2.64043 91.0115 3.17414 90.9582 3.65877 90.7564C4.1434 90.5546 4.55719 90.2134 4.84762 89.7761C5.13804 89.3388 5.29198 88.825 5.29 88.3001C5.28736 87.6007 5.0084 86.9307 4.51388 86.4362C4.01935 85.9416 3.34934 85.6627 2.64998 85.6601Z" fill="#A855F7"/>
<path d="M146.25 69.5C147.708 69.5 148.89 68.318 148.89 66.86C148.89 65.4019 147.708 64.22 146.25 64.22C144.792 64.22 143.61 65.4019 143.61 66.86C143.61 68.318 144.792 69.5 146.25 69.5Z" fill="#A855F7"/>
<path d="M122.31 69.5C123.768 69.5 124.95 68.318 124.95 66.86C124.95 65.4019 123.768 64.22 122.31 64.22C120.852 64.22 119.67 65.4019 119.67 66.86C119.67 68.318 120.852 69.5 122.31 69.5Z" fill="#A855F7"/>
<path d="M98.38 69.5001C98.9049 69.5021 99.4187 69.3481 99.856 69.0576C100.293 68.7672 100.635 68.3534 100.836 67.8688C101.038 67.3842 101.092 66.8505 100.99 66.3355C100.888 65.8206 100.635 65.3474 100.264 64.9762C99.8927 64.605 99.4195 64.3524 98.9045 64.2505C98.3895 64.1486 97.8559 64.2019 97.3713 64.4037C96.8867 64.6055 96.4729 64.9467 96.1825 65.3841C95.892 65.8214 95.738 66.3351 95.7399 66.8601C95.7426 67.5594 96.0217 68.2294 96.5162 68.7239C97.0107 69.2184 97.6806 69.4974 98.38 69.5001Z" fill="#A855F7"/>
<path d="M74.45 69.5001C74.9746 69.5001 75.4873 69.3444 75.9233 69.0528C76.3593 68.7611 76.699 68.3466 76.8993 67.8618C77.0995 67.377 77.1514 66.8437 77.0483 66.3294C76.9452 65.815 76.6919 65.3429 76.3203 64.9727C75.9487 64.6025 75.4755 64.3509 74.9608 64.2498C74.4461 64.1487 73.913 64.2026 73.4289 64.4047C72.9449 64.6068 72.5318 64.948 72.2418 65.3851C71.9518 65.8222 71.798 66.3355 71.8 66.8601C71.8 67.2076 71.8686 67.5517 72.0019 67.8726C72.1352 68.1936 72.3305 68.4851 72.5767 68.7304C72.8229 68.9756 73.1151 69.1699 73.4366 69.302C73.7581 69.434 74.1025 69.5014 74.45 69.5001Z" fill="#A855F7"/>
<path d="M50.51 69.5C51.968 69.5 53.15 68.318 53.15 66.86C53.15 65.4019 51.968 64.22 50.51 64.22C49.052 64.22 47.87 65.4019 47.87 66.86C47.87 68.318 49.052 69.5 50.51 69.5Z" fill="#A855F7"/>
<path d="M27.5927 69.1932C28.9412 68.6388 29.5849 67.0961 29.0305 65.7476C28.476 64.3991 26.9334 63.7554 25.5849 64.3098C24.2364 64.8643 23.5927 66.4069 24.1471 67.7554C24.7015 69.1039 26.2442 69.7476 27.5927 69.1932Z" fill="#A855F7"/>
<path d="M2.64998 69.5001C3.17453 69.5001 3.68724 69.3444 4.12325 69.0528C4.55925 68.7611 4.89893 68.3466 5.0992 67.8618C5.29948 67.377 5.35144 66.8437 5.24837 66.3294C5.14531 65.815 4.89183 65.3429 4.52022 64.9727C4.14861 64.6025 3.67555 64.3509 3.16085 64.2498C2.64614 64.1487 2.11303 64.2026 1.62899 64.4047C1.14494 64.6068 0.73171 64.948 0.44173 65.3851C0.15175 65.8222 -0.00202158 66.3355 -4.21631e-05 66.8601C-4.46563e-05 67.2076 0.0685648 67.5517 0.201862 67.8726C0.335159 68.1936 0.530606 68.4851 0.776813 68.7304C1.02302 68.9756 1.31522 69.1699 1.63668 69.302C1.95813 69.434 2.30245 69.5014 2.64998 69.5001Z" fill="#A855F7"/>
<path d="M146.25 48.0901C147.708 48.0901 148.89 46.9081 148.89 45.4501C148.89 43.992 147.708 42.8101 146.25 42.8101C144.792 42.8101 143.61 43.992 143.61 45.4501C143.61 46.9081 144.792 48.0901 146.25 48.0901Z" fill="#A855F7"/>
<path d="M122.31 48.0901C123.768 48.0901 124.95 46.9081 124.95 45.4501C124.95 43.992 123.768 42.8101 122.31 42.8101C120.852 42.8101 119.67 43.992 119.67 45.4501C119.67 46.9081 120.852 48.0901 122.31 48.0901Z" fill="#A855F7"/>
<path d="M98.3799 48.1001C98.9045 48.102 99.4178 47.9483 99.8549 47.6583C100.292 47.3684 100.633 46.9551 100.835 46.4711C101.037 45.987 101.091 45.4539 100.99 44.9392C100.889 44.4245 100.638 43.9514 100.267 43.5798C99.8972 43.2082 99.425 42.9548 98.9107 42.8517C98.3964 42.7486 97.863 42.8005 97.3782 43.0008C96.8934 43.2011 96.4789 43.5408 96.1873 43.9768C95.8957 44.4128 95.7399 44.9255 95.7399 45.45C95.7399 46.1511 96.0178 46.8236 96.5126 47.3203C97.0074 47.817 97.6789 48.0974 98.3799 48.1001Z" fill="#A855F7"/>
<path d="M74.45 48.1C74.9741 48.1 75.4865 47.9446 75.9223 47.6535C76.3581 47.3623 76.6977 46.9484 76.8983 46.4642C77.0988 45.98 77.1513 45.4471 77.049 44.9331C76.9468 44.419 76.6944 43.9468 76.3238 43.5762C75.9532 43.2056 75.481 42.9532 74.967 42.851C74.4529 42.7487 73.9201 42.8012 73.4359 43.0018C72.9516 43.2024 72.5378 43.542 72.2466 43.9778C71.9555 44.4136 71.8 44.9259 71.8 45.45C71.8 45.798 71.8685 46.1427 72.0016 46.4642C72.1348 46.7857 72.33 47.0778 72.5761 47.3239C72.8222 47.5699 73.1143 47.7652 73.4359 47.8983C73.7574 48.0315 74.102 48.1 74.45 48.1Z" fill="#A855F7"/>
<path d="M50.51 48.0901C51.968 48.0901 53.15 46.9081 53.15 45.4501C53.15 43.992 51.968 42.8101 50.51 42.8101C49.052 42.8101 47.87 43.992 47.87 45.4501C47.87 46.9081 49.052 48.0901 50.51 48.0901Z" fill="#A855F7"/>
<path d="M27.5913 47.7915C28.9398 47.2371 29.5835 45.6944 29.029 44.3459C28.4746 42.9974 26.932 42.3538 25.5835 42.9082C24.235 43.4626 23.5912 45.0052 24.1457 46.3537C24.7001 47.7022 26.2428 48.346 27.5913 47.7915Z" fill="#A855F7"/>
<path d="M2.64996 48.1C3.17408 48.1 3.68646 47.9446 4.12225 47.6535C4.55804 47.3623 4.89763 46.9484 5.09821 46.4642C5.29878 45.98 5.35134 45.4471 5.24908 44.9331C5.14683 44.419 4.89447 43.9468 4.52386 43.5762C4.15326 43.2056 3.68098 42.9532 3.16693 42.851C2.65288 42.7487 2.12015 42.8012 1.63593 43.0018C1.1517 43.2024 0.73778 43.542 0.446594 43.9778C0.155409 44.4136 -6.10352e-05 44.9259 -6.10352e-05 45.45C-6.10352e-05 46.1528 0.279213 46.8269 0.776184 47.3239C1.27316 47.8208 1.94714 48.1 2.64996 48.1Z" fill="#A855F7"/>
<path d="M146.25 26.69C147.708 26.69 148.89 25.5081 148.89 24.05C148.89 22.592 147.708 21.41 146.25 21.41C144.792 21.41 143.61 22.592 143.61 24.05C143.61 25.5081 144.792 26.69 146.25 26.69Z" fill="#A855F7"/>
<path d="M122.31 26.69C123.768 26.69 124.95 25.5081 124.95 24.05C124.95 22.592 123.768 21.41 122.31 21.41C120.852 21.41 119.67 22.592 119.67 24.05C119.67 25.5081 120.852 26.69 122.31 26.69Z" fill="#A855F7"/>
<path d="M98.38 26.66C98.9049 26.662 99.4187 26.508 99.856 26.2175C100.293 25.9271 100.635 25.5133 100.836 25.0287C101.038 24.5441 101.092 24.0104 100.99 23.4954C100.888 22.9805 100.635 22.5074 100.264 22.1362C99.8927 21.765 99.4195 21.5124 98.9045 21.4104C98.3895 21.3085 97.8559 21.3618 97.3713 21.5636C96.8867 21.7654 96.4729 22.1066 96.1825 22.544C95.892 22.9813 95.738 23.495 95.7399 24.02C95.7426 24.7193 96.0217 25.3893 96.5162 25.8839C97.0107 26.3784 97.6806 26.6574 98.38 26.66Z" fill="#A855F7"/>
<path d="M74.45 26.66C74.9746 26.66 75.4873 26.5043 75.9233 26.2127C76.3593 25.921 76.699 25.5066 76.8993 25.0218C77.0995 24.537 77.1514 24.0037 77.0483 23.4893C76.9452 22.975 76.6919 22.5029 76.3203 22.1327C75.9487 21.7624 75.4755 21.5108 74.9608 21.4097C74.4461 21.3086 73.913 21.3625 73.4289 21.5646C72.9449 21.7667 72.5318 22.1079 72.2418 22.545C71.9518 22.9821 71.798 23.4954 71.8 24.02C71.8 24.3675 71.8686 24.7117 72.0019 25.0326C72.1352 25.3536 72.3305 25.645 72.5767 25.8903C72.8229 26.1356 73.1151 26.3299 73.4366 26.4619C73.7581 26.594 74.1025 26.6613 74.45 26.66Z" fill="#A855F7"/>
<path d="M50.51 26.69C51.968 26.69 53.15 25.5081 53.15 24.05C53.15 22.592 51.968 21.41 50.51 21.41C49.052 21.41 47.87 22.592 47.87 24.05C47.87 25.5081 49.052 26.69 50.51 26.69Z" fill="#A855F7"/>
<path d="M27.5937 26.3891C28.9422 25.8347 29.5859 24.292 29.0315 22.9435C28.477 21.595 26.9344 20.9513 25.5859 21.5057C24.2374 22.0602 23.5936 23.6028 24.1481 24.9513C24.7025 26.2998 26.2452 26.9436 27.5937 26.3891Z" fill="#A855F7"/>
<path d="M2.64998 26.66C3.17453 26.66 3.68724 26.5043 4.12325 26.2127C4.55925 25.921 4.89893 25.5066 5.0992 25.0218C5.29948 24.537 5.35144 24.0037 5.24837 23.4893C5.14531 22.975 4.89183 22.5029 4.52022 22.1327C4.14861 21.7624 3.67555 21.5108 3.16085 21.4097C2.64614 21.3086 2.11303 21.3625 1.62899 21.5646C1.14494 21.7667 0.73171 22.1079 0.44173 22.545C0.15175 22.9821 -0.00202158 23.4954 -4.21631e-05 24.02C-4.46563e-05 24.3675 0.0685648 24.7117 0.201862 25.0326C0.335159 25.3536 0.530606 25.645 0.776813 25.8903C1.02302 26.1356 1.31522 26.3299 1.63668 26.4619C1.95813 26.594 2.30245 26.6613 2.64998 26.66Z" fill="#A855F7"/>
<path d="M146.25 5.28C147.708 5.28 148.89 4.09803 148.89 2.64C148.89 1.18197 147.708 0 146.25 0C144.792 0 143.61 1.18197 143.61 2.64C143.61 4.09803 144.792 5.28 146.25 5.28Z" fill="#A855F7"/>
<path d="M122.31 5.28C123.768 5.28 124.95 4.09803 124.95 2.64C124.95 1.18197 123.768 0 122.31 0C120.852 0 119.67 1.18197 119.67 2.64C119.67 4.09803 120.852 5.28 122.31 5.28Z" fill="#A855F7"/>
<path d="M98.3799 5.29C98.9045 5.29198 99.4178 5.13827 99.8549 4.84829C100.292 4.55831 100.633 4.14508 100.835 3.66103C101.037 3.17698 101.091 2.64388 100.99 2.12917C100.889 1.61446 100.638 1.14134 100.267 0.769734C99.8972 0.398123 99.425 0.144709 98.9107 0.0416453C98.3964 -0.0614187 97.863 -0.00952083 97.3782 0.190754C96.8934 0.391029 96.4789 0.730702 96.1873 1.16671C95.8957 1.60271 95.7399 2.11543 95.7399 2.63997C95.7399 3.34107 96.0178 4.01359 96.5126 4.51027C97.0074 5.00696 97.6789 5.28735 98.3799 5.29Z" fill="#A855F7"/>
<path d="M74.45 5.28999C74.9741 5.28999 75.4865 5.13458 75.9223 4.8434C76.3581 4.55221 76.6977 4.13835 76.8983 3.65413C77.0988 3.1699 77.1513 2.63705 77.049 2.123C76.9468 1.60895 76.6944 1.13673 76.3238 0.766126C75.9532 0.395516 75.481 0.143157 74.967 0.0409059C74.4529 -0.061345 73.9201 -0.00884847 73.4359 0.191724C72.9516 0.392296 72.5378 0.731947 72.2466 1.16774C71.9555 1.60353 71.8 2.11585 71.8 2.63997C71.8 2.98797 71.8685 3.33261 72.0016 3.65413C72.1348 3.97564 72.33 4.26773 72.5761 4.51381C72.8222 4.75988 73.1143 4.95509 73.4359 5.08827C73.7574 5.22144 74.102 5.28999 74.45 5.28999Z" fill="#A855F7"/>
<path d="M50.51 5.28C51.968 5.28 53.15 4.09803 53.15 2.64C53.15 1.18197 51.968 0 50.51 0C49.052 0 47.87 1.18197 47.87 2.64C47.87 4.09803 49.052 5.28 50.51 5.28Z" fill="#A855F7"/>
<path d="M27.5922 4.97745C28.9407 4.42301 29.5844 2.88036 29.03 1.53186C28.4755 0.183354 26.9329 -0.460315 25.5844 0.0941215C24.2359 0.648558 23.5921 2.19116 24.1466 3.53966C24.701 4.88816 26.2437 5.53189 27.5922 4.97745Z" fill="#A855F7"/>
<path d="M2.64996 5.28999C3.17408 5.28999 3.68646 5.13458 4.12225 4.8434C4.55804 4.55221 4.89763 4.13835 5.09821 3.65413C5.29878 3.1699 5.35134 2.63705 5.24908 2.123C5.14683 1.60895 4.89447 1.13673 4.52386 0.766126C4.15326 0.395516 3.68098 0.143157 3.16693 0.0409059C2.65288 -0.061345 2.12015 -0.00884847 1.63593 0.191724C1.1517 0.392296 0.73778 0.731947 0.446594 1.16774C0.155409 1.60353 -6.10352e-05 2.11585 -6.10352e-05 2.63997C-6.10352e-05 3.34279 0.279213 4.01683 0.776184 4.51381C1.27316 5.01078 1.94714 5.28999 2.64996 5.28999Z" fill="#A855F7"/>
</g>
<defs>
<clipPath id="clip0_627_14183">
<rect width="148.89" height="90.91" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -1,84 +0,0 @@
<svg width="199" height="149" viewBox="0 0 199 149" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1384_30010)">
<path d="M198.91 2.75063C198.91 1.29259 197.728 0.110626 196.27 0.110626C194.812 0.110626 193.63 1.29259 193.63 2.75063C193.63 4.20866 194.812 5.39062 196.27 5.39062C197.728 5.39062 198.91 4.20866 198.91 2.75063Z" fill="#EF5944"/>
<path d="M198.91 26.6901C198.91 25.232 197.728 24.0501 196.27 24.0501C194.812 24.0501 193.63 25.232 193.63 26.6901C193.63 28.1481 194.812 29.3301 196.27 29.3301C197.728 29.3301 198.91 28.1481 198.91 26.6901Z" fill="#EF5944"/>
<path d="M198.91 50.6198C198.912 50.0952 198.759 49.5819 198.469 49.1448C198.179 48.7077 197.765 48.3664 197.281 48.1643C196.797 47.9622 196.264 47.9083 195.75 48.0094C195.235 48.1105 194.762 48.3621 194.39 48.7323C194.018 49.1025 193.765 49.5747 193.662 50.089C193.559 50.6033 193.611 51.1367 193.811 51.6215C194.011 52.1063 194.351 52.5207 194.787 52.8124C195.223 53.104 195.736 53.2598 196.26 53.2598C196.961 53.2598 197.634 52.9819 198.131 52.4871C198.627 51.9922 198.908 51.3208 198.91 50.6198V50.6198Z" fill="#EF5944"/>
<path d="M198.91 74.5502C198.91 74.0261 198.755 73.5137 198.464 73.0779C198.173 72.6421 197.759 72.3025 197.274 72.1019C196.79 71.9014 196.257 71.8489 195.743 71.9512C195.229 72.0534 194.757 72.3058 194.387 72.6764C194.016 73.047 193.764 73.5192 193.661 74.0332C193.559 74.5473 193.612 75.0801 193.812 75.5643C194.013 76.0486 194.352 76.4624 194.788 76.7535C195.224 77.0447 195.736 77.2002 196.26 77.2002C196.608 77.2002 196.953 77.1317 197.274 76.9985C197.596 76.8654 197.888 76.6701 198.134 76.4241C198.38 76.178 198.576 75.8858 198.709 75.5643C198.842 75.2428 198.91 74.8982 198.91 74.5502V74.5502Z" fill="#EF5944"/>
<path d="M198.91 98.4899C198.91 97.0319 197.728 95.8499 196.27 95.8499C194.812 95.8499 193.63 97.0319 193.63 98.4899C193.63 99.9479 194.812 101.13 196.27 101.13C197.728 101.13 198.91 99.9479 198.91 98.4899Z" fill="#EF5944"/>
<path d="M198.595 121.41C198.041 120.061 196.498 119.418 195.15 119.972C193.801 120.527 193.157 122.069 193.712 123.418C194.266 124.766 195.809 125.41 197.157 124.855C198.506 124.301 199.15 122.758 198.595 121.41Z" fill="#EF5944"/>
<path d="M193.66 146.35C193.658 146.875 193.812 147.388 194.103 147.826C194.393 148.263 194.807 148.604 195.291 148.806C195.776 149.008 196.31 149.061 196.825 148.959C197.34 148.857 197.813 148.605 198.184 148.234C198.555 147.862 198.808 147.389 198.91 146.874C199.012 146.359 198.958 145.826 198.756 145.341C198.555 144.856 198.214 144.443 197.776 144.152C197.339 143.862 196.825 143.708 196.3 143.71C195.601 143.712 194.931 143.991 194.436 144.486C193.942 144.98 193.663 145.65 193.66 146.35V146.35Z" fill="#EF5944"/>
<path d="M177.5 2.75063C177.5 1.29259 176.318 0.110626 174.86 0.110626C173.402 0.110626 172.22 1.29259 172.22 2.75063C172.22 4.20866 173.402 5.39062 174.86 5.39062C176.318 5.39062 177.5 4.20866 177.5 2.75063Z" fill="#EF5944"/>
<path d="M177.5 26.6901C177.5 25.232 176.318 24.0501 174.86 24.0501C173.402 24.0501 172.22 25.232 172.22 26.6901C172.22 28.1481 173.402 29.3301 174.86 29.3301C176.318 29.3301 177.5 28.1481 177.5 26.6901Z" fill="#EF5944"/>
<path d="M177.5 50.6197C177.502 50.0948 177.348 49.581 177.058 49.1437C176.767 48.7063 176.354 48.3651 175.869 48.1633C175.384 47.9615 174.851 47.9082 174.336 48.0101C173.821 48.112 173.348 48.3646 172.976 48.7358C172.605 49.107 172.353 49.5802 172.251 50.0952C172.149 50.6102 172.202 51.1438 172.404 51.6284C172.606 52.113 172.947 52.5268 173.384 52.8172C173.821 53.1077 174.335 53.2617 174.86 53.2597C175.56 53.2571 176.229 52.978 176.724 52.4835C177.219 51.989 177.498 51.3191 177.5 50.6197V50.6197Z" fill="#EF5944"/>
<path d="M177.5 74.5502C177.5 74.0256 177.345 73.5129 177.053 73.0769C176.761 72.6409 176.347 72.3012 175.862 72.1009C175.377 71.9007 174.844 71.8488 174.329 71.9519C173.815 72.0549 173.343 72.3083 172.973 72.6799C172.603 73.0515 172.351 73.5247 172.25 74.0394C172.149 74.5541 172.203 75.0872 172.405 75.5713C172.607 76.0553 172.948 76.4684 173.385 76.7584C173.822 77.0484 174.336 77.2022 174.86 77.2002C175.208 77.2002 175.552 77.1316 175.873 76.9983C176.194 76.865 176.485 76.6696 176.73 76.4234C176.976 76.1772 177.17 75.885 177.302 75.5636C177.434 75.2421 177.502 74.8977 177.5 74.5502V74.5502Z" fill="#EF5944"/>
<path d="M177.5 98.4899C177.5 97.0319 176.318 95.8499 174.86 95.8499C173.402 95.8499 172.22 97.0319 172.22 98.4899C172.22 99.9479 173.402 101.13 174.86 101.13C176.318 101.13 177.5 99.9479 177.5 98.4899Z" fill="#EF5944"/>
<path d="M177.193 121.408C176.639 120.059 175.096 119.416 173.747 119.97C172.399 120.525 171.755 122.067 172.31 123.416C172.864 124.764 174.407 125.408 175.755 124.854C177.104 124.299 177.747 122.756 177.193 121.408Z" fill="#EF5944"/>
<path d="M177.5 146.35C177.5 145.825 177.345 145.313 177.053 144.877C176.761 144.441 176.347 144.101 175.862 143.901C175.377 143.7 174.844 143.649 174.329 143.752C173.815 143.855 173.343 144.108 172.973 144.48C172.603 144.851 172.351 145.324 172.25 145.839C172.149 146.354 172.203 146.887 172.405 147.371C172.607 147.855 172.948 148.268 173.385 148.558C173.822 148.848 174.336 149.002 174.86 149C175.208 149 175.552 148.931 175.873 148.798C176.194 148.665 176.485 148.469 176.73 148.223C176.976 147.977 177.17 147.685 177.302 147.363C177.434 147.042 177.502 146.697 177.5 146.35Z" fill="#EF5944"/>
<path d="M156.09 2.75063C156.09 1.29259 154.908 0.110626 153.45 0.110626C151.992 0.110626 150.81 1.29259 150.81 2.75063C150.81 4.20866 151.992 5.39062 153.45 5.39062C154.908 5.39062 156.09 4.20866 156.09 2.75063Z" fill="#EF5944"/>
<path d="M156.09 26.6901C156.09 25.232 154.908 24.0501 153.45 24.0501C151.992 24.0501 150.81 25.232 150.81 26.6901C150.81 28.1481 151.992 29.3301 153.45 29.3301C154.908 29.3301 156.09 28.1481 156.09 26.6901Z" fill="#EF5944"/>
<path d="M156.1 50.6198C156.102 50.0952 155.948 49.5819 155.658 49.1448C155.368 48.7077 154.955 48.3664 154.471 48.1643C153.987 47.9622 153.454 47.9083 152.939 48.0094C152.424 48.1105 151.951 48.3621 151.58 48.7323C151.208 49.1025 150.955 49.5747 150.851 50.089C150.748 50.6033 150.8 51.1367 151.001 51.6215C151.201 52.1063 151.541 52.5207 151.977 52.8124C152.413 53.104 152.925 53.2598 153.45 53.2598C154.151 53.2598 154.823 52.9819 155.32 52.4871C155.817 51.9922 156.097 51.3208 156.1 50.6198V50.6198Z" fill="#EF5944"/>
<path d="M156.1 74.5502C156.1 74.0261 155.944 73.5137 155.653 73.0779C155.362 72.6421 154.948 72.3025 154.464 72.1019C153.98 71.9014 153.447 71.8489 152.933 71.9512C152.419 72.0534 151.947 72.3058 151.576 72.6764C151.205 73.047 150.953 73.5192 150.851 74.0332C150.748 74.5473 150.801 75.0801 151.002 75.5643C151.202 76.0486 151.542 76.4624 151.978 76.7535C152.413 77.0447 152.926 77.2002 153.45 77.2002C153.798 77.2002 154.142 77.1317 154.464 76.9985C154.785 76.8654 155.078 76.6701 155.324 76.4241C155.57 76.178 155.765 75.8858 155.898 75.5643C156.031 75.2428 156.1 74.8982 156.1 74.5502V74.5502Z" fill="#EF5944"/>
<path d="M156.09 98.4899C156.09 97.0319 154.908 95.8499 153.45 95.8499C151.992 95.8499 150.81 97.0319 150.81 98.4899C150.81 99.9479 151.992 101.13 153.45 101.13C154.908 101.13 156.09 99.9479 156.09 98.4899Z" fill="#EF5944"/>
<path d="M155.792 121.409C155.237 120.06 153.694 119.417 152.346 119.971C150.997 120.526 150.354 122.068 150.908 123.417C151.463 124.765 153.005 125.409 154.354 124.855C155.702 124.3 156.346 122.757 155.792 121.409Z" fill="#EF5944"/>
<path d="M156.1 146.35C156.1 145.826 155.944 145.313 155.653 144.878C155.362 144.442 154.948 144.102 154.464 143.902C153.98 143.701 153.447 143.649 152.933 143.751C152.419 143.853 151.947 144.105 151.576 144.476C151.205 144.847 150.953 145.319 150.851 145.833C150.748 146.347 150.801 146.88 151.002 147.364C151.202 147.848 151.542 148.262 151.978 148.553C152.413 148.845 152.926 149 153.45 149C154.153 149 154.827 148.721 155.324 148.224C155.821 147.727 156.1 147.053 156.1 146.35V146.35Z" fill="#EF5944"/>
<path d="M134.69 2.75063C134.69 1.29259 133.508 0.110626 132.05 0.110626C130.592 0.110626 129.41 1.29259 129.41 2.75063C129.41 4.20866 130.592 5.39062 132.05 5.39062C133.508 5.39062 134.69 4.20866 134.69 2.75063Z" fill="#EF5944"/>
<path d="M134.69 26.6901C134.69 25.232 133.508 24.0501 132.05 24.0501C130.592 24.0501 129.41 25.232 129.41 26.6901C129.41 28.1481 130.592 29.3301 132.05 29.3301C133.508 29.3301 134.69 28.1481 134.69 26.6901Z" fill="#EF5944"/>
<path d="M134.66 50.6197C134.662 50.0948 134.508 49.581 134.218 49.1437C133.927 48.7063 133.514 48.3651 133.029 48.1633C132.544 47.9615 132.011 47.9082 131.496 48.0101C130.981 48.112 130.508 48.3646 130.137 48.7358C129.765 49.107 129.513 49.5802 129.411 50.0952C129.309 50.6102 129.362 51.1438 129.564 51.6284C129.766 52.113 130.107 52.5268 130.544 52.8172C130.982 53.1077 131.495 53.2617 132.02 53.2597C132.72 53.2571 133.39 52.978 133.884 52.4835C134.379 51.989 134.658 51.3191 134.66 50.6197V50.6197Z" fill="#EF5944"/>
<path d="M134.66 74.5502C134.66 74.0256 134.505 73.5129 134.213 73.0769C133.921 72.6409 133.507 72.3012 133.022 72.1009C132.537 71.9007 132.004 71.8488 131.49 71.9519C130.975 72.0549 130.503 72.3083 130.133 72.6799C129.763 73.0515 129.511 73.5247 129.41 74.0394C129.309 74.5541 129.363 75.0872 129.565 75.5713C129.767 76.0553 130.108 76.4684 130.545 76.7584C130.982 77.0484 131.496 77.2022 132.02 77.2002C132.368 77.2002 132.712 77.1316 133.033 76.9983C133.354 76.865 133.645 76.6696 133.891 76.4234C134.136 76.1772 134.33 75.885 134.462 75.5636C134.594 75.2421 134.662 74.8977 134.66 74.5502V74.5502Z" fill="#EF5944"/>
<path d="M134.69 98.4899C134.69 97.0319 133.508 95.8499 132.05 95.8499C130.592 95.8499 129.41 97.0319 129.41 98.4899C129.41 99.9479 130.592 101.13 132.05 101.13C133.508 101.13 134.69 99.9479 134.69 98.4899Z" fill="#EF5944"/>
<path d="M134.389 121.406C133.835 120.057 132.292 119.414 130.944 119.968C129.595 120.523 128.951 122.065 129.506 123.414C130.06 124.762 131.603 125.406 132.951 124.852C134.3 124.297 134.944 122.754 134.389 121.406Z" fill="#EF5944"/>
<path d="M134.66 146.35C134.66 145.825 134.505 145.313 134.213 144.877C133.921 144.441 133.507 144.101 133.022 143.901C132.537 143.7 132.004 143.649 131.49 143.752C130.975 143.855 130.503 144.108 130.133 144.48C129.763 144.851 129.511 145.324 129.41 145.839C129.309 146.354 129.363 146.887 129.565 147.371C129.767 147.855 130.108 148.268 130.545 148.558C130.982 148.848 131.496 149.002 132.02 149C132.368 149 132.712 148.931 133.033 148.798C133.354 148.665 133.645 148.469 133.891 148.223C134.136 147.977 134.33 147.685 134.462 147.363C134.594 147.042 134.662 146.697 134.66 146.35V146.35Z" fill="#EF5944"/>
<path d="M113.28 2.75063C113.28 1.29259 112.098 0.110626 110.64 0.110626C109.182 0.110626 108 1.29259 108 2.75063C108 4.20866 109.182 5.39062 110.64 5.39062C112.098 5.39062 113.28 4.20866 113.28 2.75063Z" fill="#EF5944"/>
<path d="M113.28 26.6901C113.28 25.232 112.098 24.0501 110.64 24.0501C109.182 24.0501 108 25.232 108 26.6901C108 28.1481 109.182 29.3301 110.64 29.3301C112.098 29.3301 113.28 28.1481 113.28 26.6901Z" fill="#EF5944"/>
<path d="M113.29 50.6198C113.292 50.0952 113.139 49.5819 112.849 49.1448C112.559 48.7077 112.145 48.3664 111.661 48.1643C111.177 47.9622 110.644 47.9083 110.129 48.0094C109.615 48.1105 109.142 48.3621 108.77 48.7323C108.398 49.1025 108.145 49.5747 108.042 50.089C107.939 50.6033 107.991 51.1367 108.191 51.6215C108.391 52.1063 108.731 52.5207 109.167 52.8124C109.603 53.104 110.116 53.2598 110.64 53.2598C111.341 53.2598 112.014 52.9819 112.511 52.4871C113.007 51.9922 113.288 51.3208 113.29 50.6198V50.6198Z" fill="#EF5944"/>
<path d="M113.29 74.5502C113.29 74.0261 113.135 73.5137 112.844 73.0779C112.552 72.6421 112.139 72.3025 111.654 72.1019C111.17 71.9014 110.637 71.8489 110.123 71.9512C109.609 72.0534 109.137 72.3058 108.766 72.6764C108.396 73.047 108.143 73.5192 108.041 74.0332C107.939 74.5473 107.991 75.0801 108.192 75.5643C108.393 76.0486 108.732 76.4624 109.168 76.7535C109.604 77.0447 110.116 77.2002 110.64 77.2002C110.988 77.2002 111.333 77.1317 111.654 76.9985C111.976 76.8654 112.268 76.6701 112.514 76.4241C112.76 76.178 112.955 75.8858 113.089 75.5643C113.222 75.2428 113.29 74.8982 113.29 74.5502V74.5502Z" fill="#EF5944"/>
<path d="M113.28 98.4899C113.28 97.0319 112.098 95.8499 110.64 95.8499C109.182 95.8499 108 97.0319 108 98.4899C108 99.9479 109.182 101.13 110.64 101.13C112.098 101.13 113.28 99.9479 113.28 98.4899Z" fill="#EF5944"/>
<path d="M112.977 121.408C112.423 120.059 110.88 119.416 109.531 119.97C108.183 120.525 107.539 122.067 108.094 123.416C108.648 124.764 110.191 125.408 111.539 124.854C112.888 124.299 113.532 122.756 112.977 121.408Z" fill="#EF5944"/>
<path d="M113.29 146.35C113.29 145.826 113.135 145.313 112.844 144.878C112.552 144.442 112.139 144.102 111.654 143.902C111.17 143.701 110.637 143.649 110.123 143.751C109.609 143.853 109.137 144.105 108.766 144.476C108.396 144.847 108.143 145.319 108.041 145.833C107.939 146.347 107.991 146.88 108.192 147.364C108.393 147.848 108.732 148.262 109.168 148.553C109.604 148.845 110.116 149 110.64 149C111.343 149 112.017 148.721 112.514 148.224C113.011 147.727 113.29 147.053 113.29 146.35V146.35Z" fill="#EF5944"/>
</g>
<g clip-path="url(#clip1_1384_30010)">
<path d="M90.9099 2.75063C90.9099 1.29259 89.7279 0.110626 88.2699 0.110626C86.8119 0.110626 85.6299 1.29259 85.6299 2.75063C85.6299 4.20866 86.8119 5.39062 88.2699 5.39062C89.7279 5.39062 90.9099 4.20866 90.9099 2.75063Z" fill="#EF5944"/>
<path d="M90.9099 26.6901C90.9099 25.232 89.7279 24.0501 88.2699 24.0501C86.8119 24.0501 85.6299 25.232 85.6299 26.6901C85.6299 28.1481 86.8119 29.3301 88.2699 29.3301C89.7279 29.3301 90.9099 28.1481 90.9099 26.6901Z" fill="#EF5944"/>
<path d="M90.9104 50.6198C90.9123 50.0952 90.7586 49.5819 90.4686 49.1448C90.1787 48.7077 89.7654 48.3664 89.2814 48.1643C88.7973 47.9622 88.2642 47.9083 87.7495 48.0094C87.2348 48.1105 86.7617 48.3621 86.3901 48.7323C86.0185 49.1025 85.7651 49.5747 85.662 50.089C85.5589 50.6033 85.6108 51.1367 85.8111 51.6215C86.0114 52.1063 86.3511 52.5207 86.7871 52.8124C87.2231 53.104 87.7358 53.2598 88.2603 53.2598C88.9614 53.2598 89.6339 52.9819 90.1306 52.4871C90.6273 51.9922 90.9077 51.3208 90.9104 50.6198V50.6198Z" fill="#EF5944"/>
<path d="M90.9104 74.5502C90.9104 74.0261 90.7549 73.5137 90.4638 73.0779C90.1726 72.6421 89.7587 72.3025 89.2745 72.1019C88.7903 71.9014 88.2574 71.8489 87.7434 71.9512C87.2293 72.0534 86.7572 72.3058 86.3865 72.6764C86.0159 73.047 85.7635 73.5192 85.6613 74.0332C85.559 74.5473 85.6115 75.0801 85.8121 75.5643C86.0127 76.0486 86.3523 76.4624 86.7881 76.7535C87.2239 77.0447 87.7362 77.2002 88.2603 77.2002C88.6083 77.2002 88.953 77.1317 89.2745 76.9985C89.596 76.8654 89.8881 76.6701 90.1342 76.4241C90.3802 76.178 90.5755 75.8858 90.7087 75.5643C90.8419 75.2428 90.9104 74.8982 90.9104 74.5502V74.5502Z" fill="#EF5944"/>
<path d="M90.9099 98.4899C90.9099 97.0319 89.7279 95.8499 88.2699 95.8499C86.8119 95.8499 85.6299 97.0319 85.6299 98.4899C85.6299 99.9479 86.8119 101.13 88.2699 101.13C89.7279 101.13 90.9099 99.9479 90.9099 98.4899Z" fill="#EF5944"/>
<path d="M90.5952 121.41C90.0408 120.061 88.4982 119.418 87.1497 119.972C85.8012 120.527 85.1575 122.069 85.7119 123.418C86.2664 124.766 87.809 125.41 89.1575 124.855C90.506 124.301 91.1497 122.758 90.5952 121.41Z" fill="#EF5944"/>
<path d="M85.6602 146.35C85.6582 146.875 85.8122 147.388 86.1026 147.826C86.393 148.263 86.8068 148.604 87.2915 148.806C87.7761 149.008 88.3097 149.061 88.8247 148.959C89.3397 148.857 89.8128 148.605 90.184 148.234C90.5552 147.862 90.8078 147.389 90.9097 146.874C91.0116 146.359 90.9583 145.826 90.7565 145.341C90.5547 144.856 90.2135 144.443 89.7762 144.152C89.3389 143.862 88.8252 143.708 88.3002 143.71C87.6008 143.712 86.9308 143.991 86.4363 144.486C85.9418 144.98 85.6628 145.65 85.6602 146.35V146.35Z" fill="#EF5944"/>
<path d="M69.4997 2.75063C69.4997 1.29259 68.3178 0.110626 66.8597 0.110626C65.4017 0.110626 64.2197 1.29259 64.2197 2.75063C64.2197 4.20866 65.4017 5.39062 66.8597 5.39062C68.3178 5.39062 69.4997 4.20866 69.4997 2.75063Z" fill="#EF5944"/>
<path d="M69.4997 26.6901C69.4997 25.232 68.3178 24.0501 66.8597 24.0501C65.4017 24.0501 64.2197 25.232 64.2197 26.6901C64.2197 28.1481 65.4017 29.3301 66.8597 29.3301C68.3178 29.3301 69.4997 28.1481 69.4997 26.6901Z" fill="#EF5944"/>
<path d="M69.5002 50.6197C69.5022 50.0948 69.3482 49.581 69.0578 49.1437C68.7673 48.7063 68.3535 48.3651 67.8689 48.1633C67.3843 47.9615 66.8506 47.9082 66.3357 48.0101C65.8207 48.112 65.3475 48.3646 64.9763 48.7358C64.6051 49.107 64.3526 49.5802 64.2506 50.0952C64.1487 50.6102 64.202 51.1438 64.4038 51.6284C64.6056 52.113 64.9469 52.5268 65.3842 52.8172C65.8215 53.1077 66.3352 53.2617 66.8602 53.2597C67.5595 53.2571 68.2295 52.978 68.724 52.4835C69.2185 51.989 69.4976 51.3191 69.5002 50.6197V50.6197Z" fill="#EF5944"/>
<path d="M69.5002 74.5502C69.5002 74.0256 69.3445 73.5129 69.0529 73.0769C68.7612 72.6409 68.3468 72.3012 67.862 72.1009C67.3772 71.9007 66.8438 71.8488 66.3295 71.9519C65.8152 72.0549 65.343 72.3083 64.9728 72.6799C64.6026 73.0515 64.351 73.5247 64.2499 74.0394C64.1488 74.5541 64.2027 75.0872 64.4048 75.5713C64.6069 76.0553 64.9481 76.4684 65.3852 76.7584C65.8223 77.0484 66.3356 77.2022 66.8602 77.2002C67.2077 77.2002 67.5518 77.1316 67.8728 76.9983C68.1937 76.865 68.4852 76.6696 68.7305 76.4234C68.9758 76.1772 69.17 75.885 69.3021 75.5636C69.4342 75.2421 69.5015 74.8977 69.5002 74.5502V74.5502Z" fill="#EF5944"/>
<path d="M69.4997 98.4899C69.4997 97.0319 68.3178 95.8499 66.8597 95.8499C65.4017 95.8499 64.2197 97.0319 64.2197 98.4899C64.2197 99.9479 65.4017 101.13 66.8597 101.13C68.3178 101.13 69.4997 99.9479 69.4997 98.4899Z" fill="#EF5944"/>
<path d="M69.193 121.408C68.6385 120.059 67.0959 119.416 65.7474 119.97C64.3989 120.525 63.7551 122.067 64.3096 123.416C64.864 124.764 66.4067 125.408 67.7552 124.854C69.1037 124.299 69.7474 122.756 69.193 121.408Z" fill="#EF5944"/>
<path d="M69.5002 146.35C69.5002 145.825 69.3445 145.313 69.0529 144.877C68.7612 144.441 68.3468 144.101 67.862 143.901C67.3772 143.7 66.8438 143.649 66.3295 143.752C65.8152 143.855 65.343 144.108 64.9728 144.48C64.6026 144.851 64.351 145.324 64.2499 145.839C64.1488 146.354 64.2027 146.887 64.4048 147.371C64.6069 147.855 64.9481 148.268 65.3852 148.558C65.8223 148.848 66.3356 149.002 66.8602 149C67.2077 149 67.5518 148.931 67.8728 148.798C68.1937 148.665 68.4852 148.469 68.7305 148.223C68.9758 147.977 69.17 147.685 69.3021 147.363C69.4342 147.042 69.5015 146.697 69.5002 146.35Z" fill="#EF5944"/>
<path d="M48.0896 2.75063C48.0896 1.29259 46.9076 0.110626 45.4496 0.110626C43.9915 0.110626 42.8096 1.29259 42.8096 2.75063C42.8096 4.20866 43.9915 5.39062 45.4496 5.39062C46.9076 5.39062 48.0896 4.20866 48.0896 2.75063Z" fill="#EF5944"/>
<path d="M48.0896 26.6901C48.0896 25.232 46.9076 24.0501 45.4496 24.0501C43.9915 24.0501 42.8096 25.232 42.8096 26.6901C42.8096 28.1481 43.9915 29.3301 45.4496 29.3301C46.9076 29.3301 48.0896 28.1481 48.0896 26.6901Z" fill="#EF5944"/>
<path d="M48.0998 50.6198C48.1018 50.0952 47.9481 49.5819 47.6581 49.1448C47.3681 48.7077 46.9549 48.3664 46.4708 48.1643C45.9868 47.9622 45.4537 47.9083 44.939 48.0094C44.4243 48.1105 43.9512 48.3621 43.5795 48.7323C43.2079 49.1025 42.9545 49.5747 42.8515 50.089C42.7484 50.6033 42.8003 51.1367 43.0006 51.6215C43.2008 52.1063 43.5405 52.5207 43.9765 52.8124C44.4125 53.104 44.9252 53.2598 45.4498 53.2598C46.1509 53.2598 46.8234 52.9819 47.3201 52.4871C47.8168 51.9922 48.0972 51.3208 48.0998 50.6198V50.6198Z" fill="#EF5944"/>
<path d="M48.0998 74.5502C48.0998 74.0261 47.9444 73.5137 47.6532 73.0779C47.362 72.6421 46.9482 72.3025 46.4639 72.1019C45.9797 71.9014 45.4469 71.8489 44.9328 71.9512C44.4188 72.0534 43.9465 72.3058 43.5759 72.6764C43.2053 73.047 42.953 73.5192 42.8507 74.0332C42.7485 74.5473 42.801 75.0801 43.0015 75.5643C43.2021 76.0486 43.5418 76.4624 43.9776 76.7535C44.4133 77.0447 44.9257 77.2002 45.4498 77.2002C45.7978 77.2002 46.1424 77.1317 46.4639 76.9985C46.7855 76.8654 47.0775 76.6701 47.3236 76.4241C47.5697 76.178 47.7649 75.8858 47.8981 75.5643C48.0313 75.2428 48.0998 74.8982 48.0998 74.5502V74.5502Z" fill="#EF5944"/>
<path d="M48.0896 98.4899C48.0896 97.0319 46.9076 95.8499 45.4496 95.8499C43.9915 95.8499 42.8096 97.0319 42.8096 98.4899C42.8096 99.9479 43.9915 101.13 45.4496 101.13C46.9076 101.13 48.0896 99.9479 48.0896 98.4899Z" fill="#EF5944"/>
<path d="M47.7915 121.409C47.2371 120.06 45.6944 119.417 44.3459 119.971C42.9974 120.526 42.3538 122.068 42.9082 123.417C43.4626 124.765 45.0052 125.409 46.3537 124.855C47.7022 124.3 48.346 122.757 47.7915 121.409Z" fill="#EF5944"/>
<path d="M48.0998 146.35C48.0998 145.826 47.9444 145.313 47.6532 144.878C47.362 144.442 46.9482 144.102 46.4639 143.902C45.9797 143.701 45.4469 143.649 44.9328 143.751C44.4188 143.853 43.9465 144.105 43.5759 144.476C43.2053 144.847 42.953 145.319 42.8507 145.833C42.7485 146.347 42.801 146.88 43.0015 147.364C43.2021 147.848 43.5418 148.262 43.9776 148.553C44.4133 148.845 44.9257 149 45.4498 149C46.1526 149 46.8266 148.721 47.3236 148.224C47.8206 147.727 48.0998 147.053 48.0998 146.35V146.35Z" fill="#EF5944"/>
<path d="M26.6902 2.75063C26.6902 1.29259 25.5082 0.110626 24.0502 0.110626C22.5921 0.110626 21.4102 1.29259 21.4102 2.75063C21.4102 4.20866 22.5921 5.39062 24.0502 5.39062C25.5082 5.39062 26.6902 4.20866 26.6902 2.75063Z" fill="#EF5944"/>
<path d="M26.6902 26.6901C26.6902 25.232 25.5082 24.0501 24.0502 24.0501C22.5921 24.0501 21.4102 25.232 21.4102 26.6901C21.4102 28.1481 22.5921 29.3301 24.0502 29.3301C25.5082 29.3301 26.6902 28.1481 26.6902 26.6901Z" fill="#EF5944"/>
<path d="M26.6604 50.6197C26.6623 50.0948 26.5083 49.581 26.2179 49.1437C25.9275 48.7063 25.5137 48.3651 25.0291 48.1633C24.5444 47.9615 24.0108 47.9082 23.4958 48.0101C22.9808 48.112 22.5078 48.3646 22.1366 48.7358C21.7653 49.107 21.5127 49.5802 21.4108 50.0952C21.3089 50.6102 21.3622 51.1438 21.564 51.6284C21.7658 52.113 22.107 52.5268 22.5443 52.8172C22.9817 53.1077 23.4954 53.2617 24.0203 53.2597C24.7197 53.2571 25.3897 52.978 25.8842 52.4835C26.3788 51.989 26.6577 51.3191 26.6604 50.6197V50.6197Z" fill="#EF5944"/>
<path d="M26.6604 74.5502C26.6604 74.0256 26.5047 73.5129 26.213 73.0769C25.9214 72.6409 25.507 72.3012 25.0222 72.1009C24.5374 71.9007 24.004 71.8488 23.4897 71.9519C22.9754 72.0549 22.5032 72.3083 22.133 72.6799C21.7628 73.0515 21.5112 73.5247 21.4101 74.0394C21.3089 74.5541 21.3629 75.0872 21.565 75.5713C21.7671 76.0553 22.1083 76.4684 22.5454 76.7584C22.9825 77.0484 23.4958 77.2022 24.0203 77.2002C24.3679 77.2002 24.712 77.1316 25.033 76.9983C25.3539 76.865 25.6454 76.6696 25.8906 76.4234C26.1359 76.1772 26.3302 75.885 26.4623 75.5636C26.5944 75.2421 26.6617 74.8977 26.6604 74.5502V74.5502Z" fill="#EF5944"/>
<path d="M26.6902 98.4899C26.6902 97.0319 25.5082 95.8499 24.0502 95.8499C22.5921 95.8499 21.4102 97.0319 21.4102 98.4899C21.4102 99.9479 22.5921 101.13 24.0502 101.13C25.5082 101.13 26.6902 99.9479 26.6902 98.4899Z" fill="#EF5944"/>
<path d="M26.3892 121.406C25.8348 120.057 24.2922 119.414 22.9437 119.968C21.5952 120.523 20.9514 122.065 21.5059 123.414C22.0603 124.762 23.603 125.406 24.9515 124.852C26.3 124.297 26.9437 122.754 26.3892 121.406Z" fill="#EF5944"/>
<path d="M26.6604 146.35C26.6604 145.825 26.5047 145.313 26.213 144.877C25.9214 144.441 25.507 144.101 25.0222 143.901C24.5374 143.7 24.004 143.649 23.4897 143.752C22.9754 143.855 22.5032 144.108 22.133 144.48C21.7628 144.851 21.5112 145.324 21.4101 145.839C21.3089 146.354 21.3629 146.887 21.565 147.371C21.7671 147.855 22.1083 148.268 22.5454 148.558C22.9825 148.848 23.4958 149.002 24.0203 149C24.3679 149 24.712 148.931 25.033 148.798C25.3539 148.665 25.6454 148.469 25.8906 148.223C26.1359 147.977 26.3302 147.685 26.4623 147.363C26.5944 147.042 26.6617 146.697 26.6604 146.35V146.35Z" fill="#EF5944"/>
<path d="M5.28 2.75063C5.28 1.29259 4.09803 0.110626 2.64 0.110626C1.18197 0.110626 -1.79131e-07 1.29259 -1.15398e-07 2.75063C-5.16654e-08 4.20866 1.18197 5.39062 2.64 5.39062C4.09803 5.39062 5.28 4.20866 5.28 2.75063Z" fill="#EF5944"/>
<path d="M5.28 26.6901C5.28 25.232 4.09803 24.0501 2.64 24.0501C1.18197 24.0501 -1.79131e-07 25.232 -1.15398e-07 26.6901C-5.16654e-08 28.1481 1.18197 29.3301 2.64 29.3301C4.09803 29.3301 5.28 28.1481 5.28 26.6901Z" fill="#EF5944"/>
<path d="M5.29024 50.6198C5.29222 50.0952 5.13851 49.5819 4.84853 49.1448C4.55855 48.7077 4.14532 48.3664 3.66127 48.1643C3.17723 47.9622 2.64412 47.9083 2.12941 48.0094C1.61471 48.1105 1.14159 48.3621 0.769978 48.7323C0.398367 49.1025 0.144953 49.5747 0.0418893 50.089C-0.0611746 50.6033 -0.00927678 51.1367 0.190998 51.6215C0.391273 52.1063 0.730946 52.5207 1.16695 52.8124C1.60295 53.104 2.11567 53.2598 2.64022 53.2598C3.34131 53.2598 4.01383 52.9819 4.51052 52.4871C5.0072 51.9922 5.2876 51.3208 5.29024 50.6198V50.6198Z" fill="#EF5944"/>
<path d="M5.29023 74.5502C5.29023 74.0261 5.13483 73.5137 4.84364 73.0779C4.55245 72.6421 4.13859 72.3025 3.65437 72.1019C3.17015 71.9014 2.63729 71.8489 2.12324 71.9512C1.60919 72.0534 1.13698 72.3058 0.76637 72.6764C0.39576 73.047 0.143401 73.5192 0.0411499 74.0332C-0.0611009 74.5473 -0.00860443 75.0801 0.191968 75.5643C0.39254 76.0486 0.732191 76.4624 1.16798 76.7535C1.60377 77.0447 2.11609 77.2002 2.64021 77.2002C2.98821 77.2002 3.33286 77.1317 3.65437 76.9985C3.97588 76.8654 4.26798 76.6701 4.51405 76.4241C4.76013 76.178 4.95534 75.8858 5.08851 75.5643C5.22169 75.2428 5.29023 74.8982 5.29023 74.5502V74.5502Z" fill="#EF5944"/>
<path d="M5.28 98.4899C5.28 97.0319 4.09803 95.8499 2.64 95.8499C1.18197 95.8499 -1.79131e-07 97.0319 -1.15398e-07 98.4899C-5.16654e-08 99.9479 1.18197 101.13 2.64 101.13C4.09803 101.13 5.28 99.9479 5.28 98.4899Z" fill="#EF5944"/>
<path d="M4.97708 121.408C4.42265 120.059 2.87999 119.416 1.53149 119.97C0.182988 120.525 -0.460681 122.067 0.0937552 123.416C0.648191 124.764 2.19079 125.408 3.53929 124.854C4.88779 124.299 5.53152 122.756 4.97708 121.408Z" fill="#EF5944"/>
<path d="M5.29023 146.35C5.29023 145.826 5.13483 145.313 4.84364 144.878C4.55245 144.442 4.13859 144.102 3.65437 143.902C3.17015 143.701 2.63729 143.649 2.12324 143.751C1.60919 143.853 1.13698 144.105 0.76637 144.476C0.39576 144.847 0.143401 145.319 0.0411499 145.833C-0.0611009 146.347 -0.00860443 146.88 0.191968 147.364C0.39254 147.848 0.732191 148.262 1.16798 148.553C1.60377 148.845 2.11609 149 2.64021 149C3.34303 149 4.01708 148.721 4.51405 148.224C5.01102 147.727 5.29023 147.053 5.29023 146.35V146.35Z" fill="#EF5944"/>
</g>
<defs>
<clipPath id="clip0_1384_30010">
<rect width="148.89" height="90.91" fill="white" transform="translate(108 149) rotate(-90)"/>
</clipPath>
<clipPath id="clip1_1384_30010">
<rect width="148.89" height="90.91" fill="white" transform="translate(0 149) rotate(-90)"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -1,25 +0,0 @@
<svg width="164" height="160" viewBox="0 0 164 160" fill="none" xmlns="http://www.w3.org/2000/svg">
<mask id="mask0_623_24480" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="4" y="0" width="279" height="279">
<circle cx="143.5" cy="139.5" r="137.576" fill="#C4C4C4" stroke="#F8BB54" stroke-width="3.84828"/>
</mask>
<g mask="url(#mask0_623_24480)">
<path d="M-77.0708 58.5036C-77.0708 58.5036 -12.1115 46.4704 4.64888 4.35483C20.6779 -36.0177 86.7061 -46.8696 86.7061 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 78.7456C-77.0708 78.7456 2.62416 64.8573 23.1525 14.0263C42.7247 -34.4995 123.657 -46.8696 123.657 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 99.0445C-77.0708 99.0445 17.3033 83.2442 41.5999 23.8102C64.7716 -33.0373 160.608 -46.8696 160.608 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 119.287C-77.0708 119.287 32.0387 101.631 60.1035 33.4816C86.8185 -31.5191 197.559 -46.8696 197.559 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 139.53C-77.0708 139.53 46.7742 120.018 78.6072 43.2091C108.865 -30.0009 234.454 -46.8696 234.454 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 159.828C-77.0708 159.828 61.4533 138.461 97.0546 52.9366C130.968 -28.5391 271.405 -46.8696 271.405 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 180.07C-77.0708 180.07 76.1887 156.792 115.558 62.6644C153.015 -27.0209 308.356 -46.8696 308.356 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 200.313C-77.0708 200.313 90.9243 175.178 134.005 72.3359C175.062 -25.5027 345.307 -46.8696 345.307 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 220.612C-77.0708 220.612 105.603 193.622 152.509 82.1194C197.109 -24.0409 382.202 -46.8696 382.202 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 240.853C-77.0708 240.853 120.339 212.009 170.957 91.8473C219.156 -22.5227 419.153 -46.8696 419.153 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 261.152C-77.0708 261.152 135.074 230.395 189.46 101.575C241.203 -21.0045 456.104 -46.8696 456.104 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 281.396C-77.0708 281.396 149.753 248.783 207.908 111.303C263.25 -19.5423 493.054 -46.8696 493.054 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 301.636C-77.0708 301.636 164.489 267.17 226.411 120.974C285.297 -18.0241 530.005 -46.8696 530.005 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 321.935C-77.0708 321.935 179.224 285.557 244.915 130.758C307.343 -16.5059 566.901 -46.8696 566.901 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 342.179C-77.0708 342.179 193.903 303.943 263.362 140.429C329.391 -15.0441 603.852 -46.8696 603.852 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 362.423C-77.0708 362.423 208.639 322.33 281.866 150.157C351.437 -13.5259 640.803 -46.8696 640.803 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 382.722C-77.0708 382.722 223.374 340.772 300.313 159.884C373.484 -12.0077 677.753 -46.8696 677.753 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-77.0708 402.962C-77.0708 402.962 238.053 359.104 318.817 169.612C395.531 -10.546 714.65 -46.8696 714.65 -46.8696" stroke="#EF5944" stroke-width="4.32558" stroke-miterlimit="10"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -1,22 +0,0 @@
<svg width="160" height="160" viewBox="0 0 160 160" fill="none" xmlns="http://www.w3.org/2000/svg">
<mask id="mask0_623_24459" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="-119" y="-119" width="279" height="279">
<circle cx="20.5" cy="20.5" r="137.576" fill="#C4C4C4" stroke="#F8BB54" stroke-width="3.84828"/>
</mask>
<g mask="url(#mask0_623_24459)">
<path d="M-200.071 0.287015C-200.071 0.287015 -90.9613 -17.3688 -62.8965 -85.5184C-36.1815 -150.519 74.5591 -165.87 74.5591 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 20.5295C-200.071 20.5295 -76.2258 1.01813 -44.3928 -75.7909C-14.1348 -149.001 111.454 -165.87 111.454 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 40.828C-200.071 40.828 -61.5467 19.461 -25.9454 -66.0635C7.96833 -147.539 148.405 -165.87 148.405 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 61.0704C-200.071 61.0704 -46.8113 37.7915 -7.44177 -56.3356C30.0154 -146.021 185.356 -165.87 185.356 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 81.3129C-200.071 81.3129 -32.0757 56.1785 11.0054 -46.6641C52.0621 -144.503 222.307 -165.87 222.307 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 101.612C-200.071 101.612 -17.3968 74.6219 29.5091 -36.8806C74.1093 -143.041 259.202 -165.87 259.202 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 121.853C-200.071 121.853 -2.66112 93.0088 47.9568 -27.1527C96.156 -141.523 296.153 -165.87 296.153 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 142.152C-200.071 142.152 12.0741 111.395 66.4604 -17.4253C118.203 -140.005 333.104 -165.87 333.104 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 162.396C-200.071 162.396 26.7534 129.783 84.9076 -7.69737C140.25 -138.542 370.054 -165.87 370.054 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 182.636C-200.071 182.636 41.4887 148.17 103.411 1.97366C162.297 -137.024 407.005 -165.87 407.005 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 202.935C-200.071 202.935 56.2243 166.557 121.915 11.7576C184.343 -135.506 443.901 -165.87 443.901 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 223.179C-200.071 223.179 70.9033 184.943 140.362 21.429C206.391 -134.044 480.852 -165.87 480.852 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 243.423C-200.071 243.423 85.639 203.33 158.866 31.1565C228.437 -132.526 517.803 -165.87 517.803 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 263.722C-200.071 263.722 100.374 221.772 177.313 40.8844C250.484 -131.008 554.753 -165.87 554.753 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
<path d="M-200.071 283.962C-200.071 283.962 115.053 240.104 195.817 50.6119C272.531 -129.546 591.65 -165.87 591.65 -165.87" stroke="#F59E0B" stroke-width="4.32558" stroke-miterlimit="10"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -1,7 +0,0 @@
<svg width="616" height="220" viewBox="0 0 616 220" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M615.24 218.233V219.948H538.078C538.078 234.694 520.93 246.697 499.668 246.697C478.405 246.697 461.258 234.694 461.258 219.948H384.439C384.439 234.694 367.292 246.697 346.029 246.697C324.767 246.697 307.62 234.694 307.62 219.948H230.801C230.801 234.694 213.653 246.697 192.391 246.697C171.129 246.697 153.981 234.694 153.981 219.948H76.8192C76.8192 234.694 59.6721 246.697 38.4096 246.697C17.1472 246.697 0 234.694 0 219.948H76.8192V218.233C76.8192 203.486 94.3093 191.484 115.572 191.484C136.834 191.484 153.981 203.486 153.981 218.233V219.948H230.801V218.233C230.801 203.486 247.948 191.484 269.21 191.484C290.473 191.484 307.62 203.486 307.62 218.233V219.948H384.439V218.233C384.439 203.486 401.586 191.484 422.849 191.484C444.111 191.484 461.258 203.486 461.258 218.233V219.948H538.078V218.233C538.078 203.486 555.568 191.484 576.83 191.484C598.093 191.484 615.24 203.486 615.24 218.233Z" fill="black" fill-opacity="0.05"/>
<path d="M615.24 163.362V165.077H538.078C538.078 179.823 520.93 191.826 499.668 191.826C478.405 191.826 461.258 179.823 461.258 165.077H384.439C384.439 179.823 367.292 191.826 346.029 191.826C324.767 191.826 307.62 179.823 307.62 165.077H230.801C230.801 179.823 213.653 191.826 192.391 191.826C171.129 191.826 153.981 179.823 153.981 165.077H76.8192C76.8192 179.823 59.6721 191.826 38.4096 191.826C17.1472 191.826 0 179.823 0 165.077H76.8192V163.362C76.8192 148.616 94.3093 136.613 115.572 136.613C136.834 136.613 153.981 148.616 153.981 163.362V165.077H230.801V163.362C230.801 148.616 247.948 136.613 269.21 136.613C290.473 136.613 307.62 148.616 307.62 163.362V165.077H384.439V163.362C384.439 148.616 401.586 136.613 422.849 136.613C444.111 136.613 461.258 148.616 461.258 163.362V165.077H538.078V163.362C538.078 148.616 555.568 136.613 576.83 136.613C598.093 136.613 615.24 148.616 615.24 163.362Z" fill="black" fill-opacity="0.05"/>
<path d="M615.24 108.491V110.206H538.078C538.078 124.953 520.93 136.956 499.668 136.956C478.405 136.956 461.258 124.953 461.258 110.206H384.439C384.439 124.953 367.292 136.956 346.029 136.956C324.767 136.956 307.62 124.953 307.62 110.206H230.801C230.801 124.953 213.653 136.956 192.391 136.956C171.129 136.956 153.981 124.953 153.981 110.206H76.8192C76.8192 124.953 59.6721 136.956 38.4096 136.956C17.1472 136.956 0 124.953 0 110.206H76.8192V108.491C76.8192 93.7447 94.3093 81.7418 115.572 81.7418C136.834 81.7418 153.981 93.7447 153.981 108.491V110.206H230.801V108.491C230.801 93.7447 247.948 81.7418 269.21 81.7418C290.473 81.7418 307.62 93.7447 307.62 108.491V110.206H384.439V108.491C384.439 93.7447 401.586 81.7418 422.849 81.7418C444.111 81.7418 461.258 93.7447 461.258 108.491V110.206H538.078V108.491C538.078 93.7447 555.568 81.7418 576.83 81.7418C598.093 81.7418 615.24 93.7447 615.24 108.491Z" fill="black" fill-opacity="0.05"/>
<path d="M615.24 53.6204V55.3351H538.078C538.078 70.0816 520.93 82.0847 499.668 82.0847C478.405 82.0847 461.258 70.0816 461.258 55.3351H384.439C384.439 70.0816 367.292 82.0847 346.029 82.0847C324.767 82.0847 307.62 70.0816 307.62 55.3351H230.801C230.801 70.0816 213.653 82.0847 192.391 82.0847C171.129 82.0847 153.981 70.0816 153.981 55.3351H76.8192C76.8192 70.0816 59.6721 82.0847 38.4096 82.0847C17.1472 82.0847 0 70.0816 0 55.3351H76.8192V53.6204C76.8192 38.8738 94.3093 26.8708 115.572 26.8708C136.834 26.8708 153.981 38.8738 153.981 53.6204V55.3351H230.801V53.6204C230.801 38.8738 247.948 26.8708 269.21 26.8708C290.473 26.8708 307.62 38.8738 307.62 53.6204V55.3351H384.439V53.6204C384.439 38.8738 401.586 26.8708 422.849 26.8708C444.111 26.8708 461.258 38.8738 461.258 53.6204V55.3351H538.078V53.6204C538.078 38.8738 555.568 26.8708 576.83 26.8708C598.093 26.8708 615.24 38.8738 615.24 53.6204Z" fill="black" fill-opacity="0.05"/>
<path d="M615.24 -1.25049V0.464224H538.078C538.078 15.2108 520.93 27.2138 499.668 27.2138C478.405 27.2138 461.258 15.2108 461.258 0.464224H384.439C384.439 15.2108 367.292 27.2138 346.029 27.2138C324.767 27.2138 307.62 15.2108 307.62 0.464224H230.801C230.801 15.2108 213.653 27.2138 192.391 27.2138C171.129 27.2138 153.981 15.2108 153.981 0.464224H76.8192C76.8192 15.2108 59.6721 27.2138 38.4096 27.2138C17.1472 27.2138 0 15.2108 0 0.464224H76.8192V-1.25049C76.8192 -15.997 94.3093 -28 115.572 -28C136.834 -28 153.981 -15.997 153.981 -1.25049V0.464224H230.801V-1.25049C230.801 -15.997 247.948 -28 269.21 -28C290.473 -28 307.62 -15.997 307.62 -1.25049V0.464224H384.439V-1.25049C384.439 -15.997 401.586 -28 422.849 -28C444.111 -28 461.258 -15.997 461.258 -1.25049V0.464224H538.078V-1.25049C538.078 -15.997 555.568 -28 576.83 -28C598.093 -28 615.24 -15.997 615.24 -1.25049Z" fill="black" fill-opacity="0.05"/>
</svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

View File

Before

Width:  |  Height:  |  Size: 715 B

After

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

View File

@@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="121px" height="32px" viewBox="0 0 121 32" style="enable-background:new 0 0 121 32;" xml:space="preserve">
<style type="text/css">
.st0{fill:#0073FF;stroke:#0073FF;stroke-miterlimit:10;}
.st1{fill:#212121;}
</style>
<path class="st0" d="M5.4,10.6C5.4,9.1,6.6,8,8,8h11.8l-2,2c-0.3,0.3-0.3,0.9,0,1.2s0.9,0.3,1.2,0l3.4-3.4c0.2-0.1,0.3-0.4,0.3-0.7
c0-0.2-0.1-0.5-0.3-0.6L19,3c-0.3-0.3-0.9-0.3-1.2,0c-0.3,0.3-0.3,0.9,0,1.2l2,2H8c-2.4,0-4.3,2-4.3,4.4v8.1c0,0.5,0.4,0.9,0.9,0.9
s0.9-0.4,0.9-0.9L5.4,10.6L5.4,10.6z"/>
<path class="st0" d="M18.1,24H6.3l2-2c0.3-0.3,0.3-0.9,0-1.2c-0.3-0.3-0.9-0.3-1.2,0l-3.4,3.4c-0.2,0.1-0.3,0.4-0.3,0.7
c0,0.2,0.1,0.5,0.3,0.6L7.1,29c0.3,0.3,0.9,0.3,1.2,0s0.3-0.9,0-1.2l-2-2h11.8c2.4,0,4.3-2,4.3-4.4v-8.1c0-0.5-0.4-0.9-0.9-0.9
s-0.9,0.4-0.9,0.9v8.1C20.7,22.9,19.5,24,18.1,24z"/>
<g>
<path class="st1" d="M29.6,21.6V10h4.7c0.9,0,1.6,0.1,2.1,0.4s1,0.6,1.3,1.1c0.3,0.4,0.4,1,0.4,1.5c0,0.5-0.1,0.9-0.3,1.2
c-0.2,0.3-0.4,0.6-0.7,0.8s-0.7,0.4-1.1,0.5v0.1c0.4,0,0.9,0.1,1.2,0.4c0.4,0.2,0.7,0.6,0.9,1c0.2,0.4,0.4,0.9,0.4,1.5
c0,0.6-0.2,1.2-0.5,1.7c-0.3,0.5-0.8,0.9-1.3,1.1c-0.6,0.3-1.3,0.4-2.2,0.4H29.6z M32.1,14.8h1.8c0.3,0,0.6-0.1,0.9-0.2
c0.3-0.1,0.5-0.3,0.6-0.5c0.2-0.2,0.2-0.5,0.2-0.8c0-0.4-0.1-0.8-0.4-1C34.9,12.1,34.5,12,34,12h-1.9V14.8z M32.1,19.6h2
c0.7,0,1.2-0.1,1.5-0.4s0.5-0.6,0.5-1.1c0-0.3-0.1-0.6-0.2-0.9s-0.4-0.4-0.7-0.6c-0.3-0.1-0.6-0.2-1-0.2h-2.1V19.6z"/>
<path class="st1" d="M42.7,21.8c-0.6,0-1.1-0.1-1.5-0.3s-0.8-0.5-1-0.9s-0.4-0.9-0.4-1.4c0-0.5,0.1-0.9,0.3-1.2
c0.2-0.3,0.4-0.6,0.7-0.8c0.3-0.2,0.7-0.4,1-0.5s0.8-0.2,1.2-0.2c0.5-0.1,0.9-0.1,1.2-0.2c0.3,0,0.5-0.1,0.7-0.2s0.2-0.2,0.2-0.4v0
c0-0.4-0.1-0.6-0.3-0.8c-0.2-0.2-0.5-0.3-1-0.3c-0.4,0-0.8,0.1-1,0.3c-0.3,0.2-0.4,0.4-0.5,0.7l-2.2-0.2c0.1-0.5,0.3-1,0.7-1.4
c0.3-0.4,0.8-0.7,1.3-0.9s1.1-0.3,1.8-0.3c0.5,0,1,0.1,1.4,0.2c0.4,0.1,0.8,0.3,1.2,0.5c0.3,0.2,0.6,0.5,0.8,0.9
c0.2,0.4,0.3,0.8,0.3,1.3v5.9h-2.3v-1.2h-0.1c-0.1,0.3-0.3,0.5-0.6,0.7c-0.2,0.2-0.5,0.4-0.8,0.5C43.5,21.7,43.1,21.8,42.7,21.8z
M43.4,20.1c0.4,0,0.7-0.1,0.9-0.2c0.3-0.1,0.5-0.3,0.6-0.6c0.2-0.2,0.2-0.5,0.2-0.8v-0.9c-0.1,0-0.2,0.1-0.3,0.1s-0.3,0.1-0.4,0.1
c-0.2,0-0.3,0.1-0.5,0.1c-0.2,0-0.3,0-0.4,0.1c-0.3,0-0.5,0.1-0.7,0.2c-0.2,0.1-0.4,0.2-0.5,0.4s-0.2,0.3-0.2,0.6
c0,0.3,0.1,0.6,0.4,0.8C42.7,20,43,20.1,43.4,20.1z"/>
<path class="st1" d="M56.7,15.4l-2.2,0.1c0-0.2-0.1-0.4-0.2-0.5s-0.3-0.3-0.5-0.4s-0.4-0.1-0.7-0.1c-0.4,0-0.7,0.1-0.9,0.2
c-0.3,0.2-0.4,0.4-0.4,0.6c0,0.2,0.1,0.4,0.2,0.5c0.2,0.1,0.5,0.3,0.9,0.3l1.6,0.3c0.8,0.2,1.5,0.5,1.9,0.8
c0.4,0.4,0.6,0.9,0.6,1.5c0,0.6-0.2,1.1-0.5,1.5c-0.3,0.4-0.8,0.8-1.4,1s-1.3,0.4-2,0.4c-1.2,0-2.1-0.2-2.8-0.7
c-0.7-0.5-1.1-1.1-1.2-2l2.4-0.1c0.1,0.4,0.2,0.6,0.5,0.8S52.6,20,53,20c0.4,0,0.8-0.1,1-0.2c0.3-0.2,0.4-0.4,0.4-0.6
c0-0.2-0.1-0.4-0.3-0.5c-0.2-0.1-0.5-0.3-0.8-0.3L51.8,18c-0.9-0.2-1.5-0.5-1.9-0.9c-0.4-0.4-0.6-1-0.6-1.6c0-0.6,0.2-1,0.5-1.4
c0.3-0.4,0.7-0.7,1.3-0.9c0.6-0.2,1.2-0.3,2-0.3c1.1,0,2,0.2,2.6,0.7C56.2,13.9,56.6,14.6,56.7,15.4z"/>
<path class="st1" d="M59.7,11.7c-0.4,0-0.7-0.1-0.9-0.4c-0.3-0.2-0.4-0.5-0.4-0.9c0-0.3,0.1-0.6,0.4-0.9c0.3-0.2,0.6-0.4,0.9-0.4
c0.4,0,0.7,0.1,0.9,0.4c0.3,0.2,0.4,0.5,0.4,0.9c0,0.3-0.1,0.6-0.4,0.9C60.3,11.6,60,11.7,59.7,11.7z M58.4,21.6v-8.7h2.4v8.7H58.4
z"/>
<path class="st1" d="M66.7,21.8c-0.9,0-1.7-0.2-2.3-0.6c-0.6-0.4-1.1-0.9-1.5-1.6c-0.3-0.7-0.5-1.5-0.5-2.3c0-0.9,0.2-1.7,0.5-2.4
s0.8-1.2,1.5-1.6c0.6-0.4,1.4-0.6,2.3-0.6c0.8,0,1.4,0.1,2,0.4c0.6,0.3,1,0.7,1.4,1.2c0.3,0.5,0.5,1.1,0.6,1.8h-2.3
c-0.1-0.4-0.2-0.8-0.5-1.1c-0.3-0.3-0.6-0.4-1.1-0.4c-0.4,0-0.7,0.1-1,0.3c-0.3,0.2-0.5,0.5-0.7,0.9c-0.2,0.4-0.2,0.9-0.2,1.4
c0,0.6,0.1,1,0.2,1.4c0.2,0.4,0.4,0.7,0.7,0.9c0.3,0.2,0.6,0.3,1,0.3c0.3,0,0.5-0.1,0.7-0.2c0.2-0.1,0.4-0.3,0.6-0.5
c0.1-0.2,0.2-0.5,0.3-0.8h2.3c0,0.7-0.2,1.3-0.5,1.8c-0.3,0.5-0.8,0.9-1.3,1.2C68.2,21.6,67.5,21.8,66.7,21.8z"/>
<path class="st1" d="M78.6,13.3c0-0.5-0.2-0.8-0.6-1.1c-0.3-0.3-0.8-0.4-1.4-0.4c-0.4,0-0.7,0.1-1,0.2c-0.3,0.1-0.5,0.3-0.6,0.5
c-0.1,0.2-0.2,0.4-0.2,0.7c0,0.2,0,0.4,0.1,0.5s0.2,0.3,0.4,0.4c0.2,0.1,0.4,0.2,0.6,0.3c0.2,0.1,0.5,0.2,0.7,0.2l1,0.2
c0.5,0.1,1,0.3,1.4,0.5s0.8,0.4,1.1,0.7s0.6,0.6,0.7,1c0.2,0.4,0.3,0.8,0.3,1.3c0,0.7-0.2,1.3-0.5,1.8c-0.4,0.5-0.9,0.9-1.5,1.2
c-0.7,0.3-1.5,0.4-2.4,0.4c-0.9,0-1.8-0.1-2.5-0.4c-0.7-0.3-1.2-0.7-1.6-1.3c-0.4-0.6-0.6-1.3-0.6-2.1h2.4c0,0.4,0.1,0.7,0.3,1
c0.2,0.3,0.5,0.5,0.8,0.6s0.7,0.2,1.1,0.2c0.4,0,0.8-0.1,1.1-0.2c0.3-0.1,0.5-0.3,0.7-0.5c0.2-0.2,0.3-0.5,0.3-0.7
c0-0.3-0.1-0.5-0.2-0.7c-0.2-0.2-0.4-0.3-0.7-0.5c-0.3-0.1-0.7-0.2-1.1-0.3l-1.3-0.3c-1-0.2-1.8-0.6-2.3-1.1s-0.9-1.2-0.8-2.1
c0-0.7,0.2-1.3,0.6-1.8s0.9-0.9,1.6-1.2c0.7-0.3,1.4-0.4,2.3-0.4c0.9,0,1.6,0.1,2.3,0.4c0.6,0.3,1.1,0.7,1.5,1.2
c0.4,0.5,0.5,1.1,0.6,1.8H78.6z"/>
<path class="st1" d="M84.4,21.6L82,12.9h2.4l1.4,5.9h0.1l1.4-5.9h2.4l1.4,5.8h0.1l1.3-5.8H95l-2.4,8.7h-2.6l-1.5-5.5h-0.1L87,21.6
H84.4z"/>
<path class="st1" d="M98.8,21.8c-0.6,0-1.1-0.1-1.5-0.3s-0.8-0.5-1-0.9s-0.4-0.9-0.4-1.4c0-0.5,0.1-0.9,0.3-1.2
c0.2-0.3,0.4-0.6,0.7-0.8c0.3-0.2,0.7-0.4,1-0.5c0.4-0.1,0.8-0.2,1.2-0.2c0.5-0.1,0.9-0.1,1.2-0.2c0.3,0,0.5-0.1,0.7-0.2
c0.1-0.1,0.2-0.2,0.2-0.4v0c0-0.4-0.1-0.6-0.3-0.8c-0.2-0.2-0.5-0.3-1-0.3c-0.4,0-0.8,0.1-1,0.3c-0.3,0.2-0.4,0.4-0.5,0.7l-2.2-0.2
c0.1-0.5,0.3-1,0.7-1.4c0.3-0.4,0.8-0.7,1.3-0.9c0.5-0.2,1.1-0.3,1.8-0.3c0.5,0,0.9,0.1,1.4,0.2c0.4,0.1,0.8,0.3,1.2,0.5
c0.3,0.2,0.6,0.5,0.8,0.9c0.2,0.4,0.3,0.8,0.3,1.3v5.9h-2.3v-1.2h-0.1c-0.1,0.3-0.3,0.5-0.6,0.7c-0.2,0.2-0.5,0.4-0.8,0.5
C99.6,21.7,99.2,21.8,98.8,21.8z M99.5,20.1c0.4,0,0.7-0.1,0.9-0.2s0.5-0.3,0.6-0.6c0.2-0.2,0.2-0.5,0.2-0.8v-0.9
c-0.1,0-0.2,0.1-0.3,0.1s-0.3,0.1-0.4,0.1s-0.3,0.1-0.5,0.1c-0.2,0-0.3,0-0.4,0.1c-0.3,0-0.5,0.1-0.7,0.2c-0.2,0.1-0.4,0.2-0.5,0.4
c-0.1,0.2-0.2,0.3-0.2,0.6c0,0.3,0.1,0.6,0.4,0.8C98.8,20,99.1,20.1,99.5,20.1z"/>
<path class="st1" d="M105.6,24.9v-12h2.4v1.5h0.1c0.1-0.2,0.3-0.5,0.5-0.7c0.2-0.2,0.5-0.4,0.8-0.6c0.3-0.2,0.7-0.2,1.2-0.2
c0.6,0,1.2,0.2,1.8,0.5c0.5,0.3,1,0.8,1.3,1.5s0.5,1.5,0.5,2.5c0,1-0.2,1.8-0.5,2.5c-0.3,0.7-0.7,1.2-1.3,1.5
c-0.5,0.3-1.1,0.5-1.8,0.5c-0.5,0-0.9-0.1-1.2-0.2c-0.3-0.2-0.6-0.4-0.8-0.6c-0.2-0.2-0.4-0.5-0.5-0.7H108v4.7H105.6z M107.9,17.2
c0,0.5,0.1,1,0.2,1.4c0.1,0.4,0.4,0.7,0.6,0.9c0.3,0.2,0.6,0.3,1,0.3c0.4,0,0.7-0.1,1-0.3c0.3-0.2,0.5-0.5,0.6-0.9
c0.1-0.4,0.2-0.8,0.2-1.3c0-0.5-0.1-0.9-0.2-1.3c-0.1-0.4-0.3-0.7-0.6-0.9c-0.3-0.2-0.6-0.3-1-0.3c-0.4,0-0.7,0.1-1,0.3
c-0.3,0.2-0.5,0.5-0.6,0.9C108,16.3,107.9,16.7,107.9,17.2z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.6 KiB

View File

@@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="121px" height="32px" viewBox="0 0 121 32" style="enable-background:new 0 0 121 32;" xml:space="preserve">
<style type="text/css">
.st0{fill:#0073FF;stroke:#0073FF;stroke-miterlimit:10;}
.st1{fill:#FFFFFF;}
</style>
<path class="st0" d="M5.4,10.6C5.4,9.1,6.6,8,8,8h11.8l-2,2c-0.3,0.3-0.3,0.9,0,1.2s0.9,0.3,1.2,0l3.4-3.4c0.2-0.1,0.3-0.4,0.3-0.7
c0-0.2-0.1-0.5-0.3-0.6L19,3c-0.3-0.3-0.9-0.3-1.2,0c-0.3,0.3-0.3,0.9,0,1.2l2,2H8c-2.4,0-4.3,2-4.3,4.4v8.1c0,0.5,0.4,0.9,0.9,0.9
s0.9-0.4,0.9-0.9L5.4,10.6L5.4,10.6z"/>
<path class="st0" d="M18.1,24H6.3l2-2c0.3-0.3,0.3-0.9,0-1.2c-0.3-0.3-0.9-0.3-1.2,0l-3.4,3.4c-0.2,0.1-0.3,0.4-0.3,0.7
c0,0.2,0.1,0.5,0.3,0.6L7.1,29c0.3,0.3,0.9,0.3,1.2,0s0.3-0.9,0-1.2l-2-2h11.8c2.4,0,4.3-2,4.3-4.4v-8.1c0-0.5-0.4-0.9-0.9-0.9
s-0.9,0.4-0.9,0.9v8.1C20.7,22.9,19.5,24,18.1,24z"/>
<g>
<path class="st1" d="M29.6,21.6V10h4.7c0.9,0,1.6,0.1,2.1,0.4s1,0.6,1.3,1.1c0.3,0.4,0.4,1,0.4,1.5c0,0.5-0.1,0.9-0.3,1.2
c-0.2,0.3-0.4,0.6-0.7,0.8s-0.7,0.4-1.1,0.5v0.1c0.4,0,0.9,0.1,1.2,0.4c0.4,0.2,0.7,0.6,0.9,1c0.2,0.4,0.4,0.9,0.4,1.5
c0,0.6-0.2,1.2-0.5,1.7c-0.3,0.5-0.8,0.9-1.3,1.1c-0.6,0.3-1.3,0.4-2.2,0.4H29.6z M32.1,14.8h1.8c0.3,0,0.6-0.1,0.9-0.2
c0.3-0.1,0.5-0.3,0.6-0.5c0.2-0.2,0.2-0.5,0.2-0.8c0-0.4-0.1-0.8-0.4-1C34.9,12.1,34.5,12,34,12h-1.9V14.8z M32.1,19.6h2
c0.7,0,1.2-0.1,1.5-0.4s0.5-0.6,0.5-1.1c0-0.3-0.1-0.6-0.2-0.9s-0.4-0.4-0.7-0.6c-0.3-0.1-0.6-0.2-1-0.2h-2.1V19.6z"/>
<path class="st1" d="M42.7,21.8c-0.6,0-1.1-0.1-1.5-0.3s-0.8-0.5-1-0.9s-0.4-0.9-0.4-1.4c0-0.5,0.1-0.9,0.3-1.2
c0.2-0.3,0.4-0.6,0.7-0.8c0.3-0.2,0.7-0.4,1-0.5s0.8-0.2,1.2-0.2c0.5-0.1,0.9-0.1,1.2-0.2c0.3,0,0.5-0.1,0.7-0.2s0.2-0.2,0.2-0.4v0
c0-0.4-0.1-0.6-0.3-0.8c-0.2-0.2-0.5-0.3-1-0.3c-0.4,0-0.8,0.1-1,0.3c-0.3,0.2-0.4,0.4-0.5,0.7l-2.2-0.2c0.1-0.5,0.3-1,0.7-1.4
c0.3-0.4,0.8-0.7,1.3-0.9s1.1-0.3,1.8-0.3c0.5,0,1,0.1,1.4,0.2c0.4,0.1,0.8,0.3,1.2,0.5c0.3,0.2,0.6,0.5,0.8,0.9
c0.2,0.4,0.3,0.8,0.3,1.3v5.9h-2.3v-1.2h-0.1c-0.1,0.3-0.3,0.5-0.6,0.7c-0.2,0.2-0.5,0.4-0.8,0.5C43.5,21.7,43.1,21.8,42.7,21.8z
M43.4,20.1c0.4,0,0.7-0.1,0.9-0.2c0.3-0.1,0.5-0.3,0.6-0.6c0.2-0.2,0.2-0.5,0.2-0.8v-0.9c-0.1,0-0.2,0.1-0.3,0.1s-0.3,0.1-0.4,0.1
c-0.2,0-0.3,0.1-0.5,0.1c-0.2,0-0.3,0-0.4,0.1c-0.3,0-0.5,0.1-0.7,0.2c-0.2,0.1-0.4,0.2-0.5,0.4s-0.2,0.3-0.2,0.6
c0,0.3,0.1,0.6,0.4,0.8C42.7,20,43,20.1,43.4,20.1z"/>
<path class="st1" d="M56.7,15.4l-2.2,0.1c0-0.2-0.1-0.4-0.2-0.5s-0.3-0.3-0.5-0.4s-0.4-0.1-0.7-0.1c-0.4,0-0.7,0.1-0.9,0.2
c-0.3,0.2-0.4,0.4-0.4,0.6c0,0.2,0.1,0.4,0.2,0.5c0.2,0.1,0.5,0.3,0.9,0.3l1.6,0.3c0.8,0.2,1.5,0.5,1.9,0.8
c0.4,0.4,0.6,0.9,0.6,1.5c0,0.6-0.2,1.1-0.5,1.5c-0.3,0.4-0.8,0.8-1.4,1s-1.3,0.4-2,0.4c-1.2,0-2.1-0.2-2.8-0.7
c-0.7-0.5-1.1-1.1-1.2-2l2.4-0.1c0.1,0.4,0.2,0.6,0.5,0.8S52.6,20,53,20c0.4,0,0.8-0.1,1-0.2c0.3-0.2,0.4-0.4,0.4-0.6
c0-0.2-0.1-0.4-0.3-0.5c-0.2-0.1-0.5-0.3-0.8-0.3L51.8,18c-0.9-0.2-1.5-0.5-1.9-0.9c-0.4-0.4-0.6-1-0.6-1.6c0-0.6,0.2-1,0.5-1.4
c0.3-0.4,0.7-0.7,1.3-0.9c0.6-0.2,1.2-0.3,2-0.3c1.1,0,2,0.2,2.6,0.7C56.2,13.9,56.6,14.6,56.7,15.4z"/>
<path class="st1" d="M59.7,11.7c-0.4,0-0.7-0.1-0.9-0.4c-0.3-0.2-0.4-0.5-0.4-0.9c0-0.3,0.1-0.6,0.4-0.9c0.3-0.2,0.6-0.4,0.9-0.4
c0.4,0,0.7,0.1,0.9,0.4c0.3,0.2,0.4,0.5,0.4,0.9c0,0.3-0.1,0.6-0.4,0.9C60.3,11.6,60,11.7,59.7,11.7z M58.4,21.6v-8.7h2.4v8.7H58.4
z"/>
<path class="st1" d="M66.7,21.8c-0.9,0-1.7-0.2-2.3-0.6c-0.6-0.4-1.1-0.9-1.5-1.6c-0.3-0.7-0.5-1.5-0.5-2.3c0-0.9,0.2-1.7,0.5-2.4
s0.8-1.2,1.5-1.6c0.6-0.4,1.4-0.6,2.3-0.6c0.8,0,1.4,0.1,2,0.4c0.6,0.3,1,0.7,1.4,1.2c0.3,0.5,0.5,1.1,0.6,1.8h-2.3
c-0.1-0.4-0.2-0.8-0.5-1.1c-0.3-0.3-0.6-0.4-1.1-0.4c-0.4,0-0.7,0.1-1,0.3c-0.3,0.2-0.5,0.5-0.7,0.9c-0.2,0.4-0.2,0.9-0.2,1.4
c0,0.6,0.1,1,0.2,1.4c0.2,0.4,0.4,0.7,0.7,0.9c0.3,0.2,0.6,0.3,1,0.3c0.3,0,0.5-0.1,0.7-0.2c0.2-0.1,0.4-0.3,0.6-0.5
c0.1-0.2,0.2-0.5,0.3-0.8h2.3c0,0.7-0.2,1.3-0.5,1.8c-0.3,0.5-0.8,0.9-1.3,1.2C68.2,21.6,67.5,21.8,66.7,21.8z"/>
<path class="st1" d="M78.6,13.3c0-0.5-0.2-0.8-0.6-1.1c-0.3-0.3-0.8-0.4-1.4-0.4c-0.4,0-0.7,0.1-1,0.2c-0.3,0.1-0.5,0.3-0.6,0.5
c-0.1,0.2-0.2,0.4-0.2,0.7c0,0.2,0,0.4,0.1,0.5s0.2,0.3,0.4,0.4c0.2,0.1,0.4,0.2,0.6,0.3c0.2,0.1,0.5,0.2,0.7,0.2l1,0.2
c0.5,0.1,1,0.3,1.4,0.5s0.8,0.4,1.1,0.7s0.6,0.6,0.7,1c0.2,0.4,0.3,0.8,0.3,1.3c0,0.7-0.2,1.3-0.5,1.8c-0.4,0.5-0.9,0.9-1.5,1.2
c-0.7,0.3-1.5,0.4-2.4,0.4c-0.9,0-1.8-0.1-2.5-0.4c-0.7-0.3-1.2-0.7-1.6-1.3c-0.4-0.6-0.6-1.3-0.6-2.1h2.4c0,0.4,0.1,0.7,0.3,1
c0.2,0.3,0.5,0.5,0.8,0.6s0.7,0.2,1.1,0.2c0.4,0,0.8-0.1,1.1-0.2c0.3-0.1,0.5-0.3,0.7-0.5c0.2-0.2,0.3-0.5,0.3-0.7
c0-0.3-0.1-0.5-0.2-0.7c-0.2-0.2-0.4-0.3-0.7-0.5c-0.3-0.1-0.7-0.2-1.1-0.3l-1.3-0.3c-1-0.2-1.8-0.6-2.3-1.1s-0.9-1.2-0.8-2.1
c0-0.7,0.2-1.3,0.6-1.8s0.9-0.9,1.6-1.2c0.7-0.3,1.4-0.4,2.3-0.4c0.9,0,1.6,0.1,2.3,0.4c0.6,0.3,1.1,0.7,1.5,1.2
c0.4,0.5,0.5,1.1,0.6,1.8H78.6z"/>
<path class="st1" d="M84.4,21.6L82,12.9h2.4l1.4,5.9h0.1l1.4-5.9h2.4l1.4,5.8h0.1l1.3-5.8H95l-2.4,8.7h-2.6l-1.5-5.5h-0.1L87,21.6
H84.4z"/>
<path class="st1" d="M98.8,21.8c-0.6,0-1.1-0.1-1.5-0.3s-0.8-0.5-1-0.9s-0.4-0.9-0.4-1.4c0-0.5,0.1-0.9,0.3-1.2
c0.2-0.3,0.4-0.6,0.7-0.8c0.3-0.2,0.7-0.4,1-0.5c0.4-0.1,0.8-0.2,1.2-0.2c0.5-0.1,0.9-0.1,1.2-0.2c0.3,0,0.5-0.1,0.7-0.2
c0.1-0.1,0.2-0.2,0.2-0.4v0c0-0.4-0.1-0.6-0.3-0.8c-0.2-0.2-0.5-0.3-1-0.3c-0.4,0-0.8,0.1-1,0.3c-0.3,0.2-0.4,0.4-0.5,0.7l-2.2-0.2
c0.1-0.5,0.3-1,0.7-1.4c0.3-0.4,0.8-0.7,1.3-0.9c0.5-0.2,1.1-0.3,1.8-0.3c0.5,0,0.9,0.1,1.4,0.2c0.4,0.1,0.8,0.3,1.2,0.5
c0.3,0.2,0.6,0.5,0.8,0.9c0.2,0.4,0.3,0.8,0.3,1.3v5.9h-2.3v-1.2h-0.1c-0.1,0.3-0.3,0.5-0.6,0.7c-0.2,0.2-0.5,0.4-0.8,0.5
C99.6,21.7,99.2,21.8,98.8,21.8z M99.5,20.1c0.4,0,0.7-0.1,0.9-0.2s0.5-0.3,0.6-0.6c0.2-0.2,0.2-0.5,0.2-0.8v-0.9
c-0.1,0-0.2,0.1-0.3,0.1s-0.3,0.1-0.4,0.1s-0.3,0.1-0.5,0.1c-0.2,0-0.3,0-0.4,0.1c-0.3,0-0.5,0.1-0.7,0.2c-0.2,0.1-0.4,0.2-0.5,0.4
c-0.1,0.2-0.2,0.3-0.2,0.6c0,0.3,0.1,0.6,0.4,0.8C98.8,20,99.1,20.1,99.5,20.1z"/>
<path class="st1" d="M105.6,24.9v-12h2.4v1.5h0.1c0.1-0.2,0.3-0.5,0.5-0.7c0.2-0.2,0.5-0.4,0.8-0.6c0.3-0.2,0.7-0.2,1.2-0.2
c0.6,0,1.2,0.2,1.8,0.5c0.5,0.3,1,0.8,1.3,1.5s0.5,1.5,0.5,2.5c0,1-0.2,1.8-0.5,2.5c-0.3,0.7-0.7,1.2-1.3,1.5
c-0.5,0.3-1.1,0.5-1.8,0.5c-0.5,0-0.9-0.1-1.2-0.2c-0.3-0.2-0.6-0.4-0.8-0.6c-0.2-0.2-0.4-0.5-0.5-0.7H108v4.7H105.6z M107.9,17.2
c0,0.5,0.1,1,0.2,1.4c0.1,0.4,0.4,0.7,0.6,0.9c0.3,0.2,0.6,0.3,1,0.3c0.4,0,0.7-0.1,1-0.3c0.3-0.2,0.5-0.5,0.6-0.9
c0.1-0.4,0.2-0.8,0.2-1.3c0-0.5-0.1-0.9-0.2-1.3c-0.1-0.4-0.3-0.7-0.6-0.9c-0.3-0.2-0.6-0.3-1-0.3c-0.4,0-0.7,0.1-1,0.3
c-0.3,0.2-0.5,0.5-0.6,0.9C108,16.3,107.9,16.7,107.9,17.2z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 MiB

View File

@@ -1,70 +0,0 @@
// Define a cache object to store selected option data
const selectCache = {};
// Function to update the cache with the selected option data for a given select element
function updateSelectCache(select) {
const selectedOption = select.options[select.selectedIndex];
const image = selectedOption.getAttribute('data-image');
const name = selectedOption.textContent.trim();
selectCache[select.id] = { image, name };
}
// Function to set the selected option and associated image and name for a given select element
function setSelectData(select) {
const selectedOption = select.options[select.selectedIndex];
const image = selectedOption.getAttribute('data-image') || '/static/images/other/coin.png'; // set a default image URL
const name = selectedOption.textContent.trim();
if (image) {
select.style.backgroundImage = `url(${image})`;
select.nextElementSibling.querySelector('.select-image').src = image;
} else {
select.style.backgroundImage = '';
select.nextElementSibling.querySelector('.select-image').src = '';
}
select.nextElementSibling.querySelector('.select-name').textContent = name;
updateSelectCache(select);
}
// Function to get the selected option data from cache for a given select element
function getSelectData(select) {
return selectCache[select.id] || {};
}
// Update all custom select elements on the page
const selects = document.querySelectorAll('.custom-select .select');
selects.forEach((select) => {
// Set the initial select data based on the cached data (if available) or the selected option (if any)
const cachedData = getSelectData(select);
if (cachedData.image) {
select.style.backgroundImage = `url(${cachedData.image})`;
select.nextElementSibling.querySelector('.select-image').src = cachedData.image;
}
if (cachedData.name) {
select.nextElementSibling.querySelector('.select-name').textContent = cachedData.name;
}
if (select.selectedIndex >= 0) {
setSelectData(select);
}
// Add event listener to update select data when an option is selected
select.addEventListener('change', () => {
setSelectData(select);
});
});
// Hide the select image and name on page load
const selectIcons = document.querySelectorAll('.custom-select .select-icon');
const selectImages = document.querySelectorAll('.custom-select .select-image');
const selectNames = document.querySelectorAll('.custom-select .select-name');
selectIcons.forEach((icon) => {
icon.style.display = 'none';
});
selectImages.forEach((image) => {
image.style.display = 'none';
});
selectNames.forEach((name) => {
name.style.display = 'none';
});

View File

@@ -1,60 +0,0 @@
// Define the function for setting up the custom select element
function setupCustomSelect(select) {
const options = select.querySelectorAll('option');
const selectIcon = select.parentElement.querySelector('.select-icon');
const selectImage = select.parentElement.querySelector('.select-image');
// Set the background image for each option that has a data-image attribute
options.forEach(option => {
const image = option.getAttribute('data-image');
if (image) {
option.style.backgroundImage = `url(${image})`;
}
});
if (select.value == '-1') {
// Set the selected option based on the stored value
const storedValue = localStorage.getItem(select.name);
if (storedValue) {
select.value = storedValue;
}
}
// Set the selected option image based on the selected value
const selectedOption = select.querySelector(`option[value="${select.value}"]`);
if (selectedOption) {
const image = selectedOption.getAttribute('data-image');
if (image) {
select.style.backgroundImage = `url(${image})`;
selectImage.src = image;
}
}
// Update the select element and image when the user makes a selection
select.addEventListener('change', () => {
const selectedOption = select.options[select.selectedIndex];
const image = selectedOption.getAttribute('data-image');
if (image) {
select.style.backgroundImage = `url(${image})`;
selectImage.src = image;
} else {
select.style.backgroundImage = '';
selectImage.src = '';
}
// Save the selected value to localStorage
localStorage.setItem(select.name, select.value);
});
// Hide the select icon and image on page load
selectIcon.style.display = 'none';
selectImage.style.display = 'none';
}
// Call the setupCustomSelect function for each custom select element
const customSelects = document.querySelectorAll('.custom-select select');
customSelects.forEach(select => {
setupCustomSelect(select);
});

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -1,40 +0,0 @@
// Burger menus
document.addEventListener('DOMContentLoaded', function() {
// open
const burger = document.querySelectorAll('.navbar-burger');
const menu = document.querySelectorAll('.navbar-menu');
if (burger.length && menu.length) {
for (var i = 0; i < burger.length; i++) {
burger[i].addEventListener('click', function() {
for (var j = 0; j < menu.length; j++) {
menu[j].classList.toggle('hidden');
}
});
}
}
// close
const close = document.querySelectorAll('.navbar-close');
const backdrop = document.querySelectorAll('.navbar-backdrop');
if (close.length) {
for (var i = 0; i < close.length; i++) {
close[i].addEventListener('click', function() {
for (var j = 0; j < menu.length; j++) {
menu[j].classList.toggle('hidden');
}
});
}
}
if (backdrop.length) {
for (var i = 0; i < backdrop.length; i++) {
backdrop[i].addEventListener('click', function() {
for (var j = 0; j < menu.length; j++) {
menu[j].classList.toggle('hidden');
}
});
}
}
});

View File

@@ -1,40 +1,27 @@
window.addEventListener('DOMContentLoaded', (event) => {
let err_msgs = document.querySelectorAll('p.error_msg');
for (let i = 0; i < err_msgs.length; i++) {
err_msg = err_msgs[i].innerText;
if (err_msg.indexOf('coin_to') >= 0 || err_msg.indexOf('Coin To') >= 0) {
e = document.getElementById('coin_to');
e.classList.add('error');
}
if (err_msg.indexOf('Coin From') >= 0) {
e = document.getElementById('coin_from');
e.classList.add('error');
}
if (err_msg.indexOf('Amount From') >= 0) {
e = document.getElementById('amt_from');
e.classList.add('error');
}
if (err_msg.indexOf('Amount To') >= 0) {
e = document.getElementById('amt_to');
e.classList.add('error');
}
if (err_msg.indexOf('Minimum Bid Amount') >= 0) {
e = document.getElementById('amt_bid_min');
e.classList.add('error');
}
if (err_msg.indexOf('Select coin you send') >= 0) {
e = document.getElementById('coin_from').parentNode;
e.classList.add('error');
}
}
// remove error class on input or select focus
let inputs = document.querySelectorAll('input.error');
let selects = document.querySelectorAll('select.error');
let elements = [...inputs, ...selects];
elements.forEach((element) => {
element.addEventListener('focus', (event) => {
event.target.classList.remove('error');
});
});
});
window.addEventListener('DOMContentLoaded', (event) => {
let err_msgs = document.querySelectorAll('p.error_msg');
for (let i=0; i < err_msgs.length; i++) {
err_msg = err_msgs[i].innerText
if (err_msg.indexOf('coin_to') >= 0 || err_msg.indexOf('Coin To') >= 0) {
e = document.getElementById('coin_to');
e.classList.add('error');
}
if (err_msg.indexOf('Coin From') >= 0) {
e = document.getElementById('coin_from');
e.classList.add('error');
}
if (err_msg.indexOf('Amount From') >= 0) {
e = document.getElementById('amt_from');
e.classList.add('error');
}
if (err_msg.indexOf('Amount To') >= 0) {
e = document.getElementById('amt_to');
e.classList.add('error');
}
if (err_msg.indexOf('Minimum Bid Amount') >= 0) {
e = document.getElementById('amt_bid_min');
e.classList.add('error');
}
}
});

View File

@@ -1,414 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" id="mscgenjsreplaceme" width="1272" height="2063.25" class="mscgenjsreplaceme" style="font-family:Helvetica,sans-serif;font-size:12px;font-weight:400;font-style:normal;text-decoration:none;background-color:#fff;stroke:#000;stroke-width:2" version="1.1">
<defs>
<marker id="mscgenjsreplacemecallback-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#00f"/>
</marker>
<marker id="mscgenjsreplacemecallback-l-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#00f"/>
</marker>
<marker id="mscgenjsreplacemecallback-#008800" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#080"/>
</marker>
<marker id="mscgenjsreplacemecallback-l-#008800" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#080"/>
</marker>
<marker id="mscgenjsreplacemecallback-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:red"/>
</marker>
<marker id="mscgenjsreplacemecallback-l-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:red"/>
</marker>
<marker id="mscgenjsreplacememethod-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="#00F" stroke="#00F" d="m1 1 8 2-8 2z" class="arrow-style"/>
</marker>
<marker id="mscgenjsreplacememethod-l-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="#00F" stroke="#00F" d="M17 1 9 3l8 2z" class="arrow-style"/>
</marker>
<marker id="mscgenjsreplacememethod-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="red" stroke="red" d="m1 1 8 2-8 2z" class="arrow-style"/>
</marker>
<marker id="mscgenjsreplacememethod-l-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="red" stroke="red" d="M17 1 9 3l8 2z" class="arrow-style"/>
</marker>
<style>
.mscgenjsreplaceme path,.mscgenjsreplaceme rect{fill:none}.mscgenjsreplaceme .label-text-background{fill:#fff;stroke:#fff;stroke-width:0}.mscgenjsreplaceme .return{stroke-dasharray:5,3}.mscgenjsreplaceme .inline_expression_divider{stroke-dasharray:10,5}.mscgenjsreplaceme text{color:inherit;stroke:none;text-anchor:middle}.mscgenjsreplaceme text.anchor-start{text-anchor:start}.mscgenjsreplaceme .arrow-marker{overflow:visible}.mscgenjsreplaceme .arrow-style{stroke-width:1}.mscgenjsreplaceme .arcrow{stroke-linecap:butt}.mscgenjsreplaceme .box,.mscgenjsreplaceme .entity{fill:#fff;stroke-linejoin:round}
</style>
</defs>
<g id="mscgenjsreplaceme_body" transform="translate(51 3)">
<path id="mscgenjsreplaceme_background" d="M-51-3h1272v2063.25H-51z" class="bglayer" style="fill:#fff;stroke:#fff;stroke-width:0"/>
<g id="mscgenjsreplaceme_arcspans">
<path d="M-41 869.1h1044v1169.15H-41z" class="box inline_expression alt"/>
<path d="M-37 1410.15H999v590.1H-37z" class="box inline_expression alt"/>
</g>
<g id="mscgenjsreplaceme_lifelines">
<path d="M65 38v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 38v38" class="arcrow" style="stroke:#080"/>
<path d="M481 38v38" class="arcrow" style="stroke:red"/>
<path d="M689 38v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 38v38M1105 38v38M65 76v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 76v38" class="arcrow" style="stroke:#080"/>
<path d="M481 76v38" class="arcrow" style="stroke:red"/>
<path d="M689 76v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 76v38M1105 76v38M65 114v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 114v38" class="arcrow" style="stroke:#080"/>
<path d="M481 114v38" class="arcrow" style="stroke:red"/>
<path d="M689 114v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 114v38M1105 114v38M65 152v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 152v38" class="arcrow" style="stroke:#080"/>
<path d="M481 152v38" class="arcrow" style="stroke:red"/>
<path d="M689 152v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 152v38M1105 152v38M65 190v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 190v38" class="arcrow" style="stroke:#080"/>
<path d="M481 190v38" class="arcrow" style="stroke:red"/>
<path d="M689 190v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 190v38M1105 190v38M65 228v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 228v38" class="arcrow" style="stroke:#080"/>
<path d="M481 228v38" class="arcrow" style="stroke:red"/>
<path d="M689 228v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 228v38M1105 228v38M65 266v54" class="arcrow" style="stroke:transparent"/>
<path d="M273 266v54" class="arcrow" style="stroke:#080"/>
<path d="M481 266v54" class="arcrow" style="stroke:red"/>
<path d="M689 266v54" class="arcrow" style="stroke:#00f"/>
<path d="M897 266v54M1105 266v54M65 320v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 320v38" class="arcrow" style="stroke:#080"/>
<path d="M481 320v38" class="arcrow" style="stroke:red"/>
<path d="M689 320v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 320v38M1105 320v38M65 358v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 358v38" class="arcrow" style="stroke:#080"/>
<path d="M481 358v38" class="arcrow" style="stroke:red"/>
<path d="M689 358v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 358v38M1105 358v38M65 396v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 396v38" class="arcrow" style="stroke:#080"/>
<path d="M481 396v38" class="arcrow" style="stroke:red"/>
<path d="M689 396v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 396v38M1105 396v38M65 434v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 434v38" class="arcrow" style="stroke:#080"/>
<path d="M481 434v38" class="arcrow" style="stroke:red"/>
<path d="M689 434v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 434v38M1105 434v38M65 472v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 472v38" class="arcrow" style="stroke:#080"/>
<path d="M481 472v38" class="arcrow" style="stroke:red"/>
<path d="M689 472v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 472v38M1105 472v38M65 510v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 510v38" class="arcrow" style="stroke:#080"/>
<path d="M481 510v38" class="arcrow" style="stroke:red"/>
<path d="M689 510v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 510v38M1105 510v38M65 548v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 548v38" class="arcrow" style="stroke:#080"/>
<path d="M481 548v38" class="arcrow" style="stroke:red"/>
<path d="M689 548v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 548v38M1105 548v38M65 586v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 586v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 586v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 586v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 586v75.05M1105 586v75.05M65 661.05v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 661.05v38" class="arcrow" style="stroke:#080"/>
<path d="M481 661.05v38" class="arcrow" style="stroke:red"/>
<path d="M689 661.05v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 661.05v38M1105 661.05v38M65 699.05v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 699.05v38" class="arcrow" style="stroke:#080"/>
<path d="M481 699.05v38" class="arcrow" style="stroke:red"/>
<path d="M689 699.05v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 699.05v38M1105 699.05v38M65 737.05v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 737.05v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 737.05v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 737.05v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 737.05v75.05M1105 737.05v75.05M65 812.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 812.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 812.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 812.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 812.1v38M1105 812.1v38M65 850.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 850.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 850.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 850.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 850.1v38M1105 850.1v38M65 888.1v86" class="arcrow" style="stroke:transparent"/>
<path d="M273 888.1v86" class="arcrow" style="stroke:#080"/>
<path d="M481 888.1v86" class="arcrow" style="stroke:red"/>
<path d="M689 888.1v86" class="arcrow" style="stroke:#00f"/>
<path d="M897 888.1v86M1105 888.1v86M65 974.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 974.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 974.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 974.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 974.1v38M1105 974.1v38M65 1012.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1012.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1012.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1012.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1012.1v38M1105 1012.1v38M65 1050.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1050.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1050.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1050.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1050.1v38M1105 1050.1v38M65 1088.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1088.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1088.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1088.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1088.1v38M1105 1088.1v38M65 1126.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1126.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1126.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1126.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1126.1v38M1105 1126.1v38M65 1164.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1164.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1164.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1164.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1164.1v38M1105 1164.1v38M65 1202.1v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 1202.1v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 1202.1v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 1202.1v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 1202.1v75.05M1105 1202.1v75.05M65 1277.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1277.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1277.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1277.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1277.15v38M1105 1277.15v38M65 1315.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1315.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1315.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1315.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1315.15v38M1105 1315.15v38M65 1353.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1353.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1353.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1353.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1353.15v38M1105 1353.15v38M65 1391.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1391.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1391.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1391.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1391.15v38M1105 1391.15v38M65 1429.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1429.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1429.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1429.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1429.15v38M1105 1429.15v38M65 1467.15v59.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 1467.15v59.05" class="arcrow" style="stroke:#080"/>
<path d="M481 1467.15v59.05" class="arcrow" style="stroke:red"/>
<path d="M689 1467.15v59.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 1467.15v59.05M1105 1467.15v59.05M65 1526.2v54" class="arcrow" style="stroke:transparent"/>
<path d="M273 1526.2v54" class="arcrow" style="stroke:#080"/>
<path d="M481 1526.2v54" class="arcrow" style="stroke:red"/>
<path d="M689 1526.2v54" class="arcrow" style="stroke:#00f"/>
<path d="M897 1526.2v54M1105 1526.2v54M65 1580.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1580.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1580.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1580.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1580.2v38M1105 1580.2v38M65 1618.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1618.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1618.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1618.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1618.2v38M1105 1618.2v38M65 1656.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1656.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1656.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1656.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1656.2v38M1105 1656.2v38M65 1694.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1694.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1694.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1694.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1694.2v38M1105 1694.2v38M65 1732.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1732.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1732.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1732.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1732.2v38M1105 1732.2v38M65 1770.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1770.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1770.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1770.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1770.2v38M1105 1770.2v38M65 1808.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1808.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1808.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1808.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1808.2v38M1105 1808.2v38M65 1846.2v59.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 1846.2v59.05" class="arcrow" style="stroke:#080"/>
<path d="M481 1846.2v59.05" class="arcrow" style="stroke:red"/>
<path d="M689 1846.2v59.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 1846.2v59.05M1105 1846.2v59.05M65 1905.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1905.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1905.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 1905.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1905.25v38M1105 1905.25v38M65 1943.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1943.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1943.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 1943.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1943.25v38M1105 1943.25v38M65 1981.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1981.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1981.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 1981.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1981.25v38M1105 1981.25v38M65 2019.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 2019.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 2019.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 2019.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 2019.25v38M1105 2019.25v38" class="arcrow" style="stroke:transparent"/>
</g>
<g id="mscgenjsreplaceme_sequence">
<path d="M0 0h130v38H0z" class="entity" style="stroke:transparent"/>
<text x="65" y="22.75" class="entity-text"><tspan> </tspan></text>
<path d="M208 0h130v38H208z" class="entity" style="fill:#cfc;stroke:#080"/>
<text x="273" y="22.75" class="entity-text"><tspan>Network</tspan></text>
<path d="M416 0h130v38H416z" class="entity" style="fill:#fcc;stroke:red"/>
<text x="481" y="22.75" class="entity-text"><tspan>Offerer</tspan></text>
<path d="M624 0h130v38H624z" class="entity" style="fill:#ccf;stroke:#00f"/>
<text x="689" y="22.75" class="entity-text"><tspan>Bidder</tspan></text>
<path d="M832 0h130v38H832z" class="entity" style="stroke:transparent"/>
<text x="897" y="22.75" class="entity-text"><tspan> </tspan></text>
<path d="M1040 0h130v38h-130z" class="entity" style="stroke:transparent"/>
<text x="1105" y="22.75" class="entity-text"><tspan> </tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 95H273" class="arc directional callback" style="stroke:red"/>
<path d="M345.09 79.25h63.83v14h-63.83z" class="label-text-background"/>
<text x="377" y="90.25" class="directional-text callback-text"><tspan>Sends Offer</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 133h416" class="arc directional return" style="stroke:#080"/>
<path d="M445.76 117.25h70.48v14h-70.48z" class="label-text-background"/>
<text x="481" y="128.25" class="directional-text return-text"><tspan>Detects Offer</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 171H481" class="arc directional callback" style="stroke:#00f"/>
<path d="M557.65 155.25h54.7v14h-54.7z" class="label-text-background"/>
<text x="585" y="166.25" class="directional-text callback-text"><tspan>Sends Bid</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 293h208" class="arc directional callback" style="stroke:red"/>
<path d="M513.29 277.25h143.74v14H513.29z" class="label-text-background"/>
<text x="585" y="288.25" class="directional-text callback-text"><tspan>Sends BidAccept message</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 415H481" class="arc directional callback" style="stroke:#00f"/>
<path d="M491.29 399.25h187.74v14H491.29z" class="label-text-background"/>
<text x="585" y="410.25" class="directional-text callback-text"><tspan>Sends XmrBidLockTxSigsMessage</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 491h208" class="arc directional callback" style="stroke:red"/>
<path d="M485.61 475.25H684.7v14H485.61z" class="label-text-background"/>
<text x="585" y="486.25" class="directional-text callback-text"><tspan>Sends XmrBidLockSpendTxMessage</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 529H273" class="arc directional callback" style="stroke:red"/>
<path d="M311.64 513.25h130.72v14H311.64z" class="label-text-background"/>
<text x="377" y="524.25" class="directional-text callback-text"><tspan>Sends script-coin-lock-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 615.92c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f"/>
<path d="M692 567.67h40.91v14H692z" class="label-text-background"/>
<text x="692" y="578.67" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M692 583.67h107.01v14H692z" class="label-text-background"/>
<text x="692" y="594.67" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx to</tspan></text>
<path d="M692 599.67h39.34v14H692z" class="label-text-background"/>
<text x="692" y="610.67" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 718.05H273" class="arc directional callback" style="stroke:#00f"/>
<path d="M408.97 702.3h144.06v14H408.97z" class="label-text-background"/>
<text x="481" y="713.3" class="directional-text callback-text"><tspan>Sends noscript-coin-lock-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 766.97c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f"/>
<path d="M692 718.72h40.91v14H692z" class="label-text-background"/>
<text x="692" y="729.72" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M692 734.72h120.36v14H692z" class="label-text-background"/>
<text x="692" y="745.72" class="directional-text method-text anchor-start"><tspan>noscript-coin-lock-tx to</tspan></text>
<path d="M692 750.72h39.34v14H692z" class="label-text-background"/>
<text x="692" y="761.72" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 766.97c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red"/>
<path d="M484 718.72h40.91v14H484z" class="label-text-background"/>
<text x="484" y="729.72" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M484 734.72h120.36v14H484z" class="label-text-background"/>
<text x="484" y="745.72" class="directional-text method-text anchor-start"><tspan>noscript-coin-lock-tx to</tspan></text>
<path d="M484 750.72h39.34v14H484z" class="label-text-background"/>
<text x="484" y="761.72" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 931.1h208" class="arc directional method" style="stroke:red"/>
<path d="M519.64 915.35h130.72v14H519.64z" class="label-text-background"/>
<text x="585" y="926.35" class="directional-text method-text"><tspan>Sends script-coin-lock-tx</tspan></text>
<path d="M539.3 933.35h91.71v14H539.3z" class="label-text-background"/>
<text x="585" y="944.35" class="directional-text method-text"><tspan>release message</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 1031.1H273" class="arc directional callback" style="stroke:#00f"/>
<path d="M397.3 1015.35h167.41v14H397.3z" class="label-text-background"/>
<text x="481" y="1026.35" class="directional-text callback-text"><tspan>Sends script-coin-lock-spend-tx</tspan></text>
<path d="M-41 1145.1h1044" class="inline_expression_divider"/>
<path d="M459.98 1137.85h42.03v14h-42.03z" class="label-text-background"/>
<text x="481" y="1148.85" class="empty-text comment-row-text"><tspan>fail path</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 1232.02c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f"/>
<path d="M692 1183.77h40.91v14H692z" class="label-text-background"/>
<text x="692" y="1194.77" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M692 1199.77h131.69v14H692z" class="label-text-background"/>
<text x="692" y="1210.77" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx lock to</tspan></text>
<path d="M692 1215.77h33.01v14H692z" class="label-text-background"/>
<text x="692" y="1226.77" class="directional-text method-text anchor-start"><tspan>expire</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1296.15H273" class="arc directional callback" style="stroke:red"/>
<path d="M359.98 1280.4h34.03v14h-34.03z" class="label-text-background"/>
<text x="377" y="1291.4" class="directional-text callback-text"><tspan>Sends</tspan></text>
<path d="M300.64 1298.4h152.72v14H300.64z" class="label-text-background"/>
<text x="377" y="1309.4" class="directional-text callback-text"><tspan>script-coin-lock-pre-refund-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 1334.15h208" class="arc directional return" style="stroke:#080"/>
<path d="M300.64 1318.4h152.72v14H300.64z" class="label-text-background"/>
<text x="377" y="1329.4" class="directional-text return-text"><tspan>script-coin-lock-pre-refund-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 1489.07c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red"/>
<path d="M484 1456.82h40.91v14H484z" class="label-text-background"/>
<text x="484" y="1467.82" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M484 1472.82h124.06v14H484z" class="label-text-background"/>
<text x="484" y="1483.82" class="directional-text method-text anchor-start"><tspan>pre-refund tx to confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1553.2H273" class="arc directional callback" style="stroke:red"/>
<path d="M359.98 1537.45h34.03v14h-34.03z" class="label-text-background"/>
<text x="377" y="1548.45" class="directional-text callback-text"><tspan>Sends</tspan></text>
<path d="M282.3 1555.45h189.41v14H282.3z" class="label-text-background"/>
<text x="377" y="1566.45" class="directional-text callback-text"><tspan>script-coin-lock-pre-refund-spend-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 1637.2h416" class="arc directional return" style="stroke:#080"/>
<path d="M364.29 1621.45h233.42v14H364.29z" class="label-text-background"/>
<text x="481" y="1632.45" class="directional-text return-text"><tspan>Detects script-coin-lock-pre-refund-spend-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 1675.2H273" class="arc directional callback" style="stroke:#00f"/>
<path d="M382.97 1659.45h196.06v14H382.97z" class="label-text-background"/>
<text x="481" y="1670.45" class="directional-text callback-text"><tspan>Sends scriptless-coin-lock-recover-tx</tspan></text>
<path d="M-37 1789.2H999" class="inline_expression_divider"/>
<path d="M396.96 1781.95h168.08v14H396.96z" class="label-text-background"/>
<text x="481" y="1792.95" class="empty-text comment-row-text"><tspan>bidder swipes script coin lock tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 1868.12c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f"/>
<path d="M692 1835.87h40.91v14H692z" class="label-text-background"/>
<text x="692" y="1846.87" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M692 1851.87h142.39v14H692z" class="label-text-background"/>
<text x="692" y="1862.87" class="directional-text method-text anchor-start"><tspan>pre-refund tx lock to expire</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 1924.25H273" class="arc directional callback" style="stroke:#00f"/>
<path d="M368.63 1908.5h224.75v14H368.63z" class="label-text-background"/>
<text x="481" y="1919.5" class="directional-text callback-text"><tspan>Sends script-coin-lock-pre-refund-swipe-tx</tspan></text>
</g>
<g id="mscgenjsreplaceme_notes">
<path d="m591 209 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="212.75" class="box-text abox-text"><tspan>Bid Sent</tspan></text>
<path d="M383 230h196v34H383z" class="box" style="stroke:red"/>
<text x="481" y="250.75" class="box-text"><tspan>User accepts bid</tspan></text>
<path d="M799 268h395v9h9m-9-9 9 9v41H799v-50z" class="box note" style="fill:#ffc"/>
<text x="1001" y="280.75" class="box-text note-text"><tspan>The BidAccept message contains the pubkeys the offerer will use and</tspan></text>
<text x="1001" y="296.75" class="box-text note-text"><tspan>a DLEAG proof one key will work across both chains of the swapping</tspan></text>
<text x="1001" y="312.75" class="box-text note-text"><tspan>coins</tspan></text>
<path d="m591 339 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="342.75" class="box-text abox-text"><tspan>Bid Receiving accept</tspan></text>
<path d="m591 377 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="380.75" class="box-text abox-text"><tspan>Bid Accepted</tspan></text>
<path d="M799 398h395v9h9m-9-9 9 9v25H799v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="410.75" class="box-text note-text"><tspan>The XmrBidLockTxSigsMessage contains the bidder&apos;s signatures for the</tspan></text>
<text x="1001" y="426.75" class="box-text note-text"><tspan>script-coin-lock-refund and script-coin-lock-refund-spend txns.</tspan></text>
<path d="m591 453 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="448.75" class="box-text abox-text"><tspan>Exchanged script lock tx sigs</tspan></text>
<text x="689" y="464.75" class="box-text abox-text"><tspan>msg</tspan></text>
<path d="M799 474h395v9h9m-9-9 9 9v25H799v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="486.75" class="box-text note-text"><tspan>The XmrBidLockSpendTxMessage contains the script-coin-lock-tx and</tspan></text>
<text x="1001" y="502.75" class="box-text note-text"><tspan>proof the offerer can sign it.</tspan></text>
<path d="m591 529 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="532.75" class="box-text abox-text"><tspan>Bid Script coin spend tx valid</tspan></text>
<path d="m591 567 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="562.75" class="box-text abox-text"><tspan>Exchanged script lock spend tx</tspan></text>
<text x="689" y="578.75" class="box-text abox-text"><tspan>msg</tspan></text>
<path d="m591 680.05 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="683.8" class="box-text abox-text"><tspan>Bid Script coin locked</tspan></text>
<path d="m591 831.1 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="834.85" class="box-text abox-text"><tspan>Bid Scriptless coin locked</tspan></text>
<path d="M-40 869.1h98.39v11l-7 7H-40" class="box inline_expression_label"/>
<text x="-38" y="882.35" class="inline_expression-text alt-text anchor-start"><tspan>alt: success path</tspan></text>
<path d="M799 890.1h395v9h9m-9-9 9 9v73H799v-82z" class="box note" style="fill:#ffc"/>
<text x="1001" y="902.85" class="box-text note-text"><tspan>The XmrBidLockReleaseMessage contains the offerer&apos;s OTVES for it. </tspan></text>
<text x="1001" y="918.85" class="box-text note-text"><tspan> The bidder decodes the offerer&apos;s signature</tspan></text>
<text x="1001" y="934.85" class="box-text note-text"><tspan>from the OTVES. When the offerer has the</tspan></text>
<text x="1001" y="950.85" class="box-text note-text"><tspan>plaintext signature, they can decode the bidder&apos;s noscript-coin-lock-tx</tspan></text>
<text x="1001" y="966.85" class="box-text note-text"><tspan>signature.</tspan></text>
<path d="m591 993.1 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="996.85" class="box-text abox-text"><tspan>Script coin lock released</tspan></text>
<path d="m591 1069.1 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1072.85" class="box-text abox-text"><tspan>Script tx redeemed</tspan></text>
<path d="m591 1107.1 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1110.85" class="box-text abox-text"><tspan>Bid Completed</tspan></text>
<path d="M799 1279.15h395v9h9m-9-9 9 9v25H799v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1299.9" class="box-text note-text"><tspan>tx can be sent by either party.</tspan></text>
<path d="m591 1372.15 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1367.9" class="box-text abox-text"><tspan>Bid Script pre-refund tx in</tspan></text>
<text x="689" y="1383.9" class="box-text abox-text"><tspan>chain</tspan></text>
<path d="M-36 1410.15h200.86v11l-7 7H-36" class="box inline_expression_label"/>
<text x="-34" y="1423.4" class="inline_expression-text alt-text anchor-start"><tspan>alt: offerer refunds script coin lock tx</tspan></text>
<path d="M799 1528.2h395v9h9m-9-9 9 9v41H799v-50z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1540.95" class="box-text note-text"><tspan>Refunds the script lock tx, with the offerer&apos;s cleartext signature</tspan></text>
<text x="1001" y="1556.95" class="box-text note-text"><tspan>the bidder can refund the noscript lock tx. </tspan></text>
<text x="1001" y="1572.95" class="box-text note-text"><tspan>Once the lock expires the pre-refund tx can be spent by the bidder.</tspan></text>
<path d="m383 1599.2 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="1602.95" class="box-text abox-text"><tspan>Bid Failed, refunded</tspan></text>
<path d="M799 1620.2h395v9h9m-9-9 9 9v25H799v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1640.95" class="box-text note-text"><tspan>Bidder recovers the offerer&apos;s scriptless chain key-shard.</tspan></text>
<path d="m591 1713.2 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1716.95" class="box-text abox-text"><tspan>Bid Scriptless tx recovered</tspan></text>
<path d="m591 1751.2 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1754.95" class="box-text abox-text"><tspan>Bid Failed, refunded</tspan></text>
<path d="m591 1962.25 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1966" class="box-text abox-text"><tspan>Bid Failed, swiped</tspan></text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -1,388 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" id="mscgenjsreplaceme" width="1264" height="1933.25" class="mscgenjsreplaceme" style="font-family:Helvetica,sans-serif;font-size:12px;font-weight:400;font-style:normal;text-decoration:none;background-color:#fff;stroke:#000;stroke-width:2" version="1.1">
<defs>
<marker id="mscgenjsreplacemecallback-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#00f"/>
</marker>
<marker id="mscgenjsreplacemecallback-l-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#00f"/>
</marker>
<marker id="mscgenjsreplacemecallback-#008800" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#080"/>
</marker>
<marker id="mscgenjsreplacemecallback-l-#008800" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#080"/>
</marker>
<marker id="mscgenjsreplacemecallback-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:red"/>
</marker>
<marker id="mscgenjsreplacemecallback-l-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:red"/>
</marker>
<marker id="mscgenjsreplacememethod-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="#00F" stroke="#00F" d="m1 1 8 2-8 2z" class="arrow-style"/>
</marker>
<marker id="mscgenjsreplacememethod-l-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="#00F" stroke="#00F" d="M17 1 9 3l8 2z" class="arrow-style"/>
</marker>
<marker id="mscgenjsreplacememethod-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="red" stroke="red" d="m1 1 8 2-8 2z" class="arrow-style"/>
</marker>
<marker id="mscgenjsreplacememethod-l-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="red" stroke="red" d="M17 1 9 3l8 2z" class="arrow-style"/>
</marker>
<style>
.mscgenjsreplaceme path,.mscgenjsreplaceme rect{fill:none}.mscgenjsreplaceme .label-text-background{fill:#fff;stroke:#fff;stroke-width:0}.mscgenjsreplaceme .return{stroke-dasharray:5,3}.mscgenjsreplaceme text{color:inherit;stroke:none;text-anchor:middle}.mscgenjsreplaceme text.anchor-start{text-anchor:start}.mscgenjsreplaceme .arrow-marker{overflow:visible}.mscgenjsreplaceme .arrow-style{stroke-width:1}.mscgenjsreplaceme .arcrow{stroke-linecap:butt}.mscgenjsreplaceme .box,.mscgenjsreplaceme .entity{fill:#fff;stroke-linejoin:round}
</style>
</defs>
<g id="mscgenjsreplaceme_body" transform="translate(47 3)">
<path id="mscgenjsreplaceme_background" d="M-47-3h1264v1933.25H-47z" class="bglayer" style="fill:#fff;stroke:#fff;stroke-width:0"/>
<path id="mscgenjsreplaceme_arcspans" d="M-39 778.05h1040v1130.2H-39z" class="box inline_expression alt"/>
<g id="mscgenjsreplaceme_lifelines">
<path d="M65 38v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 38v38" class="arcrow" style="stroke:#080"/>
<path d="M481 38v38" class="arcrow" style="stroke:red"/>
<path d="M689 38v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 38v38M1105 38v38M65 76v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 76v38" class="arcrow" style="stroke:#080"/>
<path d="M481 76v38" class="arcrow" style="stroke:red"/>
<path d="M689 76v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 76v38M1105 76v38M65 114v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 114v38" class="arcrow" style="stroke:#080"/>
<path d="M481 114v38" class="arcrow" style="stroke:red"/>
<path d="M689 114v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 114v38M1105 114v38M65 152v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 152v38" class="arcrow" style="stroke:#080"/>
<path d="M481 152v38" class="arcrow" style="stroke:red"/>
<path d="M689 152v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 152v38M1105 152v38M65 190v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 190v38" class="arcrow" style="stroke:#080"/>
<path d="M481 190v38" class="arcrow" style="stroke:red"/>
<path d="M689 190v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 190v38M1105 190v38M65 228v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 228v38" class="arcrow" style="stroke:#080"/>
<path d="M481 228v38" class="arcrow" style="stroke:red"/>
<path d="M689 228v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 228v38M1105 228v38M65 266v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 266v38" class="arcrow" style="stroke:#080"/>
<path d="M481 266v38" class="arcrow" style="stroke:red"/>
<path d="M689 266v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 266v38M1105 266v38M65 304v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 304v38" class="arcrow" style="stroke:#080"/>
<path d="M481 304v38" class="arcrow" style="stroke:red"/>
<path d="M689 304v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 304v38M1105 304v38M65 342v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 342v38" class="arcrow" style="stroke:#080"/>
<path d="M481 342v38" class="arcrow" style="stroke:red"/>
<path d="M689 342v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 342v38M1105 342v38M65 380v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 380v38" class="arcrow" style="stroke:#080"/>
<path d="M481 380v38" class="arcrow" style="stroke:red"/>
<path d="M689 380v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 380v38M1105 380v38M65 418v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 418v38" class="arcrow" style="stroke:#080"/>
<path d="M481 418v38" class="arcrow" style="stroke:red"/>
<path d="M689 418v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 418v38M1105 418v38M65 456v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 456v38" class="arcrow" style="stroke:#080"/>
<path d="M481 456v38" class="arcrow" style="stroke:red"/>
<path d="M689 456v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 456v38M1105 456v38M65 494v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 494v38" class="arcrow" style="stroke:#080"/>
<path d="M481 494v38" class="arcrow" style="stroke:red"/>
<path d="M689 494v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 494v38M1105 494v38M65 532v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 532v38" class="arcrow" style="stroke:#080"/>
<path d="M481 532v38" class="arcrow" style="stroke:red"/>
<path d="M689 532v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 532v38M1105 532v38M65 570v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 570v38" class="arcrow" style="stroke:#080"/>
<path d="M481 570v38" class="arcrow" style="stroke:red"/>
<path d="M689 570v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 570v38M1105 570v38M65 608v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 608v38" class="arcrow" style="stroke:#080"/>
<path d="M481 608v38" class="arcrow" style="stroke:red"/>
<path d="M689 608v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 608v38M1105 608v38M65 646v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 646v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 646v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 646v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 646v75.05M1105 646v75.05M65 721.05v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 721.05v38" class="arcrow" style="stroke:#080"/>
<path d="M481 721.05v38" class="arcrow" style="stroke:red"/>
<path d="M689 721.05v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 721.05v38M1105 721.05v38M65 759.05v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 759.05v38" class="arcrow" style="stroke:#080"/>
<path d="M481 759.05v38" class="arcrow" style="stroke:red"/>
<path d="M689 759.05v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 759.05v38M1105 759.05v38M65 797.05v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 797.05v38" class="arcrow" style="stroke:#080"/>
<path d="M481 797.05v38" class="arcrow" style="stroke:red"/>
<path d="M689 797.05v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 797.05v38M1105 797.05v38M65 835.05v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 835.05v38" class="arcrow" style="stroke:#080"/>
<path d="M481 835.05v38" class="arcrow" style="stroke:red"/>
<path d="M689 835.05v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 835.05v38M1105 835.05v38M65 873.05v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 873.05v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 873.05v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 873.05v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 873.05v75.05M1105 873.05v75.05M65 948.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 948.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 948.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 948.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 948.1v38M1105 948.1v38M65 986.1v86" class="arcrow" style="stroke:transparent"/>
<path d="M273 986.1v86" class="arcrow" style="stroke:#080"/>
<path d="M481 986.1v86" class="arcrow" style="stroke:red"/>
<path d="M689 986.1v86" class="arcrow" style="stroke:#00f"/>
<path d="M897 986.1v86M1105 986.1v86M65 1072.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1072.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1072.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1072.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1072.1v38M1105 1072.1v38M65 1110.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1110.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1110.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1110.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1110.1v38M1105 1110.1v38M65 1148.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1148.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1148.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1148.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1148.1v38M1105 1148.1v38M65 1186.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1186.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1186.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1186.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1186.1v38M1105 1186.1v38M65 1224.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1224.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1224.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1224.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1224.1v38M1105 1224.1v38M65 1262.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1262.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1262.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1262.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1262.1v38M1105 1262.1v38M65 1300.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1300.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1300.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1300.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1300.1v38M1105 1300.1v38M65 1338.1v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 1338.1v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 1338.1v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 1338.1v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 1338.1v75.05M1105 1338.1v75.05M65 1413.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1413.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1413.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1413.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1413.15v38M1105 1413.15v38M65 1451.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1451.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1451.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1451.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1451.15v38M1105 1451.15v38M65 1489.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1489.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1489.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1489.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1489.15v38M1105 1489.15v38M65 1527.15v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 1527.15v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 1527.15v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 1527.15v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 1527.15v75.05M1105 1527.15v75.05M65 1602.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1602.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1602.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1602.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1602.2v38M1105 1602.2v38M65 1640.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1640.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1640.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1640.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1640.2v38M1105 1640.2v38M65 1678.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1678.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1678.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1678.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1678.2v38M1105 1678.2v38M65 1716.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1716.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1716.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1716.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1716.2v38M1105 1716.2v38M65 1754.2v59.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 1754.2v59.05" class="arcrow" style="stroke:#080"/>
<path d="M481 1754.2v59.05" class="arcrow" style="stroke:red"/>
<path d="M689 1754.2v59.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 1754.2v59.05M1105 1754.2v59.05M65 1813.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1813.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1813.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 1813.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1813.25v38M1105 1813.25v38M65 1851.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1851.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1851.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 1851.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1851.25v38M1105 1851.25v38M65 1889.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1889.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1889.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 1889.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1889.25v38M1105 1889.25v38" class="arcrow" style="stroke:transparent"/>
</g>
<g id="mscgenjsreplaceme_sequence">
<path d="M0 0h130v38H0z" class="entity" style="stroke:transparent"/>
<text x="65" y="22.75" class="entity-text"><tspan> </tspan></text>
<path d="M208 0h130v38H208z" class="entity" style="fill:#cfc;stroke:#080"/>
<text x="273" y="22.75" class="entity-text"><tspan>Network</tspan></text>
<path d="M416 0h130v38H416z" class="entity" style="fill:#fcc;stroke:red"/>
<text x="481" y="22.75" class="entity-text"><tspan>Offerer</tspan></text>
<path d="M624 0h130v38H624z" class="entity" style="fill:#ccf;stroke:#00f"/>
<text x="689" y="22.75" class="entity-text"><tspan>Bidder</tspan></text>
<path d="M832 0h130v38H832z" class="entity" style="stroke:transparent"/>
<text x="897" y="22.75" class="entity-text"><tspan> </tspan></text>
<path d="M1040 0h130v38h-130z" class="entity" style="stroke:transparent"/>
<text x="1105" y="22.75" class="entity-text"><tspan> </tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 95H273" class="arc directional callback" style="stroke:red"/>
<path d="M345.09 79.25h63.83v14h-63.83z" class="label-text-background"/>
<text x="377" y="90.25" class="directional-text callback-text"><tspan>Sends Offer</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 133h416" class="arc directional return" style="stroke:#080"/>
<path d="M445.76 117.25h70.48v14h-70.48z" class="label-text-background"/>
<text x="481" y="128.25" class="directional-text return-text"><tspan>Detects Offer</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 171H481" class="arc directional callback" style="stroke:#00f"/>
<path d="M557.65 155.25h54.7v14h-54.7z" class="label-text-background"/>
<text x="585" y="166.25" class="directional-text callback-text"><tspan>Sends Bid</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 323h208" class="arc directional callback" style="stroke:red"/>
<path d="M513.29 307.25h143.74v14H513.29z" class="label-text-background"/>
<text x="585" y="318.25" class="directional-text callback-text"><tspan>Sends BidAccept message</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 399H481" class="arc directional callback" style="stroke:#00f"/>
<path d="M491.29 383.25h187.74v14H491.29z" class="label-text-background"/>
<text x="585" y="394.25" class="directional-text callback-text"><tspan>Sends XmrBidLockTxSigsMessage</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 475H273" class="arc directional callback" style="stroke:red"/>
<path d="M311.64 459.25h130.72v14H311.64z" class="label-text-background"/>
<text x="377" y="470.25" class="directional-text callback-text"><tspan>Sends script-coin-lock-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 551h208" class="arc directional callback" style="stroke:red"/>
<path d="M485.61 535.25H684.7v14H485.61z" class="label-text-background"/>
<text x="585" y="546.25" class="directional-text callback-text"><tspan>Sends XmrBidLockSpendTxMessage</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 675.92c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f"/>
<path d="M692 627.67h40.91v14H692z" class="label-text-background"/>
<text x="692" y="638.67" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M692 643.67h107.01v14H692z" class="label-text-background"/>
<text x="692" y="654.67" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx to</tspan></text>
<path d="M692 659.67h39.34v14H692z" class="label-text-background"/>
<text x="692" y="670.67" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 675.92c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red"/>
<path d="M484 627.67h40.91v14H484z" class="label-text-background"/>
<text x="484" y="638.67" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M484 643.67h107.01v14H484z" class="label-text-background"/>
<text x="484" y="654.67" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx to</tspan></text>
<path d="M484 659.67h39.34v14H484z" class="label-text-background"/>
<text x="484" y="670.67" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 816.05H273" class="arc directional callback" style="stroke:#00f"/>
<path d="M408.97 800.3h144.06v14H408.97z" class="label-text-background"/>
<text x="481" y="811.3" class="directional-text callback-text"><tspan>Sends noscript-coin-lock-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 902.97c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red"/>
<path d="M484 854.72h40.91v14H484z" class="label-text-background"/>
<text x="484" y="865.72" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M484 870.72h120.36v14H484z" class="label-text-background"/>
<text x="484" y="881.72" class="directional-text method-text anchor-start"><tspan>noscript-coin-lock-tx to</tspan></text>
<path d="M484 886.72h39.34v14H484z" class="label-text-background"/>
<text x="484" y="897.72" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 1029.1h208" class="arc directional method" style="stroke:red"/>
<path d="M519.64 1013.35h130.72v14H519.64z" class="label-text-background"/>
<text x="585" y="1024.35" class="directional-text method-text"><tspan>Sends script-coin-lock-tx</tspan></text>
<path d="M539.3 1031.35h91.71v14H539.3z" class="label-text-background"/>
<text x="585" y="1042.35" class="directional-text method-text"><tspan>release message</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 1129.1H273" class="arc directional callback" style="stroke:#00f"/>
<path d="M397.3 1113.35h167.41v14H397.3z" class="label-text-background"/>
<text x="481" y="1124.35" class="directional-text callback-text"><tspan>Sends script-coin-lock-spend-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 1167.1h208" class="arc directional return" style="stroke:#080"/>
<path d="M289.97 1151.35h174.06v14H289.97z" class="label-text-background"/>
<text x="377" y="1162.35" class="directional-text return-text"><tspan>Detects script-coin-lock-spend-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1243.1H273" class="arc directional callback" style="stroke:red"/>
<path d="M286.63 1227.35h180.75v14H286.63z" class="label-text-background"/>
<text x="377" y="1238.35" class="directional-text callback-text"><tspan>Sends noscript-coin-lock-spend-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 1368.02c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red"/>
<path d="M484 1319.77h40.91v14H484z" class="label-text-background"/>
<text x="484" y="1330.77" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M484 1335.77h143.39v14H484z" class="label-text-background"/>
<text x="484" y="1346.77" class="directional-text method-text anchor-start"><tspan>noscript-coin-lock-spend-tx</tspan></text>
<path d="M484 1351.77h52.69v14H484z" class="label-text-background"/>
<text x="484" y="1362.77" class="directional-text method-text anchor-start"><tspan>to confirm</tspan></text>
<path d="M-39 1470.15h1040" class="inline_expression_divider" style="stroke-dasharray:10,5"/>
<path d="M459.98 1462.9h42.03v14h-42.03z" class="label-text-background"/>
<text x="481" y="1473.9" class="empty-text comment-row-text"><tspan>fail path</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 1557.07c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red"/>
<path d="M484 1508.82h40.91v14H484z" class="label-text-background"/>
<text x="484" y="1519.82" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M484 1524.82h93.36v14H484z" class="label-text-background"/>
<text x="484" y="1535.82" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx</tspan></text>
<path d="M484 1540.82h93.7v14H484z" class="label-text-background"/>
<text x="484" y="1551.82" class="directional-text method-text anchor-start"><tspan>locktime to expire</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1621.2H273" class="arc directional callback" style="stroke:red"/>
<path d="M359.98 1605.45h34.03v14h-34.03z" class="label-text-background"/>
<text x="377" y="1616.45" class="directional-text callback-text"><tspan>Sends</tspan></text>
<path d="M300.64 1623.45h152.72v14H300.64z" class="label-text-background"/>
<text x="377" y="1634.45" class="directional-text callback-text"><tspan>script-coin-lock-pre-refund-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 1659.2h208" class="arc directional return" style="stroke:#080"/>
<path d="M300.64 1643.45h152.72v14H300.64z" class="label-text-background"/>
<text x="377" y="1654.45" class="directional-text return-text"><tspan>script-coin-lock-pre-refund-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 1776.12c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red"/>
<path d="M484 1743.87h40.91v14H484z" class="label-text-background"/>
<text x="484" y="1754.87" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M484 1759.87h124.06v14H484z" class="label-text-background"/>
<text x="484" y="1770.87" class="directional-text method-text anchor-start"><tspan>pre-refund tx to confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1832.25H273" class="arc directional callback" style="stroke:red"/>
<path d="M359.98 1816.5h34.03v14h-34.03z" class="label-text-background"/>
<text x="377" y="1827.5" class="directional-text callback-text"><tspan>Sends</tspan></text>
<path d="M282.3 1834.5h189.41v14H282.3z" class="label-text-background"/>
<text x="377" y="1845.5" class="directional-text callback-text"><tspan>script-coin-lock-pre-refund-spend-tx</tspan></text>
</g>
<g id="mscgenjsreplaceme_notes">
<path d="m381 209 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="212.75" class="box-text abox-text"><tspan>Bid Receiving</tspan></text>
<path d="m381 247 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="250.75" class="box-text abox-text"><tspan>Bid Received</tspan></text>
<path d="M381 268h200v34H381z" class="box" style="stroke:red"/>
<text x="481" y="288.75" class="box-text"><tspan>User accepts bid</tspan></text>
<path d="M797 306h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="318.75" class="box-text note-text"><tspan>The BidAccept message contains the pubkeys the offerer will use and a</tspan></text>
<text x="1001" y="334.75" class="box-text note-text"><tspan>DLEAG proof one key will work across both chains of the swapping coins</tspan></text>
<path d="m381 361 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="364.75" class="box-text abox-text"><tspan>Bid Accepted</tspan></text>
<path d="M797 382h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="394.75" class="box-text note-text"><tspan>The XmrBidLockTxSigsMessage contains the bidder&apos;s signatures for the</tspan></text>
<text x="1001" y="410.75" class="box-text note-text"><tspan>script-coin-lock-refund and script-coin-lock-refund-spend txns.</tspan></text>
<path d="m381 437 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="432.75" class="box-text abox-text"><tspan>Exchanged script lock tx sigs</tspan></text>
<text x="481" y="448.75" class="box-text abox-text"><tspan>msg</tspan></text>
<path d="m381 513 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="516.75" class="box-text abox-text"><tspan>Bid Script coin spend tx valid</tspan></text>
<path d="M797 534h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="546.75" class="box-text note-text"><tspan>The XmrBidLockSpendTxMessage contains the script-coin-lock-tx and</tspan></text>
<text x="1001" y="562.75" class="box-text note-text"><tspan>proof the offerer can sign it.</tspan></text>
<path d="m381 589 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="584.75" class="box-text abox-text"><tspan>Exchanged script lock spend tx</tspan></text>
<text x="481" y="600.75" class="box-text abox-text"><tspan>msg</tspan></text>
<path d="m381 740.05 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="743.8" class="box-text abox-text"><tspan>Bid Script coin locked</tspan></text>
<path d="M-38 778.05h98.39v11l-7 7H-38" class="box inline_expression_label"/>
<text x="-36" y="791.3" class="inline_expression-text alt-text anchor-start"><tspan>alt: success path</tspan></text>
<path d="m381 967.1 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="970.85" class="box-text abox-text"><tspan>Bid Scriptless coin locked</tspan></text>
<path d="M797 988.1h399v9h9m-9-9 9 9v73H797v-82z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1000.85" class="box-text note-text"><tspan>The XmrBidLockReleaseMessage contains the offerer&apos;s OTVES for the</tspan></text>
<text x="1001" y="1016.85" class="box-text note-text"><tspan>script-coin-lock-tx. The bidder decodes the</tspan></text>
<text x="1001" y="1032.85" class="box-text note-text"><tspan>offerer&apos;s signature from the OTVES. When the</tspan></text>
<text x="1001" y="1048.85" class="box-text note-text"><tspan>offerer has the plaintext signature, they can decode the bidder&apos;s key</tspan></text>
<text x="1001" y="1064.85" class="box-text note-text"><tspan>for the noscript-lock-tx.</tspan></text>
<path d="m381 1091.1 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="1094.85" class="box-text abox-text"><tspan>Bid Script coin lock released</tspan></text>
<path d="m381 1205.1 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="1208.85" class="box-text abox-text"><tspan>Bid Script tx redeemed</tspan></text>
<path d="M797 1188.1h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1200.85" class="box-text note-text"><tspan>The offerer extracts the bidder&apos;s plaintext signature and derives the</tspan></text>
<text x="1001" y="1216.85" class="box-text note-text"><tspan>bidder&apos;s noscript-lock-tx keyhalf.</tspan></text>
<path d="m381 1281.1 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="1284.85" class="box-text abox-text"><tspan>Bid Scriptless tx redeemed</tspan></text>
<path d="m381 1432.15 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="1435.9" class="box-text abox-text"><tspan>Bid Completed</tspan></text>
<path d="M797 1604.2h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1624.95" class="box-text note-text"><tspan>tx can be sent by either party.</tspan></text>
<path d="m381 1697.2 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="1692.95" class="box-text abox-text"><tspan>Bid Script pre-refund tx in</tspan></text>
<text x="481" y="1708.95" class="box-text abox-text"><tspan>chain</tspan></text>
<path d="M797 1815.25h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1828" class="box-text note-text"><tspan>Refunds the script lock tx, with the offerer&apos;s cleartext signature</tspan></text>
<text x="1001" y="1844" class="box-text note-text"><tspan>the bidder can refund the noscript lock tx.</tspan></text>
<path d="m381 1870.25 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="1874" class="box-text abox-text"><tspan>Bid Failed, refunded</tspan></text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -1,391 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" id="mscgenjsreplaceme" width="1264" height="1971.25" class="mscgenjsreplaceme" style="font-family:Helvetica,sans-serif;font-size:12px;font-weight:400;font-style:normal;text-decoration:none;background-color:#fff;stroke:#000;stroke-width:2" version="1.1">
<defs>
<marker id="mscgenjsreplacemecallback-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#00f"/>
</marker>
<marker id="mscgenjsreplacemecallback-l-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#00f"/>
</marker>
<marker id="mscgenjsreplacemecallback-#008800" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#080"/>
</marker>
<marker id="mscgenjsreplacemecallback-l-#008800" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#080"/>
</marker>
<marker id="mscgenjsreplacemecallback-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:red"/>
</marker>
<marker id="mscgenjsreplacemecallback-l-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:red"/>
</marker>
<marker id="mscgenjsreplacememethod-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="#00F" stroke="#00F" d="m1 1 8 2-8 2z" class="arrow-style"/>
</marker>
<marker id="mscgenjsreplacememethod-l-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="#00F" stroke="#00F" d="M17 1 9 3l8 2z" class="arrow-style"/>
</marker>
<marker id="mscgenjsreplacememethod-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="red" stroke="red" d="m1 1 8 2-8 2z" class="arrow-style"/>
</marker>
<marker id="mscgenjsreplacememethod-l-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="red" stroke="red" d="M17 1 9 3l8 2z" class="arrow-style"/>
</marker>
<style>
.mscgenjsreplaceme path,.mscgenjsreplaceme rect{fill:none}.mscgenjsreplaceme .label-text-background{fill:#fff;stroke:#fff;stroke-width:0}.mscgenjsreplaceme .return{stroke-dasharray:5,3}.mscgenjsreplaceme text{color:inherit;stroke:none;text-anchor:middle}.mscgenjsreplaceme text.anchor-start{text-anchor:start}.mscgenjsreplaceme .arrow-marker{overflow:visible}.mscgenjsreplaceme .arrow-style{stroke-width:1}.mscgenjsreplaceme .arcrow{stroke-linecap:butt}.mscgenjsreplaceme .box,.mscgenjsreplaceme .entity{fill:#fff;stroke-linejoin:round}
</style>
</defs>
<g id="mscgenjsreplaceme_body" transform="translate(47 3)">
<path id="mscgenjsreplaceme_background" d="M-47-3h1264v1971.25H-47z" class="bglayer" style="fill:#fff;stroke:#fff;stroke-width:0"/>
<path id="mscgenjsreplaceme_arcspans" d="M-39 816.05h1040v1130.2H-39z" class="box inline_expression alt"/>
<g id="mscgenjsreplaceme_lifelines">
<path d="M65 38v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 38v38" class="arcrow" style="stroke:#080"/>
<path d="M481 38v38" class="arcrow" style="stroke:red"/>
<path d="M689 38v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 38v38M1105 38v38M65 76v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 76v38" class="arcrow" style="stroke:#080"/>
<path d="M481 76v38" class="arcrow" style="stroke:red"/>
<path d="M689 76v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 76v38M1105 76v38M65 114v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 114v38" class="arcrow" style="stroke:#080"/>
<path d="M481 114v38" class="arcrow" style="stroke:red"/>
<path d="M689 114v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 114v38M1105 114v38M65 152v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 152v38" class="arcrow" style="stroke:#080"/>
<path d="M481 152v38" class="arcrow" style="stroke:red"/>
<path d="M689 152v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 152v38M1105 152v38M65 190v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 190v38" class="arcrow" style="stroke:#080"/>
<path d="M481 190v38" class="arcrow" style="stroke:red"/>
<path d="M689 190v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 190v38M1105 190v38M65 228v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 228v38" class="arcrow" style="stroke:#080"/>
<path d="M481 228v38" class="arcrow" style="stroke:red"/>
<path d="M689 228v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 228v38M1105 228v38M65 266v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 266v38" class="arcrow" style="stroke:#080"/>
<path d="M481 266v38" class="arcrow" style="stroke:red"/>
<path d="M689 266v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 266v38M1105 266v38M65 304v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 304v38" class="arcrow" style="stroke:#080"/>
<path d="M481 304v38" class="arcrow" style="stroke:red"/>
<path d="M689 304v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 304v38M1105 304v38M65 342v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 342v38" class="arcrow" style="stroke:#080"/>
<path d="M481 342v38" class="arcrow" style="stroke:red"/>
<path d="M689 342v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 342v38M1105 342v38M65 380v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 380v38" class="arcrow" style="stroke:#080"/>
<path d="M481 380v38" class="arcrow" style="stroke:red"/>
<path d="M689 380v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 380v38M1105 380v38M65 418v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 418v38" class="arcrow" style="stroke:#080"/>
<path d="M481 418v38" class="arcrow" style="stroke:red"/>
<path d="M689 418v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 418v38M1105 418v38M65 456v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 456v38" class="arcrow" style="stroke:#080"/>
<path d="M481 456v38" class="arcrow" style="stroke:red"/>
<path d="M689 456v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 456v38M1105 456v38M65 494v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 494v38" class="arcrow" style="stroke:#080"/>
<path d="M481 494v38" class="arcrow" style="stroke:red"/>
<path d="M689 494v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 494v38M1105 494v38M65 532v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 532v38" class="arcrow" style="stroke:#080"/>
<path d="M481 532v38" class="arcrow" style="stroke:red"/>
<path d="M689 532v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 532v38M1105 532v38M65 570v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 570v38" class="arcrow" style="stroke:#080"/>
<path d="M481 570v38" class="arcrow" style="stroke:red"/>
<path d="M689 570v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 570v38M1105 570v38M65 608v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 608v38" class="arcrow" style="stroke:#080"/>
<path d="M481 608v38" class="arcrow" style="stroke:red"/>
<path d="M689 608v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 608v38M1105 608v38M65 646v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 646v38" class="arcrow" style="stroke:#080"/>
<path d="M481 646v38" class="arcrow" style="stroke:red"/>
<path d="M689 646v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 646v38M1105 646v38M65 684v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 684v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 684v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 684v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 684v75.05M1105 684v75.05M65 759.05v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 759.05v38" class="arcrow" style="stroke:#080"/>
<path d="M481 759.05v38" class="arcrow" style="stroke:red"/>
<path d="M689 759.05v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 759.05v38M1105 759.05v38M65 797.05v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 797.05v38" class="arcrow" style="stroke:#080"/>
<path d="M481 797.05v38" class="arcrow" style="stroke:red"/>
<path d="M689 797.05v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 797.05v38M1105 797.05v38M65 835.05v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 835.05v38" class="arcrow" style="stroke:#080"/>
<path d="M481 835.05v38" class="arcrow" style="stroke:red"/>
<path d="M689 835.05v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 835.05v38M1105 835.05v38M65 873.05v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 873.05v38" class="arcrow" style="stroke:#080"/>
<path d="M481 873.05v38" class="arcrow" style="stroke:red"/>
<path d="M689 873.05v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 873.05v38M1105 873.05v38M65 911.05v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 911.05v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 911.05v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 911.05v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 911.05v75.05M1105 911.05v75.05M65 986.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 986.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 986.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 986.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 986.1v38M1105 986.1v38M65 1024.1v86" class="arcrow" style="stroke:transparent"/>
<path d="M273 1024.1v86" class="arcrow" style="stroke:#080"/>
<path d="M481 1024.1v86" class="arcrow" style="stroke:red"/>
<path d="M689 1024.1v86" class="arcrow" style="stroke:#00f"/>
<path d="M897 1024.1v86M1105 1024.1v86M65 1110.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1110.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1110.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1110.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1110.1v38M1105 1110.1v38M65 1148.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1148.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1148.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1148.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1148.1v38M1105 1148.1v38M65 1186.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1186.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1186.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1186.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1186.1v38M1105 1186.1v38M65 1224.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1224.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1224.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1224.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1224.1v38M1105 1224.1v38M65 1262.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1262.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1262.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1262.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1262.1v38M1105 1262.1v38M65 1300.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1300.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1300.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1300.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1300.1v38M1105 1300.1v38M65 1338.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1338.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1338.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1338.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1338.1v38M1105 1338.1v38M65 1376.1v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 1376.1v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 1376.1v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 1376.1v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 1376.1v75.05M1105 1376.1v75.05M65 1451.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1451.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1451.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1451.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1451.15v38M1105 1451.15v38M65 1489.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1489.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1489.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1489.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1489.15v38M1105 1489.15v38M65 1527.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1527.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1527.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1527.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1527.15v38M1105 1527.15v38M65 1565.15v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 1565.15v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 1565.15v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 1565.15v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 1565.15v75.05M1105 1565.15v75.05M65 1640.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1640.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1640.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1640.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1640.2v38M1105 1640.2v38M65 1678.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1678.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1678.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1678.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1678.2v38M1105 1678.2v38M65 1716.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1716.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1716.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1716.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1716.2v38M1105 1716.2v38M65 1754.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1754.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1754.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1754.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1754.2v38M1105 1754.2v38M65 1792.2v59.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 1792.2v59.05" class="arcrow" style="stroke:#080"/>
<path d="M481 1792.2v59.05" class="arcrow" style="stroke:red"/>
<path d="M689 1792.2v59.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 1792.2v59.05M1105 1792.2v59.05M65 1851.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1851.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1851.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 1851.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1851.25v38M1105 1851.25v38M65 1889.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1889.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1889.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 1889.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1889.25v38M1105 1889.25v38M65 1927.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1927.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1927.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 1927.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1927.25v38M1105 1927.25v38" class="arcrow" style="stroke:transparent"/>
</g>
<g id="mscgenjsreplaceme_sequence">
<path d="M0 0h130v38H0z" class="entity" style="stroke:transparent"/>
<text x="65" y="22.75" class="entity-text"><tspan> </tspan></text>
<path d="M208 0h130v38H208z" class="entity" style="fill:#cfc;stroke:#080"/>
<text x="273" y="22.75" class="entity-text"><tspan>Network</tspan></text>
<path d="M416 0h130v38H416z" class="entity" style="fill:#fcc;stroke:red"/>
<text x="481" y="22.75" class="entity-text"><tspan>Offerer</tspan></text>
<path d="M624 0h130v38H624z" class="entity" style="fill:#ccf;stroke:#00f"/>
<text x="689" y="22.75" class="entity-text"><tspan>Bidder</tspan></text>
<path d="M832 0h130v38H832z" class="entity" style="stroke:transparent"/>
<text x="897" y="22.75" class="entity-text"><tspan> </tspan></text>
<path d="M1040 0h130v38h-130z" class="entity" style="stroke:transparent"/>
<text x="1105" y="22.75" class="entity-text"><tspan> </tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 95H273" class="arc directional callback" style="stroke:red"/>
<path d="M345.09 79.25h63.83v14h-63.83z" class="label-text-background"/>
<text x="377" y="90.25" class="directional-text callback-text"><tspan>Sends Offer</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 133h416" class="arc directional return" style="stroke:#080"/>
<path d="M445.76 117.25h70.48v14h-70.48z" class="label-text-background"/>
<text x="481" y="128.25" class="directional-text return-text"><tspan>Detects Offer</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 171H481" class="arc directional callback" style="stroke:#00f"/>
<path d="M516.62 155.25H653.7v14H516.62z" class="label-text-background"/>
<text x="585" y="166.25" class="directional-text callback-text"><tspan>Sends BidIntent message</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 285h208" class="arc directional callback" style="stroke:red"/>
<path d="M498.28 269.25h173.76v14H498.28z" class="label-text-background"/>
<text x="585" y="280.25" class="directional-text callback-text"><tspan>Sends BidIntentAccept message</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 361H481" class="arc directional callback" style="stroke:#00f"/>
<path d="M513.29 345.25h143.74v14H513.29z" class="label-text-background"/>
<text x="585" y="356.25" class="directional-text callback-text"><tspan>Sends BidAccept message</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 437h208" class="arc directional callback" style="stroke:red"/>
<path d="M491.29 421.25h187.74v14H491.29z" class="label-text-background"/>
<text x="585" y="432.25" class="directional-text callback-text"><tspan>Sends XmrBidLockTxSigsMessage</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 513H273" class="arc directional callback" style="stroke:#00f"/>
<path d="M415.64 497.25h130.72v14H415.64z" class="label-text-background"/>
<text x="481" y="508.25" class="directional-text callback-text"><tspan>Sends script-coin-lock-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 589H481" class="arc directional callback" style="stroke:#00f"/>
<path d="M485.61 573.25H684.7v14H485.61z" class="label-text-background"/>
<text x="585" y="584.25" class="directional-text callback-text"><tspan>Sends XmrBidLockSpendTxMessage</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 713.92c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red"/>
<path d="M484 665.67h40.91v14H484z" class="label-text-background"/>
<text x="484" y="676.67" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M484 681.67h107.01v14H484z" class="label-text-background"/>
<text x="484" y="692.67" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx to</tspan></text>
<path d="M484 697.67h39.34v14H484z" class="label-text-background"/>
<text x="484" y="708.67" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 713.92c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f"/>
<path d="M692 665.67h40.91v14H692z" class="label-text-background"/>
<text x="692" y="676.67" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M692 681.67h107.01v14H692z" class="label-text-background"/>
<text x="692" y="692.67" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx to</tspan></text>
<path d="M692 697.67h39.34v14H692z" class="label-text-background"/>
<text x="692" y="708.67" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 854.05H273" class="arc directional callback" style="stroke:red"/>
<path d="M304.97 838.3h144.06v14H304.97z" class="label-text-background"/>
<text x="377" y="849.3" class="directional-text callback-text"><tspan>Sends noscript-coin-lock-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 940.97c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f"/>
<path d="M692 892.72h40.91v14H692z" class="label-text-background"/>
<text x="692" y="903.72" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M692 908.72h120.36v14H692z" class="label-text-background"/>
<text x="692" y="919.72" class="directional-text method-text anchor-start"><tspan>noscript-coin-lock-tx to</tspan></text>
<path d="M692 924.72h39.34v14H692z" class="label-text-background"/>
<text x="692" y="935.72" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 1067.1H481" class="arc directional method" style="stroke:#00f"/>
<path d="M519.64 1051.35h130.72v14H519.64z" class="label-text-background"/>
<text x="585" y="1062.35" class="directional-text method-text"><tspan>Sends script-coin-lock-tx</tspan></text>
<path d="M539.3 1069.35h91.71v14H539.3z" class="label-text-background"/>
<text x="585" y="1080.35" class="directional-text method-text"><tspan>release message</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1167.1H273" class="arc directional callback" style="stroke:red"/>
<path d="M293.3 1151.35h167.41v14H293.3z" class="label-text-background"/>
<text x="377" y="1162.35" class="directional-text callback-text"><tspan>Sends script-coin-lock-spend-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 1205.1h416" class="arc directional return" style="stroke:#080"/>
<path d="M393.97 1189.35h174.06v14H393.97z" class="label-text-background"/>
<text x="481" y="1200.35" class="directional-text return-text"><tspan>Detects script-coin-lock-spend-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 1281.1H273" class="arc directional callback" style="stroke:#00f"/>
<path d="M390.63 1265.35h180.75v14H390.63z" class="label-text-background"/>
<text x="481" y="1276.35" class="directional-text callback-text"><tspan>Sends noscript-coin-lock-spend-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 1406.02c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f"/>
<path d="M692 1357.77h40.91v14H692z" class="label-text-background"/>
<text x="692" y="1368.77" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M692 1373.77h143.39v14H692z" class="label-text-background"/>
<text x="692" y="1384.77" class="directional-text method-text anchor-start"><tspan>noscript-coin-lock-spend-tx</tspan></text>
<path d="M692 1389.77h52.69v14H692z" class="label-text-background"/>
<text x="692" y="1400.77" class="directional-text method-text anchor-start"><tspan>to confirm</tspan></text>
<path d="M-39 1508.15h1040" class="inline_expression_divider" style="stroke-dasharray:10,5"/>
<path d="M459.98 1500.9h42.03v14h-42.03z" class="label-text-background"/>
<text x="481" y="1511.9" class="empty-text comment-row-text"><tspan>fail path</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 1595.07c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f"/>
<path d="M692 1546.82h40.91v14H692z" class="label-text-background"/>
<text x="692" y="1557.82" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M692 1562.82h93.36v14H692z" class="label-text-background"/>
<text x="692" y="1573.82" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx</tspan></text>
<path d="M692 1578.82h93.7v14H692z" class="label-text-background"/>
<text x="692" y="1589.82" class="directional-text method-text anchor-start"><tspan>locktime to expire</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 1659.2H273" class="arc directional callback" style="stroke:#00f"/>
<path d="M385.96 1643.45h190.08v14H385.96z" class="label-text-background"/>
<text x="481" y="1654.45" class="directional-text callback-text"><tspan>Sends script-coin-lock-pre-refund-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 1697.2h416" class="arc directional return" style="stroke:#080"/>
<path d="M404.64 1681.45h152.72v14H404.64z" class="label-text-background"/>
<text x="481" y="1692.45" class="directional-text return-text"><tspan>script-coin-lock-pre-refund-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 1814.12c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f"/>
<path d="M692 1781.87h40.91v14H692z" class="label-text-background"/>
<text x="692" y="1792.87" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M692 1797.87h124.06v14H692z" class="label-text-background"/>
<text x="692" y="1808.87" class="directional-text method-text anchor-start"><tspan>pre-refund tx to confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 1870.25H273" class="arc directional callback" style="stroke:#00f"/>
<path d="M367.62 1854.5h226.77v14H367.62z" class="label-text-background"/>
<text x="481" y="1865.5" class="directional-text callback-text"><tspan>Sends script-coin-lock-pre-refund-spend-tx</tspan></text>
</g>
<g id="mscgenjsreplaceme_notes">
<path d="m589 209 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="212.75" class="box-text abox-text"><tspan>Bid Request sent</tspan></text>
<path d="M381 230h200v34H381z" class="box" style="stroke:red"/>
<text x="481" y="250.75" class="box-text"><tspan>User accepts bid</tspan></text>
<path d="M797 268h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="280.75" class="box-text note-text"><tspan>The BidAccept message contains the pubkeys the offerer will use and a</tspan></text>
<text x="1001" y="296.75" class="box-text note-text"><tspan>DLEAG proof one key will work across both chains of the swapping coins</tspan></text>
<path d="m589 323 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="326.75" class="box-text abox-text"><tspan>Bid Receiving accept</tspan></text>
<path d="m589 399 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="402.75" class="box-text abox-text"><tspan>Bid Accepted</tspan></text>
<path d="M797 420h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="432.75" class="box-text note-text"><tspan>The XmrBidLockTxSigsMessage contains the offerer&apos;s signatures for the</tspan></text>
<text x="1001" y="448.75" class="box-text note-text"><tspan>script-coin-lock-refund and script-coin-lock-refund-spend txns.</tspan></text>
<path d="m589 475 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="470.75" class="box-text abox-text"><tspan>Exchanged script lock tx sigs</tspan></text>
<text x="689" y="486.75" class="box-text abox-text"><tspan>msg</tspan></text>
<path d="m589 551 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="554.75" class="box-text abox-text"><tspan>Bid Script coin spend tx valid</tspan></text>
<path d="M797 572h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="584.75" class="box-text note-text"><tspan>The XmrBidLockSpendTxMessage contains the script-coin-lock-tx and</tspan></text>
<text x="1001" y="600.75" class="box-text note-text"><tspan>proof the bidder can sign it.</tspan></text>
<path d="m589 627 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="622.75" class="box-text abox-text"><tspan>Exchanged script lock spend tx</tspan></text>
<text x="689" y="638.75" class="box-text abox-text"><tspan>msg</tspan></text>
<path d="m589 778.05 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="781.8" class="box-text abox-text"><tspan>Bid Script coin locked</tspan></text>
<path d="M-38 816.05h98.39v11l-7 7H-38" class="box inline_expression_label"/>
<text x="-36" y="829.3" class="inline_expression-text alt-text anchor-start"><tspan>alt: success path</tspan></text>
<path d="m589 1005.1 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1008.85" class="box-text abox-text"><tspan>Bid Scriptless coin locked</tspan></text>
<path d="M797 1026.1h399v9h9m-9-9 9 9v73H797v-82z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1038.85" class="box-text note-text"><tspan>The XmrBidLockReleaseMessage contains the bidder&apos;s OTVES for the</tspan></text>
<text x="1001" y="1054.85" class="box-text note-text"><tspan>script-coin-lock-tx. The offerer decodes the</tspan></text>
<text x="1001" y="1070.85" class="box-text note-text"><tspan>bidder&apos;s signature from the OTVES. When the</tspan></text>
<text x="1001" y="1086.85" class="box-text note-text"><tspan>bidder has the plaintext signature, they can decode the offerer&apos;s key</tspan></text>
<text x="1001" y="1102.85" class="box-text note-text"><tspan>for the noscript-lock-tx.</tspan></text>
<path d="m589 1129.1 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1132.85" class="box-text abox-text"><tspan>Bid Script coin lock released</tspan></text>
<path d="m589 1243.1 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1246.85" class="box-text abox-text"><tspan>Bid Script tx redeemed</tspan></text>
<path d="M797 1226.1h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1238.85" class="box-text note-text"><tspan>The bidder extracts the offerer&apos;s plaintext signature and derives the</tspan></text>
<text x="1001" y="1254.85" class="box-text note-text"><tspan>offerer&apos;s noscript-lock-tx keyhalf.</tspan></text>
<path d="m589 1319.1 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1322.85" class="box-text abox-text"><tspan>Bid Scriptless tx redeemed</tspan></text>
<path d="m589 1470.15 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1473.9" class="box-text abox-text"><tspan>Bid Completed</tspan></text>
<path d="M797 1642.2h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1662.95" class="box-text note-text"><tspan>tx can be sent by either party.</tspan></text>
<path d="m589 1735.2 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1730.95" class="box-text abox-text"><tspan>Bid Script pre-refund tx in</tspan></text>
<text x="689" y="1746.95" class="box-text abox-text"><tspan>chain</tspan></text>
<path d="M797 1853.25h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1866" class="box-text note-text"><tspan>Refunds the script lock tx, with the bidder&apos;s cleartext signature the</tspan></text>
<text x="1001" y="1882" class="box-text note-text"><tspan>offerer can refund the noscript lock tx.</tspan></text>
<path d="m589 1908.25 3-17h194l3 17-3 17H592z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1912" class="box-text abox-text"><tspan>Bid Failed, refunded</tspan></text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -1,420 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" id="mscgenjsreplaceme" width="1272" height="2063.25" class="mscgenjsreplaceme" style="font-family:Helvetica,sans-serif;font-size:12px;font-weight:400;font-style:normal;text-decoration:none;background-color:#fff;stroke:#000;stroke-width:2" version="1.1">
<defs>
<marker id="mscgenjsreplacemecallback-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#00f"/>
</marker>
<marker id="mscgenjsreplacemecallback-l-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#00f"/>
</marker>
<marker id="mscgenjsreplacemecallback-#008800" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#080"/>
</marker>
<marker id="mscgenjsreplacemecallback-l-#008800" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#080"/>
</marker>
<marker id="mscgenjsreplacemecallback-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:red"/>
</marker>
<marker id="mscgenjsreplacemecallback-l-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:red"/>
</marker>
<marker id="mscgenjsreplacememethod-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="#00F" stroke="#00F" d="m1 1 8 2-8 2z" class="arrow-style"/>
</marker>
<marker id="mscgenjsreplacememethod-l-#0000FF" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="#00F" stroke="#00F" d="M17 1 9 3l8 2z" class="arrow-style"/>
</marker>
<marker id="mscgenjsreplacememethod-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="red" stroke="red" d="m1 1 8 2-8 2z" class="arrow-style"/>
</marker>
<marker id="mscgenjsreplacememethod-l-#FF0000" class="arrow-marker" markerHeight="10" markerUnits="strokeWidth" markerWidth="10" orient="auto" refX="9" refY="3" viewBox="0 0 10 10">
<path fill="red" stroke="red" d="M17 1 9 3l8 2z" class="arrow-style"/>
</marker>
<style>
.mscgenjsreplaceme path,.mscgenjsreplaceme rect{fill:none}.mscgenjsreplaceme .label-text-background{fill:#fff;stroke:#fff;stroke-width:0}.mscgenjsreplaceme .return{stroke-dasharray:5,3}.mscgenjsreplaceme .inline_expression_divider{stroke-dasharray:10,5}.mscgenjsreplaceme text{color:inherit;stroke:none;text-anchor:middle}.mscgenjsreplaceme text.anchor-start{text-anchor:start}.mscgenjsreplaceme .arrow-marker{overflow:visible}.mscgenjsreplaceme .arrow-style{stroke-width:1}.mscgenjsreplaceme .arcrow{stroke-linecap:butt}.mscgenjsreplaceme .box,.mscgenjsreplaceme .entity{fill:#fff;stroke-linejoin:round}
</style>
</defs>
<g id="mscgenjsreplaceme_body" transform="translate(51 3)">
<path id="mscgenjsreplaceme_background" d="M-51-3h1272v2063.25H-51z" class="bglayer" style="fill:#fff;stroke:#fff;stroke-width:0"/>
<g id="mscgenjsreplaceme_arcspans">
<path d="M-41 869.1h1044v1169.15H-41z" class="box inline_expression alt"/>
<path d="M-37 1410.15H999v590.1H-37z" class="box inline_expression alt"/>
</g>
<g id="mscgenjsreplaceme_lifelines">
<path d="M65 38v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 38v38" class="arcrow" style="stroke:#080"/>
<path d="M481 38v38" class="arcrow" style="stroke:red"/>
<path d="M689 38v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 38v38M1105 38v38M65 76v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 76v38" class="arcrow" style="stroke:#080"/>
<path d="M481 76v38" class="arcrow" style="stroke:red"/>
<path d="M689 76v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 76v38M1105 76v38M65 114v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 114v38" class="arcrow" style="stroke:#080"/>
<path d="M481 114v38" class="arcrow" style="stroke:red"/>
<path d="M689 114v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 114v38M1105 114v38M65 152v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 152v38" class="arcrow" style="stroke:#080"/>
<path d="M481 152v38" class="arcrow" style="stroke:red"/>
<path d="M689 152v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 152v38M1105 152v38M65 190v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 190v38" class="arcrow" style="stroke:#080"/>
<path d="M481 190v38" class="arcrow" style="stroke:red"/>
<path d="M689 190v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 190v38M1105 190v38M65 228v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 228v38" class="arcrow" style="stroke:#080"/>
<path d="M481 228v38" class="arcrow" style="stroke:red"/>
<path d="M689 228v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 228v38M1105 228v38M65 266v54" class="arcrow" style="stroke:transparent"/>
<path d="M273 266v54" class="arcrow" style="stroke:#080"/>
<path d="M481 266v54" class="arcrow" style="stroke:red"/>
<path d="M689 266v54" class="arcrow" style="stroke:#00f"/>
<path d="M897 266v54M1105 266v54M65 320v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 320v38" class="arcrow" style="stroke:#080"/>
<path d="M481 320v38" class="arcrow" style="stroke:red"/>
<path d="M689 320v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 320v38M1105 320v38M65 358v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 358v38" class="arcrow" style="stroke:#080"/>
<path d="M481 358v38" class="arcrow" style="stroke:red"/>
<path d="M689 358v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 358v38M1105 358v38M65 396v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 396v38" class="arcrow" style="stroke:#080"/>
<path d="M481 396v38" class="arcrow" style="stroke:red"/>
<path d="M689 396v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 396v38M1105 396v38M65 434v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 434v38" class="arcrow" style="stroke:#080"/>
<path d="M481 434v38" class="arcrow" style="stroke:red"/>
<path d="M689 434v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 434v38M1105 434v38M65 472v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 472v38" class="arcrow" style="stroke:#080"/>
<path d="M481 472v38" class="arcrow" style="stroke:red"/>
<path d="M689 472v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 472v38M1105 472v38M65 510v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 510v38" class="arcrow" style="stroke:#080"/>
<path d="M481 510v38" class="arcrow" style="stroke:red"/>
<path d="M689 510v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 510v38M1105 510v38M65 548v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 548v38" class="arcrow" style="stroke:#080"/>
<path d="M481 548v38" class="arcrow" style="stroke:red"/>
<path d="M689 548v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 548v38M1105 548v38M65 586v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 586v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 586v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 586v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 586v75.05M1105 586v75.05M65 661.05v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 661.05v38" class="arcrow" style="stroke:#080"/>
<path d="M481 661.05v38" class="arcrow" style="stroke:red"/>
<path d="M689 661.05v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 661.05v38M1105 661.05v38M65 699.05v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 699.05v38" class="arcrow" style="stroke:#080"/>
<path d="M481 699.05v38" class="arcrow" style="stroke:red"/>
<path d="M689 699.05v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 699.05v38M1105 699.05v38M65 737.05v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 737.05v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 737.05v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 737.05v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 737.05v75.05M1105 737.05v75.05M65 812.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 812.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 812.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 812.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 812.1v38M1105 812.1v38M65 850.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 850.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 850.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 850.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 850.1v38M1105 850.1v38M65 888.1v86" class="arcrow" style="stroke:transparent"/>
<path d="M273 888.1v86" class="arcrow" style="stroke:#080"/>
<path d="M481 888.1v86" class="arcrow" style="stroke:red"/>
<path d="M689 888.1v86" class="arcrow" style="stroke:#00f"/>
<path d="M897 888.1v86M1105 888.1v86M65 974.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 974.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 974.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 974.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 974.1v38M1105 974.1v38M65 1012.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1012.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1012.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1012.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1012.1v38M1105 1012.1v38M65 1050.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1050.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1050.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1050.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1050.1v38M1105 1050.1v38M65 1088.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1088.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1088.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1088.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1088.1v38M1105 1088.1v38M65 1126.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1126.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1126.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1126.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1126.1v38M1105 1126.1v38M65 1164.1v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1164.1v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1164.1v38" class="arcrow" style="stroke:red"/>
<path d="M689 1164.1v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1164.1v38M1105 1164.1v38M65 1202.1v75.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 1202.1v75.05" class="arcrow" style="stroke:#080"/>
<path d="M481 1202.1v75.05" class="arcrow" style="stroke:red"/>
<path d="M689 1202.1v75.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 1202.1v75.05M1105 1202.1v75.05M65 1277.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1277.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1277.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1277.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1277.15v38M1105 1277.15v38M65 1315.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1315.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1315.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1315.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1315.15v38M1105 1315.15v38M65 1353.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1353.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1353.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1353.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1353.15v38M1105 1353.15v38M65 1391.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1391.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1391.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1391.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1391.15v38M1105 1391.15v38M65 1429.15v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1429.15v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1429.15v38" class="arcrow" style="stroke:red"/>
<path d="M689 1429.15v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1429.15v38M1105 1429.15v38M65 1467.15v59.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 1467.15v59.05" class="arcrow" style="stroke:#080"/>
<path d="M481 1467.15v59.05" class="arcrow" style="stroke:red"/>
<path d="M689 1467.15v59.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 1467.15v59.05M1105 1467.15v59.05M65 1526.2v54" class="arcrow" style="stroke:transparent"/>
<path d="M273 1526.2v54" class="arcrow" style="stroke:#080"/>
<path d="M481 1526.2v54" class="arcrow" style="stroke:red"/>
<path d="M689 1526.2v54" class="arcrow" style="stroke:#00f"/>
<path d="M897 1526.2v54M1105 1526.2v54M65 1580.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1580.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1580.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1580.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1580.2v38M1105 1580.2v38M65 1618.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1618.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1618.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1618.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1618.2v38M1105 1618.2v38M65 1656.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1656.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1656.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1656.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1656.2v38M1105 1656.2v38M65 1694.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1694.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1694.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1694.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1694.2v38M1105 1694.2v38M65 1732.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1732.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1732.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1732.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1732.2v38M1105 1732.2v38M65 1770.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1770.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1770.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1770.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1770.2v38M1105 1770.2v38M65 1808.2v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1808.2v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1808.2v38" class="arcrow" style="stroke:red"/>
<path d="M689 1808.2v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1808.2v38M1105 1808.2v38M65 1846.2v59.05" class="arcrow" style="stroke:transparent"/>
<path d="M273 1846.2v59.05" class="arcrow" style="stroke:#080"/>
<path d="M481 1846.2v59.05" class="arcrow" style="stroke:red"/>
<path d="M689 1846.2v59.05" class="arcrow" style="stroke:#00f"/>
<path d="M897 1846.2v59.05M1105 1846.2v59.05M65 1905.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1905.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1905.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 1905.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1905.25v38M1105 1905.25v38M65 1943.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1943.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1943.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 1943.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1943.25v38M1105 1943.25v38M65 1981.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 1981.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 1981.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 1981.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 1981.25v38M1105 1981.25v38M65 2019.25v38" class="arcrow" style="stroke:transparent"/>
<path d="M273 2019.25v38" class="arcrow" style="stroke:#080"/>
<path d="M481 2019.25v38" class="arcrow" style="stroke:red"/>
<path d="M689 2019.25v38" class="arcrow" style="stroke:#00f"/>
<path d="M897 2019.25v38M1105 2019.25v38" class="arcrow" style="stroke:transparent"/>
</g>
<g id="mscgenjsreplaceme_sequence">
<path d="M0 0h130v38H0z" class="entity" style="stroke:transparent"/>
<text x="65" y="22.75" class="entity-text"><tspan> </tspan></text>
<path d="M208 0h130v38H208z" class="entity" style="fill:#cfc;stroke:#080"/>
<text x="273" y="22.75" class="entity-text"><tspan>Network</tspan></text>
<path d="M416 0h130v38H416z" class="entity" style="fill:#fcc;stroke:red"/>
<text x="481" y="22.75" class="entity-text"><tspan>Offerer</tspan></text>
<path d="M624 0h130v38H624z" class="entity" style="fill:#ccf;stroke:#00f"/>
<text x="689" y="22.75" class="entity-text"><tspan>Bidder</tspan></text>
<path d="M832 0h130v38H832z" class="entity" style="stroke:transparent"/>
<text x="897" y="22.75" class="entity-text"><tspan> </tspan></text>
<path d="M1040 0h130v38h-130z" class="entity" style="stroke:transparent"/>
<text x="1105" y="22.75" class="entity-text"><tspan> </tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 95H273" class="arc directional callback" style="stroke:red"/>
<path d="M345.09 79.25h63.83v14h-63.83z" class="label-text-background"/>
<text x="377" y="90.25" class="directional-text callback-text"><tspan>Sends Offer</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 133h416" class="arc directional return" style="stroke:#080"/>
<path d="M445.76 117.25h70.48v14h-70.48z" class="label-text-background"/>
<text x="481" y="128.25" class="directional-text return-text"><tspan>Detects Offer</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 171H481" class="arc directional callback" style="stroke:#00f"/>
<path d="M516.62 155.25H653.7v14H516.62z" class="label-text-background"/>
<text x="585" y="166.25" class="directional-text callback-text"><tspan>Sends BidIntent message</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 293h208" class="arc directional callback" style="stroke:red"/>
<path d="M498.28 277.25h173.76v14H498.28z" class="label-text-background"/>
<text x="585" y="288.25" class="directional-text callback-text"><tspan>Sends BidIntentAccept message</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 339H481" class="arc directional callback" style="stroke:#00f"/>
<path d="M513.29 323.25h143.74v14H513.29z" class="label-text-background"/>
<text x="585" y="334.25" class="directional-text callback-text"><tspan>Sends BidAccept message</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 415h208" class="arc directional callback" style="stroke:red"/>
<path d="M491.29 399.25h187.74v14H491.29z" class="label-text-background"/>
<text x="585" y="410.25" class="directional-text callback-text"><tspan>Sends XmrBidLockTxSigsMessage</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 491H481" class="arc directional callback" style="stroke:#00f"/>
<path d="M485.61 475.25H684.7v14H485.61z" class="label-text-background"/>
<text x="585" y="486.25" class="directional-text callback-text"><tspan>Sends XmrBidLockSpendTxMessage</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 529H273" class="arc directional callback" style="stroke:#00f"/>
<path d="M415.64 513.25h130.72v14H415.64z" class="label-text-background"/>
<text x="481" y="524.25" class="directional-text callback-text"><tspan>Sends script-coin-lock-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 615.92c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red"/>
<path d="M484 567.67h40.91v14H484z" class="label-text-background"/>
<text x="484" y="578.67" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M484 583.67h107.01v14H484z" class="label-text-background"/>
<text x="484" y="594.67" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx to</tspan></text>
<path d="M484 599.67h39.34v14H484z" class="label-text-background"/>
<text x="484" y="610.67" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 718.05H273" class="arc directional callback" style="stroke:red"/>
<path d="M304.97 702.3h144.06v14H304.97z" class="label-text-background"/>
<text x="377" y="713.3" class="directional-text callback-text"><tspan>Sends noscript-coin-lock-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 766.97c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red"/>
<path d="M484 718.72h40.91v14H484z" class="label-text-background"/>
<text x="484" y="729.72" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M484 734.72h120.36v14H484z" class="label-text-background"/>
<text x="484" y="745.72" class="directional-text method-text anchor-start"><tspan>noscript-coin-lock-tx to</tspan></text>
<path d="M484 750.72h39.34v14H484z" class="label-text-background"/>
<text x="484" y="761.72" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 766.97c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f"/>
<path d="M692 718.72h40.91v14H692z" class="label-text-background"/>
<text x="692" y="729.72" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M692 734.72h120.36v14H692z" class="label-text-background"/>
<text x="692" y="745.72" class="directional-text method-text anchor-start"><tspan>noscript-coin-lock-tx to</tspan></text>
<path d="M692 750.72h39.34v14H692z" class="label-text-background"/>
<text x="692" y="761.72" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 931.1H481" class="arc directional method" style="stroke:#00f"/>
<path d="M519.64 915.35h130.72v14H519.64z" class="label-text-background"/>
<text x="585" y="926.35" class="directional-text method-text"><tspan>Sends script-coin-lock-tx</tspan></text>
<path d="M539.3 933.35h91.71v14H539.3z" class="label-text-background"/>
<text x="585" y="944.35" class="directional-text method-text"><tspan>release message</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1031.1H273" class="arc directional callback" style="stroke:red"/>
<path d="M293.3 1015.35h167.41v14H293.3z" class="label-text-background"/>
<text x="377" y="1026.35" class="directional-text callback-text"><tspan>Sends script-coin-lock-spend-tx</tspan></text>
<path d="M-41 1145.1h1044" class="inline_expression_divider"/>
<path d="M459.98 1137.85h42.03v14h-42.03z" class="label-text-background"/>
<text x="481" y="1148.85" class="empty-text comment-row-text"><tspan>fail path</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 1232.02c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red"/>
<path d="M484 1183.77h40.91v14H484z" class="label-text-background"/>
<text x="484" y="1194.77" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M484 1199.77h131.69v14H484z" class="label-text-background"/>
<text x="484" y="1210.77" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx lock to</tspan></text>
<path d="M484 1215.77h33.01v14H484z" class="label-text-background"/>
<text x="484" y="1226.77" class="directional-text method-text anchor-start"><tspan>expire</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 1296.15H273" class="arc directional callback" style="stroke:#00f"/>
<path d="M385.96 1280.4h190.08v14H385.96z" class="label-text-background"/>
<text x="481" y="1291.4" class="directional-text callback-text"><tspan>Sends script-coin-lock-pre-refund-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 1334.15h416" class="arc directional return" style="stroke:#080"/>
<path d="M404.64 1318.4h152.72v14H404.64z" class="label-text-background"/>
<text x="481" y="1329.4" class="directional-text return-text"><tspan>script-coin-lock-pre-refund-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#0000FF)" d="M689 1489.07c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f"/>
<path d="M692 1456.82h40.91v14H692z" class="label-text-background"/>
<text x="692" y="1467.82" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M692 1472.82h124.06v14H692z" class="label-text-background"/>
<text x="692" y="1483.82" class="directional-text method-text anchor-start"><tspan>pre-refund tx to confirm</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 1553.2H273" class="arc directional callback" style="stroke:#00f"/>
<path d="M367.62 1537.45h226.77v14H367.62z" class="label-text-background"/>
<text x="481" y="1548.45" class="directional-text callback-text"><tspan>Sends script-coin-lock-pre-refund-spend-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 1637.2h208" class="arc directional return" style="stroke:#080"/>
<path d="M356.66 1621.45h40.69v14h-40.69z" class="label-text-background"/>
<text x="377" y="1632.45" class="directional-text return-text"><tspan>Detects</tspan></text>
<path d="M282.3 1639.45h189.41v14H282.3z" class="label-text-background"/>
<text x="377" y="1650.45" class="directional-text return-text"><tspan>script-coin-lock-pre-refund-spend-tx</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1675.2H273" class="arc directional callback" style="stroke:red"/>
<path d="M359.98 1659.45h34.03v14h-34.03z" class="label-text-background"/>
<text x="377" y="1670.45" class="directional-text callback-text"><tspan>Sends</tspan></text>
<path d="M297.65 1677.45h158.7v14h-158.7z" class="label-text-background"/>
<text x="377" y="1688.45" class="directional-text callback-text"><tspan>scriptless-coin-lock-recover-tx</tspan></text>
<path d="M-37 1789.2H999" class="inline_expression_divider"/>
<path d="M396.41 1781.95h169.17v14H396.41z" class="label-text-background"/>
<text x="481" y="1792.95" class="empty-text comment-row-text"><tspan>offerer swipes script coin lock tx</tspan></text>
<path marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 1868.12c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red"/>
<path d="M484 1835.87h40.91v14H484z" class="label-text-background"/>
<text x="484" y="1846.87" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path d="M484 1851.87h142.39v14H484z" class="label-text-background"/>
<text x="484" y="1862.87" class="directional-text method-text anchor-start"><tspan>pre-refund tx lock to expire</tspan></text>
<path marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1924.25H273" class="arc directional callback" style="stroke:red"/>
<path d="M359.98 1908.5h34.03v14h-34.03z" class="label-text-background"/>
<text x="377" y="1919.5" class="directional-text callback-text"><tspan>Sends</tspan></text>
<path d="M283.3 1926.5h187.39v14H283.3z" class="label-text-background"/>
<text x="377" y="1937.5" class="directional-text callback-text"><tspan>script-coin-lock-pre-refund-swipe-tx</tspan></text>
</g>
<g id="mscgenjsreplaceme_notes">
<path d="m383 209 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="212.75" class="box-text abox-text"><tspan>Bid Received</tspan></text>
<path d="M383 230h196v34H383z" class="box" style="stroke:red"/>
<text x="481" y="250.75" class="box-text"><tspan>User accepts bid</tspan></text>
<path d="M799 268h395v9h9m-9-9 9 9v41H799v-50z" class="box note" style="fill:#ffc"/>
<text x="1001" y="280.75" class="box-text note-text"><tspan>The BidAccept message contains the pubkeys the offerer will use and</tspan></text>
<text x="1001" y="296.75" class="box-text note-text"><tspan>a DLEAG proof one key will work across both chains of the swapping</tspan></text>
<text x="1001" y="312.75" class="box-text note-text"><tspan>coins</tspan></text>
<path d="M799 322h395v9h9m-9-9 9 9v25H799v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="334.75" class="box-text note-text"><tspan>The BidAccept message contains the pubkeys the bidder will use and a</tspan></text>
<text x="1001" y="350.75" class="box-text note-text"><tspan>DLEAG proof one key will work across both chains of the swapping coins</tspan></text>
<path d="m383 377 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="380.75" class="box-text abox-text"><tspan>Bid Accepted</tspan></text>
<path d="M799 398h395v9h9m-9-9 9 9v25H799v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="410.75" class="box-text note-text"><tspan>The XmrBidLockTxSigsMessage contains the offerer&apos;s signatures for</tspan></text>
<text x="1001" y="426.75" class="box-text note-text"><tspan>the script-coin-lock-refund and script-coin-lock-refund-spend txns.</tspan></text>
<path d="m383 453 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="448.75" class="box-text abox-text"><tspan>Exchanged script lock tx sigs</tspan></text>
<text x="481" y="464.75" class="box-text abox-text"><tspan>msg</tspan></text>
<path d="M799 474h395v9h9m-9-9 9 9v25H799v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="486.75" class="box-text note-text"><tspan>The XmrBidLockSpendTxMessage contains the script-coin-lock-tx and</tspan></text>
<text x="1001" y="502.75" class="box-text note-text"><tspan>proof the bidder can sign it.</tspan></text>
<path d="m383 529 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="532.75" class="box-text abox-text"><tspan>Bid Script coin spend tx valid</tspan></text>
<path d="m383 567 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="562.75" class="box-text abox-text"><tspan>Exchanged script lock spend tx</tspan></text>
<text x="481" y="578.75" class="box-text abox-text"><tspan>msg</tspan></text>
<path d="m383 680.05 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="683.8" class="box-text abox-text"><tspan>Bid Script coin locked</tspan></text>
<path d="m383 831.1 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="834.85" class="box-text abox-text"><tspan>Bid Scriptless coin locked</tspan></text>
<path d="M-40 869.1h98.39v11l-7 7H-40" class="box inline_expression_label"/>
<text x="-38" y="882.35" class="inline_expression-text alt-text anchor-start"><tspan>alt: success path</tspan></text>
<path d="M799 890.1h395v9h9m-9-9 9 9v73H799v-82z" class="box note" style="fill:#ffc"/>
<text x="1001" y="902.85" class="box-text note-text"><tspan>The XmrBidLockReleaseMessage contains the bidder&apos;s OTVES for it. </tspan></text>
<text x="1001" y="918.85" class="box-text note-text"><tspan> The offerer decodes the bidder&apos;s signature</tspan></text>
<text x="1001" y="934.85" class="box-text note-text"><tspan>from the OTVES. When the bidder has the</tspan></text>
<text x="1001" y="950.85" class="box-text note-text"><tspan>plaintext signature, they can decode the offerer&apos;s noscript-coin-lock-tx</tspan></text>
<text x="1001" y="966.85" class="box-text note-text"><tspan>signature.</tspan></text>
<path d="m383 993.1 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="996.85" class="box-text abox-text"><tspan>Script coin lock released</tspan></text>
<path d="m383 1069.1 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="1072.85" class="box-text abox-text"><tspan>Script tx redeemed</tspan></text>
<path d="m383 1107.1 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="1110.85" class="box-text abox-text"><tspan>Bid Completed</tspan></text>
<path d="M799 1279.15h395v9h9m-9-9 9 9v25H799v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1299.9" class="box-text note-text"><tspan>tx can be sent by either party.</tspan></text>
<path d="m383 1372.15 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="1367.9" class="box-text abox-text"><tspan>Bid Script pre-refund tx in</tspan></text>
<text x="481" y="1383.9" class="box-text abox-text"><tspan>chain</tspan></text>
<path d="M-36 1410.15h199.77v11l-7 7H-36" class="box inline_expression_label"/>
<text x="-34" y="1423.4" class="inline_expression-text alt-text anchor-start"><tspan>alt: bidder refunds script coin lock tx</tspan></text>
<path d="M799 1528.2h395v9h9m-9-9 9 9v41H799v-50z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1540.95" class="box-text note-text"><tspan>Refunds the script lock tx, with the bidder&apos;s cleartext signature</tspan></text>
<text x="1001" y="1556.95" class="box-text note-text"><tspan>the offerer can refund the noscript lock tx. </tspan></text>
<text x="1001" y="1572.95" class="box-text note-text"><tspan>Once the lock expires the pre-refund tx can be spent by the offerer.</tspan></text>
<path d="m591 1599.2 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1602.95" class="box-text abox-text"><tspan>Bid Failed, refunded</tspan></text>
<path d="M799 1620.2h395v9h9m-9-9 9 9v25H799v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1640.95" class="box-text note-text"><tspan>offerer recovers the bidder&apos;s scriptless chain key-shard.</tspan></text>
<path d="m383 1713.2 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="1716.95" class="box-text abox-text"><tspan>Bid Scriptless tx recovered</tspan></text>
<path d="m383 1751.2 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="1754.95" class="box-text abox-text"><tspan>Bid Failed, refunded</tspan></text>
<path d="m383 1962.25 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="1966" class="box-text abox-text"><tspan>Bid Failed, swiped</tspan></text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -0,0 +1,414 @@
<svg version="1.1" id="mscgenjsreplaceme" class="mscgenjsreplaceme" xmlns="http://www.w3.org/2000/svg" width="1272" height="2063.3" style="font-family:Helvetica,sans-serif;font-size:12px;font-weight:400;font-style:normal;text-decoration:none;background-color:#fff;stroke:#000;stroke-width:2">
<defs>
<marker orient="auto" id="mscgenjsreplacemecallback-#0000FF" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#00f"/>
</marker>
<marker orient="auto" id="mscgenjsreplacemecallback-l-#0000FF" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#00f"/>
</marker>
<marker orient="auto" id="mscgenjsreplacemecallback-#008800" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#080"/>
</marker>
<marker orient="auto" id="mscgenjsreplacemecallback-l-#008800" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#080"/>
</marker>
<marker orient="auto" id="mscgenjsreplacemecallback-#FF0000" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:red"/>
</marker>
<marker orient="auto" id="mscgenjsreplacemecallback-l-#FF0000" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:red"/>
</marker>
<marker orient="auto" id="mscgenjsreplacememethod-#0000FF" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path class="arrow-style" stroke="#00F" fill="#00F" d="m1 1 8 2-8 2z"/>
</marker>
<marker orient="auto" id="mscgenjsreplacememethod-l-#0000FF" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path class="arrow-style" stroke="#00F" fill="#00F" d="M17 1 9 3l8 2z"/>
</marker>
<marker orient="auto" id="mscgenjsreplacememethod-#FF0000" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path class="arrow-style" stroke="red" fill="red" d="m1 1 8 2-8 2z"/>
</marker>
<marker orient="auto" id="mscgenjsreplacememethod-l-#FF0000" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path class="arrow-style" stroke="red" fill="red" d="M17 1 9 3l8 2z"/>
</marker>
<style>
.mscgenjsreplaceme path,.mscgenjsreplaceme rect{fill:none}.mscgenjsreplaceme .label-text-background{fill:#fff;stroke:#fff;stroke-width:0}.mscgenjsreplaceme .return{stroke-dasharray:5,3}.mscgenjsreplaceme .inline_expression_divider{stroke-dasharray:10,5}.mscgenjsreplaceme text{color:inherit;stroke:none;text-anchor:middle}.mscgenjsreplaceme text.anchor-start{text-anchor:start}.mscgenjsreplaceme .arrow-marker{overflow:visible}.mscgenjsreplaceme .arrow-style{stroke-width:1}.mscgenjsreplaceme .arcrow{stroke-linecap:butt}.mscgenjsreplaceme .box,.mscgenjsreplaceme .entity{fill:#fff;stroke-linejoin:round}
</style>
</defs>
<g id="mscgenjsreplaceme_body" transform="translate(51 3)">
<path class="bglayer" style="fill:#fff;stroke:#fff;stroke-width:0" d="M-51-3h1272v2063.3H-51z" id="mscgenjsreplaceme_background"/>
<g id="mscgenjsreplaceme_arcspans">
<path class="box inline_expression alt" d="M-41 869.12h1044V2038.3H-41z"/>
<path class="box inline_expression alt" d="M-37 1410.18H999v590.12H-37z"/>
</g>
<g id="mscgenjsreplaceme_lifelines">
<path class="arcrow" style="stroke:transparent" d="M65 38v38"/>
<path class="arcrow" style="stroke:#080" d="M273 38v38"/>
<path class="arcrow" style="stroke:red" d="M481 38v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 38v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 38v38M1105 38v38M65 76v38"/>
<path class="arcrow" style="stroke:#080" d="M273 76v38"/>
<path class="arcrow" style="stroke:red" d="M481 76v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 76v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 76v38M1105 76v38M65 114v38"/>
<path class="arcrow" style="stroke:#080" d="M273 114v38"/>
<path class="arcrow" style="stroke:red" d="M481 114v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 114v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 114v38M1105 114v38M65 152v38"/>
<path class="arcrow" style="stroke:#080" d="M273 152v38"/>
<path class="arcrow" style="stroke:red" d="M481 152v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 152v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 152v38M1105 152v38M65 190v38"/>
<path class="arcrow" style="stroke:#080" d="M273 190v38"/>
<path class="arcrow" style="stroke:red" d="M481 190v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 190v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 190v38M1105 190v38M65 228v38"/>
<path class="arcrow" style="stroke:#080" d="M273 228v38"/>
<path class="arcrow" style="stroke:red" d="M481 228v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 228v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 228v38M1105 228v38M65 266v54"/>
<path class="arcrow" style="stroke:#080" d="M273 266v54"/>
<path class="arcrow" style="stroke:red" d="M481 266v54"/>
<path class="arcrow" style="stroke:#00f" d="M689 266v54"/>
<path class="arcrow" style="stroke:transparent" d="M897 266v54M1105 266v54M65 320v38"/>
<path class="arcrow" style="stroke:#080" d="M273 320v38"/>
<path class="arcrow" style="stroke:red" d="M481 320v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 320v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 320v38M1105 320v38M65 358v38"/>
<path class="arcrow" style="stroke:#080" d="M273 358v38"/>
<path class="arcrow" style="stroke:red" d="M481 358v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 358v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 358v38M1105 358v38M65 396v38"/>
<path class="arcrow" style="stroke:#080" d="M273 396v38"/>
<path class="arcrow" style="stroke:red" d="M481 396v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 396v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 396v38M1105 396v38M65 434v38"/>
<path class="arcrow" style="stroke:#080" d="M273 434v38"/>
<path class="arcrow" style="stroke:red" d="M481 434v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 434v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 434v38M1105 434v38M65 472v38"/>
<path class="arcrow" style="stroke:#080" d="M273 472v38"/>
<path class="arcrow" style="stroke:red" d="M481 472v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 472v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 472v38M1105 472v38M65 510v38"/>
<path class="arcrow" style="stroke:#080" d="M273 510v38"/>
<path class="arcrow" style="stroke:red" d="M481 510v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 510v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 510v38M1105 510v38M65 548v38"/>
<path class="arcrow" style="stroke:#080" d="M273 548v38"/>
<path class="arcrow" style="stroke:red" d="M481 548v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 548v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 548v38M1105 548v38M65 586v75.06"/>
<path class="arcrow" style="stroke:#080" d="M273 586v75.06"/>
<path class="arcrow" style="stroke:red" d="M481 586v75.06"/>
<path class="arcrow" style="stroke:#00f" d="M689 586v75.06"/>
<path class="arcrow" style="stroke:transparent" d="M897 586v75.06M1105 586v75.06M65 661.06v38"/>
<path class="arcrow" style="stroke:#080" d="M273 661.06v38"/>
<path class="arcrow" style="stroke:red" d="M481 661.06v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 661.06v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 661.06v38M1105 661.06v38M65 699.06v38"/>
<path class="arcrow" style="stroke:#080" d="M273 699.06v38"/>
<path class="arcrow" style="stroke:red" d="M481 699.06v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 699.06v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 699.06v38M1105 699.06v38M65 737.06v75.06"/>
<path class="arcrow" style="stroke:#080" d="M273 737.06v75.06"/>
<path class="arcrow" style="stroke:red" d="M481 737.06v75.06"/>
<path class="arcrow" style="stroke:#00f" d="M689 737.06v75.06"/>
<path class="arcrow" style="stroke:transparent" d="M897 737.06v75.06M1105 737.06v75.06M65 812.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 812.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 812.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 812.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 812.12v38M1105 812.12v38M65 850.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 850.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 850.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 850.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 850.12v38M1105 850.12v38M65 888.12v86"/>
<path class="arcrow" style="stroke:#080" d="M273 888.12v86"/>
<path class="arcrow" style="stroke:red" d="M481 888.12v86"/>
<path class="arcrow" style="stroke:#00f" d="M689 888.12v86"/>
<path class="arcrow" style="stroke:transparent" d="M897 888.12v86M1105 888.12v86M65 974.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 974.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 974.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 974.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 974.12v38M1105 974.12v38M65 1012.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1012.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 1012.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1012.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1012.12v38M1105 1012.12v38M65 1050.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1050.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 1050.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1050.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1050.12v38M1105 1050.12v38M65 1088.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1088.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 1088.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1088.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1088.12v38M1105 1088.12v38M65 1126.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1126.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 1126.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1126.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1126.12v38M1105 1126.12v38M65 1164.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1164.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 1164.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1164.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1164.12v38M1105 1164.12v38M65 1202.12v75.06"/>
<path class="arcrow" style="stroke:#080" d="M273 1202.12v75.06"/>
<path class="arcrow" style="stroke:red" d="M481 1202.12v75.06"/>
<path class="arcrow" style="stroke:#00f" d="M689 1202.12v75.06"/>
<path class="arcrow" style="stroke:transparent" d="M897 1202.12v75.06M1105 1202.12v75.06M65 1277.18v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1277.18v38"/>
<path class="arcrow" style="stroke:red" d="M481 1277.18v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1277.18v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1277.18v38M1105 1277.18v38M65 1315.18v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1315.18v38"/>
<path class="arcrow" style="stroke:red" d="M481 1315.18v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1315.18v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1315.18v38M1105 1315.18v38M65 1353.18v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1353.18v38"/>
<path class="arcrow" style="stroke:red" d="M481 1353.18v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1353.18v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1353.18v38M1105 1353.18v38M65 1391.18v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1391.18v38"/>
<path class="arcrow" style="stroke:red" d="M481 1391.18v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1391.18v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1391.18v38M1105 1391.18v38M65 1429.18v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1429.18v38"/>
<path class="arcrow" style="stroke:red" d="M481 1429.18v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1429.18v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1429.18v38M1105 1429.18v38M65 1467.18v59.06"/>
<path class="arcrow" style="stroke:#080" d="M273 1467.18v59.06"/>
<path class="arcrow" style="stroke:red" d="M481 1467.18v59.06"/>
<path class="arcrow" style="stroke:#00f" d="M689 1467.18v59.06"/>
<path class="arcrow" style="stroke:transparent" d="M897 1467.18v59.06M1105 1467.18v59.06M65 1526.24v54"/>
<path class="arcrow" style="stroke:#080" d="M273 1526.24v54"/>
<path class="arcrow" style="stroke:red" d="M481 1526.24v54"/>
<path class="arcrow" style="stroke:#00f" d="M689 1526.24v54"/>
<path class="arcrow" style="stroke:transparent" d="M897 1526.24v54M1105 1526.24v54M65 1580.24v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1580.24v38"/>
<path class="arcrow" style="stroke:red" d="M481 1580.24v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1580.24v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1580.24v38M1105 1580.24v38M65 1618.24v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1618.24v38"/>
<path class="arcrow" style="stroke:red" d="M481 1618.24v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1618.24v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1618.24v38M1105 1618.24v38M65 1656.24v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1656.24v38"/>
<path class="arcrow" style="stroke:red" d="M481 1656.24v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1656.24v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1656.24v38M1105 1656.24v38M65 1694.24v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1694.24v38"/>
<path class="arcrow" style="stroke:red" d="M481 1694.24v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1694.24v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1694.24v38M1105 1694.24v38M65 1732.24v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1732.24v38"/>
<path class="arcrow" style="stroke:red" d="M481 1732.24v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1732.24v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1732.24v38M1105 1732.24v38M65 1770.24v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1770.24v38"/>
<path class="arcrow" style="stroke:red" d="M481 1770.24v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1770.24v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1770.24v38M1105 1770.24v38M65 1808.24v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1808.24v38"/>
<path class="arcrow" style="stroke:red" d="M481 1808.24v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1808.24v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1808.24v38M1105 1808.24v38M65 1846.24v59.06"/>
<path class="arcrow" style="stroke:#080" d="M273 1846.24v59.06"/>
<path class="arcrow" style="stroke:red" d="M481 1846.24v59.06"/>
<path class="arcrow" style="stroke:#00f" d="M689 1846.24v59.06"/>
<path class="arcrow" style="stroke:transparent" d="M897 1846.24v59.06M1105 1846.24v59.06M65 1905.3v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1905.3v38"/>
<path class="arcrow" style="stroke:red" d="M481 1905.3v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1905.3v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1905.3v38M1105 1905.3v38M65 1943.3v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1943.3v38"/>
<path class="arcrow" style="stroke:red" d="M481 1943.3v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1943.3v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1943.3v38M1105 1943.3v38M65 1981.3v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1981.3v38"/>
<path class="arcrow" style="stroke:red" d="M481 1981.3v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1981.3v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1981.3v38M1105 1981.3v38M65 2019.3v38"/>
<path class="arcrow" style="stroke:#080" d="M273 2019.3v38"/>
<path class="arcrow" style="stroke:red" d="M481 2019.3v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 2019.3v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 2019.3v38M1105 2019.3v38"/>
</g>
<g id="mscgenjsreplaceme_sequence">
<path class="entity" style="stroke:transparent" d="M0 0h130v38H0z"/>
<text x="65" y="22.75" class="entity-text"><tspan> </tspan></text>
<path class="entity" style="fill:#cfc;stroke:#080" d="M208 0h130v38H208z"/>
<text x="273" y="22.75" class="entity-text"><tspan>Network</tspan></text>
<path class="entity" style="fill:#fcc;stroke:red" d="M416 0h130v38H416z"/>
<text x="481" y="22.75" class="entity-text"><tspan>Offerer</tspan></text>
<path class="entity" style="fill:#ccf;stroke:#00f" d="M624 0h130v38H624z"/>
<text x="689" y="22.75" class="entity-text"><tspan>Bidder</tspan></text>
<path class="entity" style="stroke:transparent" d="M832 0h130v38H832z"/>
<text x="897" y="22.75" class="entity-text"><tspan> </tspan></text>
<path class="entity" style="stroke:transparent" d="M1040 0h130v38h-130z"/>
<text x="1105" y="22.75" class="entity-text"><tspan> </tspan></text>
<path class="arc directional callback" style="stroke:red" marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 95H273"/>
<path class="label-text-background" d="M345.08 79.25h63.84v14h-63.84z"/>
<text x="377" y="90.25" class="directional-text callback-text"><tspan>Sends Offer</tspan></text>
<path class="arc directional return" style="stroke:#080" marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 133h416"/>
<path class="label-text-background" d="M445.75 117.25h70.5v14h-70.5z"/>
<text x="481" y="128.25" class="directional-text return-text"><tspan>Detects Offer</tspan></text>
<path class="arc directional callback" style="stroke:#00f" marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 171H481"/>
<path class="label-text-background" d="M557.64 155.25h54.72v14h-54.72z"/>
<text x="585" y="166.25" class="directional-text callback-text"><tspan>Sends Bid</tspan></text>
<path class="arc directional callback" style="stroke:red" marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 293h208"/>
<path class="label-text-background" d="M513.28 277.25h143.77v14H513.28z"/>
<text x="585" y="288.25" class="directional-text callback-text"><tspan>Sends BidAccept message</tspan></text>
<path class="arc directional callback" style="stroke:#00f" marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 415H481"/>
<path class="label-text-background" d="M491.28 399.25h187.77v14H491.28z"/>
<text x="585" y="410.25" class="directional-text callback-text"><tspan>Sends XmrBidLockTxSigsMessage</tspan></text>
<path class="arc directional callback" style="stroke:red" marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 491h208"/>
<path class="label-text-background" d="M485.61 475.25h199.11v14H485.61z"/>
<text x="585" y="486.25" class="directional-text callback-text"><tspan>Sends XmrBidLockSpendTxMessage</tspan></text>
<path class="arc directional callback" style="stroke:red" marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 529H273"/>
<path class="label-text-background" d="M311.64 513.25h130.72v14H311.64z"/>
<text x="377" y="524.25" class="directional-text callback-text"><tspan>Sends script-coin-lock-tx</tspan></text>
<path d="M689 615.93c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f" marker-end="url(#mscgenjsreplacememethod-#0000FF)"/>
<path class="label-text-background" d="M692 567.67h40.91v14.02H692z"/>
<text x="692" y="578.68" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path class="label-text-background" d="M692 583.67h107.02v14.02H692z"/>
<text x="692" y="594.68" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx to</tspan></text>
<path class="label-text-background" d="M692 599.67h39.34v14.02H692z"/>
<text x="692" y="610.68" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path class="arc directional callback" style="stroke:#00f" marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 718.06H273"/>
<path class="label-text-background" d="M408.97 702.3h144.06v14.02H408.97z"/>
<text x="481" y="713.31" class="directional-text callback-text"><tspan>Sends noscript-coin-lock-tx</tspan></text>
<path d="M689 766.99c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f" marker-end="url(#mscgenjsreplacememethod-#0000FF)"/>
<path class="label-text-background" d="M692 718.73h40.91v14.02H692z"/>
<text x="692" y="729.74" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path class="label-text-background" d="M692 734.73h120.38v14.02H692z"/>
<text x="692" y="745.74" class="directional-text method-text anchor-start"><tspan>noscript-coin-lock-tx to</tspan></text>
<path class="label-text-background" d="M692 750.73h39.34v14.02H692z"/>
<text x="692" y="761.74" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path d="M481 766.99c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red" marker-end="url(#mscgenjsreplacememethod-#FF0000)"/>
<path class="label-text-background" d="M484 718.73h40.91v14.02H484z"/>
<text x="484" y="729.74" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path class="label-text-background" d="M484 734.73h120.38v14.02H484z"/>
<text x="484" y="745.74" class="directional-text method-text anchor-start"><tspan>noscript-coin-lock-tx to</tspan></text>
<path class="label-text-background" d="M484 750.73h39.34v14.02H484z"/>
<text x="484" y="761.74" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path class="arc directional method" style="stroke:red" marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 931.12h208"/>
<path class="label-text-background" d="M519.64 915.36h130.72v14.02H519.64z"/>
<text x="585" y="926.37" class="directional-text method-text"><tspan>Sends script-coin-lock-tx</tspan></text>
<path class="label-text-background" d="M539.3 933.36h91.73v14.02H539.3z"/>
<text x="585" y="944.37" class="directional-text method-text"><tspan>release message</tspan></text>
<path class="arc directional callback" style="stroke:#00f" marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 1031.12H273"/>
<path class="label-text-background" d="M397.3 1015.36h167.41v14.02H397.3z"/>
<text x="481" y="1026.37" class="directional-text callback-text"><tspan>Sends script-coin-lock-spend-tx</tspan></text>
<path class="inline_expression_divider" d="M-41 1145.12h1044"/>
<path class="label-text-background" d="M459.98 1137.86h42.03v14.02h-42.03z"/>
<text x="481" y="1148.87" class="empty-text comment-row-text"><tspan>fail path</tspan></text>
<path d="M689 1232.05c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f" marker-end="url(#mscgenjsreplacememethod-#0000FF)"/>
<path class="label-text-background" d="M692 1183.8h40.91v14.02H692z"/>
<text x="692" y="1194.8" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path class="label-text-background" d="M692 1199.8h131.69v14.02H692z"/>
<text x="692" y="1210.8" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx lock to</tspan></text>
<path class="label-text-background" d="M692 1215.8h33.02v14.02H692z"/>
<text x="692" y="1226.8" class="directional-text method-text anchor-start"><tspan>expire</tspan></text>
<path class="arc directional callback" style="stroke:red" marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1296.18H273"/>
<path class="label-text-background" d="M359.98 1280.42h34.03v14.02h-34.03z"/>
<text x="377" y="1291.43" class="directional-text callback-text"><tspan>Sends</tspan></text>
<path class="label-text-background" d="M300.64 1298.42h152.72v14.02H300.64z"/>
<text x="377" y="1309.43" class="directional-text callback-text"><tspan>script-coin-lock-pre-refund-tx</tspan></text>
<path class="arc directional return" style="stroke:#080" marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 1334.18h208"/>
<path class="label-text-background" d="M300.64 1318.42h152.72v14.02H300.64z"/>
<text x="377" y="1329.43" class="directional-text return-text"><tspan>script-coin-lock-pre-refund-tx</tspan></text>
<path d="M481 1489.11c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red" marker-end="url(#mscgenjsreplacememethod-#FF0000)"/>
<path class="label-text-background" d="M484 1456.86h40.91v14.02H484z"/>
<text x="484" y="1467.86" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path class="label-text-background" d="M484 1472.86h124.06v14.02H484z"/>
<text x="484" y="1483.86" class="directional-text method-text anchor-start"><tspan>pre-refund tx to confirm</tspan></text>
<path class="arc directional callback" style="stroke:red" marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1553.24H273"/>
<path class="label-text-background" d="M359.98 1537.48h34.03v14.02h-34.03z"/>
<text x="377" y="1548.49" class="directional-text callback-text"><tspan>Sends</tspan></text>
<path class="label-text-background" d="M282.3 1555.48h189.41v14.02H282.3z"/>
<text x="377" y="1566.49" class="directional-text callback-text"><tspan>script-coin-lock-pre-refund-spend-tx</tspan></text>
<path class="arc directional return" style="stroke:#080" marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 1637.24h416"/>
<path class="label-text-background" d="M364.28 1621.48h233.44v14.02H364.28z"/>
<text x="481" y="1632.49" class="directional-text return-text"><tspan>Detects script-coin-lock-pre-refund-spend-tx</tspan></text>
<path class="arc directional callback" style="stroke:#00f" marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 1675.24H273"/>
<path class="label-text-background" d="M382.97 1659.48h196.06v14.02H382.97z"/>
<text x="481" y="1670.49" class="directional-text callback-text"><tspan>Sends scriptless-coin-lock-recover-tx</tspan></text>
<path class="inline_expression_divider" d="M-37 1789.24H999"/>
<path class="label-text-background" d="M396.95 1781.98h168.09V1796H396.95z"/>
<text x="481" y="1792.99" class="empty-text comment-row-text"><tspan>bidder swipes script coin lock tx</tspan></text>
<path d="M689 1868.17c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f" marker-end="url(#mscgenjsreplacememethod-#0000FF)"/>
<path class="label-text-background" d="M692 1835.91h40.91v14.02H692z"/>
<text x="692" y="1846.92" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path class="label-text-background" d="M692 1851.91h142.41v14.02H692z"/>
<text x="692" y="1862.92" class="directional-text method-text anchor-start"><tspan>pre-refund tx lock to expire</tspan></text>
<path class="arc directional callback" style="stroke:#00f" marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 1924.3H273"/>
<path class="label-text-background" d="M368.63 1908.55h224.75v14.02H368.63z"/>
<text x="481" y="1919.55" class="directional-text callback-text"><tspan>Sends script-coin-lock-pre-refund-swipe-tx</tspan></text>
</g>
<g id="mscgenjsreplaceme_notes">
<path d="m591 209 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="212.75" class="box-text abox-text"><tspan>Bid Sent</tspan></text>
<path class="box" style="stroke:red" d="M383 230h196v34H383z"/>
<text x="481" y="250.75" class="box-text"><tspan>User accepts bid</tspan></text>
<path d="M799 268h395v9h9m-9-9 9 9v41H799v-50z" class="box note" style="fill:#ffc"/>
<text x="1001" y="280.75" class="box-text note-text"><tspan>The BidAccept message contains the pubkeys the offerer will use and</tspan></text>
<text x="1001" y="296.75" class="box-text note-text"><tspan>a DLEAG proof one key will work across both chains of the swapping</tspan></text>
<text x="1001" y="312.75" class="box-text note-text"><tspan>coins</tspan></text>
<path d="m591 339 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="342.75" class="box-text abox-text"><tspan>Bid Receiving accept</tspan></text>
<path d="m591 377 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="380.75" class="box-text abox-text"><tspan>Bid Accepted</tspan></text>
<path d="M799 398h395v9h9m-9-9 9 9v25H799v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="410.75" class="box-text note-text"><tspan>The XmrBidLockTxSigsMessage contains the bidder&apos;s signatures for the</tspan></text>
<text x="1001" y="426.75" class="box-text note-text"><tspan>script-coin-lock-refund and script-coin-lock-refund-spend txns.</tspan></text>
<path d="m591 453 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="448.75" class="box-text abox-text"><tspan>Exchanged script lock tx sigs</tspan></text>
<text x="689" y="464.75" class="box-text abox-text"><tspan>msg</tspan></text>
<path d="M799 474h395v9h9m-9-9 9 9v25H799v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="486.75" class="box-text note-text"><tspan>The XmrBidLockSpendTxMessage contains the script-coin-lock-tx and</tspan></text>
<text x="1001" y="502.75" class="box-text note-text"><tspan>the offerer&apos;s signature for it.</tspan></text>
<path d="m591 529 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="532.75" class="box-text abox-text"><tspan>Bid Script coin spend tx valid</tspan></text>
<path d="m591 567 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="562.75" class="box-text abox-text"><tspan>Exchanged script lock spend tx</tspan></text>
<text x="689" y="578.75" class="box-text abox-text"><tspan>msg</tspan></text>
<path d="m591 680.06 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="683.81" class="box-text abox-text"><tspan>Bid Script coin locked</tspan></text>
<path d="m591 831.12 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="834.87" class="box-text abox-text"><tspan>Bid Scriptless coin locked</tspan></text>
<path d="M-40 869.12h98.39v11.02l-7 7H-40" class="box inline_expression_label"/>
<text x="-38" y="882.37" class="inline_expression-text alt-text anchor-start"><tspan>alt: success path</tspan></text>
<path d="M799 890.11h395v9h9m-9-9 9 9v73.02H799v-82.02z" class="box note" style="fill:#ffc"/>
<text x="1001" y="902.87" class="box-text note-text"><tspan>The XmrBidLockReleaseMessage contains the offerer&apos;s OTVES for it. </tspan></text>
<text x="1001" y="918.87" class="box-text note-text"><tspan> The bidder decodes the offerer&apos;s signature</tspan></text>
<text x="1001" y="934.87" class="box-text note-text"><tspan>from the OTVES. When the offerer has the</tspan></text>
<text x="1001" y="950.87" class="box-text note-text"><tspan>plaintext signature, they can decode the bidder&apos;s noscript-coin-lock-tx</tspan></text>
<text x="1001" y="966.87" class="box-text note-text"><tspan>signature.</tspan></text>
<path d="m591 993.12 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="996.87" class="box-text abox-text"><tspan>Script coin lock released</tspan></text>
<path d="m591 1069.12 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1072.87" class="box-text abox-text"><tspan>Script tx redeemed</tspan></text>
<path d="m591 1107.12 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1110.87" class="box-text abox-text"><tspan>Bid Completed</tspan></text>
<path d="M799 1279.18h395v9h9m-9-9 9 9v25H799v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1299.93" class="box-text note-text"><tspan>tx can be sent by either party.</tspan></text>
<path d="m591 1372.18 3-17.01h190l3 17.01-3 17.01H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1367.93" class="box-text abox-text"><tspan>Bid Script pre-refund tx in</tspan></text>
<text x="689" y="1383.93" class="box-text abox-text"><tspan>chain</tspan></text>
<path d="M-36 1410.18h200.86v11.02l-7 7H-36" class="box inline_expression_label"/>
<text x="-34" y="1423.43" class="inline_expression-text alt-text anchor-start"><tspan>alt: offerer refunds script coin lock tx</tspan></text>
<path d="M799 1528.23h395v9h9m-9-9 9 9v41.02H799v-50.02z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1540.99" class="box-text note-text"><tspan>Refunds the script lock tx, with the offerer&apos;s cleartext signature</tspan></text>
<text x="1001" y="1556.99" class="box-text note-text"><tspan>the bidder can refund the noscript lock tx. </tspan></text>
<text x="1001" y="1572.99" class="box-text note-text"><tspan>Once the lock expires the pre-refund tx can be spent by the bidder.</tspan></text>
<path d="m383 1599.24 3-17h190l3 17-3 17H386z" class="box abox" style="stroke:red"/>
<text x="481" y="1602.99" class="box-text abox-text"><tspan>Bid Failed, refunded</tspan></text>
<path d="M799 1620.24h395v9h9m-9-9 9 9v25H799v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1640.99" class="box-text note-text"><tspan>Bidder recovers the offerer&apos;s scriptless chain key-shard.</tspan></text>
<path d="m591 1713.24 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1716.99" class="box-text abox-text"><tspan>Bid Scriptless tx recovered</tspan></text>
<path d="m591 1751.24 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1754.99" class="box-text abox-text"><tspan>Bid Failed, refunded</tspan></text>
<path d="m591 1962.3 3-17h190l3 17-3 17H594z" class="box abox" style="stroke:#00f"/>
<text x="689" y="1966.05" class="box-text abox-text"><tspan>Bid Failed, swiped</tspan></text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -0,0 +1,388 @@
<svg version="1.1" id="mscgenjsreplaceme" class="mscgenjsreplaceme" xmlns="http://www.w3.org/2000/svg" width="1264" height="1933.3" style="font-family:Helvetica,sans-serif;font-size:12px;font-weight:400;font-style:normal;text-decoration:none;background-color:#fff;stroke:#000;stroke-width:2">
<defs>
<marker orient="auto" id="mscgenjsreplacemecallback-#0000FF" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#00f"/>
</marker>
<marker orient="auto" id="mscgenjsreplacemecallback-l-#0000FF" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#00f"/>
</marker>
<marker orient="auto" id="mscgenjsreplacemecallback-#008800" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#080"/>
</marker>
<marker orient="auto" id="mscgenjsreplacemecallback-l-#008800" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:#080"/>
</marker>
<marker orient="auto" id="mscgenjsreplacemecallback-#FF0000" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path d="m1 1 8 2-8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:red"/>
</marker>
<marker orient="auto" id="mscgenjsreplacemecallback-l-#FF0000" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path d="M17 1 9 3l8 2" class="arrow-style" style="stroke-dasharray:100,1;stroke:red"/>
</marker>
<marker orient="auto" id="mscgenjsreplacememethod-#0000FF" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path class="arrow-style" stroke="#00F" fill="#00F" d="m1 1 8 2-8 2z"/>
</marker>
<marker orient="auto" id="mscgenjsreplacememethod-l-#0000FF" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path class="arrow-style" stroke="#00F" fill="#00F" d="M17 1 9 3l8 2z"/>
</marker>
<marker orient="auto" id="mscgenjsreplacememethod-#FF0000" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path class="arrow-style" stroke="red" fill="red" d="m1 1 8 2-8 2z"/>
</marker>
<marker orient="auto" id="mscgenjsreplacememethod-l-#FF0000" class="arrow-marker" viewBox="0 0 10 10" refX="9" refY="3" markerUnits="strokeWidth" markerWidth="10" markerHeight="10">
<path class="arrow-style" stroke="red" fill="red" d="M17 1 9 3l8 2z"/>
</marker>
<style>
.mscgenjsreplaceme path,.mscgenjsreplaceme rect{fill:none}.mscgenjsreplaceme .label-text-background{fill:#fff;stroke:#fff;stroke-width:0}.mscgenjsreplaceme .return{stroke-dasharray:5,3}.mscgenjsreplaceme text{color:inherit;stroke:none;text-anchor:middle}.mscgenjsreplaceme text.anchor-start{text-anchor:start}.mscgenjsreplaceme .arrow-marker{overflow:visible}.mscgenjsreplaceme .arrow-style{stroke-width:1}.mscgenjsreplaceme .arcrow{stroke-linecap:butt}.mscgenjsreplaceme .box,.mscgenjsreplaceme .entity{fill:#fff;stroke-linejoin:round}
</style>
</defs>
<g id="mscgenjsreplaceme_body" transform="translate(47 3)">
<path class="bglayer" style="fill:#fff;stroke:#fff;stroke-width:0" d="M-47-3h1264v1933.3H-47z" id="mscgenjsreplaceme_background"/>
<path class="box inline_expression alt" d="M-39 778.06h1040V1908.3H-39z" id="mscgenjsreplaceme_arcspans"/>
<g id="mscgenjsreplaceme_lifelines">
<path class="arcrow" style="stroke:transparent" d="M65 38v38"/>
<path class="arcrow" style="stroke:#080" d="M273 38v38"/>
<path class="arcrow" style="stroke:red" d="M481 38v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 38v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 38v38M1105 38v38M65 76v38"/>
<path class="arcrow" style="stroke:#080" d="M273 76v38"/>
<path class="arcrow" style="stroke:red" d="M481 76v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 76v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 76v38M1105 76v38M65 114v38"/>
<path class="arcrow" style="stroke:#080" d="M273 114v38"/>
<path class="arcrow" style="stroke:red" d="M481 114v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 114v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 114v38M1105 114v38M65 152v38"/>
<path class="arcrow" style="stroke:#080" d="M273 152v38"/>
<path class="arcrow" style="stroke:red" d="M481 152v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 152v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 152v38M1105 152v38M65 190v38"/>
<path class="arcrow" style="stroke:#080" d="M273 190v38"/>
<path class="arcrow" style="stroke:red" d="M481 190v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 190v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 190v38M1105 190v38M65 228v38"/>
<path class="arcrow" style="stroke:#080" d="M273 228v38"/>
<path class="arcrow" style="stroke:red" d="M481 228v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 228v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 228v38M1105 228v38M65 266v38"/>
<path class="arcrow" style="stroke:#080" d="M273 266v38"/>
<path class="arcrow" style="stroke:red" d="M481 266v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 266v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 266v38M1105 266v38M65 304v38"/>
<path class="arcrow" style="stroke:#080" d="M273 304v38"/>
<path class="arcrow" style="stroke:red" d="M481 304v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 304v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 304v38M1105 304v38M65 342v38"/>
<path class="arcrow" style="stroke:#080" d="M273 342v38"/>
<path class="arcrow" style="stroke:red" d="M481 342v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 342v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 342v38M1105 342v38M65 380v38"/>
<path class="arcrow" style="stroke:#080" d="M273 380v38"/>
<path class="arcrow" style="stroke:red" d="M481 380v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 380v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 380v38M1105 380v38M65 418v38"/>
<path class="arcrow" style="stroke:#080" d="M273 418v38"/>
<path class="arcrow" style="stroke:red" d="M481 418v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 418v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 418v38M1105 418v38M65 456v38"/>
<path class="arcrow" style="stroke:#080" d="M273 456v38"/>
<path class="arcrow" style="stroke:red" d="M481 456v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 456v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 456v38M1105 456v38M65 494v38"/>
<path class="arcrow" style="stroke:#080" d="M273 494v38"/>
<path class="arcrow" style="stroke:red" d="M481 494v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 494v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 494v38M1105 494v38M65 532v38"/>
<path class="arcrow" style="stroke:#080" d="M273 532v38"/>
<path class="arcrow" style="stroke:red" d="M481 532v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 532v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 532v38M1105 532v38M65 570v38"/>
<path class="arcrow" style="stroke:#080" d="M273 570v38"/>
<path class="arcrow" style="stroke:red" d="M481 570v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 570v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 570v38M1105 570v38M65 608v38"/>
<path class="arcrow" style="stroke:#080" d="M273 608v38"/>
<path class="arcrow" style="stroke:red" d="M481 608v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 608v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 608v38M1105 608v38M65 646v75.06"/>
<path class="arcrow" style="stroke:#080" d="M273 646v75.06"/>
<path class="arcrow" style="stroke:red" d="M481 646v75.06"/>
<path class="arcrow" style="stroke:#00f" d="M689 646v75.06"/>
<path class="arcrow" style="stroke:transparent" d="M897 646v75.06M1105 646v75.06M65 721.06v38"/>
<path class="arcrow" style="stroke:#080" d="M273 721.06v38"/>
<path class="arcrow" style="stroke:red" d="M481 721.06v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 721.06v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 721.06v38M1105 721.06v38M65 759.06v38"/>
<path class="arcrow" style="stroke:#080" d="M273 759.06v38"/>
<path class="arcrow" style="stroke:red" d="M481 759.06v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 759.06v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 759.06v38M1105 759.06v38M65 797.06v38"/>
<path class="arcrow" style="stroke:#080" d="M273 797.06v38"/>
<path class="arcrow" style="stroke:red" d="M481 797.06v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 797.06v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 797.06v38M1105 797.06v38M65 835.06v38"/>
<path class="arcrow" style="stroke:#080" d="M273 835.06v38"/>
<path class="arcrow" style="stroke:red" d="M481 835.06v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 835.06v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 835.06v38M1105 835.06v38M65 873.06v75.06"/>
<path class="arcrow" style="stroke:#080" d="M273 873.06v75.06"/>
<path class="arcrow" style="stroke:red" d="M481 873.06v75.06"/>
<path class="arcrow" style="stroke:#00f" d="M689 873.06v75.06"/>
<path class="arcrow" style="stroke:transparent" d="M897 873.06v75.06M1105 873.06v75.06M65 948.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 948.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 948.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 948.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 948.12v38M1105 948.12v38M65 986.12v86"/>
<path class="arcrow" style="stroke:#080" d="M273 986.12v86"/>
<path class="arcrow" style="stroke:red" d="M481 986.12v86"/>
<path class="arcrow" style="stroke:#00f" d="M689 986.12v86"/>
<path class="arcrow" style="stroke:transparent" d="M897 986.12v86M1105 986.12v86M65 1072.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1072.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 1072.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1072.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1072.12v38M1105 1072.12v38M65 1110.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1110.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 1110.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1110.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1110.12v38M1105 1110.12v38M65 1148.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1148.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 1148.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1148.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1148.12v38M1105 1148.12v38M65 1186.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1186.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 1186.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1186.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1186.12v38M1105 1186.12v38M65 1224.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1224.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 1224.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1224.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1224.12v38M1105 1224.12v38M65 1262.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1262.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 1262.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1262.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1262.12v38M1105 1262.12v38M65 1300.12v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1300.12v38"/>
<path class="arcrow" style="stroke:red" d="M481 1300.12v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1300.12v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1300.12v38M1105 1300.12v38M65 1338.12v75.06"/>
<path class="arcrow" style="stroke:#080" d="M273 1338.12v75.06"/>
<path class="arcrow" style="stroke:red" d="M481 1338.12v75.06"/>
<path class="arcrow" style="stroke:#00f" d="M689 1338.12v75.06"/>
<path class="arcrow" style="stroke:transparent" d="M897 1338.12v75.06M1105 1338.12v75.06M65 1413.18v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1413.18v38"/>
<path class="arcrow" style="stroke:red" d="M481 1413.18v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1413.18v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1413.18v38M1105 1413.18v38M65 1451.18v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1451.18v38"/>
<path class="arcrow" style="stroke:red" d="M481 1451.18v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1451.18v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1451.18v38M1105 1451.18v38M65 1489.18v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1489.18v38"/>
<path class="arcrow" style="stroke:red" d="M481 1489.18v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1489.18v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1489.18v38M1105 1489.18v38M65 1527.18v75.06"/>
<path class="arcrow" style="stroke:#080" d="M273 1527.18v75.06"/>
<path class="arcrow" style="stroke:red" d="M481 1527.18v75.06"/>
<path class="arcrow" style="stroke:#00f" d="M689 1527.18v75.06"/>
<path class="arcrow" style="stroke:transparent" d="M897 1527.18v75.06M1105 1527.18v75.06M65 1602.24v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1602.24v38"/>
<path class="arcrow" style="stroke:red" d="M481 1602.24v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1602.24v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1602.24v38M1105 1602.24v38M65 1640.24v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1640.24v38"/>
<path class="arcrow" style="stroke:red" d="M481 1640.24v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1640.24v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1640.24v38M1105 1640.24v38M65 1678.24v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1678.24v38"/>
<path class="arcrow" style="stroke:red" d="M481 1678.24v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1678.24v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1678.24v38M1105 1678.24v38M65 1716.24v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1716.24v38"/>
<path class="arcrow" style="stroke:red" d="M481 1716.24v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1716.24v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1716.24v38M1105 1716.24v38M65 1754.24v59.06"/>
<path class="arcrow" style="stroke:#080" d="M273 1754.24v59.06"/>
<path class="arcrow" style="stroke:red" d="M481 1754.24v59.06"/>
<path class="arcrow" style="stroke:#00f" d="M689 1754.24v59.06"/>
<path class="arcrow" style="stroke:transparent" d="M897 1754.24v59.06M1105 1754.24v59.06M65 1813.3v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1813.3v38"/>
<path class="arcrow" style="stroke:red" d="M481 1813.3v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1813.3v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1813.3v38M1105 1813.3v38M65 1851.3v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1851.3v38"/>
<path class="arcrow" style="stroke:red" d="M481 1851.3v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1851.3v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1851.3v38M1105 1851.3v38M65 1889.3v38"/>
<path class="arcrow" style="stroke:#080" d="M273 1889.3v38"/>
<path class="arcrow" style="stroke:red" d="M481 1889.3v38"/>
<path class="arcrow" style="stroke:#00f" d="M689 1889.3v38"/>
<path class="arcrow" style="stroke:transparent" d="M897 1889.3v38M1105 1889.3v38"/>
</g>
<g id="mscgenjsreplaceme_sequence">
<path class="entity" style="stroke:transparent" d="M0 0h130v38H0z"/>
<text x="65" y="22.75" class="entity-text"><tspan> </tspan></text>
<path class="entity" style="fill:#cfc;stroke:#080" d="M208 0h130v38H208z"/>
<text x="273" y="22.75" class="entity-text"><tspan>Network</tspan></text>
<path class="entity" style="fill:#fcc;stroke:red" d="M416 0h130v38H416z"/>
<text x="481" y="22.75" class="entity-text"><tspan>Offerer</tspan></text>
<path class="entity" style="fill:#ccf;stroke:#00f" d="M624 0h130v38H624z"/>
<text x="689" y="22.75" class="entity-text"><tspan>Bidder</tspan></text>
<path class="entity" style="stroke:transparent" d="M832 0h130v38H832z"/>
<text x="897" y="22.75" class="entity-text"><tspan> </tspan></text>
<path class="entity" style="stroke:transparent" d="M1040 0h130v38h-130z"/>
<text x="1105" y="22.75" class="entity-text"><tspan> </tspan></text>
<path class="arc directional callback" style="stroke:red" marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 95H273"/>
<path class="label-text-background" d="M345.08 79.25h63.84v14h-63.84z"/>
<text x="377" y="90.25" class="directional-text callback-text"><tspan>Sends Offer</tspan></text>
<path class="arc directional return" style="stroke:#080" marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 133h416"/>
<path class="label-text-background" d="M445.75 117.25h70.5v14h-70.5z"/>
<text x="481" y="128.25" class="directional-text return-text"><tspan>Detects Offer</tspan></text>
<path class="arc directional callback" style="stroke:#00f" marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 171H481"/>
<path class="label-text-background" d="M557.64 155.25h54.72v14h-54.72z"/>
<text x="585" y="166.25" class="directional-text callback-text"><tspan>Sends Bid</tspan></text>
<path class="arc directional callback" style="stroke:red" marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 323h208"/>
<path class="label-text-background" d="M513.28 307.25h143.77v14H513.28z"/>
<text x="585" y="318.25" class="directional-text callback-text"><tspan>Sends BidAccept message</tspan></text>
<path class="arc directional callback" style="stroke:#00f" marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 399H481"/>
<path class="label-text-background" d="M491.28 383.25h187.77v14H491.28z"/>
<text x="585" y="394.25" class="directional-text callback-text"><tspan>Sends XmrBidLockTxSigsMessage</tspan></text>
<path class="arc directional callback" style="stroke:red" marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 475H273"/>
<path class="label-text-background" d="M311.64 459.25h130.72v14H311.64z"/>
<text x="377" y="470.25" class="directional-text callback-text"><tspan>Sends script-coin-lock-tx</tspan></text>
<path class="arc directional callback" style="stroke:red" marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 551h208"/>
<path class="label-text-background" d="M485.61 535.25h199.11v14H485.61z"/>
<text x="585" y="546.25" class="directional-text callback-text"><tspan>Sends XmrBidLockSpendTxMessage</tspan></text>
<path d="M689 675.93c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:#00f" marker-end="url(#mscgenjsreplacememethod-#0000FF)"/>
<path class="label-text-background" d="M692 627.67h40.91v14.02H692z"/>
<text x="692" y="638.68" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path class="label-text-background" d="M692 643.67h107.02v14.02H692z"/>
<text x="692" y="654.68" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx to</tspan></text>
<path class="label-text-background" d="M692 659.67h39.34v14.02H692z"/>
<text x="692" y="670.68" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path d="M481 675.93c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red" marker-end="url(#mscgenjsreplacememethod-#FF0000)"/>
<path class="label-text-background" d="M484 627.67h40.91v14.02H484z"/>
<text x="484" y="638.68" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path class="label-text-background" d="M484 643.67h107.02v14.02H484z"/>
<text x="484" y="654.68" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx to</tspan></text>
<path class="label-text-background" d="M484 659.67h39.34v14.02H484z"/>
<text x="484" y="670.68" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path class="arc directional callback" style="stroke:#00f" marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 816.06H273"/>
<path class="label-text-background" d="M408.97 800.3h144.06v14.02H408.97z"/>
<text x="481" y="811.31" class="directional-text callback-text"><tspan>Sends noscript-coin-lock-tx</tspan></text>
<path d="M481 902.99c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red" marker-end="url(#mscgenjsreplacememethod-#FF0000)"/>
<path class="label-text-background" d="M484 854.73h40.91v14.02H484z"/>
<text x="484" y="865.74" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path class="label-text-background" d="M484 870.73h120.38v14.02H484z"/>
<text x="484" y="881.74" class="directional-text method-text anchor-start"><tspan>noscript-coin-lock-tx to</tspan></text>
<path class="label-text-background" d="M484 886.73h39.34v14.02H484z"/>
<text x="484" y="897.74" class="directional-text method-text anchor-start"><tspan>confirm</tspan></text>
<path class="arc directional method" style="stroke:red" marker-end="url(#mscgenjsreplacememethod-#FF0000)" d="M481 1029.12h208"/>
<path class="label-text-background" d="M519.64 1013.36h130.72v14.02H519.64z"/>
<text x="585" y="1024.37" class="directional-text method-text"><tspan>Sends script-coin-lock-tx</tspan></text>
<path class="label-text-background" d="M539.3 1031.36h91.73v14.02H539.3z"/>
<text x="585" y="1042.37" class="directional-text method-text"><tspan>release message</tspan></text>
<path class="arc directional callback" style="stroke:#00f" marker-end="url(#mscgenjsreplacemecallback-#0000FF)" d="M689 1129.12H273"/>
<path class="label-text-background" d="M397.3 1113.36h167.41v14.02H397.3z"/>
<text x="481" y="1124.37" class="directional-text callback-text"><tspan>Sends script-coin-lock-spend-tx</tspan></text>
<path class="arc directional return" style="stroke:#080" marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 1167.12h208"/>
<path class="label-text-background" d="M289.97 1151.36h174.06v14.02H289.97z"/>
<text x="377" y="1162.37" class="directional-text return-text"><tspan>Detects script-coin-lock-spend-tx</tspan></text>
<path class="arc directional callback" style="stroke:red" marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1243.12H273"/>
<path class="label-text-background" d="M286.63 1227.36h180.75v14.02H286.63z"/>
<text x="377" y="1238.37" class="directional-text callback-text"><tspan>Sends noscript-coin-lock-spend-tx</tspan></text>
<path d="M481 1368.05c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red" marker-end="url(#mscgenjsreplacememethod-#FF0000)"/>
<path class="label-text-background" d="M484 1319.8h40.91v14.02H484z"/>
<text x="484" y="1330.8" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path class="label-text-background" d="M484 1335.8h143.39v14.02H484z"/>
<text x="484" y="1346.8" class="directional-text method-text anchor-start"><tspan>noscript-coin-lock-spend-tx</tspan></text>
<path class="label-text-background" d="M484 1351.8h52.69v14.02H484z"/>
<text x="484" y="1362.8" class="directional-text method-text anchor-start"><tspan>to confirm</tspan></text>
<path class="inline_expression_divider" style="stroke-dasharray:10,5" d="M-39 1470.18h1040"/>
<path class="label-text-background" d="M459.98 1462.92h42.03v14.02h-42.03z"/>
<text x="481" y="1473.93" class="empty-text comment-row-text"><tspan>fail path</tspan></text>
<path d="M481 1557.11c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red" marker-end="url(#mscgenjsreplacememethod-#FF0000)"/>
<path class="label-text-background" d="M484 1508.86h40.91v14.02H484z"/>
<text x="484" y="1519.86" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path class="label-text-background" d="M484 1524.86h93.36v14.02H484z"/>
<text x="484" y="1535.86" class="directional-text method-text anchor-start"><tspan>script-coin-lock-tx</tspan></text>
<path class="label-text-background" d="M484 1540.86h93.7v14.02H484z"/>
<text x="484" y="1551.86" class="directional-text method-text anchor-start"><tspan>locktime to expire</tspan></text>
<path class="arc directional callback" style="stroke:red" marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1621.24H273"/>
<path class="label-text-background" d="M359.98 1605.48h34.03v14.02h-34.03z"/>
<text x="377" y="1616.49" class="directional-text callback-text"><tspan>Sends</tspan></text>
<path class="label-text-background" d="M300.64 1623.48h152.72v14.02H300.64z"/>
<text x="377" y="1634.49" class="directional-text callback-text"><tspan>script-coin-lock-pre-refund-tx</tspan></text>
<path class="arc directional return" style="stroke:#080" marker-end="url(#mscgenjsreplacemecallback-#008800)" d="M273 1659.24h208"/>
<path class="label-text-background" d="M300.64 1643.48h152.72v14.02H300.64z"/>
<text x="377" y="1654.49" class="directional-text return-text"><tspan>script-coin-lock-pre-refund-tx</tspan></text>
<path d="M481 1776.17c104 .1 104 22.8 0 22.8" class="arc directional method" style="stroke:red" marker-end="url(#mscgenjsreplacememethod-#FF0000)"/>
<path class="label-text-background" d="M484 1743.91h40.91v14.02H484z"/>
<text x="484" y="1754.92" class="directional-text method-text anchor-start"><tspan>Wait for</tspan></text>
<path class="label-text-background" d="M484 1759.91h124.06v14.02H484z"/>
<text x="484" y="1770.92" class="directional-text method-text anchor-start"><tspan>pre-refund tx to confirm</tspan></text>
<path class="arc directional callback" style="stroke:red" marker-end="url(#mscgenjsreplacemecallback-#FF0000)" d="M481 1832.3H273"/>
<path class="label-text-background" d="M359.98 1816.55h34.03v14.02h-34.03z"/>
<text x="377" y="1827.55" class="directional-text callback-text"><tspan>Sends</tspan></text>
<path class="label-text-background" d="M282.3 1834.55h189.41v14.02H282.3z"/>
<text x="377" y="1845.55" class="directional-text callback-text"><tspan>script-coin-lock-pre-refund-spend-tx</tspan></text>
</g>
<g id="mscgenjsreplaceme_notes">
<path d="m381 209 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="212.75" class="box-text abox-text"><tspan>Bid Receiving</tspan></text>
<path d="m381 247 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="250.75" class="box-text abox-text"><tspan>Bid Received</tspan></text>
<path class="box" style="stroke:red" d="M381 268h200v34H381z"/>
<text x="481" y="288.75" class="box-text"><tspan>User accepts bid</tspan></text>
<path d="M797 306h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="318.75" class="box-text note-text"><tspan>The BidAccept message contains the pubkeys the offerer will use and a</tspan></text>
<text x="1001" y="334.75" class="box-text note-text"><tspan>DLEAG proof one key will work across both chains of the swapping coins</tspan></text>
<path d="m381 361 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="364.75" class="box-text abox-text"><tspan>Bid Accepted</tspan></text>
<path d="M797 382h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="394.75" class="box-text note-text"><tspan>The XmrBidLockTxSigsMessage contains the bidder&apos;s signatures for the</tspan></text>
<text x="1001" y="410.75" class="box-text note-text"><tspan>script-coin-lock-refund and script-coin-lock-refund-spend txns.</tspan></text>
<path d="m381 437 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="432.75" class="box-text abox-text"><tspan>Exchanged script lock tx sigs</tspan></text>
<text x="481" y="448.75" class="box-text abox-text"><tspan>msg</tspan></text>
<path d="m381 513 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="516.75" class="box-text abox-text"><tspan>Bid Script coin spend tx valid</tspan></text>
<path d="M797 534h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="546.75" class="box-text note-text"><tspan>The XmrBidLockSpendTxMessage contains the script-coin-lock-tx and the</tspan></text>
<text x="1001" y="562.75" class="box-text note-text"><tspan>offerer&apos;s signature for it.</tspan></text>
<path d="m381 589 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="584.75" class="box-text abox-text"><tspan>Exchanged script lock spend tx</tspan></text>
<text x="481" y="600.75" class="box-text abox-text"><tspan>msg</tspan></text>
<path d="m381 740.06 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="743.81" class="box-text abox-text"><tspan>Bid Script coin locked</tspan></text>
<path d="M-38 778.06h98.39v11.02l-7 7H-38" class="box inline_expression_label"/>
<text x="-36" y="791.31" class="inline_expression-text alt-text anchor-start"><tspan>alt: success path</tspan></text>
<path d="m381 967.12 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="970.87" class="box-text abox-text"><tspan>Bid Scriptless coin locked</tspan></text>
<path d="M797 988.11h399v9h9m-9-9 9 9v73.02H797v-82.02z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1000.87" class="box-text note-text"><tspan>The XmrBidLockReleaseMessage contains the offerer&apos;s OTVES for the</tspan></text>
<text x="1001" y="1016.87" class="box-text note-text"><tspan>script-coin-lock-tx. The bidder decodes the</tspan></text>
<text x="1001" y="1032.87" class="box-text note-text"><tspan>offerer&apos;s signature from the OTVES. When the</tspan></text>
<text x="1001" y="1048.87" class="box-text note-text"><tspan>offerer has the plaintext signature, they can decode the bidder&apos;s key</tspan></text>
<text x="1001" y="1064.87" class="box-text note-text"><tspan>for the noscript-lock-tx.</tspan></text>
<path d="m381 1091.12 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="1094.87" class="box-text abox-text"><tspan>Bid Script coin lock released</tspan></text>
<path d="m381 1205.12 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="1208.87" class="box-text abox-text"><tspan>Bid Script tx redeemed</tspan></text>
<path d="M797 1188.11h399v9h9m-9-9 9 9v25.02H797v-34.02z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1200.87" class="box-text note-text"><tspan>The offerer extracts the bidder&apos;s plaintext signature and derives the</tspan></text>
<text x="1001" y="1216.87" class="box-text note-text"><tspan>bidder&apos;s noscript-lock-tx keyhalf.</tspan></text>
<path d="m381 1281.12 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="1284.87" class="box-text abox-text"><tspan>Bid Scriptless tx redeemed</tspan></text>
<path d="m381 1432.18 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="1435.93" class="box-text abox-text"><tspan>Bid Completed</tspan></text>
<path d="M797 1604.24h399v9h9m-9-9 9 9v25H797v-34z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1624.99" class="box-text note-text"><tspan>tx can be sent by either party.</tspan></text>
<path d="m381 1697.24 3-17.01h194l3 17.01-3 17.01H384z" class="box abox" style="stroke:red"/>
<text x="481" y="1692.99" class="box-text abox-text"><tspan>Bid Script pre-refund tx in</tspan></text>
<text x="481" y="1708.99" class="box-text abox-text"><tspan>chain</tspan></text>
<path d="M797 1815.29h399v9h9m-9-9 9 9v25.02H797v-34.02z" class="box note" style="fill:#ffc"/>
<text x="1001" y="1828.05" class="box-text note-text"><tspan>Refunds the script lock tx, with the offerer&apos;s cleartext signature</tspan></text>
<text x="1001" y="1844.05" class="box-text note-text"><tspan>the bidder can refund the noscript lock tx.</tspan></text>
<path d="m381 1870.3 3-17h194l3 17-3 17H384z" class="box abox" style="stroke:red"/>
<text x="481" y="1874.05" class="box-text abox-text"><tspan>Bid Failed, refunded</tspan></text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -1,52 +1,6 @@
{% include 'header.html' %}
<div class="container mx-auto">
<section class="p-5 mt-5">
<div class="flex flex-wrap items-center -m-2">
<div class="w-full md:w-1/2 p-2">
<ul class="flex flex-wrap items-center gap-x-3 mb-2">
<li>
<a class="flex font-medium text-xs text-coolGray-500 dark:text-gray-300 hover:text-coolGray-700" href="/">
<p>Home</p>
</a>
</li>
<li>
<svg width="6" height="15" viewBox="0 0 6 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.34 0.671999L2.076 14.1H0.732L3.984 0.671999H5.34Z" fill="#BBC3CF"></path>
</svg>
</li>
<li>
<a class="flex font-medium text-xs text-coolGray-500 dark:text-gray-300 hover:text-coolGray-700" href="/404">404</a>
</li>
<li>
<svg width="6" height="15" viewBox="0 0 6 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.34 0.671999L2.076 14.1H0.732L3.984 0.671999H5.34Z" fill="#BBC3CF"></path>
</svg>
</li>
</ul>
</div>
</div>
</section>
{% include 'inc_messages.html' %}
<section class="relative py-24 md:py-40">
<div class="relative z-10 container px-4 mx-auto">
<div class="flex flex-wrap items-center -mx-4">
<div class="w-full md:w-1/2 px-4 mb-16 md:mb-0">
<div class="md:max-w-xl md:mx-auto text-center md:text-left"> <span class="inline-block py-1 px-3 mb-4 text-xs leading-5 bg-blue-500 text-white font-medium rounded-full shadow-sm">Error 404</span>
<h2 class="mb-4 text-4xl md:text-5xl leading-tight font-bold tracking-tighter dark:text-white">Oh no! Error 404</h2>
<p class="mb-6 text-lg md:text-xl text-coolGray-500 dark:text-gray-300 ">Something went wrong, so this page is broken.</p>
<div class="flex flex-wrap">
<div class="w-full lg:w-auto py-1 lg:py-0 lg:mr-6"><a class="inline-block py-5 px-7 w-full text-base md:text-lg leading-4 text-blue-50 font-medium text-center bg-blue-500 hover:bg-blue-600 border border-blue-500 rounded-md shadow-sm focus:ring-0 focus:outline-none" href="/">Go Back</a></div>
<div class="w-full lg:w-auto py-1 lg:py-0"><a class="inline-block py-5 px-7 w-full text-base md:text-lg leading-4 text-coolGray-800 font-medium text-center bg-white hover:bg-coolGray-100 border border-coolGray-200 rounded-md shadow-sm focus:ring-0 focus:outline-none" href="/refresh">Try Again</a></div>
<!-- todo add last URL page visit -->
</div>
</div>
</div>
<div class="w-full md:w-1/3 px-4"><img class="mx-auto" src="/static/images/other/what-why.gif" alt=""></div>
</div>
</div>
</section>
</div>
{% include 'footer.html' %}
</div>
</body>
</html>
<p>404 Page Not Found</p>
<p><a href="/">home</a></p>
</body></html>

Some files were not shown because too many files have changed in this diff Show More