From 6556f74f2cbe67c5e9e9e3f5ada05f6950e1af97 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 16 Oct 2019 12:49:54 -0400 Subject: [PATCH 01/34] Update test_framework.py to support version compatibility tests --- qa/test_framework/test_framework.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/qa/test_framework/test_framework.py b/qa/test_framework/test_framework.py index f45cd44e9f..f030002c13 100644 --- a/qa/test_framework/test_framework.py +++ b/qa/test_framework/test_framework.py @@ -45,7 +45,7 @@ def __init__(self): def setup_nodes(self): for i in range(self.num_nodes): self.configure_node(i) - self.start_node(self.nodes[i]) + self.start_node(i, self.nodes[i]) def setup_network(self): if self.bitcoind is not None and self.cointype == "BTC": @@ -64,7 +64,11 @@ def send_bitcoin_cmd(self, *args): def configure_node(self, n): dir_path = os.path.join(self.temp_dir, "openbazaar-go", str(n)) - args = [self.binary, "init", "-d", dir_path, "--testnet"] + args = [] + if self.binaries is not None: + args = [self.binaries[n], "init", "-d", dir_path, "--testnet"] + else: + args = [self.binary, "init", "-d", dir_path, "--testnet"] if n < 3: args.extend(["-m", BOOTSTAP_MNEMONICS[n]]) process = subprocess.Popen(args, stdout=PIPE) @@ -111,8 +115,12 @@ def wait_for_init_success(process): if "OpenBazaar repo initialized" in str(o): return - def start_node(self, node): - args = [self.binary, "start", "-v", "-d", node["data_dir"], *self.options] + def start_node(self, n, node): + args = [] + if self.binaries is not None: + args = [self.binaries[n], "start", "-v", "-d", node["data_dir"], *self.options] + else: + args = [self.binary, "start", "-v", "-d", node["data_dir"], *self.options] process = subprocess.Popen(args, stdout=PIPE) peerId = self.wait_for_start_success(process, node) node["peerId"] = peerId @@ -185,12 +193,16 @@ def main(self, options=["--disablewallet", "--testnet", "--disableexchangerates" description="OpenBazaar Test Framework", usage="python3 test_framework.py [options]" ) - parser.add_argument('-b', '--binary', required=True, help="the openbazaar-go binary") + parser.add_argument('-b', '--binary', help="the openbazaar-go binary") + parser.add_argument('-i', '--binaries', nargs='*', help="a list of binaries to use. Indexes map to the index of each node in the test.") + parser.add_argument('-v', '--versions', nargs='*', help="a list of versions mapped to the node index") parser.add_argument('-d', '--bitcoind', help="the bitcoind binary") parser.add_argument('-t', '--tempdir', action='store_true', help="temp directory to store the data folders", default="/tmp/") parser.add_argument('-c', '--cointype', help="cointype to test", default="BTC") args = parser.parse_args(sys.argv[1:]) self.binary = args.binary + self.binaries = args.binaries + self.versions = args.versions self.temp_dir = args.tempdir self.bitcoind = args.bitcoind self.cointype = args.cointype From ee897d67d51297480d7d1637956032a2c3566ae4 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 9 Dec 2019 12:06:03 -0500 Subject: [PATCH 02/34] Update qa tests with data version selection --- core/core.go | 2 +- qa/cancel_direct_offline.py | 6 +- qa/complete_direct_online.py | 8 +- qa/complete_disputed.py | 10 +- qa/complete_moderated_online.py | 12 +- qa/complete_moderated_with_timeout.py | 12 +- qa/dispute_close_buyer.py | 8 +- qa/dispute_close_split.py | 8 +- qa/dispute_close_vendor.py | 10 +- qa/escrow_release_after_timeout.py | 10 +- qa/fulfill_direct_online.py | 8 +- qa/listings.py | 6 +- qa/manage_crypto_listings.py | 4 +- qa/market_price_modifier.py | 8 +- qa/out_of_inventory.py | 6 +- qa/purchase_crypto_listing.py | 8 +- qa/purchase_digital.py | 6 +- qa/purchase_direct_offline.py | 6 +- qa/purchase_direct_online.py | 8 +- qa/purchase_moderated_offline.py | 8 +- qa/purchase_moderated_online.py | 8 +- qa/purchase_offline_error.py | 6 +- qa/refund_direct.py | 6 +- qa/refund_moderated.py | 8 +- qa/reject_direct_offline.py | 6 +- qa/reject_moderated_offline.py | 8 +- qa/smtp_notification.py | 6 +- qa/test_framework/test_framework.py | 36 +++- qa/testdata/v4/completion.json | 15 ++ qa/testdata/v4/digital.json | 49 +++++ qa/testdata/v4/fulfillment.json | 10 + qa/testdata/v4/fulfillment_crypto.json | 7 + qa/testdata/v4/listing.json | 183 ++++++++++++++++++ qa/testdata/v4/listing_crypto.json | 33 ++++ qa/testdata/v4/moderation.json | 9 + qa/testdata/v4/order_crypto.json | 10 + qa/testdata/v4/order_digital.json | 10 + qa/testdata/v4/order_direct.json | 33 ++++ .../v4/order_direct_too_much_quantity.json | 29 +++ qa/testdata/{ => v4}/profile.json | 0 qa/testdata/{ => v5}/completion.json | 0 qa/testdata/{ => v5}/digital.json | 0 qa/testdata/{ => v5}/eth_digital.json | 0 qa/testdata/{ => v5}/eth_listing.json | 0 qa/testdata/{ => v5}/eth_listing_crypto.json | 0 qa/testdata/{ => v5}/fulfillment.json | 0 qa/testdata/{ => v5}/fulfillment_crypto.json | 0 qa/testdata/{ => v5}/listing.json | 0 qa/testdata/{ => v5}/listing_crypto.json | 0 qa/testdata/{ => v5}/moderation.json | 0 qa/testdata/{ => v5}/order_crypto.json | 0 qa/testdata/{ => v5}/order_digital.json | 0 qa/testdata/{ => v5}/order_direct.json | 0 .../order_direct_too_much_quantity.json | 0 qa/testdata/v5/profile.json | 4 + qa/upload_listing.py | 8 +- 56 files changed, 525 insertions(+), 113 deletions(-) create mode 100644 qa/testdata/v4/completion.json create mode 100644 qa/testdata/v4/digital.json create mode 100644 qa/testdata/v4/fulfillment.json create mode 100644 qa/testdata/v4/fulfillment_crypto.json create mode 100644 qa/testdata/v4/listing.json create mode 100644 qa/testdata/v4/listing_crypto.json create mode 100644 qa/testdata/v4/moderation.json create mode 100644 qa/testdata/v4/order_crypto.json create mode 100644 qa/testdata/v4/order_digital.json create mode 100644 qa/testdata/v4/order_direct.json create mode 100644 qa/testdata/v4/order_direct_too_much_quantity.json rename qa/testdata/{ => v4}/profile.json (100%) rename qa/testdata/{ => v5}/completion.json (100%) rename qa/testdata/{ => v5}/digital.json (100%) rename qa/testdata/{ => v5}/eth_digital.json (100%) rename qa/testdata/{ => v5}/eth_listing.json (100%) rename qa/testdata/{ => v5}/eth_listing_crypto.json (100%) rename qa/testdata/{ => v5}/fulfillment.json (100%) rename qa/testdata/{ => v5}/fulfillment_crypto.json (100%) rename qa/testdata/{ => v5}/listing.json (100%) rename qa/testdata/{ => v5}/listing_crypto.json (100%) rename qa/testdata/{ => v5}/moderation.json (100%) rename qa/testdata/{ => v5}/order_crypto.json (100%) rename qa/testdata/{ => v5}/order_digital.json (100%) rename qa/testdata/{ => v5}/order_direct.json (100%) rename qa/testdata/{ => v5}/order_direct_too_much_quantity.json (100%) create mode 100644 qa/testdata/v5/profile.json diff --git a/core/core.go b/core/core.go index 66ba2f1b63..446d221c36 100644 --- a/core/core.go +++ b/core/core.go @@ -30,7 +30,7 @@ import ( const ( // VERSION - current version - VERSION = "0.13.6" + VERSION = "0.14.0" // USERAGENT - user-agent header string USERAGENT = "/openbazaar-go:" + VERSION + "/" ) diff --git a/qa/cancel_direct_offline.py b/qa/cancel_direct_offline.py index f05306d9cc..1dd85e1b8d 100644 --- a/qa/cancel_direct_offline.py +++ b/qa/cancel_direct_offline.py @@ -30,13 +30,13 @@ def run_test(self): time.sleep(20) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -67,7 +67,7 @@ def run_test(self): time.sleep(4) # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["paymentCoin"] = "T" + self.cointype diff --git a/qa/complete_direct_online.py b/qa/complete_direct_online.py index 44c01dee10..f1f360f388 100644 --- a/qa/complete_direct_online.py +++ b/qa/complete_direct_online.py @@ -30,13 +30,13 @@ def run_test(self): time.sleep(20) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "T" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["T" + self.cointype] @@ -60,7 +60,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["paymentCoin"] = "t" + self.cointype @@ -138,7 +138,7 @@ def run_test(self): raise TestFailure("CompleteDirectOnlineTest - FAIL: Alice incorrectly saved as unfunded") # alice send order fulfillment - with open('testdata/fulfillment.json') as fulfillment_file: + with open('testdata/'+ self.vendor_version +'/fulfillment.json') as fulfillment_file: fulfillment_json = json.load(fulfillment_file, object_pairs_hook=OrderedDict) fulfillment_json["orderId"] = orderId fulfillment_json["slug"] = slug diff --git a/qa/complete_disputed.py b/qa/complete_disputed.py index fafe83998f..19d883e620 100644 --- a/qa/complete_disputed.py +++ b/qa/complete_disputed.py @@ -43,7 +43,7 @@ def run_test(self): time.sleep(4) # make charlie a moderator - with open('testdata/moderation.json') as listing_file: + with open('testdata/'+ self.moderator_version +'/moderation.json') as listing_file: moderation_json = json.load(listing_file, object_pairs_hook=OrderedDict) api_url = charlie["gateway_url"] + "ob/moderator" r = requests.put(api_url, data=json.dumps(moderation_json, indent=4)) @@ -56,13 +56,13 @@ def run_test(self): time.sleep(4) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -87,7 +87,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["moderator"] = moderatorId @@ -167,7 +167,7 @@ def run_test(self): raise TestFailure("CompleteDisputedTest - FAIL: Alice incorrectly saved as unfunded") # alice send order fulfillment - with open('testdata/fulfillment.json') as fulfillment_file: + with open('testdata/'+ self.vendor_version +'/fulfillment.json') as fulfillment_file: fulfillment_json = json.load(fulfillment_file, object_pairs_hook=OrderedDict) fulfillment_json["orderId"] = orderId fulfillment_json["slug"] = slug diff --git a/qa/complete_moderated_online.py b/qa/complete_moderated_online.py index 7ab63e77cc..f5eb592d9b 100644 --- a/qa/complete_moderated_online.py +++ b/qa/complete_moderated_online.py @@ -42,7 +42,7 @@ def run_test(self): time.sleep(4) # make charlie a moderator - with open('testdata/moderation.json') as listing_file: + with open('testdata/'+ self.moderator_version +'/moderation.json') as listing_file: moderation_json = json.load(listing_file, object_pairs_hook=OrderedDict) api_url = charlie["gateway_url"] + "ob/moderator" r = requests.put(api_url, data=json.dumps(moderation_json, indent=4)) @@ -55,13 +55,13 @@ def run_test(self): time.sleep(4) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -87,7 +87,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["moderator"] = moderatorId @@ -167,7 +167,7 @@ def run_test(self): raise TestFailure("CompleteModeratedOnlineTest - FAIL: Alice incorrectly saved as unfunded") # alice send order fulfillment - with open('testdata/fulfillment.json') as fulfillment_file: + with open('testdata/'+ self.vendor_version +'/fulfillment.json') as fulfillment_file: fulfillment_json = json.load(fulfillment_file, object_pairs_hook=OrderedDict) fulfillment_json["slug"] = slug fulfillment_json["orderId"] = orderId @@ -199,7 +199,7 @@ def run_test(self): raise TestFailure("CompleteModeratedOnlineTest - FAIL: Alice failed to order fulfillment") # bob send order completion - with open('testdata/completion.json') as completion_file: + with open('testdata/'+ self.buyer_version +'/completion.json') as completion_file: completion_json = json.load(completion_file, object_pairs_hook=OrderedDict) completion_json["orderId"] = orderId completion_json["ratings"][0]["slug"] = slug diff --git a/qa/complete_moderated_with_timeout.py b/qa/complete_moderated_with_timeout.py index 0e2748a87c..2428532df4 100644 --- a/qa/complete_moderated_with_timeout.py +++ b/qa/complete_moderated_with_timeout.py @@ -42,7 +42,7 @@ def run_test(self): time.sleep(4) # make charlie a moderator - with open('testdata/moderation.json') as listing_file: + with open('testdata/'+ self.moderator_version +'/moderation.json') as listing_file: moderation_json = json.load(listing_file, object_pairs_hook=OrderedDict) api_url = charlie["gateway_url"] + "ob/moderator" r = requests.put(api_url, data=json.dumps(moderation_json, indent=4)) @@ -55,13 +55,13 @@ def run_test(self): time.sleep(4) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -88,7 +88,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["moderator"] = moderatorId @@ -168,7 +168,7 @@ def run_test(self): raise TestFailure("CompleteModeratedWithTimeout - FAIL: Alice incorrectly saved as unfunded") # alice send order fulfillment - with open('testdata/fulfillment.json') as fulfillment_file: + with open('testdata/'+ self.vendor_version +'/fulfillment.json') as fulfillment_file: fulfillment_json = json.load(fulfillment_file, object_pairs_hook=OrderedDict) fulfillment_json["slug"] = slug fulfillment_json["orderId"] = orderId @@ -200,7 +200,7 @@ def run_test(self): raise TestFailure("CompleteModeratedWithTimeout - FAIL: Alice failed to order fulfillment") # bob send order completion - with open('testdata/completion.json') as completion_file: + with open('testdata/'+ self.buyer_version +'/completion.json') as completion_file: completion_json = json.load(completion_file, object_pairs_hook=OrderedDict) completion_json["orderId"] = orderId completion_json["ratings"][0]["slug"] = slug diff --git a/qa/dispute_close_buyer.py b/qa/dispute_close_buyer.py index 60b1296560..b56f7e38f8 100644 --- a/qa/dispute_close_buyer.py +++ b/qa/dispute_close_buyer.py @@ -43,7 +43,7 @@ def run_test(self): time.sleep(4) # make charlie a moderator - with open('testdata/moderation.json') as listing_file: + with open('testdata/'+ self.moderator_version +'/moderation.json') as listing_file: moderation_json = json.load(listing_file, object_pairs_hook=OrderedDict) api_url = charlie["gateway_url"] + "ob/moderator" r = requests.put(api_url, data=json.dumps(moderation_json, indent=4)) @@ -56,13 +56,13 @@ def run_test(self): time.sleep(4) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -86,7 +86,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["moderator"] = moderatorId diff --git a/qa/dispute_close_split.py b/qa/dispute_close_split.py index fb0f8485ba..93ef782395 100644 --- a/qa/dispute_close_split.py +++ b/qa/dispute_close_split.py @@ -43,7 +43,7 @@ def run_test(self): time.sleep(4) # make charlie a moderator - with open('testdata/moderation.json') as listing_file: + with open('testdata/'+ self.moderator_version +'/moderation.json') as listing_file: moderation_json = json.load(listing_file, object_pairs_hook=OrderedDict) api_url = charlie["gateway_url"] + "ob/moderator" r = requests.put(api_url, data=json.dumps(moderation_json, indent=4)) @@ -56,13 +56,13 @@ def run_test(self): time.sleep(4) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -86,7 +86,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["moderator"] = moderatorId diff --git a/qa/dispute_close_vendor.py b/qa/dispute_close_vendor.py index 9ade33d6a7..5776474a96 100644 --- a/qa/dispute_close_vendor.py +++ b/qa/dispute_close_vendor.py @@ -43,7 +43,7 @@ def run_test(self): time.sleep(4) # make charlie a moderator - with open('testdata/moderation.json') as listing_file: + with open('testdata/'+ self.moderator_version +'/moderation.json') as listing_file: moderation_json = json.load(listing_file, object_pairs_hook=OrderedDict) api_url = charlie["gateway_url"] + "ob/moderator" r = requests.put(api_url, data=json.dumps(moderation_json, indent=4)) @@ -56,13 +56,13 @@ def run_test(self): time.sleep(4) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -88,7 +88,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version+'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["moderator"] = moderatorId @@ -168,7 +168,7 @@ def run_test(self): raise TestFailure("DisputeCloseVendorTest - FAIL: Alice incorrectly saved as unfunded") # alice send order fulfillment - with open('testdata/fulfillment.json') as fulfillment_file: + with open('testdata/'+ self.vendor_version +'/fulfillment.json') as fulfillment_file: fulfillment_json = json.load(fulfillment_file, object_pairs_hook=OrderedDict) fulfillment_json["orderId"] = orderId fulfillment_json["slug"] = slug diff --git a/qa/escrow_release_after_timeout.py b/qa/escrow_release_after_timeout.py index 26b8c1e282..2805db040e 100644 --- a/qa/escrow_release_after_timeout.py +++ b/qa/escrow_release_after_timeout.py @@ -42,7 +42,7 @@ def run_test(self): time.sleep(4) # make charlie a moderator - with open('testdata/moderation.json') as listing_file: + with open('testdata/'+ self.moderator_version +'/moderation.json') as listing_file: moderation_json = json.load(listing_file, object_pairs_hook=OrderedDict) api_url = charlie["gateway_url"] + "ob/moderator" r = requests.put(api_url, data=json.dumps(moderation_json, indent=4)) @@ -55,13 +55,13 @@ def run_test(self): time.sleep(4) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -88,7 +88,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["moderator"] = moderatorId @@ -168,7 +168,7 @@ def run_test(self): raise TestFailure("EscrowTimeoutRelease - FAIL: Alice incorrectly saved as unfunded") # alice send order fulfillment - with open('testdata/fulfillment.json') as fulfillment_file: + with open('testdata/'+ self.vendor_version +'/fulfillment.json') as fulfillment_file: fulfillment_json = json.load(fulfillment_file, object_pairs_hook=OrderedDict) fulfillment_json["slug"] = slug fulfillment_json["orderId"] = orderId diff --git a/qa/fulfill_direct_online.py b/qa/fulfill_direct_online.py index fad75a85dc..b7c6b6ea1c 100644 --- a/qa/fulfill_direct_online.py +++ b/qa/fulfill_direct_online.py @@ -30,13 +30,13 @@ def run_test(self): time.sleep(20) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -61,7 +61,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["paymentCoin"] = "t" + self.cointype @@ -139,7 +139,7 @@ def run_test(self): raise TestFailure("FulfillDirectOnlineTest - FAIL: Alice incorrectly saved as unfunded") # alice send order fulfillment - with open('testdata/fulfillment.json') as fulfillment_file: + with open('testdata/'+ self.vendor_version +'/fulfillment.json') as fulfillment_file: fulfillment_json = json.load(fulfillment_file, object_pairs_hook=OrderedDict) fulfillment_json["orderId"] = orderId fulfillment_json["slug"] = slug diff --git a/qa/listings.py b/qa/listings.py index ecf97313e6..ce66d4f2bc 100644 --- a/qa/listings.py +++ b/qa/listings.py @@ -14,7 +14,7 @@ def setup_network(self): def run_test(self): vendor = self.nodes[1] - browser = self.nodes[2] + buyer = self.nodes[2] currency = "tbtc" @@ -33,7 +33,7 @@ def run_test(self): raise TestFailure("ListingsTest - FAIL: Listings GET failed. Reason: %s", resp["reason"]) # POST listing - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: ljson = json.load(listing_file, object_pairs_hook=OrderedDict) ljson["item"]["priceCurrency"]["code"] = "T" + self.cointype ljson["metadata"]["acceptedCurrencies"] = ["t" + self.cointype.lower()] @@ -80,7 +80,7 @@ def run_test(self): raise TestFailure("ListingsTest - FAIL: Listing should have acceptedCurrences in metadata") # check vendor's index from another node - api_url = browser["gateway_url"] + "ob/listings/" + vendor["peerId"] + api_url = buyer["gateway_url"] + "ob/listings/" + vendor["peerId"] r = requests.get(api_url) if r.status_code == 404: raise TestFailure("ListingsTest - FAIL: Listings get endpoint not found") diff --git a/qa/manage_crypto_listings.py b/qa/manage_crypto_listings.py index 8b781888bc..e7c125586c 100644 --- a/qa/manage_crypto_listings.py +++ b/qa/manage_crypto_listings.py @@ -15,7 +15,7 @@ def run_test(self): vendor = self.nodes[1] # post profile for vendor - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = vendor["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) @@ -27,7 +27,7 @@ def run_test(self): raise TestFailure("ManageCryptoListingsTest - FAIL: Incorrect listing count: %d", len(resp)) # post listing to vendor - with open('testdata/listing_crypto.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing_crypto.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["coinType"] = "TETH" diff --git a/qa/market_price_modifier.py b/qa/market_price_modifier.py index 7ae676e9e0..637f96e209 100644 --- a/qa/market_price_modifier.py +++ b/qa/market_price_modifier.py @@ -32,13 +32,13 @@ def run_test(self): time.sleep(20) # post profile for vendor - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = vendor["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listings to vendor - with open('testdata/listing_crypto.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing_crypto.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["metadata"]["coinType"] = "TBCH" listing_json["metadata"]["coinDivisibility"] = 8 @@ -104,7 +104,7 @@ def run_test(self): raise TestFailure("MarketPriceModifierTest - FAIL: Listing doesn't include priceModifier") # buyer send orders - with open('testdata/order_crypto.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_crypto.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listing_id order_json["paymentCoin"] = "T" + self.cointype @@ -119,7 +119,7 @@ def run_test(self): payment_address = resp["paymentAddress"] payment_amount = int(resp["amount"]["amount"]) - with open('testdata/order_crypto.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_crypto.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listing_id_with_modifier order_json["paymentCoin"] = "T" + self.cointype diff --git a/qa/out_of_inventory.py b/qa/out_of_inventory.py index 8753ff3adc..e708282292 100644 --- a/qa/out_of_inventory.py +++ b/qa/out_of_inventory.py @@ -16,13 +16,13 @@ def run_test(self): bob = self.nodes[2] # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -68,7 +68,7 @@ def run_test(self): time.sleep(10) # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["paymentCoin"] = "t" + self.cointype diff --git a/qa/purchase_crypto_listing.py b/qa/purchase_crypto_listing.py index b97e780bfd..806a1059f3 100644 --- a/qa/purchase_crypto_listing.py +++ b/qa/purchase_crypto_listing.py @@ -30,13 +30,13 @@ def run_test(self): time.sleep(20) # post profile for vendor - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = vendor["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to vendor - with open('testdata/listing_crypto.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing_crypto.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -69,7 +69,7 @@ def run_test(self): listingId = resp[0]["hash"] # buyer send order - with open('testdata/order_crypto.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_crypto.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["paymentCoin"] = "t" + self.cointype @@ -163,7 +163,7 @@ def run_test(self): if resp["funded"] == False: raise TestFailure("PurchaseCryptoListingTest - FAIL: Vendor incorrectly saved as unfunded") - with open('testdata/fulfillment_crypto.json') as fulfillment_file: + with open('testdata/'+ self.vendor_version +'/fulfillment_crypto.json') as fulfillment_file: fulfillment_json = json.load(fulfillment_file, object_pairs_hook=OrderedDict) fulfillment_json["orderId"] = orderId fulfillment_json["slug"] = slug diff --git a/qa/purchase_digital.py b/qa/purchase_digital.py index b64c9120a4..ac781ac45f 100644 --- a/qa/purchase_digital.py +++ b/qa/purchase_digital.py @@ -30,13 +30,13 @@ def run_test(self): time.sleep(20) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/digital.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/digital.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -59,7 +59,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_digital.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_digital.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["paymentCoin"] = "t" + self.cointype diff --git a/qa/purchase_direct_offline.py b/qa/purchase_direct_offline.py index 304af4bfc8..4b103d696a 100644 --- a/qa/purchase_direct_offline.py +++ b/qa/purchase_direct_offline.py @@ -16,13 +16,13 @@ def run_test(self): bob = self.nodes[2] # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -67,7 +67,7 @@ def run_test(self): time.sleep(10) # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["paymentCoin"] = "t" + self.cointype diff --git a/qa/purchase_direct_online.py b/qa/purchase_direct_online.py index 3c6da6bc12..8b44cd6877 100644 --- a/qa/purchase_direct_online.py +++ b/qa/purchase_direct_online.py @@ -29,13 +29,13 @@ def run_test(self): time.sleep(20) # post profile for vendor - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = vendor["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to vendor - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -59,7 +59,7 @@ def run_test(self): # buyer send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["paymentCoin"] = "t" + self.cointype @@ -138,7 +138,7 @@ def run_test(self): raise TestFailure("PurchaseDirectOnlineTest - FAIL: Vendor incorrectly saved as unfunded") # buyer send order - with open('testdata/order_direct_too_much_quantity.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct_too_much_quantity.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId diff --git a/qa/purchase_moderated_offline.py b/qa/purchase_moderated_offline.py index cd25f5aa74..63edaad221 100644 --- a/qa/purchase_moderated_offline.py +++ b/qa/purchase_moderated_offline.py @@ -42,7 +42,7 @@ def run_test(self): time.sleep(4) # make charlie a moderator - with open('testdata/moderation.json') as listing_file: + with open('testdata/'+ self.moderator_version +'/moderation.json') as listing_file: moderation_json = json.load(listing_file, object_pairs_hook=OrderedDict) api_url = charlie["gateway_url"] + "ob/moderator" r = requests.put(api_url, data=json.dumps(moderation_json, indent=4)) @@ -55,13 +55,13 @@ def run_test(self): time.sleep(4) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -94,7 +94,7 @@ def run_test(self): time.sleep(10) # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["moderator"] = moderatorId diff --git a/qa/purchase_moderated_online.py b/qa/purchase_moderated_online.py index 14b3d19b37..32ff00a72a 100644 --- a/qa/purchase_moderated_online.py +++ b/qa/purchase_moderated_online.py @@ -42,7 +42,7 @@ def run_test(self): time.sleep(4) # make charlie a moderator - with open('testdata/moderation.json') as listing_file: + with open('testdata/'+ self.moderator_version +'/moderation.json') as listing_file: moderation_json = json.load(listing_file, object_pairs_hook=OrderedDict) api_url = charlie["gateway_url"] + "ob/moderator" r = requests.put(api_url, data=json.dumps(moderation_json, indent=4)) @@ -55,13 +55,13 @@ def run_test(self): time.sleep(4) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -85,7 +85,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["moderator"] = moderatorId diff --git a/qa/purchase_offline_error.py b/qa/purchase_offline_error.py index 874b150cb2..5677a15101 100644 --- a/qa/purchase_offline_error.py +++ b/qa/purchase_offline_error.py @@ -16,13 +16,13 @@ def run_test(self): bob = self.nodes[2] # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -67,7 +67,7 @@ def run_test(self): time.sleep(30) # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId diff --git a/qa/refund_direct.py b/qa/refund_direct.py index 26868c29d0..5c6acb1fb5 100644 --- a/qa/refund_direct.py +++ b/qa/refund_direct.py @@ -44,13 +44,13 @@ def run_test(self): time.sleep(20) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -73,7 +73,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["paymentCoin"] = "t" + self.cointype diff --git a/qa/refund_moderated.py b/qa/refund_moderated.py index 7fb97f904d..f90779a154 100644 --- a/qa/refund_moderated.py +++ b/qa/refund_moderated.py @@ -42,7 +42,7 @@ def run_test(self): time.sleep(4) # make charlie a moderator - with open('testdata/moderation.json') as listing_file: + with open('testdata/'+ self.moderator_version +'/moderation.json') as listing_file: moderation_json = json.load(listing_file, object_pairs_hook=OrderedDict) api_url = charlie["gateway_url"] + "ob/moderator" r = requests.put(api_url, data=json.dumps(moderation_json, indent=4)) @@ -55,13 +55,13 @@ def run_test(self): time.sleep(4) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -85,7 +85,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["moderator"] = moderatorId diff --git a/qa/reject_direct_offline.py b/qa/reject_direct_offline.py index f5256b8716..58db977c6c 100644 --- a/qa/reject_direct_offline.py +++ b/qa/reject_direct_offline.py @@ -30,13 +30,13 @@ def run_test(self): time.sleep(20) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -68,7 +68,7 @@ def run_test(self): time.sleep(4) # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["paymentCoin"] = "t" + self.cointype diff --git a/qa/reject_moderated_offline.py b/qa/reject_moderated_offline.py index 8b2648dff5..cc7fe9c4c9 100644 --- a/qa/reject_moderated_offline.py +++ b/qa/reject_moderated_offline.py @@ -42,7 +42,7 @@ def run_test(self): time.sleep(4) # make charlie a moderator - with open('testdata/moderation.json') as listing_file: + with open('testdata/'+ self.moderator_version +'/moderation.json') as listing_file: moderation_json = json.load(listing_file, object_pairs_hook=OrderedDict) api_url = charlie["gateway_url"] + "ob/moderator" r = requests.put(api_url, data=json.dumps(moderation_json, indent=4)) @@ -55,13 +55,13 @@ def run_test(self): time.sleep(4) # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] @@ -94,7 +94,7 @@ def run_test(self): time.sleep(4) # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["moderator"] = moderatorId diff --git a/qa/smtp_notification.py b/qa/smtp_notification.py index 5994337ee8..6f2165654a 100644 --- a/qa/smtp_notification.py +++ b/qa/smtp_notification.py @@ -21,7 +21,7 @@ def run_test(self): bob = self.nodes[2] # post profile for alice - with open('testdata/profile.json') as profile_file: + with open('testdata/'+ self.vendor_version +'/profile.json') as profile_file: profile_json = json.load(profile_file, object_pairs_hook=OrderedDict) api_url = alice["gateway_url"] + "ob/profile" requests.post(api_url, data=json.dumps(profile_json, indent=4)) @@ -77,7 +77,7 @@ def run_test(self): time.sleep(20) # post listing to alice - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -99,7 +99,7 @@ def run_test(self): listingId = resp[0]["hash"] # bob send order - with open('testdata/order_direct.json') as order_file: + with open('testdata/'+ self.buyer_version +'/order_direct.json') as order_file: order_json = json.load(order_file, object_pairs_hook=OrderedDict) order_json["items"][0]["listingHash"] = listingId order_json["paymentCoin"] = "t" + self.cointype diff --git a/qa/test_framework/test_framework.py b/qa/test_framework/test_framework.py index f030002c13..db209a5c2b 100644 --- a/qa/test_framework/test_framework.py +++ b/qa/test_framework/test_framework.py @@ -41,6 +41,9 @@ class OpenBazaarTestFramework(object): def __init__(self): self.nodes = [] self.bitcoin_api = None + self.vendor_version = "v5" + self.buyer_version = "v5" + self.moderator_version = "v5" def setup_nodes(self): for i in range(self.num_nodes): @@ -65,8 +68,15 @@ def send_bitcoin_cmd(self, *args): def configure_node(self, n): dir_path = os.path.join(self.temp_dir, "openbazaar-go", str(n)) args = [] - if self.binaries is not None: - args = [self.binaries[n], "init", "-d", dir_path, "--testnet"] + if n == 1 and self.v4vendor_binary is not None: + self.vendor_version = "v4" + args = [self.v4vendor_binary, "init", "-d", dir_path, "--testnet"] + elif n == 2 and self.v4buyer_binary is not None: + self.buyer_version = "v4" + args = [self.v4buyer_binary, "init", "-d", dir_path, "--testnet"] + elif n == 3 and self.v4moderator_binary is not None: + self.moderator_version = "v4" + args = [self.v4moderator_binary, "init", "-d", dir_path, "--testnet"] else: args = [self.binary, "init", "-d", dir_path, "--testnet"] if n < 3: @@ -117,10 +127,18 @@ def wait_for_init_success(process): def start_node(self, n, node): args = [] - if self.binaries is not None: - args = [self.binaries[n], "start", "-v", "-d", node["data_dir"], *self.options] + if n == 1 and self.v4vendor_binary is not None: + self.vendor_version = "v4" + args = [self.v4vendor_binary, "start", "-v", "-d", node["data_dir"], *self.options] + elif n == 2 and self.v4buyer_binary is not None: + self.buyer_version = "v4" + args = [self.v4buyer_binary, "start", "-v", "-d", node["data_dir"], *self.options] + elif n == 3 and self.v4moderator_binary is not None: + self.moderator_version = "v4" + args = [self.v4moderator_binary, "start", "-v", "-d", node["data_dir"], *self.options] else: args = [self.binary, "start", "-v", "-d", node["data_dir"], *self.options] + process = subprocess.Popen(args, stdout=PIPE) peerId = self.wait_for_start_success(process, node) node["peerId"] = peerId @@ -194,15 +212,17 @@ def main(self, options=["--disablewallet", "--testnet", "--disableexchangerates" usage="python3 test_framework.py [options]" ) parser.add_argument('-b', '--binary', help="the openbazaar-go binary") - parser.add_argument('-i', '--binaries', nargs='*', help="a list of binaries to use. Indexes map to the index of each node in the test.") - parser.add_argument('-v', '--versions', nargs='*', help="a list of versions mapped to the node index") + parser.add_argument('--v4buyer', help="path to a v4 binary if you want to use one") + parser.add_argument('--v4vendor', help="path to a v4 binary if you want to use one") + parser.add_argument('--v4moderator', help="path to a v4 binary if you want to use one") parser.add_argument('-d', '--bitcoind', help="the bitcoind binary") parser.add_argument('-t', '--tempdir', action='store_true', help="temp directory to store the data folders", default="/tmp/") parser.add_argument('-c', '--cointype', help="cointype to test", default="BTC") args = parser.parse_args(sys.argv[1:]) self.binary = args.binary - self.binaries = args.binaries - self.versions = args.versions + self.v4buyer_binary = args.v4buyer + self.v4vendor_binary = args.v4vendor + self.v4moderator_binary = args.v4moderator self.temp_dir = args.tempdir self.bitcoind = args.bitcoind self.cointype = args.cointype diff --git a/qa/testdata/v4/completion.json b/qa/testdata/v4/completion.json new file mode 100644 index 0000000000..aee5d5d6f3 --- /dev/null +++ b/qa/testdata/v4/completion.json @@ -0,0 +1,15 @@ +{ + "orderId": "", + "ratings": [ + { + "slug": "", + "overall": 4, + "quality": 5, + "description": 5, + "customerService": 4, + "deliverySpeed": 3, + "review": "I love it!", + "anonymous": true + } + ] +} \ No newline at end of file diff --git a/qa/testdata/v4/digital.json b/qa/testdata/v4/digital.json new file mode 100644 index 0000000000..2b55e948a8 --- /dev/null +++ b/qa/testdata/v4/digital.json @@ -0,0 +1,49 @@ +{ + "slug": "", + "metadata": { + "version": 1, + "contractType": "DIGITAL_GOOD", + "format": "FIXED_PRICE", + "expiry": "2030-08-17T04:52:19.000Z", + "pricingCurrency": "tbtc", + "acceptedCurrencies": ["tbtc", "tbch", "tltc", "tzec"] + }, + "item": { + "title": "Citizenfour", + "description": "A documentarian and a reporter travel to Hong Kong for the first of many meetings with Edward Snowden.", + "processingTime": "1 confirmation", + "price": 12000000, + "tags": [ + "documentary" + ], + "images": [ + { + "tiny": "QmUAuYuiafnJRZxDDX7MuruMNsicYNuyub5vUeAcupUBNs", + "small": "QmXSEqXLCzpCByJU4wqbJ37TcBEj77FKMUWUP1qLh56847", + "medium": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", + "large": "QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9", + "original": "QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6", + "filename": "citizenfour.jpg" + } + ], + "categories": [ + "movies" + ], + "condition": "New", + "skus": [ + ] + }, + "taxes": [ + { + "taxType": "Sales tax", + "taxRegions": [ + "UNITED_STATES" + ], + "taxShipping": false, + "percentage": 7 + } + ], + "moderators": [], + "termsAndConditions": "NA", + "refundPolicy": "No refuns for you. All sales are final." +} \ No newline at end of file diff --git a/qa/testdata/v4/fulfillment.json b/qa/testdata/v4/fulfillment.json new file mode 100644 index 0000000000..d1495f8316 --- /dev/null +++ b/qa/testdata/v4/fulfillment.json @@ -0,0 +1,10 @@ +{ + "orderId": "", + "slug": "", + "physicalDelivery": [ + { + "shipper": "UPS", + "trackingNumber": "1234" + } + ] +} \ No newline at end of file diff --git a/qa/testdata/v4/fulfillment_crypto.json b/qa/testdata/v4/fulfillment_crypto.json new file mode 100644 index 0000000000..b9a34f6193 --- /dev/null +++ b/qa/testdata/v4/fulfillment_crypto.json @@ -0,0 +1,7 @@ +{ + "orderId": "", + "slug": "", + "cryptocurrencyDelivery": [{ + "transactionID": "crypto_transaction_id" + }] +} \ No newline at end of file diff --git a/qa/testdata/v4/listing.json b/qa/testdata/v4/listing.json new file mode 100644 index 0000000000..f1b108c024 --- /dev/null +++ b/qa/testdata/v4/listing.json @@ -0,0 +1,183 @@ +{ + "slug": "", + "metadata": { + "version": 1, + "contractType": "PHYSICAL_GOOD", + "format": "FIXED_PRICE", + "expiry": "2030-08-17T04:52:19.000Z", + "pricingCurrency": "tbtc", + "acceptedCurrencies": ["tbtc", "tbch", "tltc", "tzec"] + }, + "item": { + "title": "Ron Swanson Tshirt", + "description": "Kick ass ron swanson tshirt in yellow", + "processingTime": "1 to 2 Business days", + "price": 12000000, + "tags": [ + "tshirts", + "clothing", + "ron swanson" + ], + "images": [ + { + "tiny": "QmUAuYuiafnJRZxDDX7MuruMNsicYNuyub5vUeAcupUBNs", + "small": "QmXSEqXLCzpCByJU4wqbJ37TcBEj77FKMUWUP1qLh56847", + "medium": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", + "large": "QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9", + "original": "QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6", + "filename": "swanson.jpg" + } + ], + "categories": [ + "clothing" + ], + "grams": 28, + "condition": "New", + "options": [ + { + "name": "Size", + "description": "What size do you want your shirt?", + "variants": [ + { + "name": "Small", + "image": { + "tiny": "QmUAuYuiafnJRZxDDX7MuruMNsicYNuyub5vUeAcupUBNs", + "small": "QmXSEqXLCzpCByJU4wqbJ37TcBEj77FKMUWUP1qLh56847", + "medium": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", + "large": "QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9", + "original": "QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6", + "filename": "swanson.jpg" + } + }, + { + "name": "Medium" + }, + { + "name": "Large" + }, + { + "name": "XL" + } + ] + }, + { + "name": "Color", + "description": "What color do you want your shirt?", + "variants": [ + { + "name": "Red" + }, + { + "name": "Yellow" + } + ] + } + ], + "skus": [ + { + "variantCombo": [0,0], + "productID": "932-33-2945", + "surcharge": 0, + "quantity": 12 + }, + { + "variantCombo": [0,1], + "surcharge": 0, + "quantity": 100 + }, + { + "variantCombo": [1,0], + "productID": "123-99-1111", + "surcharge": 0, + "quantity": 44 + }, + { + "variantCombo": [1,1], + "productID": "229-00-3333", + "surcharge": 0, + "quantity": 19 + }, + { + "variantCombo": [2,0], + "productID": "987-54-3456", + "surcharge": 0, + "quantity": 7 + }, + { + "variantCombo": [2,1], + "surcharge": 0, + "quantity": 3 + }, + { + "variantCombo": [3,0], + "surcharge": 1000, + "quantity": 16 + }, + { + "variantCombo": [3,1], + "surcharge": 1000, + "quantity": 12 + } + ] + }, + "shippingOptions": [ + { + "name": "Domestic Shipping", + "type": "FIXED_PRICE", + "regions": [ + "UNITED_STATES" + ], + "services": [ + { + "name": "Standard", + "price": 6000000, + "estimatedDelivery": "4-6 days" + }, + { + "name": "Express", + "price": 12000000, + "estimatedDelivery": "1-3 days" + } + ] + }, + { + "name": "International Shipping", + "type": "FIXED_PRICE", + "regions": [ + "ALL" + ], + "services": [ + { + "name": "Standard", + "price": 8000000, + "estimatedDelivery": "6-8 days" + }, + { + "name": "Express", + "price": 150000000, + "estimatedDelivery": "2-3 days" + } + ] + } + ], + "taxes": [ + { + "taxType": "Sales tax", + "taxRegions": [ + "UNITED_STATES" + ], + "taxShipping": true, + "percentage": 7 + } + ], + "coupons": [ + { + "title": "10% off", + "discountCode": "radio", + "percentDiscount": 10.0 + } + ], + "moderators": [], + "termsAndConditions": "NA", + "refundPolicy": "No refuns for you. All sales are final." +} \ No newline at end of file diff --git a/qa/testdata/v4/listing_crypto.json b/qa/testdata/v4/listing_crypto.json new file mode 100644 index 0000000000..2e6ae12b6e --- /dev/null +++ b/qa/testdata/v4/listing_crypto.json @@ -0,0 +1,33 @@ +{ + "slug": "", + "metadata": { + "version": 1, + "contractType": "CRYPTOCURRENCY", + "format": "MARKET_PRICE", + "expiry": "2030-08-17T04:52:19.000Z", + "coinType": "ETH", + "coinDivisibility": 100000000 + }, + "item": { + "title": "Ether", + "description": "", + "processingTime": "1 to 2 hours", + "price": 0, + "images": [{ + "tiny": "QmUAuYuiafnJRZxDDX7MuruMNsicYNuyub5vUeAcupUBNs", + "small": "QmXSEqXLCzpCByJU4wqbJ37TcBEj77FKMUWUP1qLh56847", + "medium": "QmYVXrKrKHDC9FobgmcmshCDyWwdrfwfanNQN4oxJ9Fk3h", + "large": "QmUadX5EcvrBmxAV9sE7wUWtWSqxns5K84qKJBixmcT1w9", + "original": "QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6", + "filename": "ether.jpg" + }], + "grams": 0, + "options": [], + "skus": [{ + "quantity": 350000000 + }] + }, + "moderators": [], + "termsAndConditions": "NA", + "refundPolicy": "No refunds for you. All sales are final." +} \ No newline at end of file diff --git a/qa/testdata/v4/moderation.json b/qa/testdata/v4/moderation.json new file mode 100644 index 0000000000..cdb283ecd3 --- /dev/null +++ b/qa/testdata/v4/moderation.json @@ -0,0 +1,9 @@ +{ + "description": "I am a moderator!!!", + "termsAndConditions": "I moderate stuff", + "languages": ["english"], + "fee": { + "feeType": "PERCENTAGE", + "percentage": 10.0 + } +} \ No newline at end of file diff --git a/qa/testdata/v4/order_crypto.json b/qa/testdata/v4/order_crypto.json new file mode 100644 index 0000000000..4b9d2c36bb --- /dev/null +++ b/qa/testdata/v4/order_crypto.json @@ -0,0 +1,10 @@ + +{ + "moderator": "", + "items": [{ + "listingHash": "", + "quantity": 100000000, + "paymentAddress": "crypto_payment_address", + "memo": "thanks!" + }] +} \ No newline at end of file diff --git a/qa/testdata/v4/order_digital.json b/qa/testdata/v4/order_digital.json new file mode 100644 index 0000000000..03da37d4fe --- /dev/null +++ b/qa/testdata/v4/order_digital.json @@ -0,0 +1,10 @@ +{ + "moderator": "", + "items": [ + { + "listingHash": "", + "quantity": 1, + "memo": "thanks!" + } + ] +} \ No newline at end of file diff --git a/qa/testdata/v4/order_direct.json b/qa/testdata/v4/order_direct.json new file mode 100644 index 0000000000..e0580dacdc --- /dev/null +++ b/qa/testdata/v4/order_direct.json @@ -0,0 +1,33 @@ +{ + "shipTo": "Seymour Butts", + "address": "31 Spooner Street", + "city": "Quahog", + "state": "RI", + "postalCode": "00093", + "countryCode": "UNITED_STATES", + "addressNotes": "", + "moderator": "", + "paymentCoin": "", + "items": [ + { + "listingHash": "", + "quantity": 1, + "options": [ + { + "name": "Color", + "value": "Red" + }, + { + "name": "Size", + "value": "Large" + } + ], + "shipping": { + "name": "Domestic Shipping", + "service": "Standard" + }, + "memo": "thanks!", + "coupons": ["discount"] + } + ] +} \ No newline at end of file diff --git a/qa/testdata/v4/order_direct_too_much_quantity.json b/qa/testdata/v4/order_direct_too_much_quantity.json new file mode 100644 index 0000000000..50f41ade34 --- /dev/null +++ b/qa/testdata/v4/order_direct_too_much_quantity.json @@ -0,0 +1,29 @@ +{ + "shipTo": "Satoshi Nakamoto", + "address": "31 Spooner Street", + "city": "Quahog", + "state": "RI", + "postalCode": "00093", + "countryCode": "UNITED_STATES", + "addressNotes": "", + "moderator": "", + "items": [{ + "listingHash": "", + "quantity": 999999999999, + "options": [{ + "name": "Color", + "value": "Red" + }, + { + "name": "Size", + "value": "Large" + } + ], + "shipping": { + "name": "Domestic Shipping", + "service": "Standard" + }, + "memo": "thanks!", + "coupons": ["discount"] + }] +} \ No newline at end of file diff --git a/qa/testdata/profile.json b/qa/testdata/v4/profile.json similarity index 100% rename from qa/testdata/profile.json rename to qa/testdata/v4/profile.json diff --git a/qa/testdata/completion.json b/qa/testdata/v5/completion.json similarity index 100% rename from qa/testdata/completion.json rename to qa/testdata/v5/completion.json diff --git a/qa/testdata/digital.json b/qa/testdata/v5/digital.json similarity index 100% rename from qa/testdata/digital.json rename to qa/testdata/v5/digital.json diff --git a/qa/testdata/eth_digital.json b/qa/testdata/v5/eth_digital.json similarity index 100% rename from qa/testdata/eth_digital.json rename to qa/testdata/v5/eth_digital.json diff --git a/qa/testdata/eth_listing.json b/qa/testdata/v5/eth_listing.json similarity index 100% rename from qa/testdata/eth_listing.json rename to qa/testdata/v5/eth_listing.json diff --git a/qa/testdata/eth_listing_crypto.json b/qa/testdata/v5/eth_listing_crypto.json similarity index 100% rename from qa/testdata/eth_listing_crypto.json rename to qa/testdata/v5/eth_listing_crypto.json diff --git a/qa/testdata/fulfillment.json b/qa/testdata/v5/fulfillment.json similarity index 100% rename from qa/testdata/fulfillment.json rename to qa/testdata/v5/fulfillment.json diff --git a/qa/testdata/fulfillment_crypto.json b/qa/testdata/v5/fulfillment_crypto.json similarity index 100% rename from qa/testdata/fulfillment_crypto.json rename to qa/testdata/v5/fulfillment_crypto.json diff --git a/qa/testdata/listing.json b/qa/testdata/v5/listing.json similarity index 100% rename from qa/testdata/listing.json rename to qa/testdata/v5/listing.json diff --git a/qa/testdata/listing_crypto.json b/qa/testdata/v5/listing_crypto.json similarity index 100% rename from qa/testdata/listing_crypto.json rename to qa/testdata/v5/listing_crypto.json diff --git a/qa/testdata/moderation.json b/qa/testdata/v5/moderation.json similarity index 100% rename from qa/testdata/moderation.json rename to qa/testdata/v5/moderation.json diff --git a/qa/testdata/order_crypto.json b/qa/testdata/v5/order_crypto.json similarity index 100% rename from qa/testdata/order_crypto.json rename to qa/testdata/v5/order_crypto.json diff --git a/qa/testdata/order_digital.json b/qa/testdata/v5/order_digital.json similarity index 100% rename from qa/testdata/order_digital.json rename to qa/testdata/v5/order_digital.json diff --git a/qa/testdata/order_direct.json b/qa/testdata/v5/order_direct.json similarity index 100% rename from qa/testdata/order_direct.json rename to qa/testdata/v5/order_direct.json diff --git a/qa/testdata/order_direct_too_much_quantity.json b/qa/testdata/v5/order_direct_too_much_quantity.json similarity index 100% rename from qa/testdata/order_direct_too_much_quantity.json rename to qa/testdata/v5/order_direct_too_much_quantity.json diff --git a/qa/testdata/v5/profile.json b/qa/testdata/v5/profile.json new file mode 100644 index 0000000000..377243c156 --- /dev/null +++ b/qa/testdata/v5/profile.json @@ -0,0 +1,4 @@ +{ + "name": "alice", + "vendor": true +} \ No newline at end of file diff --git a/qa/upload_listing.py b/qa/upload_listing.py index fd3afe2dfc..69c66a2c8c 100644 --- a/qa/upload_listing.py +++ b/qa/upload_listing.py @@ -8,24 +8,24 @@ class UploadListingTest(OpenBazaarTestFramework): def __init__(self): super().__init__() - self.num_nodes = 1 + self.num_nodes = 2 def setup_network(self): self.setup_nodes() def run_test(self): - with open('testdata/listing.json') as listing_file: + with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["item"]["priceCurrency"]["divisibility"] = 8 - api_url = self.nodes[0]["gateway_url"] + "ob/listing" + api_url = self.nodes[1]["gateway_url"] + "ob/listing" r = requests.post(api_url, data=json.dumps(listing_json, indent=4)) if r.status_code == 404: raise TestFailure("UploadListingTest - FAIL: Listing post endpoint not found") elif r.status_code != 200: resp = json.loads(r.text) raise TestFailure("UploadListingTest - FAIL: Listing POST failed. Reason: %s", resp["reason"]) - api_url = self.nodes[0]["gateway_url"] + "ob/inventory" + api_url = self.nodes[1]["gateway_url"] + "ob/inventory" r = requests.get(api_url) if r.status_code == 200: resp = json.loads(r.text) From 24520726e42ac96b2b2e9bfc5ecd2f2efeda6b95 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 9 Dec 2019 13:04:35 -0500 Subject: [PATCH 03/34] Fix bugs calling start_node --- qa/cancel_direct_offline.py | 2 +- qa/chat_offline.py | 2 +- qa/eth_cancel_direct_offline.py | 2 +- qa/eth_purchase_direct_offline.py | 2 +- qa/eth_purchase_moderated_offline.py | 2 +- qa/eth_purchase_offline_error.py | 2 +- qa/eth_reject_direct_offline.py | 2 +- qa/eth_reject_moderated_offline.py | 2 +- qa/out_of_inventory.py | 2 +- qa/purchase_direct_offline.py | 2 +- qa/purchase_moderated_offline.py | 2 +- qa/purchase_offline_error.py | 2 +- qa/reject_direct_offline.py | 2 +- qa/reject_moderated_offline.py | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/qa/cancel_direct_offline.py b/qa/cancel_direct_offline.py index 1dd85e1b8d..1a92c38493 100644 --- a/qa/cancel_direct_offline.py +++ b/qa/cancel_direct_offline.py @@ -149,7 +149,7 @@ def run_test(self): raise TestFailure("CancelDirectOfflineTest - FAIL: Bob failed to detect outgoing payment") # startup alice again - self.start_node(alice) + self.start_node(1, alice) self.send_bitcoin_cmd("generatetoaddress", 1, self.bitcoin_address) time.sleep(45) diff --git a/qa/chat_offline.py b/qa/chat_offline.py index 351f77d6af..b7046a5ddb 100644 --- a/qa/chat_offline.py +++ b/qa/chat_offline.py @@ -67,7 +67,7 @@ def run_test(self): raise TestFailure("ChatOfflineTest - FAIL: Did not record new conversation") # startup bob again - self.start_node(bob) + self.start_node(2, bob) time.sleep(45) # check bob saved message correctly diff --git a/qa/eth_cancel_direct_offline.py b/qa/eth_cancel_direct_offline.py index eb2d074c9d..590410decb 100644 --- a/qa/eth_cancel_direct_offline.py +++ b/qa/eth_cancel_direct_offline.py @@ -147,7 +147,7 @@ def run_test(self): raise TestFailure("EthCancelDirectOfflineTest - FAIL: Bob failed to save as canceled") # startup alice again - self.start_node(alice) + self.start_node(1, alice) time.sleep(160) # check alice detected order diff --git a/qa/eth_purchase_direct_offline.py b/qa/eth_purchase_direct_offline.py index 4fb1302e64..30194be512 100644 --- a/qa/eth_purchase_direct_offline.py +++ b/qa/eth_purchase_direct_offline.py @@ -129,7 +129,7 @@ def run_test(self): # startup alice again - self.start_node(alice) + self.start_node(1, alice) time.sleep(60) # check alice detected order and payment diff --git a/qa/eth_purchase_moderated_offline.py b/qa/eth_purchase_moderated_offline.py index 5b63681ea1..915792ac96 100644 --- a/qa/eth_purchase_moderated_offline.py +++ b/qa/eth_purchase_moderated_offline.py @@ -155,7 +155,7 @@ def run_test(self): raise TestFailure("EthPurchaseModeratedOfflineTest - FAIL: Bob purchase saved in incorrect state") # startup alice again - self.start_node(alice) + self.start_node(1, alice) time.sleep(80) # check alice detected order and payment diff --git a/qa/eth_purchase_offline_error.py b/qa/eth_purchase_offline_error.py index 417c31892f..d6ba75b1a9 100644 --- a/qa/eth_purchase_offline_error.py +++ b/qa/eth_purchase_offline_error.py @@ -100,7 +100,7 @@ def run_test(self): raise TestFailure("EthPurchaseOfflineErrorTest - FAIL: Bob incorrectly saved as funded") # startup alice again - self.start_node(alice) + self.start_node(1, alice) time.sleep(45) # check alice detected processing error diff --git a/qa/eth_reject_direct_offline.py b/qa/eth_reject_direct_offline.py index 3a59b79497..066a1ec81b 100644 --- a/qa/eth_reject_direct_offline.py +++ b/qa/eth_reject_direct_offline.py @@ -128,7 +128,7 @@ def run_test(self): raise TestFailure("EthRejectDirectOfflineTest - FAIL: Bob purchase saved in incorrect state") # startup alice again - self.start_node(alice) + self.start_node(1, alice) time.sleep(60) # alice reject order diff --git a/qa/eth_reject_moderated_offline.py b/qa/eth_reject_moderated_offline.py index a3fe76fa6e..7add9f8212 100644 --- a/qa/eth_reject_moderated_offline.py +++ b/qa/eth_reject_moderated_offline.py @@ -156,7 +156,7 @@ def run_test(self): # startup alice again - self.start_node(alice) + self.start_node(1, alice) time.sleep(45) # alice reject order diff --git a/qa/out_of_inventory.py b/qa/out_of_inventory.py index e708282292..2bef19751b 100644 --- a/qa/out_of_inventory.py +++ b/qa/out_of_inventory.py @@ -131,7 +131,7 @@ def run_test(self): self.send_bitcoin_cmd("generate", 1) # startup alice again - self.start_node(alice) + self.start_node(1, alice) time.sleep(45) # check alice detected order and payment diff --git a/qa/purchase_direct_offline.py b/qa/purchase_direct_offline.py index 4b103d696a..b32b63e1e4 100644 --- a/qa/purchase_direct_offline.py +++ b/qa/purchase_direct_offline.py @@ -130,7 +130,7 @@ def run_test(self): self.send_bitcoin_cmd("generate", 1) # startup alice again - self.start_node(alice) + self.start_node(1, alice) time.sleep(60) # check alice detected order and payment diff --git a/qa/purchase_moderated_offline.py b/qa/purchase_moderated_offline.py index 63edaad221..695e2d7e9b 100644 --- a/qa/purchase_moderated_offline.py +++ b/qa/purchase_moderated_offline.py @@ -158,7 +158,7 @@ def run_test(self): self.send_bitcoin_cmd("generate", 1) # startup alice again - self.start_node(alice) + self.start_node(1, alice) time.sleep(80) # check alice detected order and payment diff --git a/qa/purchase_offline_error.py b/qa/purchase_offline_error.py index 5677a15101..bf54b662a4 100644 --- a/qa/purchase_offline_error.py +++ b/qa/purchase_offline_error.py @@ -101,7 +101,7 @@ def run_test(self): raise TestFailure("PurchaseOfflineErrorTest - FAIL: Bob incorrectly saved as funded") # startup alice again - self.start_node(alice) + self.start_node(1, alice) time.sleep(45) # check alice detected processing error diff --git a/qa/reject_direct_offline.py b/qa/reject_direct_offline.py index 58db977c6c..19fc5e3f8f 100644 --- a/qa/reject_direct_offline.py +++ b/qa/reject_direct_offline.py @@ -131,7 +131,7 @@ def run_test(self): self.send_bitcoin_cmd("generate", 1) # startup alice again - self.start_node(alice) + self.start_node(1, alice) time.sleep(60) # alice reject order diff --git a/qa/reject_moderated_offline.py b/qa/reject_moderated_offline.py index cc7fe9c4c9..94bde21375 100644 --- a/qa/reject_moderated_offline.py +++ b/qa/reject_moderated_offline.py @@ -158,7 +158,7 @@ def run_test(self): self.send_bitcoin_cmd("generate", 1) # startup alice again - self.start_node(alice) + self.start_node(1, alice) time.sleep(45) # alice reject order From d77e45ba1f5dd1a71cdc2cecb8c81b7213a05d6b Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Mon, 9 Dec 2019 13:38:21 -0500 Subject: [PATCH 04/34] Check for connection reset error --- qa/test_framework/test_framework.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/qa/test_framework/test_framework.py b/qa/test_framework/test_framework.py index db209a5c2b..2042209d19 100644 --- a/qa/test_framework/test_framework.py +++ b/qa/test_framework/test_framework.py @@ -61,6 +61,9 @@ def run_test(self): def send_bitcoin_cmd(self, *args): try: return self.bitcoin_api.call(*args) + except ConnectionResetError: + self.bitcoin_api = rpc.Proxy(btc_conf_file=self.btc_config) + return self.send_bitcoin_cmd(*args) except BrokenPipeError: self.bitcoin_api = rpc.Proxy(btc_conf_file=self.btc_config) return self.send_bitcoin_cmd(*args) From a6454a22fcb559c56c28c293ff44d8d522839951 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 20 Dec 2019 12:31:22 -0500 Subject: [PATCH 05/34] Update qa tests to parse responses by version --- qa/cancel_direct_offline.py | 18 +++++++++++++++--- qa/complete_direct_online.py | 10 +++++++++- qa/complete_disputed.py | 17 +++++++++++++++-- qa/complete_moderated_online.py | 9 ++++++++- qa/complete_moderated_with_timeout.py | 9 ++++++++- qa/dispute_close_buyer.py | 16 ++++++++++++++-- qa/dispute_close_split.py | 17 +++++++++++++++-- qa/dispute_close_vendor.py | 9 ++++++++- qa/escrow_release_after_timeout.py | 9 ++++++++- qa/fulfill_direct_online.py | 9 ++++++++- qa/listings.py | 5 ++++- qa/market_price_modifier.py | 15 +++++++++++---- qa/out_of_inventory.py | 9 ++++++++- qa/purchase_crypto_listing.py | 21 ++++++++++++++++++--- qa/purchase_digital.py | 9 ++++++++- qa/purchase_direct_offline.py | 9 ++++++++- qa/purchase_direct_online.py | 10 ++++++++-- qa/purchase_moderated_offline.py | 9 ++++++++- qa/purchase_moderated_online.py | 9 ++++++++- qa/purchase_offline_error.py | 5 ++++- qa/refund_direct.py | 16 ++++++++++++++-- qa/refund_moderated.py | 16 ++++++++++++++-- qa/reject_direct_offline.py | 16 ++++++++++++++-- qa/reject_moderated_offline.py | 16 ++++++++++++++-- qa/smtp_notification.py | 9 ++++++++- qa/upload_listing.py | 5 ++++- 26 files changed, 261 insertions(+), 41 deletions(-) diff --git a/qa/cancel_direct_offline.py b/qa/cancel_direct_offline.py index 1a92c38493..a6260c9653 100644 --- a/qa/cancel_direct_offline.py +++ b/qa/cancel_direct_offline.py @@ -38,8 +38,12 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + api_url = alice["gateway_url"] + "ob/listing" r = requests.post(api_url, data=json.dumps(listing_json, indent=4)) if r.status_code == 404: @@ -104,6 +108,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: @@ -169,8 +177,12 @@ def run_test(self): resp = json.loads(r.text) confirmed = int(resp["confirmed"]) #unconfirmed = int(resp["unconfirmed"]) - if confirmed <= 50 - int(payment_amount["amount"]): - raise TestFailure("CancelDirectOfflineTest - FAIL: Bob failed to receive the multisig payout") + if self.buyer_version == 4: + if confirmed <= 50 - payment_amount: + raise TestFailure("CancelDirectOfflineTest - FAIL: Bob failed to receive the multisig payout") + else: + if confirmed <= 50 - int(payment_amount["amount"]): + raise TestFailure("CancelDirectOfflineTest - FAIL: Bob failed to receive the multisig payout") else: raise TestFailure("CancelDirectOfflineTest - FAIL: Failed to query Bob's balance") diff --git a/qa/complete_direct_online.py b/qa/complete_direct_online.py index f1f360f388..451c455002 100644 --- a/qa/complete_direct_online.py +++ b/qa/complete_direct_online.py @@ -38,8 +38,12 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "T" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["T" + self.cointype] + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + api_url = alice["gateway_url"] + "ob/listing" r = requests.post(api_url, data=json.dumps(listing_json, indent=4)) if r.status_code == 404: @@ -106,6 +110,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: diff --git a/qa/complete_disputed.py b/qa/complete_disputed.py index 19d883e620..6a000aa46e 100644 --- a/qa/complete_disputed.py +++ b/qa/complete_disputed.py @@ -64,8 +64,12 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + listing_json["moderators"] = [moderatorId] api_url = alice["gateway_url"] + "ob/listing" r = requests.post(api_url, data=json.dumps(listing_json, indent=4)) @@ -135,6 +139,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: @@ -288,7 +296,12 @@ def run_test(self): resp = json.loads(r.text) confirmed = int(resp["confirmed"]) #unconfirmed = int(resp["unconfirmed"]) - if confirmed <= (generated_coins*100000000) - int(payment_amount["amount"]): + amt = 0 + if self.buyer_version == 4: + amt = payment_amount + else: + amt = int(payment_amount["amount"]) + if confirmed <= (generated_coins*100000000) - amt: raise TestFailure("CompleteDisputedTest - FAIL: Bob failed to detect dispute payout") elif r.status_code == 404: raise TestFailure("CompleteDisputedTest - FAIL: Receive coins endpoint not found") diff --git a/qa/complete_moderated_online.py b/qa/complete_moderated_online.py index f5eb592d9b..effd5122e9 100644 --- a/qa/complete_moderated_online.py +++ b/qa/complete_moderated_online.py @@ -63,7 +63,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] slug = listing_json["slug"] listing_json["moderators"] = [moderatorId] @@ -135,6 +138,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: diff --git a/qa/complete_moderated_with_timeout.py b/qa/complete_moderated_with_timeout.py index 2428532df4..cae50facc3 100644 --- a/qa/complete_moderated_with_timeout.py +++ b/qa/complete_moderated_with_timeout.py @@ -63,7 +63,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] slug = listing_json["slug"] listing_json["moderators"] = [moderatorId] @@ -136,6 +139,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: diff --git a/qa/dispute_close_buyer.py b/qa/dispute_close_buyer.py index b56f7e38f8..b315005ecc 100644 --- a/qa/dispute_close_buyer.py +++ b/qa/dispute_close_buyer.py @@ -64,7 +64,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] listing_json["moderators"] = [moderatorId] @@ -134,6 +137,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: @@ -273,7 +280,12 @@ def run_test(self): resp = json.loads(r.text) confirmed = int(resp["confirmed"]) #unconfirmed = int(resp["unconfirmed"]) - if confirmed <= (generated_coins*100000000) - int(payment_amount["amount"]): + amt = 0 + if self.buyer_version == 4: + amt = payment_amount + else: + amt = int(payment_amount["amount"]) + if confirmed <= (generated_coins*100000000) - amt: raise TestFailure("DisputeCloseBuyerTest - FAIL: Bob failed to detect dispute payout") elif r.status_code == 404: raise TestFailure("DisputeCloseBuyerTest - FAIL: Receive coins endpoint not found") diff --git a/qa/dispute_close_split.py b/qa/dispute_close_split.py index 93ef782395..9cb2a81585 100644 --- a/qa/dispute_close_split.py +++ b/qa/dispute_close_split.py @@ -64,7 +64,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] listing_json["moderators"] = [moderatorId] @@ -134,6 +137,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: @@ -273,7 +280,13 @@ def run_test(self): resp = json.loads(r.text) confirmed = int(resp["confirmed"]) unconfirmed = int(resp["unconfirmed"]) - if confirmed + unconfirmed <= (generated_coins*100000000) - int(payment_amount["amount"]): + amt = 0 + if self.buyer_version == 4: + amt = payment_amount + else: + amt = int(payment_amount["amount"]) + + if confirmed + unconfirmed <= (generated_coins*100000000) - amt: raise TestFailure("DisputeCloseSplitTest - FAIL: Bob failed to detect dispute payout") elif r.status_code == 404: raise TestFailure("DisputeCloseSplitTest - FAIL: Receive coins endpoint not found") diff --git a/qa/dispute_close_vendor.py b/qa/dispute_close_vendor.py index 5776474a96..5024cf1503 100644 --- a/qa/dispute_close_vendor.py +++ b/qa/dispute_close_vendor.py @@ -64,7 +64,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] listing_json["moderators"] = [moderatorId] @@ -136,6 +139,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: diff --git a/qa/escrow_release_after_timeout.py b/qa/escrow_release_after_timeout.py index 2805db040e..3a55aa2e77 100644 --- a/qa/escrow_release_after_timeout.py +++ b/qa/escrow_release_after_timeout.py @@ -63,7 +63,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] slug = listing_json["slug"] listing_json["moderators"] = [moderatorId] @@ -136,6 +139,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: diff --git a/qa/fulfill_direct_online.py b/qa/fulfill_direct_online.py index b7c6b6ea1c..b25dc4fef7 100644 --- a/qa/fulfill_direct_online.py +++ b/qa/fulfill_direct_online.py @@ -38,7 +38,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] api_url = alice["gateway_url"] + "ob/listing" @@ -107,6 +110,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: diff --git a/qa/listings.py b/qa/listings.py index ce66d4f2bc..62c1d8b373 100644 --- a/qa/listings.py +++ b/qa/listings.py @@ -35,7 +35,10 @@ def run_test(self): # POST listing with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: ljson = json.load(listing_file, object_pairs_hook=OrderedDict) - ljson["item"]["priceCurrency"]["code"] = "T" + self.cointype + if self.vendor_version == 4: + ljson["metadata"]["priceCurrency"] = "t" + self.cointype + else: + ljson["item"]["priceCurrency"]["code"] = "t" + self.cointype ljson["metadata"]["acceptedCurrencies"] = ["t" + self.cointype.lower()] currency = "T" + self.cointype api_url = vendor["gateway_url"] + "ob/listing" diff --git a/qa/market_price_modifier.py b/qa/market_price_modifier.py index 637f96e209..31c7ff973e 100644 --- a/qa/market_price_modifier.py +++ b/qa/market_price_modifier.py @@ -40,11 +40,15 @@ def run_test(self): # post listings to vendor with open('testdata/'+ self.vendor_version +'/listing_crypto.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["metadata"]["coinType"] = "TBCH" - listing_json["metadata"]["coinDivisibility"] = 8 + if self.vendor_version == 5: + listing_json["metadata"]["coinType"] = "TBCH" + listing_json["metadata"]["coinDivisibility"] = 8 listing_json["metadata"]["acceptedCurrencies"] = ["T" + self.cointype] listing_json_with_modifier = deepcopy(listing_json) - listing_json_with_modifier["item"]["priceModifier"] = self.price_modifier + if self.vendor_version == 4: + listing_json_with_modifier["metadata"]["priceModifier"] = self.price_modifier + else: + listing_json_with_modifier["item"]["priceModifier"] = self.price_modifier api_url = vendor["gateway_url"] + "ob/listing" r = requests.post(api_url, data=json.dumps(listing_json, indent=4)) @@ -132,7 +136,10 @@ def run_test(self): raise TestFailure("MarketPriceModifierTest - FAIL: Purchase POST failed. Reason: %s", resp["reason"]) resp = json.loads(r.text) payment_address_with_modifier = resp["paymentAddress"] - payment_amount_with_modifier = int(resp["amount"]["amount"]) + if self.buyer_version == 4: + payment_address_with_modifier = resp["amount"] + else: + payment_amount_with_modifier = int(resp["amount"]["amount"]) # Check that modified price is different than regular price pct_change = round((payment_amount-payment_amount_with_modifier) / payment_amount * -100, 2) diff --git a/qa/out_of_inventory.py b/qa/out_of_inventory.py index 2bef19751b..f9a627805b 100644 --- a/qa/out_of_inventory.py +++ b/qa/out_of_inventory.py @@ -24,7 +24,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] listing_json["item"]["skus"][4]["quantity"] = 0 @@ -105,6 +108,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: diff --git a/qa/purchase_crypto_listing.py b/qa/purchase_crypto_listing.py index 806a1059f3..9c07208429 100644 --- a/qa/purchase_crypto_listing.py +++ b/qa/purchase_crypto_listing.py @@ -55,7 +55,10 @@ def run_test(self): resp = json.loads(r.text) if r.status_code != 200: raise TestFailure("PurchaseCryptoListingTest - FAIL: Inventory get endpoint failed") - if resp["ether"]["inventory"] != "350000000": + check_amt = "350000000" + if self.vendor_version == 4: + check_amt = 350000000 + if resp["ether"]["inventory"] != check_amt: raise TestFailure("PurchaseCryptoListingTest - FAIL: Inventory incorrect: %d", resp["ether"]["inventory"]) # get listing hash @@ -84,7 +87,12 @@ def run_test(self): orderId = resp["orderId"] payment_address = resp["paymentAddress"] payment_amount = resp["amount"] - if int(payment_amount["amount"]) <= 0: + amt = 0 + if self.buyer_version == 4: + amt = payment_amount + else: + amt = int(payment_amount["amount"]) + if amt <= 0: raise TestFailure("PurchaseCryptoListingTest - FAIL: Purchase POST failed: paymentAmount is <= 0") # check the purchase saved correctly @@ -127,6 +135,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = buyer["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: @@ -191,7 +203,10 @@ def run_test(self): resp = json.loads(r.text) if r.status_code != 200: raise TestFailure("PurchaseCryptoListingTest - FAIL: Inventory get endpoint failed") - if resp["ether"]["inventory"] != "250000000": + check_amt = "250000000" + if self.buyer_version == 4: + check_amt = 250000000 + if resp["ether"]["inventory"] != check_amt: raise TestFailure("PurchaseCryptoListingTest - FAIL: Inventory incorrect: %d", resp["ether"]["inventory"]) print("PurchaseCryptoListingTest - PASS") diff --git a/qa/purchase_digital.py b/qa/purchase_digital.py index ac781ac45f..c01485505d 100644 --- a/qa/purchase_digital.py +++ b/qa/purchase_digital.py @@ -38,7 +38,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/digital.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] api_url = alice["gateway_url"] + "ob/listing" @@ -105,6 +108,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: diff --git a/qa/purchase_direct_offline.py b/qa/purchase_direct_offline.py index b32b63e1e4..4657052076 100644 --- a/qa/purchase_direct_offline.py +++ b/qa/purchase_direct_offline.py @@ -24,8 +24,12 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + api_url = alice["gateway_url"] + "ob/listing" r = requests.post(api_url, data=json.dumps(listing_json, indent=4)) @@ -104,6 +108,9 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: diff --git a/qa/purchase_direct_online.py b/qa/purchase_direct_online.py index 8b44cd6877..9a8d0fba9a 100644 --- a/qa/purchase_direct_online.py +++ b/qa/purchase_direct_online.py @@ -37,8 +37,11 @@ def run_test(self): # post listing to vendor with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype api_url = vendor["gateway_url"] + "ob/listing" r = requests.post(api_url, data=json.dumps(listing_json, indent=4)) @@ -75,7 +78,6 @@ def run_test(self): payment_address = resp["paymentAddress"] payment_amount = resp["amount"] - # check the purchase saved correctly api_url = buyer["gateway_url"] + "ob/order/" + orderId r = requests.get(api_url) @@ -106,6 +108,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = buyer["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: diff --git a/qa/purchase_moderated_offline.py b/qa/purchase_moderated_offline.py index 695e2d7e9b..5384848afe 100644 --- a/qa/purchase_moderated_offline.py +++ b/qa/purchase_moderated_offline.py @@ -63,7 +63,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] api_url = alice["gateway_url"] + "ob/listing" @@ -132,6 +135,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: diff --git a/qa/purchase_moderated_online.py b/qa/purchase_moderated_online.py index 32ff00a72a..08c53b9cf0 100644 --- a/qa/purchase_moderated_online.py +++ b/qa/purchase_moderated_online.py @@ -63,7 +63,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] listing_json["moderators"] = [moderatorId] @@ -133,6 +136,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: diff --git a/qa/purchase_offline_error.py b/qa/purchase_offline_error.py index bf54b662a4..c2b31df078 100644 --- a/qa/purchase_offline_error.py +++ b/qa/purchase_offline_error.py @@ -24,7 +24,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] api_url = alice["gateway_url"] + "ob/listing" diff --git a/qa/refund_direct.py b/qa/refund_direct.py index 5c6acb1fb5..0e30e7d0b6 100644 --- a/qa/refund_direct.py +++ b/qa/refund_direct.py @@ -52,7 +52,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] api_url = alice["gateway_url"] + "ob/listing" @@ -119,6 +122,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: @@ -192,8 +199,13 @@ def run_test(self): if r.status_code == 200: resp = json.loads(r.text) confirmed = int(resp["confirmed"]) + amt = 0 + if self.buyer_version == 4: + amt = payment_amount + else: + amt = int(payment_amount["amount"]) #unconfirmed = int(resp["unconfirmed"]) - if confirmed <= 50 - int(payment_amount["amount"]): + if confirmed <= 50 - amt: raise TestFailure("RefundDirectTest - FAIL: Bob failed to receive the multisig payout") else: raise TestFailure("RefundDirectTest - FAIL: Failed to query Bob's balance") diff --git a/qa/refund_moderated.py b/qa/refund_moderated.py index f90779a154..0624a54ff7 100644 --- a/qa/refund_moderated.py +++ b/qa/refund_moderated.py @@ -63,7 +63,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] listing_json["moderators"] = [moderatorId] @@ -133,6 +136,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: @@ -211,8 +218,13 @@ def run_test(self): if r.status_code == 200: resp = json.loads(r.text) confirmed = int(resp["confirmed"]) + amt = 0 + if self.buyer_version == 4: + amt = payment_amount + else: + amt = int(payment_amount["amount"]) #unconfirmed = int(resp["unconfirmed"]) - if confirmed <= 50 - int(payment_amount["amount"]): + if confirmed <= 50 - amt: raise TestFailure("RefundModeratedTest - FAIL: Bob failed to receive the multisig payout") else: raise TestFailure("RefundModeratedTest - FAIL: Failed to query Bob's balance") diff --git a/qa/reject_direct_offline.py b/qa/reject_direct_offline.py index 19fc5e3f8f..600d037932 100644 --- a/qa/reject_direct_offline.py +++ b/qa/reject_direct_offline.py @@ -38,7 +38,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] api_url = alice["gateway_url"] + "ob/listing" @@ -105,6 +108,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: @@ -179,8 +186,13 @@ def run_test(self): if r.status_code == 200: resp = json.loads(r.text) confirmed = int(resp["confirmed"]) + amt = 0 + if self.buyer_version == 4: + amt = payment_amount + else: + amt = int(payment_amount["amount"]) #unconfirmed = int(resp["unconfirmed"]) - if confirmed <= 50 - int(payment_amount["amount"]): + if confirmed <= 50 - amt: raise TestFailure("RejectDirectOfflineTest - FAIL: Bob failed to receive the multisig payout") else: raise TestFailure("RejectDirectOfflineTest - FAIL: Failed to query Bob's balance") diff --git a/qa/reject_moderated_offline.py b/qa/reject_moderated_offline.py index 94bde21375..c2a4a1c949 100644 --- a/qa/reject_moderated_offline.py +++ b/qa/reject_moderated_offline.py @@ -63,7 +63,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] listing_json["moderators"] = [moderatorId] @@ -132,6 +135,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: @@ -206,8 +213,13 @@ def run_test(self): if r.status_code == 200: resp = json.loads(r.text) confirmed = int(resp["confirmed"]) + amt = 0 + if self.buyer_version == 4: + amt = payment_amount + else: + amt = int(payment_amount["amount"]) #unconfirmed = int(resp["unconfirmed"]) - if confirmed <= 50 - int(payment_amount["amount"]): + if confirmed <= 50 - amt: raise TestFailure("RejectModeratedOffline - FAIL: Bob failed to receive the multisig payout") else: raise TestFailure("RejectModeratedOffline - FAIL: Failed to query Bob's balance") diff --git a/qa/smtp_notification.py b/qa/smtp_notification.py index 6f2165654a..d89a71b928 100644 --- a/qa/smtp_notification.py +++ b/qa/smtp_notification.py @@ -79,7 +79,10 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype api_url = alice["gateway_url"] + "ob/listing" r = requests.post(api_url, data=json.dumps(listing_json, indent=4)) @@ -123,6 +126,10 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } + if self.buyer_version == 4: + spend["amount"] = payment_amount + spend["wallet"] = "T" + self.cointype + api_url = bob["gateway_url"] + "wallet/spend" r = requests.post(api_url, data=json.dumps(spend, indent=4)) if r.status_code == 404: diff --git a/qa/upload_listing.py b/qa/upload_listing.py index 69c66a2c8c..80dd8b02cc 100644 --- a/qa/upload_listing.py +++ b/qa/upload_listing.py @@ -16,7 +16,10 @@ def setup_network(self): def run_test(self): with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + if self.vendor_version == 4: + listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + else: + listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype listing_json["item"]["priceCurrency"]["divisibility"] = 8 api_url = self.nodes[1]["gateway_url"] + "ob/listing" r = requests.post(api_url, data=json.dumps(listing_json, indent=4)) From c7f3a8763b134f758054059f4ae8bb03eed0addc Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 25 Feb 2020 17:54:45 -0500 Subject: [PATCH 06/34] Fdaf --- qa/purchase_crypto_listing.py | 2 +- qa/purchase_direct_online.py | 4 ++-- qa/test_framework/test_framework.py | 7 ++++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/qa/purchase_crypto_listing.py b/qa/purchase_crypto_listing.py index 194690bbc8..b2b8d3ff7b 100644 --- a/qa/purchase_crypto_listing.py +++ b/qa/purchase_crypto_listing.py @@ -204,7 +204,7 @@ def run_test(self): resp = json.loads(r.text) if r.status_code != 200: raise TestFailure("PurchaseCryptoListingTest - FAIL: Inventory get endpoint failed") - + check_amt = "340000000000000000" if self.buyer_version == 4: check_amt = 340000000000000000 diff --git a/qa/purchase_direct_online.py b/qa/purchase_direct_online.py index 9a8d0fba9a..8e73b8cdb1 100644 --- a/qa/purchase_direct_online.py +++ b/qa/purchase_direct_online.py @@ -38,8 +38,8 @@ def run_test(self): with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] - if self.vendor_version == 4: - listing_json["metadata"]["priceCurrency"] = "t" + self.cointype + if self.vendor_version == "v4": + listing_json["metadata"]["pricingCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype diff --git a/qa/test_framework/test_framework.py b/qa/test_framework/test_framework.py index d9572ea5f9..2aeeed9cfa 100644 --- a/qa/test_framework/test_framework.py +++ b/qa/test_framework/test_framework.py @@ -71,13 +71,14 @@ def send_bitcoin_cmd(self, *args): def configure_node(self, n): dir_path = os.path.join(self.temp_dir, "openbazaar-go", str(n)) args = [] - if n == 1 and self.v4vendor_binary is not None: + + if n == 1 and self.v4vendor_binary: self.vendor_version = "v4" args = [self.v4vendor_binary, "init", "-d", dir_path, "--testnet"] - elif n == 2 and self.v4buyer_binary is not None: + elif n == 2 and self.v4buyer_binary: self.buyer_version = "v4" args = [self.v4buyer_binary, "init", "-d", dir_path, "--testnet"] - elif n == 3 and self.v4moderator_binary is not None: + elif n == 3 and self.v4moderator_binary: self.moderator_version = "v4" args = [self.v4moderator_binary, "init", "-d", dir_path, "--testnet"] else: From a3007d08d25110fe55f0cab8ec1194dfd891fe4d Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Mon, 9 Mar 2020 16:55:43 -0400 Subject: [PATCH 07/34] Upgrade golangci --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 724a5e258d..2c56706901 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ env: - "PATH=/home/travis/gopath/bin:$PATH" before_install: - go get -u github.com/axw/gocov/gocov github.com/mattn/goveralls github.com/tcnksm/ghr - - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s -- -b $GOPATH/bin v1.15.0 + - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s -- -b $GOPATH/bin v1.23.3 install: - echo "No external dependencies required. Skipping travis default library dependency setup to use vendors..." script: From 98a9ed19baa5fbedc91df84d8c18d670ea00633c Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Mon, 9 Mar 2020 17:00:06 -0400 Subject: [PATCH 08/34] Remove revision --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2c56706901..dc57e48c61 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ before_install: install: - echo "No external dependencies required. Skipping travis default library dependency setup to use vendors..." script: - - $GOPATH/bin/golangci-lint run --deadline 10m --new-from-rev=24dc0f64 + - $GOPATH/bin/golangci-lint run --deadline 10m --new-from-rev= - cd $TRAVIS_BUILD_DIR && go test -i && ./test_compile.sh - goveralls -coverprofile=coverage.out -service travis-ci -repotoken $COVERALLS_TOKEN after_success: From 707a3f186f1967a2d26c11cf362ac15d1d6c3bcb Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Mon, 9 Mar 2020 17:08:11 -0400 Subject: [PATCH 09/34] golangci lint fixes --- api/jsonapi.go | 5 ++++- ipfs/config.go | 4 ++-- repo/notification.go | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/api/jsonapi.go b/api/jsonapi.go index 4e7be901b6..167d0291c3 100644 --- a/api/jsonapi.go +++ b/api/jsonapi.go @@ -3696,7 +3696,10 @@ func (i *jsonAPIHandler) POSTFetchRatings(w http.ResponseWriter, r *http.Request id := r.URL.Query().Get("asyncID") if id == "" { idBytes := make([]byte, 16) - rand.Read(idBytes) + _, err := rand.Read(idBytes) + if err != nil { + return + } id = base58.Encode(idBytes) } diff --git a/ipfs/config.go b/ipfs/config.go index b041bd8008..f3ec28c7b9 100644 --- a/ipfs/config.go +++ b/ipfs/config.go @@ -15,7 +15,7 @@ import ( "github.com/ipfs/go-ipfs/repo" ) -var routerCacheURI string +//var routerCacheURI string // UpdateIPFSGlobalProtocolVars is a hack to manage custom protocol strings // which do not yet have an API to manage their configuration @@ -34,7 +34,7 @@ func UpdateIPFSGlobalProtocolVars(testnetEnable bool) { // PrepareIPFSConfig builds the configuration options for the internal // IPFS node. func PrepareIPFSConfig(r repo.Repo, routerAPIEndpoint string, testEnable, regtestEnable bool) *ipfscore.BuildCfg { - routerCacheURI = routerAPIEndpoint + //routerCacheURI = routerAPIEndpoint ncfg := &ipfscore.BuildCfg{ Repo: r, Online: true, diff --git a/repo/notification.go b/repo/notification.go index 17d455fb59..db00615c6f 100644 --- a/repo/notification.go +++ b/repo/notification.go @@ -450,7 +450,7 @@ func (n PaymentNotification) GetID() string { return n.ID } func (n PaymentNotification) GetType() NotificationType { return NotifierTypePaymentNotification } func (n PaymentNotification) GetSMTPTitleAndBody() (string, string, bool) { form := "Payment for order \"%s\" received (total %d)." - return "Payment received", fmt.Sprintf(form, n.OrderId, n.FundingTotal), true + return "Payment received", fmt.Sprintf(form, n.OrderId, n.FundingTotal.Amount), true } type OrderConfirmationNotification struct { From ab09e71f9d348ac1d0d14873f12ce4399d5e3590 Mon Sep 17 00:00:00 2001 From: Rod Date: Tue, 10 Mar 2020 01:15:33 -0700 Subject: [PATCH 10/34] Added orderConfirmation state check --- net/service/handlers.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/net/service/handlers.go b/net/service/handlers.go index 34a4348770..895fa5b853 100644 --- a/net/service/handlers.go +++ b/net/service/handlers.go @@ -553,6 +553,14 @@ func (service *OpenBazaarService) handleOrderConfirmation(p peer.ID, pmes *pb.Me return nil, net.DuplicateMessage } + if state != pb.OrderState_PENDING { + log.Debugf("order state (%s) is not what is expected", state.String()) + if err := service.SendProcessingError(p.Pretty(), vendorContract.VendorOrderConfirmation.OrderID, pb.Message_ORDER_CONFIRMATION, contract); err != nil { + log.Errorf("failed sending ORDER_PROCESSING_FAILURE to peer (%s): %s", p.Pretty(), err) + } + return nil, net.OutOfOrderMessage + } + // Validate the order confirmation log.Debugf("validating order confirmation message") err = service.node.ValidateOrderConfirmation(vendorContract, false) From 191eb3c7262a8bfb69d978cb6848ad5a0a28b09a Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Tue, 10 Mar 2020 07:37:21 -0400 Subject: [PATCH 11/34] gofmt file --- net/service/handlers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/service/handlers.go b/net/service/handlers.go index 895fa5b853..5a87c7c0fa 100644 --- a/net/service/handlers.go +++ b/net/service/handlers.go @@ -560,7 +560,7 @@ func (service *OpenBazaarService) handleOrderConfirmation(p peer.ID, pmes *pb.Me } return nil, net.OutOfOrderMessage } - + // Validate the order confirmation log.Debugf("validating order confirmation message") err = service.node.ValidateOrderConfirmation(vendorContract, false) From f0eb5c35037b64d7d517b2fcd3bc801fdd27f555 Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Tue, 10 Mar 2020 09:17:58 -0400 Subject: [PATCH 12/34] Fix scientific notation coming out of database for purchases --- repo/db/purchases.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/repo/db/purchases.go b/repo/db/purchases.go index 064e177693..2f792baf59 100644 --- a/repo/db/purchases.go +++ b/repo/db/purchases.go @@ -4,6 +4,8 @@ import ( "database/sql" "encoding/json" "fmt" + "math/big" + "strings" "sync" "time" @@ -197,6 +199,16 @@ func (p *PurchasesDB) GetAll(stateFilter []pb.OrderState, searchTerm string, sor coinType = "" } + if strings.Contains(totalStr, "e") { + flt, _, err := big.ParseFloat(totalStr, 10, 0, big.ToNearestEven) + if err != nil { + return nil, 0, err + } + var i = new(big.Int) + i, _ = flt.Int(i) + totalStr = i.String() + } + cv, err := repo.NewCurrencyValueWithLookup(totalStr, paymentCoin) if err != nil { return nil, 0, err From 3686cd2833e995422ec557e3fa49b074f1f959a7 Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Tue, 10 Mar 2020 12:04:32 -0400 Subject: [PATCH 13/34] Check for nil blocknumber when retrieving tx Fixes #2023 --- .../OpenBazaar/go-ethwallet/wallet/wallet.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go index da75cbf5f9..81b0d7fcfb 100644 --- a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go +++ b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go @@ -1448,14 +1448,23 @@ func (wallet *EthereumWallet) GetConfirmations(txid chainhash.Hash) (confirms, a result := s["result"].(map[string]interface{}) - d, _ := strconv.ParseInt(result["blockNumber"].(string), 0, 64) + var d, conf int64 + if result["blockNumber"] != nil { + d, _ = strconv.ParseInt(result["blockNumber"].(string), 0, 64) + } else { + d = 0 + } n, err := wallet.client.HeaderByNumber(context.Background(), nil) if err != nil { return 0, 0, err } - conf := n.Number.Int64() - d + if d != 0 { + conf = n.Number.Int64() - d + } else { + conf = 0 + } return uint32(conf), uint32(d), nil } From e0d0e1051cee0fd0694b3611c8389c1b54d74089 Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Tue, 10 Mar 2020 12:55:57 -0400 Subject: [PATCH 14/34] Ensure the right amount of confs --- vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go index 81b0d7fcfb..09e5029a04 100644 --- a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go +++ b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go @@ -1461,7 +1461,7 @@ func (wallet *EthereumWallet) GetConfirmations(txid chainhash.Hash) (confirms, a } if d != 0 { - conf = n.Number.Int64() - d + conf = n.Number.Int64() - d + 1 } else { conf = 0 } From 0b1cd2ed31597a8086c4b9b1883e1a09b8cc9544 Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Tue, 10 Mar 2020 16:07:03 -0400 Subject: [PATCH 15/34] Bump version --- core/core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.go b/core/core.go index 6af7fe63af..a8a39ecbc6 100644 --- a/core/core.go +++ b/core/core.go @@ -31,7 +31,7 @@ import ( const ( // VERSION - current version - VERSION = "0.13.8" + VERSION = "0.14.0" // USERAGENT - user-agent header string USERAGENT = "/openbazaar-go:" + VERSION + "/" ) From ff8c8f8baa6c01645b60ee4344d164fbe76bd672 Mon Sep 17 00:00:00 2001 From: Rod Date: Tue, 10 Mar 2020 18:44:58 -0700 Subject: [PATCH 16/34] Changed func to check if transaction goes through before saving to the db --- core/disputes.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/disputes.go b/core/disputes.go index 64a385b579..3abdbda80b 100644 --- a/core/disputes.go +++ b/core/disputes.go @@ -1210,6 +1210,12 @@ func (n *OpenBazaarNode) ReleaseFunds(contract *pb.RicardianContract, records [] peerID := order.BuyerID.PeerID + // Build, sign, and broadcast transaction + txnID, err := wal.Multisign(inputs, outputs, mySigs, moderatorSigs, redeemScriptBytes, *big.NewInt(0), true) + if err != nil { + return err + } + // Update database if n.IpfsNode.Identity.Pretty() == order.BuyerID.PeerID { err = n.Datastore.Purchases().Put(orderID, *contract, pb.OrderState_DECIDED, true) @@ -1221,12 +1227,6 @@ func (n *OpenBazaarNode) ReleaseFunds(contract *pb.RicardianContract, records [] log.Errorf("ReleaseFunds error updating database: %s", err.Error()) } - // Build, sign, and broadcast transaction - txnID, err := wal.Multisign(inputs, outputs, mySigs, moderatorSigs, redeemScriptBytes, *big.NewInt(0), true) - if err != nil { - return err - } - err = n.SendOrderPayment(&SpendResponse{ Txid: util.NormalizeAddress(hexutil.Encode(txnID)), Currency: ¤cyDef, From 35e080eb25c3dfa002b945d7e19e5e269385fcbd Mon Sep 17 00:00:00 2001 From: Dr Washington Sanchez Date: Thu, 12 Mar 2020 10:42:02 +1000 Subject: [PATCH 17/34] feat: Endpoint to hash a message This will take a string and encode it as a multihash + convert it to a Base 58 string in the same way we do to our coupons. This makes it easy for clients to determine if a given coupon matches a listing's coupon secret. --- api/endpoints.go | 2 ++ api/jsonapi.go | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/api/endpoints.go b/api/endpoints.go index 8484b5dd62..cf26268f06 100644 --- a/api/endpoints.go +++ b/api/endpoints.go @@ -115,6 +115,8 @@ func post(i *jsonAPIHandler, path string, w http.ResponseWriter, r *http.Request i.POSTBulkUpdateCurrency(w, r) case strings.HasPrefix(path, "/ob/resendordermessage"): i.POSTResendOrderMessage(w, r) + case strings.HasPrefix(path, "/ob/hashmessage"): + i.POSTHashMessage(w, r) default: ErrorResponse(w, http.StatusNotFound, "Not Found") } diff --git a/api/jsonapi.go b/api/jsonapi.go index 167d0291c3..ee6198d069 100644 --- a/api/jsonapi.go +++ b/api/jsonapi.go @@ -4406,3 +4406,26 @@ func (i *jsonAPIHandler) GETScanOfflineMessages(w http.ResponseWriter, r *http.R } SanitizedResponse(w, `{}`) } + +func (i *jsonAPIHandler) POSTHashMessage(w http.ResponseWriter, r *http.Request) { + type hashRequest struct { + Content string `json:"content"` + } + var ( + req hashRequest + err = json.NewDecoder(r.Body).Decode(&req) + ) + if err != nil { + ErrorResponse(w, http.StatusBadRequest, err.Error()) + return + } + + messageHash, err := ipfs.EncodeMultihash([]byte(req.Content)) + if err != nil { + ErrorResponse(w, http.StatusBadRequest, err.Error()) + return + } + + SanitizedResponse(w, fmt.Sprintf(`{"hash": "%s"}`, + messageHash.B58String())) +} From fc6737706732fe9f502b37bf6c1ddc4a53456bff Mon Sep 17 00:00:00 2001 From: Rod Date: Thu, 12 Mar 2020 00:44:20 -0700 Subject: [PATCH 18/34] Fix: Save DisputeAcceptance to the contract even if state has not progressed Also automatically progress an order contract's state to RESOLVED when a DISPUTE_CLOSE message is found and DisputeAcceptance data is already present on the contract. This is another fix aimed at fully resolving #1651 --- net/service/handlers.go | 14 +++++++++++--- wallet/listeners/transaction_listener.go | 20 ++++++++++++++++---- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/net/service/handlers.go b/net/service/handlers.go index 5a87c7c0fa..fe255bf2c1 100644 --- a/net/service/handlers.go +++ b/net/service/handlers.go @@ -1520,11 +1520,19 @@ func (service *OpenBazaarService) handleDisputeClose(p peer.ID, pmes *pb.Message return nil, err } + // If DisputeAcceptance is already set then move the state directly to RESOLVED if isPurchase { - // Set message state to complete - err = service.datastore.Purchases().Put(rc.DisputeResolution.OrderId, *contract, pb.OrderState_DECIDED, false) + if contract.DisputeAcceptance != nil { + err = service.datastore.Purchases().Put(rc.DisputeResolution.OrderId, *contract, pb.OrderState_RESOLVED, false) + } else { + err = service.datastore.Purchases().Put(rc.DisputeResolution.OrderId, *contract, pb.OrderState_DECIDED, false) + } } else { - err = service.datastore.Sales().Put(rc.DisputeResolution.OrderId, *contract, pb.OrderState_DECIDED, false) + if contract.DisputeAcceptance != nil { + err = service.datastore.Sales().Put(rc.DisputeResolution.OrderId, *contract, pb.OrderState_RESOLVED, false) + } else { + err = service.datastore.Sales().Put(rc.DisputeResolution.OrderId, *contract, pb.OrderState_DECIDED, false) + } } if err != nil { return nil, err diff --git a/wallet/listeners/transaction_listener.go b/wallet/listeners/transaction_listener.go index 3cda723a69..10f322d1a2 100644 --- a/wallet/listeners/transaction_listener.go +++ b/wallet/listeners/transaction_listener.go @@ -154,8 +154,14 @@ func (l *TransactionListener) OnTransactionReceived(cb wallet.TransactionCallbac log.Errorf("persist dispute acceptance notification for order (%s): %s", orderId, err) } } - if err := l.db.Sales().Put(orderId, *contract, pb.OrderState_RESOLVED, false); err != nil { - log.Errorf("failed updating order (%s) to RESOLVED: %s", orderId, err.Error()) + if state == pb.OrderState_DECIDED { + if err := l.db.Sales().Put(orderId, *contract, pb.OrderState_RESOLVED, false); err != nil { + log.Errorf("failed updating order (%s) to RESOLVED: %s", orderId, err.Error()) + } + } else { + if err := l.db.Sales().Put(orderId, *contract, state, false); err != nil { + log.Errorf("failed updating order (%s) with DisputeAcceptance: %s", orderId, err.Error()) + } } } } else { @@ -192,8 +198,14 @@ func (l *TransactionListener) OnTransactionReceived(cb wallet.TransactionCallbac log.Errorf("persist dispute acceptance notification for order (%s): %s", orderId, err) } } - if err := l.db.Purchases().Put(orderId, *contract, pb.OrderState_RESOLVED, false); err != nil { - log.Errorf("failed updating order (%s) to RESOLVED: %s", orderId, err.Error()) + if state == pb.OrderState_DECIDED { + if err := l.db.Purchases().Put(orderId, *contract, pb.OrderState_RESOLVED, false); err != nil { + log.Errorf("failed updating order (%s) to RESOLVED: %s", orderId, err.Error()) + } + } else { + if err := l.db.Purchases().Put(orderId, *contract, state, false); err != nil { + log.Errorf("failed updating order (%s) with DisputeAcceptance: %s", orderId, err.Error()) + } } } } From 57340cdef95d5c07403aabe4d7d31ac3ec3b3562 Mon Sep 17 00:00:00 2001 From: Rod Date: Thu, 12 Mar 2020 00:47:50 -0700 Subject: [PATCH 19/34] Removed the order state requirement for added DisputeAcceptance to the contract --- wallet/listeners/transaction_listener.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wallet/listeners/transaction_listener.go b/wallet/listeners/transaction_listener.go index 10f322d1a2..eaf8853b83 100644 --- a/wallet/listeners/transaction_listener.go +++ b/wallet/listeners/transaction_listener.go @@ -129,7 +129,7 @@ func (l *TransactionListener) OnTransactionReceived(cb wallet.TransactionCallbac log.Errorf("update funding for sale (%s): %s", orderId, err) } // This is a dispute payout. We should set the order state. - if state == pb.OrderState_DECIDED && len(records) > 0 && fundsReleased { + if len(records) > 0 && fundsReleased { if contract.DisputeAcceptance == nil && contract != nil && contract.BuyerOrder != nil && contract.BuyerOrder.BuyerID != nil { accept := new(pb.DisputeAcceptance) ts, _ := ptypes.TimestampProto(time.Now()) @@ -169,7 +169,7 @@ func (l *TransactionListener) OnTransactionReceived(cb wallet.TransactionCallbac if err != nil { log.Errorf("update funding for purchase (%s): %s", orderId, err) } - if state == pb.OrderState_DECIDED && len(records) > 0 && fundsReleased { + if len(records) > 0 && fundsReleased { if contract.DisputeAcceptance == nil && contract != nil && len(contract.VendorListings) > 0 && contract.VendorListings[0].VendorID != nil { accept := new(pb.DisputeAcceptance) ts, _ := ptypes.TimestampProto(time.Now()) From 6ea019a66b45053bc91f91c6373ee91857a84c46 Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 12 Mar 2020 23:22:39 -0400 Subject: [PATCH 20/34] Save and load unconfirmed txs from db --- .../OpenBazaar/go-ethwallet/wallet/wallet.go | 59 +++++++++++-------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go index 09e5029a04..cc08125ab2 100644 --- a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go +++ b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go @@ -519,6 +519,15 @@ func (wallet *EthereumWallet) Balance() (confirmed, unconfirmed wi.CurrencyValue // TransactionsFromBlock - Returns a list of transactions for this wallet begining from the specified block func (wallet *EthereumWallet) TransactionsFromBlock(startBlock *int) ([]wi.Txn, error) { + ret := []wi.Txn{} + unconf, err := wallet.db.Txns().GetAll(false) + if err == nil { + for _, u := range unconf { + u.Status = wi.StatusUnconfirmed + ret = append(ret, u) + } + } + txns, err := wallet.client.eClient.NormalTxByAddress(util.EnsureCorrectPrefix(wallet.account.Address().String()), startBlock, nil, 1, 0, false) if err != nil { @@ -526,7 +535,6 @@ func (wallet *EthereumWallet) TransactionsFromBlock(startBlock *int) ([]wi.Txn, return []wi.Txn{}, nil } - ret := []wi.Txn{} for _, t := range txns { status := wi.StatusConfirmed prefix := "" @@ -653,15 +661,20 @@ func (wallet *EthereumWallet) GetFeePerByte(feeLevel wi.FeeLevel) big.Int { // Spend - Send ether to an external wallet func (wallet *EthereumWallet) Spend(amount big.Int, addr btcutil.Address, feeLevel wi.FeeLevel, referenceID string, spendAll bool) (*chainhash.Hash, error) { - var hash common.Hash - var h *chainhash.Hash - var err error + var ( + hash common.Hash + h *chainhash.Hash + watchOnly bool + nonce int32 + err error + ) actualRecipient := addr if referenceID == "" { // no referenceID means this is a direct transfer hash, err = wallet.Transfer(util.EnsureCorrectPrefix(addr.String()), &amount, spendAll, wallet.GetFeePerByte(feeLevel)) } else { + watchOnly = true // this is a spend which means it has to be linked to an order // specified using the referenceID @@ -710,33 +723,33 @@ func (wallet *EthereumWallet) Spend(amount big.Int, addr btcutil.Address, feeLev } // txn is pending - nonce, err := wallet.client.GetTxnNonce(util.EnsureCorrectPrefix(hash.Hex())) - if err == nil { - data, err := SerializePendingTxn(PendingTxn{ - TxnID: hash, - Amount: amount.String(), - OrderID: referenceID, - Nonce: nonce, - From: wallet.address.EncodeAddress(), - To: actualRecipient.EncodeAddress(), - WithInput: false, - }) - if err == nil { - err0 := wallet.db.Txns().Put(data, ut.NormalizeAddress(hash.Hex()), "0", 0, time.Now(), true) - if err0 != nil { - log.Error(err0.Error()) - } - } + nonce, err = wallet.client.GetTxnNonce(util.EnsureCorrectPrefix(hash.Hex())) + if err != nil { + return nil, err } } - if err == nil { h, err = util.CreateChainHash(hash.Hex()) if err == nil { wallet.invokeTxnCB(h.String(), &amount) } } - return h, err + data, err := SerializePendingTxn(PendingTxn{ + TxnID: hash, + Amount: amount.String(), + OrderID: referenceID, + Nonce: nonce, + From: wallet.address.EncodeAddress(), + To: actualRecipient.EncodeAddress(), + WithInput: false, + }) + if err == nil { + err0 := wallet.db.Txns().Put(data, ut.NormalizeAddress(hash.Hex()), "0", 0, time.Now(), watchOnly) + if err0 != nil { + log.Error(err0.Error()) + } + } + return h, nil } func (wallet *EthereumWallet) createTxnCallback(txID, orderID string, toAddress btcutil.Address, value big.Int, bTime time.Time, withInput bool) wi.TransactionCallback { From dcf144bdbc2877b465d6b29bd41f4cd536766413 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 13 Mar 2020 16:59:55 -0400 Subject: [PATCH 21/34] Update eth pending confirmations --- .../OpenBazaar/go-ethwallet/wallet/wallet.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go index cc08125ab2..bc669641ec 100644 --- a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go +++ b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go @@ -537,6 +537,9 @@ func (wallet *EthereumWallet) TransactionsFromBlock(startBlock *int) ([]wi.Txn, for _, t := range txns { status := wi.StatusConfirmed + if t.Confirmations > 1 && t.Confirmations <= 7 { + status = wi.StatusPending + } prefix := "" if t.IsError != 0 { status = wi.StatusError @@ -752,7 +755,7 @@ func (wallet *EthereumWallet) Spend(amount big.Int, addr btcutil.Address, feeLev return h, nil } -func (wallet *EthereumWallet) createTxnCallback(txID, orderID string, toAddress btcutil.Address, value big.Int, bTime time.Time, withInput bool) wi.TransactionCallback { +func (wallet *EthereumWallet) createTxnCallback(txID, orderID string, toAddress btcutil.Address, value big.Int, bTime time.Time, withInput bool, height int64) wi.TransactionCallback { output := wi.TransactionOutput{ Address: toAddress, Value: value, @@ -772,12 +775,11 @@ func (wallet *EthereumWallet) createTxnCallback(txID, orderID string, toAddress } } - return wi.TransactionCallback{ Txid: util.EnsureCorrectPrefix(txID), Outputs: []wi.TransactionOutput{output}, Inputs: []wi.TransactionInput{input}, - Height: 1, + Height: int32(height), Timestamp: time.Now(), Value: value, WatchOnly: false, @@ -825,9 +827,10 @@ func (wallet *EthereumWallet) checkTxnRcpt(hash *common.Hash, data []byte) (*com toAddr = common.HexToAddress(util.EnsureCorrectPrefix(pTxn.To)) withInput = pTxn.WithInput } + height := rcpt.BlockNumber.Int64() go wallet.AssociateTransactionWithOrder( wallet.createTxnCallback(util.EnsureCorrectPrefix(hash.Hex()), pTxn.OrderID, EthAddress{&toAddr}, - *n, time.Now(), withInput)) + *n, time.Now(), withInput, height)) } } return hash, nil From 5da4d62ceb96dfdcf87966921c594bf026422496 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 16 Mar 2020 09:23:57 -0400 Subject: [PATCH 22/34] Fix bugs in compatibility --- core/order.go | 7 +- pb/api.pb.go | 65 +- pb/contracts.pb.go | 1026 ++++++++--------- pb/countrycodes.pb.go | 18 +- pb/message.pb.go | 93 +- pb/moderator.pb.go | 48 +- pb/orders.pb.go | 18 +- pb/posts.pb.go | 43 +- pb/profile.pb.go | 58 +- pb/protos/contracts.proto | 8 +- repo/listing.go | 40 +- repo/signed_listing.go | 1 - .../go-ethwallet/wallet/erc20_wallet.go | 3 + 13 files changed, 739 insertions(+), 689 deletions(-) diff --git a/core/order.go b/core/order.go index 6c68a82f28..6aa19993c0 100644 --- a/core/order.go +++ b/core/order.go @@ -169,6 +169,7 @@ func (n *OpenBazaarNode) Purchase(data *repo.PurchaseData) (orderID string, paym Code: defn.Code.String(), Divisibility: uint32(defn.Divisibility), } + payment.Coin = defn.Code.String() // Calculate payment amount total, err := n.CalculateOrderTotal(contract) @@ -181,6 +182,7 @@ func (n *OpenBazaarNode) Purchase(data *repo.PurchaseData) (orderID string, paym } payment.BigAmount = total.String() + payment.Amount = total.Uint64() contract, err = n.SignOrder(contract) if err != nil { @@ -238,11 +240,13 @@ func prepareModeratedOrderContract(data *repo.PurchaseData, n *OpenBazaarNode, c Code: defn.Code.String(), Divisibility: uint32(defn.Divisibility), } + payment.Coin = defn.Code.String() total, err := n.CalculateOrderTotal(contract) if err != nil { return nil, err } payment.BigAmount = total.String() + payment.Amount = total.Uint64() contract.BuyerOrder.Payment = payment fpb := wal.GetFeePerByte(wallet.NORMAL) @@ -708,7 +712,6 @@ func getListing(n *OpenBazaarNode, contract *pb.RicardianContract, item repo.Ite if err := sl.GetListing().GetVendorID().Valid(); err != nil { return nil, fmt.Errorf("invalid vendor info: %s", err.Error()) } - if err := sl.ValidateListing(n.TestNetworkEnabled() || n.RegressionNetworkEnabled()); err != nil { return nil, fmt.Errorf("validating listing (%s): %s", sl.GetSlug(), err.Error()) } @@ -982,7 +985,7 @@ func (n *OpenBazaarNode) CalculateOrderTotal(contract *pb.RicardianContract) (*b } for _, vendorCoupon := range nrl.GetProtobuf().Coupons { if id.B58String() == vendorCoupon.GetHash() { - if disc, ok := new(big.Int).SetString(vendorCoupon.BigPriceDiscount, 10); ok && disc.Cmp(big.NewInt(0)) > 0 { + if disc, ok := new(big.Int).SetString(vendorCoupon.GetBigPriceDiscount(), 10); ok && disc.Cmp(big.NewInt(0)) > 0 { // apply fixed discount itemOriginAmt = itemOriginAmt.SubBigInt(disc) } else if discountF := vendorCoupon.GetPercentDiscount(); discountF > 0 { diff --git a/pb/api.pb.go b/pb/api.pb.go index 6cf46c1dc9..ecf0f45ebe 100644 --- a/pb/api.pb.go +++ b/pb/api.pb.go @@ -3,10 +3,12 @@ package pb -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import timestamp "github.com/golang/protobuf/ptypes/timestamp" +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -17,7 +19,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type Coupon struct { Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` @@ -31,16 +33,17 @@ func (m *Coupon) Reset() { *m = Coupon{} } func (m *Coupon) String() string { return proto.CompactTextString(m) } func (*Coupon) ProtoMessage() {} func (*Coupon) Descriptor() ([]byte, []int) { - return fileDescriptor_api_691aa1834ba6a6f4, []int{0} + return fileDescriptor_00212fb1f9d3bf1c, []int{0} } + func (m *Coupon) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Coupon.Unmarshal(m, b) } func (m *Coupon) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Coupon.Marshal(b, m, deterministic) } -func (dst *Coupon) XXX_Merge(src proto.Message) { - xxx_messageInfo_Coupon.Merge(dst, src) +func (m *Coupon) XXX_Merge(src proto.Message) { + xxx_messageInfo_Coupon.Merge(m, src) } func (m *Coupon) XXX_Size() int { return xxx_messageInfo_Coupon.Size(m) @@ -82,16 +85,17 @@ func (m *OrderRespApi) Reset() { *m = OrderRespApi{} } func (m *OrderRespApi) String() string { return proto.CompactTextString(m) } func (*OrderRespApi) ProtoMessage() {} func (*OrderRespApi) Descriptor() ([]byte, []int) { - return fileDescriptor_api_691aa1834ba6a6f4, []int{1} + return fileDescriptor_00212fb1f9d3bf1c, []int{1} } + func (m *OrderRespApi) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OrderRespApi.Unmarshal(m, b) } func (m *OrderRespApi) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_OrderRespApi.Marshal(b, m, deterministic) } -func (dst *OrderRespApi) XXX_Merge(src proto.Message) { - xxx_messageInfo_OrderRespApi.Merge(dst, src) +func (m *OrderRespApi) XXX_Merge(src proto.Message) { + xxx_messageInfo_OrderRespApi.Merge(m, src) } func (m *OrderRespApi) XXX_Size() int { return xxx_messageInfo_OrderRespApi.Size(m) @@ -172,16 +176,17 @@ func (m *CaseRespApi) Reset() { *m = CaseRespApi{} } func (m *CaseRespApi) String() string { return proto.CompactTextString(m) } func (*CaseRespApi) ProtoMessage() {} func (*CaseRespApi) Descriptor() ([]byte, []int) { - return fileDescriptor_api_691aa1834ba6a6f4, []int{2} + return fileDescriptor_00212fb1f9d3bf1c, []int{2} } + func (m *CaseRespApi) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CaseRespApi.Unmarshal(m, b) } func (m *CaseRespApi) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_CaseRespApi.Marshal(b, m, deterministic) } -func (dst *CaseRespApi) XXX_Merge(src proto.Message) { - xxx_messageInfo_CaseRespApi.Merge(dst, src) +func (m *CaseRespApi) XXX_Merge(src proto.Message) { + xxx_messageInfo_CaseRespApi.Merge(m, src) } func (m *CaseRespApi) XXX_Size() int { return xxx_messageInfo_CaseRespApi.Size(m) @@ -286,16 +291,17 @@ func (m *TransactionRecord) Reset() { *m = TransactionRecord{} } func (m *TransactionRecord) String() string { return proto.CompactTextString(m) } func (*TransactionRecord) ProtoMessage() {} func (*TransactionRecord) Descriptor() ([]byte, []int) { - return fileDescriptor_api_691aa1834ba6a6f4, []int{3} + return fileDescriptor_00212fb1f9d3bf1c, []int{3} } + func (m *TransactionRecord) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TransactionRecord.Unmarshal(m, b) } func (m *TransactionRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TransactionRecord.Marshal(b, m, deterministic) } -func (dst *TransactionRecord) XXX_Merge(src proto.Message) { - xxx_messageInfo_TransactionRecord.Merge(dst, src) +func (m *TransactionRecord) XXX_Merge(src proto.Message) { + xxx_messageInfo_TransactionRecord.Merge(m, src) } func (m *TransactionRecord) XXX_Size() int { return xxx_messageInfo_TransactionRecord.Size(m) @@ -368,16 +374,17 @@ func (m *PeerAndProfile) Reset() { *m = PeerAndProfile{} } func (m *PeerAndProfile) String() string { return proto.CompactTextString(m) } func (*PeerAndProfile) ProtoMessage() {} func (*PeerAndProfile) Descriptor() ([]byte, []int) { - return fileDescriptor_api_691aa1834ba6a6f4, []int{4} + return fileDescriptor_00212fb1f9d3bf1c, []int{4} } + func (m *PeerAndProfile) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PeerAndProfile.Unmarshal(m, b) } func (m *PeerAndProfile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_PeerAndProfile.Marshal(b, m, deterministic) } -func (dst *PeerAndProfile) XXX_Merge(src proto.Message) { - xxx_messageInfo_PeerAndProfile.Merge(dst, src) +func (m *PeerAndProfile) XXX_Merge(src proto.Message) { + xxx_messageInfo_PeerAndProfile.Merge(m, src) } func (m *PeerAndProfile) XXX_Size() int { return xxx_messageInfo_PeerAndProfile.Size(m) @@ -415,16 +422,17 @@ func (m *PeerAndProfileWithID) Reset() { *m = PeerAndProfileWithID{} } func (m *PeerAndProfileWithID) String() string { return proto.CompactTextString(m) } func (*PeerAndProfileWithID) ProtoMessage() {} func (*PeerAndProfileWithID) Descriptor() ([]byte, []int) { - return fileDescriptor_api_691aa1834ba6a6f4, []int{5} + return fileDescriptor_00212fb1f9d3bf1c, []int{5} } + func (m *PeerAndProfileWithID) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_PeerAndProfileWithID.Unmarshal(m, b) } func (m *PeerAndProfileWithID) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_PeerAndProfileWithID.Marshal(b, m, deterministic) } -func (dst *PeerAndProfileWithID) XXX_Merge(src proto.Message) { - xxx_messageInfo_PeerAndProfileWithID.Merge(dst, src) +func (m *PeerAndProfileWithID) XXX_Merge(src proto.Message) { + xxx_messageInfo_PeerAndProfileWithID.Merge(m, src) } func (m *PeerAndProfileWithID) XXX_Size() int { return xxx_messageInfo_PeerAndProfileWithID.Size(m) @@ -469,16 +477,17 @@ func (m *RatingWithID) Reset() { *m = RatingWithID{} } func (m *RatingWithID) String() string { return proto.CompactTextString(m) } func (*RatingWithID) ProtoMessage() {} func (*RatingWithID) Descriptor() ([]byte, []int) { - return fileDescriptor_api_691aa1834ba6a6f4, []int{6} + return fileDescriptor_00212fb1f9d3bf1c, []int{6} } + func (m *RatingWithID) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RatingWithID.Unmarshal(m, b) } func (m *RatingWithID) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RatingWithID.Marshal(b, m, deterministic) } -func (dst *RatingWithID) XXX_Merge(src proto.Message) { - xxx_messageInfo_RatingWithID.Merge(dst, src) +func (m *RatingWithID) XXX_Merge(src proto.Message) { + xxx_messageInfo_RatingWithID.Merge(m, src) } func (m *RatingWithID) XXX_Size() int { return xxx_messageInfo_RatingWithID.Size(m) @@ -520,9 +529,9 @@ func init() { proto.RegisterType((*RatingWithID)(nil), "RatingWithID") } -func init() { proto.RegisterFile("api.proto", fileDescriptor_api_691aa1834ba6a6f4) } +func init() { proto.RegisterFile("api.proto", fileDescriptor_00212fb1f9d3bf1c) } -var fileDescriptor_api_691aa1834ba6a6f4 = []byte{ +var fileDescriptor_00212fb1f9d3bf1c = []byte{ // 670 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0xdd, 0x6a, 0x1b, 0x3b, 0x10, 0xc6, 0xeb, 0xbf, 0xf5, 0x38, 0xf6, 0xe1, 0xe8, 0x84, 0xc3, 0x62, 0x38, 0x27, 0xee, 0xd2, diff --git a/pb/contracts.pb.go b/pb/contracts.pb.go index b4103910bf..4a0e81ed44 100644 --- a/pb/contracts.pb.go +++ b/pb/contracts.pb.go @@ -3,10 +3,12 @@ package pb -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import timestamp "github.com/golang/protobuf/ptypes/timestamp" +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -17,7 +19,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type Listing_Metadata_ContractType int32 @@ -36,6 +38,7 @@ var Listing_Metadata_ContractType_name = map[int32]string{ 3: "CROWD_FUND", 4: "CRYPTOCURRENCY", } + var Listing_Metadata_ContractType_value = map[string]int32{ "PHYSICAL_GOOD": 0, "DIGITAL_GOOD": 1, @@ -47,8 +50,9 @@ var Listing_Metadata_ContractType_value = map[string]int32{ func (x Listing_Metadata_ContractType) String() string { return proto.EnumName(Listing_Metadata_ContractType_name, int32(x)) } + func (Listing_Metadata_ContractType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2, 0, 0} + return fileDescriptor_b6d125f880f9ca35, []int{2, 0, 0} } type Listing_Metadata_Format int32 @@ -62,6 +66,7 @@ var Listing_Metadata_Format_name = map[int32]string{ 0: "FIXED_PRICE", 2: "MARKET_PRICE", } + var Listing_Metadata_Format_value = map[string]int32{ "FIXED_PRICE": 0, "MARKET_PRICE": 2, @@ -70,8 +75,9 @@ var Listing_Metadata_Format_value = map[string]int32{ func (x Listing_Metadata_Format) String() string { return proto.EnumName(Listing_Metadata_Format_name, int32(x)) } + func (Listing_Metadata_Format) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2, 0, 1} + return fileDescriptor_b6d125f880f9ca35, []int{2, 0, 1} } type Listing_ShippingOption_ShippingType int32 @@ -85,6 +91,7 @@ var Listing_ShippingOption_ShippingType_name = map[int32]string{ 0: "LOCAL_PICKUP", 1: "FIXED_PRICE", } + var Listing_ShippingOption_ShippingType_value = map[string]int32{ "LOCAL_PICKUP": 0, "FIXED_PRICE": 1, @@ -93,8 +100,9 @@ var Listing_ShippingOption_ShippingType_value = map[string]int32{ func (x Listing_ShippingOption_ShippingType) String() string { return proto.EnumName(Listing_ShippingOption_ShippingType_name, int32(x)) } + func (Listing_ShippingOption_ShippingType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2, 2, 0} + return fileDescriptor_b6d125f880f9ca35, []int{2, 2, 0} } type Order_Payment_Method int32 @@ -110,6 +118,7 @@ var Order_Payment_Method_name = map[int32]string{ 1: "DIRECT", 2: "MODERATED", } + var Order_Payment_Method_value = map[string]int32{ "ADDRESS_REQUEST": 0, "DIRECT": 1, @@ -119,8 +128,9 @@ var Order_Payment_Method_value = map[string]int32{ func (x Order_Payment_Method) String() string { return proto.EnumName(Order_Payment_Method_name, int32(x)) } + func (Order_Payment_Method) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{3, 2, 0} + return fileDescriptor_b6d125f880f9ca35, []int{3, 2, 0} } type Signature_Section int32 @@ -146,6 +156,7 @@ var Signature_Section_name = map[int32]string{ 6: "DISPUTE_RESOLUTION", 7: "REFUND", } + var Signature_Section_value = map[string]int32{ "LISTING": 0, "ORDER": 1, @@ -160,8 +171,9 @@ var Signature_Section_value = map[string]int32{ func (x Signature_Section) String() string { return proto.EnumName(Signature_Section_name, int32(x)) } + func (Signature_Section) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{19, 0} + return fileDescriptor_b6d125f880f9ca35, []int{19, 0} } type RicardianContract struct { @@ -185,16 +197,17 @@ func (m *RicardianContract) Reset() { *m = RicardianContract{} } func (m *RicardianContract) String() string { return proto.CompactTextString(m) } func (*RicardianContract) ProtoMessage() {} func (*RicardianContract) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{0} + return fileDescriptor_b6d125f880f9ca35, []int{0} } + func (m *RicardianContract) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RicardianContract.Unmarshal(m, b) } func (m *RicardianContract) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RicardianContract.Marshal(b, m, deterministic) } -func (dst *RicardianContract) XXX_Merge(src proto.Message) { - xxx_messageInfo_RicardianContract.Merge(dst, src) +func (m *RicardianContract) XXX_Merge(src proto.Message) { + xxx_messageInfo_RicardianContract.Merge(m, src) } func (m *RicardianContract) XXX_Size() int { return xxx_messageInfo_RicardianContract.Size(m) @@ -294,16 +307,17 @@ func (m *CurrencyDefinition) Reset() { *m = CurrencyDefinition{} } func (m *CurrencyDefinition) String() string { return proto.CompactTextString(m) } func (*CurrencyDefinition) ProtoMessage() {} func (*CurrencyDefinition) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{1} + return fileDescriptor_b6d125f880f9ca35, []int{1} } + func (m *CurrencyDefinition) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CurrencyDefinition.Unmarshal(m, b) } func (m *CurrencyDefinition) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_CurrencyDefinition.Marshal(b, m, deterministic) } -func (dst *CurrencyDefinition) XXX_Merge(src proto.Message) { - xxx_messageInfo_CurrencyDefinition.Merge(dst, src) +func (m *CurrencyDefinition) XXX_Merge(src proto.Message) { + xxx_messageInfo_CurrencyDefinition.Merge(m, src) } func (m *CurrencyDefinition) XXX_Size() int { return xxx_messageInfo_CurrencyDefinition.Size(m) @@ -348,16 +362,17 @@ func (m *Listing) Reset() { *m = Listing{} } func (m *Listing) String() string { return proto.CompactTextString(m) } func (*Listing) ProtoMessage() {} func (*Listing) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2} + return fileDescriptor_b6d125f880f9ca35, []int{2} } + func (m *Listing) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Listing.Unmarshal(m, b) } func (m *Listing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Listing.Marshal(b, m, deterministic) } -func (dst *Listing) XXX_Merge(src proto.Message) { - xxx_messageInfo_Listing.Merge(dst, src) +func (m *Listing) XXX_Merge(src proto.Message) { + xxx_messageInfo_Listing.Merge(m, src) } func (m *Listing) XXX_Size() int { return xxx_messageInfo_Listing.Size(m) @@ -459,16 +474,17 @@ func (m *Listing_Metadata) Reset() { *m = Listing_Metadata{} } func (m *Listing_Metadata) String() string { return proto.CompactTextString(m) } func (*Listing_Metadata) ProtoMessage() {} func (*Listing_Metadata) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2, 0} + return fileDescriptor_b6d125f880f9ca35, []int{2, 0} } + func (m *Listing_Metadata) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Listing_Metadata.Unmarshal(m, b) } func (m *Listing_Metadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Listing_Metadata.Marshal(b, m, deterministic) } -func (dst *Listing_Metadata) XXX_Merge(src proto.Message) { - xxx_messageInfo_Listing_Metadata.Merge(dst, src) +func (m *Listing_Metadata) XXX_Merge(src proto.Message) { + xxx_messageInfo_Listing_Metadata.Merge(m, src) } func (m *Listing_Metadata) XXX_Size() int { return xxx_messageInfo_Listing_Metadata.Size(m) @@ -583,16 +599,17 @@ func (m *Listing_Item) Reset() { *m = Listing_Item{} } func (m *Listing_Item) String() string { return proto.CompactTextString(m) } func (*Listing_Item) ProtoMessage() {} func (*Listing_Item) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2, 1} + return fileDescriptor_b6d125f880f9ca35, []int{2, 1} } + func (m *Listing_Item) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Listing_Item.Unmarshal(m, b) } func (m *Listing_Item) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Listing_Item.Marshal(b, m, deterministic) } -func (dst *Listing_Item) XXX_Merge(src proto.Message) { - xxx_messageInfo_Listing_Item.Merge(dst, src) +func (m *Listing_Item) XXX_Merge(src proto.Message) { + xxx_messageInfo_Listing_Item.Merge(m, src) } func (m *Listing_Item) XXX_Size() int { return xxx_messageInfo_Listing_Item.Size(m) @@ -722,16 +739,17 @@ func (m *Listing_Item_Option) Reset() { *m = Listing_Item_Option{} } func (m *Listing_Item_Option) String() string { return proto.CompactTextString(m) } func (*Listing_Item_Option) ProtoMessage() {} func (*Listing_Item_Option) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2, 1, 0} + return fileDescriptor_b6d125f880f9ca35, []int{2, 1, 0} } + func (m *Listing_Item_Option) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Listing_Item_Option.Unmarshal(m, b) } func (m *Listing_Item_Option) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Listing_Item_Option.Marshal(b, m, deterministic) } -func (dst *Listing_Item_Option) XXX_Merge(src proto.Message) { - xxx_messageInfo_Listing_Item_Option.Merge(dst, src) +func (m *Listing_Item_Option) XXX_Merge(src proto.Message) { + xxx_messageInfo_Listing_Item_Option.Merge(m, src) } func (m *Listing_Item_Option) XXX_Size() int { return xxx_messageInfo_Listing_Item_Option.Size(m) @@ -775,16 +793,17 @@ func (m *Listing_Item_Option_Variant) Reset() { *m = Listing_Item_Option func (m *Listing_Item_Option_Variant) String() string { return proto.CompactTextString(m) } func (*Listing_Item_Option_Variant) ProtoMessage() {} func (*Listing_Item_Option_Variant) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2, 1, 0, 0} + return fileDescriptor_b6d125f880f9ca35, []int{2, 1, 0, 0} } + func (m *Listing_Item_Option_Variant) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Listing_Item_Option_Variant.Unmarshal(m, b) } func (m *Listing_Item_Option_Variant) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Listing_Item_Option_Variant.Marshal(b, m, deterministic) } -func (dst *Listing_Item_Option_Variant) XXX_Merge(src proto.Message) { - xxx_messageInfo_Listing_Item_Option_Variant.Merge(dst, src) +func (m *Listing_Item_Option_Variant) XXX_Merge(src proto.Message) { + xxx_messageInfo_Listing_Item_Option_Variant.Merge(m, src) } func (m *Listing_Item_Option_Variant) XXX_Size() int { return xxx_messageInfo_Listing_Item_Option_Variant.Size(m) @@ -825,16 +844,17 @@ func (m *Listing_Item_Sku) Reset() { *m = Listing_Item_Sku{} } func (m *Listing_Item_Sku) String() string { return proto.CompactTextString(m) } func (*Listing_Item_Sku) ProtoMessage() {} func (*Listing_Item_Sku) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2, 1, 1} + return fileDescriptor_b6d125f880f9ca35, []int{2, 1, 1} } + func (m *Listing_Item_Sku) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Listing_Item_Sku.Unmarshal(m, b) } func (m *Listing_Item_Sku) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Listing_Item_Sku.Marshal(b, m, deterministic) } -func (dst *Listing_Item_Sku) XXX_Merge(src proto.Message) { - xxx_messageInfo_Listing_Item_Sku.Merge(dst, src) +func (m *Listing_Item_Sku) XXX_Merge(src proto.Message) { + xxx_messageInfo_Listing_Item_Sku.Merge(m, src) } func (m *Listing_Item_Sku) XXX_Size() int { return xxx_messageInfo_Listing_Item_Sku.Size(m) @@ -905,16 +925,17 @@ func (m *Listing_Item_Image) Reset() { *m = Listing_Item_Image{} } func (m *Listing_Item_Image) String() string { return proto.CompactTextString(m) } func (*Listing_Item_Image) ProtoMessage() {} func (*Listing_Item_Image) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2, 1, 2} + return fileDescriptor_b6d125f880f9ca35, []int{2, 1, 2} } + func (m *Listing_Item_Image) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Listing_Item_Image.Unmarshal(m, b) } func (m *Listing_Item_Image) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Listing_Item_Image.Marshal(b, m, deterministic) } -func (dst *Listing_Item_Image) XXX_Merge(src proto.Message) { - xxx_messageInfo_Listing_Item_Image.Merge(dst, src) +func (m *Listing_Item_Image) XXX_Merge(src proto.Message) { + xxx_messageInfo_Listing_Item_Image.Merge(m, src) } func (m *Listing_Item_Image) XXX_Size() int { return xxx_messageInfo_Listing_Item_Image.Size(m) @@ -981,16 +1002,17 @@ func (m *Listing_ShippingOption) Reset() { *m = Listing_ShippingOption{} func (m *Listing_ShippingOption) String() string { return proto.CompactTextString(m) } func (*Listing_ShippingOption) ProtoMessage() {} func (*Listing_ShippingOption) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2, 2} + return fileDescriptor_b6d125f880f9ca35, []int{2, 2} } + func (m *Listing_ShippingOption) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Listing_ShippingOption.Unmarshal(m, b) } func (m *Listing_ShippingOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Listing_ShippingOption.Marshal(b, m, deterministic) } -func (dst *Listing_ShippingOption) XXX_Merge(src proto.Message) { - xxx_messageInfo_Listing_ShippingOption.Merge(dst, src) +func (m *Listing_ShippingOption) XXX_Merge(src proto.Message) { + xxx_messageInfo_Listing_ShippingOption.Merge(m, src) } func (m *Listing_ShippingOption) XXX_Size() int { return xxx_messageInfo_Listing_ShippingOption.Size(m) @@ -1045,16 +1067,17 @@ func (m *Listing_ShippingOption_Service) Reset() { *m = Listing_Shipping func (m *Listing_ShippingOption_Service) String() string { return proto.CompactTextString(m) } func (*Listing_ShippingOption_Service) ProtoMessage() {} func (*Listing_ShippingOption_Service) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2, 2, 0} + return fileDescriptor_b6d125f880f9ca35, []int{2, 2, 0} } + func (m *Listing_ShippingOption_Service) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Listing_ShippingOption_Service.Unmarshal(m, b) } func (m *Listing_ShippingOption_Service) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Listing_ShippingOption_Service.Marshal(b, m, deterministic) } -func (dst *Listing_ShippingOption_Service) XXX_Merge(src proto.Message) { - xxx_messageInfo_Listing_ShippingOption_Service.Merge(dst, src) +func (m *Listing_ShippingOption_Service) XXX_Merge(src proto.Message) { + xxx_messageInfo_Listing_ShippingOption_Service.Merge(m, src) } func (m *Listing_ShippingOption_Service) XXX_Size() int { return xxx_messageInfo_Listing_ShippingOption_Service.Size(m) @@ -1123,16 +1146,17 @@ func (m *Listing_Tax) Reset() { *m = Listing_Tax{} } func (m *Listing_Tax) String() string { return proto.CompactTextString(m) } func (*Listing_Tax) ProtoMessage() {} func (*Listing_Tax) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2, 3} + return fileDescriptor_b6d125f880f9ca35, []int{2, 3} } + func (m *Listing_Tax) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Listing_Tax.Unmarshal(m, b) } func (m *Listing_Tax) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Listing_Tax.Marshal(b, m, deterministic) } -func (dst *Listing_Tax) XXX_Merge(src proto.Message) { - xxx_messageInfo_Listing_Tax.Merge(dst, src) +func (m *Listing_Tax) XXX_Merge(src proto.Message) { + xxx_messageInfo_Listing_Tax.Merge(m, src) } func (m *Listing_Tax) XXX_Size() int { return xxx_messageInfo_Listing_Tax.Size(m) @@ -1176,29 +1200,32 @@ type Listing_Coupon struct { // Types that are valid to be assigned to Code: // *Listing_Coupon_Hash // *Listing_Coupon_DiscountCode - Code isListing_Coupon_Code `protobuf_oneof:"code"` - PercentDiscount float32 `protobuf:"fixed32,5,opt,name=percentDiscount,proto3" json:"percentDiscount,omitempty"` - PriceDiscount uint64 `protobuf:"varint,6,opt,name=priceDiscount,proto3" json:"priceDiscount,omitempty"` // Deprecated: Do not use. - BigPriceDiscount string `protobuf:"bytes,7,opt,name=bigPriceDiscount,proto3" json:"bigPriceDiscount,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Code isListing_Coupon_Code `protobuf_oneof:"code"` + // Types that are valid to be assigned to Discount: + // *Listing_Coupon_PercentDiscount + // *Listing_Coupon_PriceDiscount + // *Listing_Coupon_BigPriceDiscount + Discount isListing_Coupon_Discount `protobuf_oneof:"discount"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Listing_Coupon) Reset() { *m = Listing_Coupon{} } func (m *Listing_Coupon) String() string { return proto.CompactTextString(m) } func (*Listing_Coupon) ProtoMessage() {} func (*Listing_Coupon) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{2, 4} + return fileDescriptor_b6d125f880f9ca35, []int{2, 4} } + func (m *Listing_Coupon) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Listing_Coupon.Unmarshal(m, b) } func (m *Listing_Coupon) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Listing_Coupon.Marshal(b, m, deterministic) } -func (dst *Listing_Coupon) XXX_Merge(src proto.Message) { - xxx_messageInfo_Listing_Coupon.Merge(dst, src) +func (m *Listing_Coupon) XXX_Merge(src proto.Message) { + xxx_messageInfo_Listing_Coupon.Merge(m, src) } func (m *Listing_Coupon) XXX_Size() int { return xxx_messageInfo_Listing_Coupon.Size(m) @@ -1253,94 +1280,68 @@ func (m *Listing_Coupon) GetDiscountCode() string { return "" } -func (m *Listing_Coupon) GetPercentDiscount() float32 { +type isListing_Coupon_Discount interface { + isListing_Coupon_Discount() +} + +type Listing_Coupon_PercentDiscount struct { + PercentDiscount float32 `protobuf:"fixed32,5,opt,name=percentDiscount,proto3,oneof"` +} + +type Listing_Coupon_PriceDiscount struct { + PriceDiscount uint64 `protobuf:"varint,6,opt,name=priceDiscount,proto3,oneof"` +} + +type Listing_Coupon_BigPriceDiscount struct { + BigPriceDiscount string `protobuf:"bytes,7,opt,name=bigPriceDiscount,proto3,oneof"` +} + +func (*Listing_Coupon_PercentDiscount) isListing_Coupon_Discount() {} + +func (*Listing_Coupon_PriceDiscount) isListing_Coupon_Discount() {} + +func (*Listing_Coupon_BigPriceDiscount) isListing_Coupon_Discount() {} + +func (m *Listing_Coupon) GetDiscount() isListing_Coupon_Discount { if m != nil { - return m.PercentDiscount + return m.Discount + } + return nil +} + +func (m *Listing_Coupon) GetPercentDiscount() float32 { + if x, ok := m.GetDiscount().(*Listing_Coupon_PercentDiscount); ok { + return x.PercentDiscount } return 0 } // Deprecated: Do not use. func (m *Listing_Coupon) GetPriceDiscount() uint64 { - if m != nil { - return m.PriceDiscount + if x, ok := m.GetDiscount().(*Listing_Coupon_PriceDiscount); ok { + return x.PriceDiscount } return 0 } func (m *Listing_Coupon) GetBigPriceDiscount() string { - if m != nil { - return m.BigPriceDiscount + if x, ok := m.GetDiscount().(*Listing_Coupon_BigPriceDiscount); ok { + return x.BigPriceDiscount } return "" } -// XXX_OneofFuncs is for the internal use of the proto package. -func (*Listing_Coupon) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _Listing_Coupon_OneofMarshaler, _Listing_Coupon_OneofUnmarshaler, _Listing_Coupon_OneofSizer, []interface{}{ +// XXX_OneofWrappers is for the internal use of the proto package. +func (*Listing_Coupon) XXX_OneofWrappers() []interface{} { + return []interface{}{ (*Listing_Coupon_Hash)(nil), (*Listing_Coupon_DiscountCode)(nil), + (*Listing_Coupon_PercentDiscount)(nil), + (*Listing_Coupon_PriceDiscount)(nil), + (*Listing_Coupon_BigPriceDiscount)(nil), } } -func _Listing_Coupon_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*Listing_Coupon) - // code - switch x := m.Code.(type) { - case *Listing_Coupon_Hash: - b.EncodeVarint(2<<3 | proto.WireBytes) - b.EncodeStringBytes(x.Hash) - case *Listing_Coupon_DiscountCode: - b.EncodeVarint(3<<3 | proto.WireBytes) - b.EncodeStringBytes(x.DiscountCode) - case nil: - default: - return fmt.Errorf("Listing_Coupon.Code has unexpected type %T", x) - } - return nil -} - -func _Listing_Coupon_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*Listing_Coupon) - switch tag { - case 2: // code.hash - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeStringBytes() - m.Code = &Listing_Coupon_Hash{x} - return true, err - case 3: // code.discountCode - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeStringBytes() - m.Code = &Listing_Coupon_DiscountCode{x} - return true, err - default: - return false, nil - } -} - -func _Listing_Coupon_OneofSizer(msg proto.Message) (n int) { - m := msg.(*Listing_Coupon) - // code - switch x := m.Code.(type) { - case *Listing_Coupon_Hash: - n += 1 // tag and wire - n += proto.SizeVarint(uint64(len(x.Hash))) - n += len(x.Hash) - case *Listing_Coupon_DiscountCode: - n += 1 // tag and wire - n += proto.SizeVarint(uint64(len(x.DiscountCode))) - n += len(x.DiscountCode) - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - type Order struct { RefundAddress string `protobuf:"bytes,1,opt,name=refundAddress,proto3" json:"refundAddress,omitempty"` RefundFee uint64 `protobuf:"varint,2,opt,name=refundFee,proto3" json:"refundFee,omitempty"` // Deprecated: Do not use. @@ -1362,16 +1363,17 @@ func (m *Order) Reset() { *m = Order{} } func (m *Order) String() string { return proto.CompactTextString(m) } func (*Order) ProtoMessage() {} func (*Order) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{3} + return fileDescriptor_b6d125f880f9ca35, []int{3} } + func (m *Order) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Order.Unmarshal(m, b) } func (m *Order) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Order.Marshal(b, m, deterministic) } -func (dst *Order) XXX_Merge(src proto.Message) { - xxx_messageInfo_Order.Merge(dst, src) +func (m *Order) XXX_Merge(src proto.Message) { + xxx_messageInfo_Order.Merge(m, src) } func (m *Order) XXX_Size() int { return xxx_messageInfo_Order.Size(m) @@ -1477,16 +1479,17 @@ func (m *Order_Shipping) Reset() { *m = Order_Shipping{} } func (m *Order_Shipping) String() string { return proto.CompactTextString(m) } func (*Order_Shipping) ProtoMessage() {} func (*Order_Shipping) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{3, 0} + return fileDescriptor_b6d125f880f9ca35, []int{3, 0} } + func (m *Order_Shipping) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Order_Shipping.Unmarshal(m, b) } func (m *Order_Shipping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Order_Shipping.Marshal(b, m, deterministic) } -func (dst *Order_Shipping) XXX_Merge(src proto.Message) { - xxx_messageInfo_Order_Shipping.Merge(dst, src) +func (m *Order_Shipping) XXX_Merge(src proto.Message) { + xxx_messageInfo_Order_Shipping.Merge(m, src) } func (m *Order_Shipping) XXX_Size() int { return xxx_messageInfo_Order_Shipping.Size(m) @@ -1565,16 +1568,17 @@ func (m *Order_Item) Reset() { *m = Order_Item{} } func (m *Order_Item) String() string { return proto.CompactTextString(m) } func (*Order_Item) ProtoMessage() {} func (*Order_Item) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{3, 1} + return fileDescriptor_b6d125f880f9ca35, []int{3, 1} } + func (m *Order_Item) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Order_Item.Unmarshal(m, b) } func (m *Order_Item) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Order_Item.Marshal(b, m, deterministic) } -func (dst *Order_Item) XXX_Merge(src proto.Message) { - xxx_messageInfo_Order_Item.Merge(dst, src) +func (m *Order_Item) XXX_Merge(src proto.Message) { + xxx_messageInfo_Order_Item.Merge(m, src) } func (m *Order_Item) XXX_Size() int { return xxx_messageInfo_Order_Item.Size(m) @@ -1662,16 +1666,17 @@ func (m *Order_Item_Option) Reset() { *m = Order_Item_Option{} } func (m *Order_Item_Option) String() string { return proto.CompactTextString(m) } func (*Order_Item_Option) ProtoMessage() {} func (*Order_Item_Option) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{3, 1, 0} + return fileDescriptor_b6d125f880f9ca35, []int{3, 1, 0} } + func (m *Order_Item_Option) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Order_Item_Option.Unmarshal(m, b) } func (m *Order_Item_Option) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Order_Item_Option.Marshal(b, m, deterministic) } -func (dst *Order_Item_Option) XXX_Merge(src proto.Message) { - xxx_messageInfo_Order_Item_Option.Merge(dst, src) +func (m *Order_Item_Option) XXX_Merge(src proto.Message) { + xxx_messageInfo_Order_Item_Option.Merge(m, src) } func (m *Order_Item_Option) XXX_Size() int { return xxx_messageInfo_Order_Item_Option.Size(m) @@ -1708,16 +1713,17 @@ func (m *Order_Item_ShippingOption) Reset() { *m = Order_Item_ShippingOp func (m *Order_Item_ShippingOption) String() string { return proto.CompactTextString(m) } func (*Order_Item_ShippingOption) ProtoMessage() {} func (*Order_Item_ShippingOption) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{3, 1, 1} + return fileDescriptor_b6d125f880f9ca35, []int{3, 1, 1} } + func (m *Order_Item_ShippingOption) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Order_Item_ShippingOption.Unmarshal(m, b) } func (m *Order_Item_ShippingOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Order_Item_ShippingOption.Marshal(b, m, deterministic) } -func (dst *Order_Item_ShippingOption) XXX_Merge(src proto.Message) { - xxx_messageInfo_Order_Item_ShippingOption.Merge(dst, src) +func (m *Order_Item_ShippingOption) XXX_Merge(src proto.Message) { + xxx_messageInfo_Order_Item_ShippingOption.Merge(m, src) } func (m *Order_Item_ShippingOption) XXX_Size() int { return xxx_messageInfo_Order_Item_ShippingOption.Size(m) @@ -1762,16 +1768,17 @@ func (m *Order_Payment) Reset() { *m = Order_Payment{} } func (m *Order_Payment) String() string { return proto.CompactTextString(m) } func (*Order_Payment) ProtoMessage() {} func (*Order_Payment) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{3, 2} + return fileDescriptor_b6d125f880f9ca35, []int{3, 2} } + func (m *Order_Payment) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Order_Payment.Unmarshal(m, b) } func (m *Order_Payment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Order_Payment.Marshal(b, m, deterministic) } -func (dst *Order_Payment) XXX_Merge(src proto.Message) { - xxx_messageInfo_Order_Payment.Merge(dst, src) +func (m *Order_Payment) XXX_Merge(src proto.Message) { + xxx_messageInfo_Order_Payment.Merge(m, src) } func (m *Order_Payment) XXX_Size() int { return xxx_messageInfo_Order_Payment.Size(m) @@ -1872,16 +1879,17 @@ func (m *OrderConfirmation) Reset() { *m = OrderConfirmation{} } func (m *OrderConfirmation) String() string { return proto.CompactTextString(m) } func (*OrderConfirmation) ProtoMessage() {} func (*OrderConfirmation) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{4} + return fileDescriptor_b6d125f880f9ca35, []int{4} } + func (m *OrderConfirmation) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OrderConfirmation.Unmarshal(m, b) } func (m *OrderConfirmation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_OrderConfirmation.Marshal(b, m, deterministic) } -func (dst *OrderConfirmation) XXX_Merge(src proto.Message) { - xxx_messageInfo_OrderConfirmation.Merge(dst, src) +func (m *OrderConfirmation) XXX_Merge(src proto.Message) { + xxx_messageInfo_OrderConfirmation.Merge(m, src) } func (m *OrderConfirmation) XXX_Size() int { return xxx_messageInfo_OrderConfirmation.Size(m) @@ -1955,16 +1963,17 @@ func (m *OrderReject) Reset() { *m = OrderReject{} } func (m *OrderReject) String() string { return proto.CompactTextString(m) } func (*OrderReject) ProtoMessage() {} func (*OrderReject) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{5} + return fileDescriptor_b6d125f880f9ca35, []int{5} } + func (m *OrderReject) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OrderReject.Unmarshal(m, b) } func (m *OrderReject) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_OrderReject.Marshal(b, m, deterministic) } -func (dst *OrderReject) XXX_Merge(src proto.Message) { - xxx_messageInfo_OrderReject.Merge(dst, src) +func (m *OrderReject) XXX_Merge(src proto.Message) { + xxx_messageInfo_OrderReject.Merge(m, src) } func (m *OrderReject) XXX_Size() int { return xxx_messageInfo_OrderReject.Size(m) @@ -2008,16 +2017,17 @@ func (m *RatingSignature) Reset() { *m = RatingSignature{} } func (m *RatingSignature) String() string { return proto.CompactTextString(m) } func (*RatingSignature) ProtoMessage() {} func (*RatingSignature) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{6} + return fileDescriptor_b6d125f880f9ca35, []int{6} } + func (m *RatingSignature) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RatingSignature.Unmarshal(m, b) } func (m *RatingSignature) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RatingSignature.Marshal(b, m, deterministic) } -func (dst *RatingSignature) XXX_Merge(src proto.Message) { - xxx_messageInfo_RatingSignature.Merge(dst, src) +func (m *RatingSignature) XXX_Merge(src proto.Message) { + xxx_messageInfo_RatingSignature.Merge(m, src) } func (m *RatingSignature) XXX_Size() int { return xxx_messageInfo_RatingSignature.Size(m) @@ -2057,16 +2067,17 @@ func (m *RatingSignature_TransactionMetadata) Reset() { *m = RatingSigna func (m *RatingSignature_TransactionMetadata) String() string { return proto.CompactTextString(m) } func (*RatingSignature_TransactionMetadata) ProtoMessage() {} func (*RatingSignature_TransactionMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{6, 0} + return fileDescriptor_b6d125f880f9ca35, []int{6, 0} } + func (m *RatingSignature_TransactionMetadata) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RatingSignature_TransactionMetadata.Unmarshal(m, b) } func (m *RatingSignature_TransactionMetadata) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RatingSignature_TransactionMetadata.Marshal(b, m, deterministic) } -func (dst *RatingSignature_TransactionMetadata) XXX_Merge(src proto.Message) { - xxx_messageInfo_RatingSignature_TransactionMetadata.Merge(dst, src) +func (m *RatingSignature_TransactionMetadata) XXX_Merge(src proto.Message) { + xxx_messageInfo_RatingSignature_TransactionMetadata.Merge(m, src) } func (m *RatingSignature_TransactionMetadata) XXX_Size() int { return xxx_messageInfo_RatingSignature_TransactionMetadata.Size(m) @@ -2129,16 +2140,17 @@ func (m *RatingSignature_TransactionMetadata_Image) Reset() { func (m *RatingSignature_TransactionMetadata_Image) String() string { return proto.CompactTextString(m) } func (*RatingSignature_TransactionMetadata_Image) ProtoMessage() {} func (*RatingSignature_TransactionMetadata_Image) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{6, 0, 0} + return fileDescriptor_b6d125f880f9ca35, []int{6, 0, 0} } + func (m *RatingSignature_TransactionMetadata_Image) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RatingSignature_TransactionMetadata_Image.Unmarshal(m, b) } func (m *RatingSignature_TransactionMetadata_Image) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RatingSignature_TransactionMetadata_Image.Marshal(b, m, deterministic) } -func (dst *RatingSignature_TransactionMetadata_Image) XXX_Merge(src proto.Message) { - xxx_messageInfo_RatingSignature_TransactionMetadata_Image.Merge(dst, src) +func (m *RatingSignature_TransactionMetadata_Image) XXX_Merge(src proto.Message) { + xxx_messageInfo_RatingSignature_TransactionMetadata_Image.Merge(m, src) } func (m *RatingSignature_TransactionMetadata_Image) XXX_Size() int { return xxx_messageInfo_RatingSignature_TransactionMetadata_Image.Size(m) @@ -2196,16 +2208,17 @@ func (m *BitcoinSignature) Reset() { *m = BitcoinSignature{} } func (m *BitcoinSignature) String() string { return proto.CompactTextString(m) } func (*BitcoinSignature) ProtoMessage() {} func (*BitcoinSignature) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{7} + return fileDescriptor_b6d125f880f9ca35, []int{7} } + func (m *BitcoinSignature) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_BitcoinSignature.Unmarshal(m, b) } func (m *BitcoinSignature) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_BitcoinSignature.Marshal(b, m, deterministic) } -func (dst *BitcoinSignature) XXX_Merge(src proto.Message) { - xxx_messageInfo_BitcoinSignature.Merge(dst, src) +func (m *BitcoinSignature) XXX_Merge(src proto.Message) { + xxx_messageInfo_BitcoinSignature.Merge(m, src) } func (m *BitcoinSignature) XXX_Size() int { return xxx_messageInfo_BitcoinSignature.Size(m) @@ -2236,7 +2249,7 @@ type OrderFulfillment struct { Timestamp *timestamp.Timestamp `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Physical goods only PhysicalDelivery []*OrderFulfillment_PhysicalDelivery `protobuf:"bytes,4,rep,name=physicalDelivery,proto3" json:"physicalDelivery,omitempty"` - // Digital goods only + //Digital goods only DigitalDelivery []*OrderFulfillment_DigitalDelivery `protobuf:"bytes,5,rep,name=digitalDelivery,proto3" json:"digitalDelivery,omitempty"` // Moderated payments only Payout *OrderFulfillment_Payout `protobuf:"bytes,6,opt,name=payout,proto3" json:"payout,omitempty"` @@ -2253,16 +2266,17 @@ func (m *OrderFulfillment) Reset() { *m = OrderFulfillment{} } func (m *OrderFulfillment) String() string { return proto.CompactTextString(m) } func (*OrderFulfillment) ProtoMessage() {} func (*OrderFulfillment) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{8} + return fileDescriptor_b6d125f880f9ca35, []int{8} } + func (m *OrderFulfillment) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OrderFulfillment.Unmarshal(m, b) } func (m *OrderFulfillment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_OrderFulfillment.Marshal(b, m, deterministic) } -func (dst *OrderFulfillment) XXX_Merge(src proto.Message) { - xxx_messageInfo_OrderFulfillment.Merge(dst, src) +func (m *OrderFulfillment) XXX_Merge(src proto.Message) { + xxx_messageInfo_OrderFulfillment.Merge(m, src) } func (m *OrderFulfillment) XXX_Size() int { return xxx_messageInfo_OrderFulfillment.Size(m) @@ -2348,16 +2362,17 @@ func (m *OrderFulfillment_PhysicalDelivery) Reset() { *m = OrderFulfillm func (m *OrderFulfillment_PhysicalDelivery) String() string { return proto.CompactTextString(m) } func (*OrderFulfillment_PhysicalDelivery) ProtoMessage() {} func (*OrderFulfillment_PhysicalDelivery) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{8, 0} + return fileDescriptor_b6d125f880f9ca35, []int{8, 0} } + func (m *OrderFulfillment_PhysicalDelivery) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OrderFulfillment_PhysicalDelivery.Unmarshal(m, b) } func (m *OrderFulfillment_PhysicalDelivery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_OrderFulfillment_PhysicalDelivery.Marshal(b, m, deterministic) } -func (dst *OrderFulfillment_PhysicalDelivery) XXX_Merge(src proto.Message) { - xxx_messageInfo_OrderFulfillment_PhysicalDelivery.Merge(dst, src) +func (m *OrderFulfillment_PhysicalDelivery) XXX_Merge(src proto.Message) { + xxx_messageInfo_OrderFulfillment_PhysicalDelivery.Merge(m, src) } func (m *OrderFulfillment_PhysicalDelivery) XXX_Size() int { return xxx_messageInfo_OrderFulfillment_PhysicalDelivery.Size(m) @@ -2394,16 +2409,17 @@ func (m *OrderFulfillment_DigitalDelivery) Reset() { *m = OrderFulfillme func (m *OrderFulfillment_DigitalDelivery) String() string { return proto.CompactTextString(m) } func (*OrderFulfillment_DigitalDelivery) ProtoMessage() {} func (*OrderFulfillment_DigitalDelivery) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{8, 1} + return fileDescriptor_b6d125f880f9ca35, []int{8, 1} } + func (m *OrderFulfillment_DigitalDelivery) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OrderFulfillment_DigitalDelivery.Unmarshal(m, b) } func (m *OrderFulfillment_DigitalDelivery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_OrderFulfillment_DigitalDelivery.Marshal(b, m, deterministic) } -func (dst *OrderFulfillment_DigitalDelivery) XXX_Merge(src proto.Message) { - xxx_messageInfo_OrderFulfillment_DigitalDelivery.Merge(dst, src) +func (m *OrderFulfillment_DigitalDelivery) XXX_Merge(src proto.Message) { + xxx_messageInfo_OrderFulfillment_DigitalDelivery.Merge(m, src) } func (m *OrderFulfillment_DigitalDelivery) XXX_Size() int { return xxx_messageInfo_OrderFulfillment_DigitalDelivery.Size(m) @@ -2441,16 +2457,17 @@ func (m *OrderFulfillment_CryptocurrencyDelivery) Reset() { func (m *OrderFulfillment_CryptocurrencyDelivery) String() string { return proto.CompactTextString(m) } func (*OrderFulfillment_CryptocurrencyDelivery) ProtoMessage() {} func (*OrderFulfillment_CryptocurrencyDelivery) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{8, 2} + return fileDescriptor_b6d125f880f9ca35, []int{8, 2} } + func (m *OrderFulfillment_CryptocurrencyDelivery) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OrderFulfillment_CryptocurrencyDelivery.Unmarshal(m, b) } func (m *OrderFulfillment_CryptocurrencyDelivery) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_OrderFulfillment_CryptocurrencyDelivery.Marshal(b, m, deterministic) } -func (dst *OrderFulfillment_CryptocurrencyDelivery) XXX_Merge(src proto.Message) { - xxx_messageInfo_OrderFulfillment_CryptocurrencyDelivery.Merge(dst, src) +func (m *OrderFulfillment_CryptocurrencyDelivery) XXX_Merge(src proto.Message) { + xxx_messageInfo_OrderFulfillment_CryptocurrencyDelivery.Merge(m, src) } func (m *OrderFulfillment_CryptocurrencyDelivery) XXX_Size() int { return xxx_messageInfo_OrderFulfillment_CryptocurrencyDelivery.Size(m) @@ -2483,16 +2500,17 @@ func (m *OrderFulfillment_Payout) Reset() { *m = OrderFulfillment_Payout func (m *OrderFulfillment_Payout) String() string { return proto.CompactTextString(m) } func (*OrderFulfillment_Payout) ProtoMessage() {} func (*OrderFulfillment_Payout) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{8, 3} + return fileDescriptor_b6d125f880f9ca35, []int{8, 3} } + func (m *OrderFulfillment_Payout) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OrderFulfillment_Payout.Unmarshal(m, b) } func (m *OrderFulfillment_Payout) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_OrderFulfillment_Payout.Marshal(b, m, deterministic) } -func (dst *OrderFulfillment_Payout) XXX_Merge(src proto.Message) { - xxx_messageInfo_OrderFulfillment_Payout.Merge(dst, src) +func (m *OrderFulfillment_Payout) XXX_Merge(src proto.Message) { + xxx_messageInfo_OrderFulfillment_Payout.Merge(m, src) } func (m *OrderFulfillment_Payout) XXX_Size() int { return xxx_messageInfo_OrderFulfillment_Payout.Size(m) @@ -2553,16 +2571,17 @@ func (m *OrderCompletion) Reset() { *m = OrderCompletion{} } func (m *OrderCompletion) String() string { return proto.CompactTextString(m) } func (*OrderCompletion) ProtoMessage() {} func (*OrderCompletion) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{9} + return fileDescriptor_b6d125f880f9ca35, []int{9} } + func (m *OrderCompletion) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OrderCompletion.Unmarshal(m, b) } func (m *OrderCompletion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_OrderCompletion.Marshal(b, m, deterministic) } -func (dst *OrderCompletion) XXX_Merge(src proto.Message) { - xxx_messageInfo_OrderCompletion.Merge(dst, src) +func (m *OrderCompletion) XXX_Merge(src proto.Message) { + xxx_messageInfo_OrderCompletion.Merge(m, src) } func (m *OrderCompletion) XXX_Size() int { return xxx_messageInfo_OrderCompletion.Size(m) @@ -2614,16 +2633,17 @@ func (m *OrderProcessingFailure) Reset() { *m = OrderProcessingFailure{} func (m *OrderProcessingFailure) String() string { return proto.CompactTextString(m) } func (*OrderProcessingFailure) ProtoMessage() {} func (*OrderProcessingFailure) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{10} + return fileDescriptor_b6d125f880f9ca35, []int{10} } + func (m *OrderProcessingFailure) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OrderProcessingFailure.Unmarshal(m, b) } func (m *OrderProcessingFailure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_OrderProcessingFailure.Marshal(b, m, deterministic) } -func (dst *OrderProcessingFailure) XXX_Merge(src proto.Message) { - xxx_messageInfo_OrderProcessingFailure.Merge(dst, src) +func (m *OrderProcessingFailure) XXX_Merge(src proto.Message) { + xxx_messageInfo_OrderProcessingFailure.Merge(m, src) } func (m *OrderProcessingFailure) XXX_Size() int { return xxx_messageInfo_OrderProcessingFailure.Size(m) @@ -2667,16 +2687,17 @@ func (m *Rating) Reset() { *m = Rating{} } func (m *Rating) String() string { return proto.CompactTextString(m) } func (*Rating) ProtoMessage() {} func (*Rating) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{11} + return fileDescriptor_b6d125f880f9ca35, []int{11} } + func (m *Rating) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Rating.Unmarshal(m, b) } func (m *Rating) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Rating.Marshal(b, m, deterministic) } -func (dst *Rating) XXX_Merge(src proto.Message) { - xxx_messageInfo_Rating.Merge(dst, src) +func (m *Rating) XXX_Merge(src proto.Message) { + xxx_messageInfo_Rating.Merge(m, src) } func (m *Rating) XXX_Size() int { return xxx_messageInfo_Rating.Size(m) @@ -2725,16 +2746,17 @@ func (m *Rating_RatingData) Reset() { *m = Rating_RatingData{} } func (m *Rating_RatingData) String() string { return proto.CompactTextString(m) } func (*Rating_RatingData) ProtoMessage() {} func (*Rating_RatingData) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{11, 0} + return fileDescriptor_b6d125f880f9ca35, []int{11, 0} } + func (m *Rating_RatingData) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Rating_RatingData.Unmarshal(m, b) } func (m *Rating_RatingData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Rating_RatingData.Marshal(b, m, deterministic) } -func (dst *Rating_RatingData) XXX_Merge(src proto.Message) { - xxx_messageInfo_Rating_RatingData.Merge(dst, src) +func (m *Rating_RatingData) XXX_Merge(src proto.Message) { + xxx_messageInfo_Rating_RatingData.Merge(m, src) } func (m *Rating_RatingData) XXX_Size() int { return xxx_messageInfo_Rating_RatingData.Size(m) @@ -2858,16 +2880,17 @@ func (m *Dispute) Reset() { *m = Dispute{} } func (m *Dispute) String() string { return proto.CompactTextString(m) } func (*Dispute) ProtoMessage() {} func (*Dispute) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{12} + return fileDescriptor_b6d125f880f9ca35, []int{12} } + func (m *Dispute) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Dispute.Unmarshal(m, b) } func (m *Dispute) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Dispute.Marshal(b, m, deterministic) } -func (dst *Dispute) XXX_Merge(src proto.Message) { - xxx_messageInfo_Dispute.Merge(dst, src) +func (m *Dispute) XXX_Merge(src proto.Message) { + xxx_messageInfo_Dispute.Merge(m, src) } func (m *Dispute) XXX_Size() int { return xxx_messageInfo_Dispute.Size(m) @@ -2929,16 +2952,17 @@ func (m *DisputeResolution) Reset() { *m = DisputeResolution{} } func (m *DisputeResolution) String() string { return proto.CompactTextString(m) } func (*DisputeResolution) ProtoMessage() {} func (*DisputeResolution) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{13} + return fileDescriptor_b6d125f880f9ca35, []int{13} } + func (m *DisputeResolution) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DisputeResolution.Unmarshal(m, b) } func (m *DisputeResolution) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DisputeResolution.Marshal(b, m, deterministic) } -func (dst *DisputeResolution) XXX_Merge(src proto.Message) { - xxx_messageInfo_DisputeResolution.Merge(dst, src) +func (m *DisputeResolution) XXX_Merge(src proto.Message) { + xxx_messageInfo_DisputeResolution.Merge(m, src) } func (m *DisputeResolution) XXX_Size() int { return xxx_messageInfo_DisputeResolution.Size(m) @@ -3007,16 +3031,17 @@ func (m *DisputeResolution_Payout) Reset() { *m = DisputeResolution_Payo func (m *DisputeResolution_Payout) String() string { return proto.CompactTextString(m) } func (*DisputeResolution_Payout) ProtoMessage() {} func (*DisputeResolution_Payout) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{13, 0} + return fileDescriptor_b6d125f880f9ca35, []int{13, 0} } + func (m *DisputeResolution_Payout) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DisputeResolution_Payout.Unmarshal(m, b) } func (m *DisputeResolution_Payout) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DisputeResolution_Payout.Marshal(b, m, deterministic) } -func (dst *DisputeResolution_Payout) XXX_Merge(src proto.Message) { - xxx_messageInfo_DisputeResolution_Payout.Merge(dst, src) +func (m *DisputeResolution_Payout) XXX_Merge(src proto.Message) { + xxx_messageInfo_DisputeResolution_Payout.Merge(m, src) } func (m *DisputeResolution_Payout) XXX_Size() int { return xxx_messageInfo_DisputeResolution_Payout.Size(m) @@ -3085,16 +3110,17 @@ func (m *DisputeResolution_Payout_Output) Reset() { *m = DisputeResoluti func (m *DisputeResolution_Payout_Output) String() string { return proto.CompactTextString(m) } func (*DisputeResolution_Payout_Output) ProtoMessage() {} func (*DisputeResolution_Payout_Output) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{13, 0, 0} + return fileDescriptor_b6d125f880f9ca35, []int{13, 0, 0} } + func (m *DisputeResolution_Payout_Output) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DisputeResolution_Payout_Output.Unmarshal(m, b) } func (m *DisputeResolution_Payout_Output) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DisputeResolution_Payout_Output.Marshal(b, m, deterministic) } -func (dst *DisputeResolution_Payout_Output) XXX_Merge(src proto.Message) { - xxx_messageInfo_DisputeResolution_Payout_Output.Merge(dst, src) +func (m *DisputeResolution_Payout_Output) XXX_Merge(src proto.Message) { + xxx_messageInfo_DisputeResolution_Payout_Output.Merge(m, src) } func (m *DisputeResolution_Payout_Output) XXX_Size() int { return xxx_messageInfo_DisputeResolution_Payout_Output.Size(m) @@ -3157,72 +3183,14 @@ func (m *DisputeResolution_Payout_Output) GetBigAmount() string { return "" } -// XXX_OneofFuncs is for the internal use of the proto package. -func (*DisputeResolution_Payout_Output) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _DisputeResolution_Payout_Output_OneofMarshaler, _DisputeResolution_Payout_Output_OneofUnmarshaler, _DisputeResolution_Payout_Output_OneofSizer, []interface{}{ +// XXX_OneofWrappers is for the internal use of the proto package. +func (*DisputeResolution_Payout_Output) XXX_OneofWrappers() []interface{} { + return []interface{}{ (*DisputeResolution_Payout_Output_Script)(nil), (*DisputeResolution_Payout_Output_Address)(nil), } } -func _DisputeResolution_Payout_Output_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*DisputeResolution_Payout_Output) - // scriptOrAddress - switch x := m.ScriptOrAddress.(type) { - case *DisputeResolution_Payout_Output_Script: - b.EncodeVarint(1<<3 | proto.WireBytes) - b.EncodeStringBytes(x.Script) - case *DisputeResolution_Payout_Output_Address: - b.EncodeVarint(3<<3 | proto.WireBytes) - b.EncodeStringBytes(x.Address) - case nil: - default: - return fmt.Errorf("DisputeResolution_Payout_Output.ScriptOrAddress has unexpected type %T", x) - } - return nil -} - -func _DisputeResolution_Payout_Output_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*DisputeResolution_Payout_Output) - switch tag { - case 1: // scriptOrAddress.script - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeStringBytes() - m.ScriptOrAddress = &DisputeResolution_Payout_Output_Script{x} - return true, err - case 3: // scriptOrAddress.address - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeStringBytes() - m.ScriptOrAddress = &DisputeResolution_Payout_Output_Address{x} - return true, err - default: - return false, nil - } -} - -func _DisputeResolution_Payout_Output_OneofSizer(msg proto.Message) (n int) { - m := msg.(*DisputeResolution_Payout_Output) - // scriptOrAddress - switch x := m.ScriptOrAddress.(type) { - case *DisputeResolution_Payout_Output_Script: - n += 1 // tag and wire - n += proto.SizeVarint(uint64(len(x.Script))) - n += len(x.Script) - case *DisputeResolution_Payout_Output_Address: - n += 1 // tag and wire - n += proto.SizeVarint(uint64(len(x.Address))) - n += len(x.Address) - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - type DisputeAcceptance struct { Timestamp *timestamp.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` ClosedBy string `protobuf:"bytes,2,opt,name=closedBy,proto3" json:"closedBy,omitempty"` @@ -3235,16 +3203,17 @@ func (m *DisputeAcceptance) Reset() { *m = DisputeAcceptance{} } func (m *DisputeAcceptance) String() string { return proto.CompactTextString(m) } func (*DisputeAcceptance) ProtoMessage() {} func (*DisputeAcceptance) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{14} + return fileDescriptor_b6d125f880f9ca35, []int{14} } + func (m *DisputeAcceptance) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DisputeAcceptance.Unmarshal(m, b) } func (m *DisputeAcceptance) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DisputeAcceptance.Marshal(b, m, deterministic) } -func (dst *DisputeAcceptance) XXX_Merge(src proto.Message) { - xxx_messageInfo_DisputeAcceptance.Merge(dst, src) +func (m *DisputeAcceptance) XXX_Merge(src proto.Message) { + xxx_messageInfo_DisputeAcceptance.Merge(m, src) } func (m *DisputeAcceptance) XXX_Size() int { return xxx_messageInfo_DisputeAcceptance.Size(m) @@ -3283,16 +3252,17 @@ func (m *Outpoint) Reset() { *m = Outpoint{} } func (m *Outpoint) String() string { return proto.CompactTextString(m) } func (*Outpoint) ProtoMessage() {} func (*Outpoint) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{15} + return fileDescriptor_b6d125f880f9ca35, []int{15} } + func (m *Outpoint) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Outpoint.Unmarshal(m, b) } func (m *Outpoint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Outpoint.Marshal(b, m, deterministic) } -func (dst *Outpoint) XXX_Merge(src proto.Message) { - xxx_messageInfo_Outpoint.Merge(dst, src) +func (m *Outpoint) XXX_Merge(src proto.Message) { + xxx_messageInfo_Outpoint.Merge(m, src) } func (m *Outpoint) XXX_Size() int { return xxx_messageInfo_Outpoint.Size(m) @@ -3347,16 +3317,17 @@ func (m *Refund) Reset() { *m = Refund{} } func (m *Refund) String() string { return proto.CompactTextString(m) } func (*Refund) ProtoMessage() {} func (*Refund) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{16} + return fileDescriptor_b6d125f880f9ca35, []int{16} } + func (m *Refund) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Refund.Unmarshal(m, b) } func (m *Refund) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Refund.Marshal(b, m, deterministic) } -func (dst *Refund) XXX_Merge(src proto.Message) { - xxx_messageInfo_Refund.Merge(dst, src) +func (m *Refund) XXX_Merge(src proto.Message) { + xxx_messageInfo_Refund.Merge(m, src) } func (m *Refund) XXX_Size() int { return xxx_messageInfo_Refund.Size(m) @@ -3416,16 +3387,17 @@ func (m *Refund_TransactionInfo) Reset() { *m = Refund_TransactionInfo{} func (m *Refund_TransactionInfo) String() string { return proto.CompactTextString(m) } func (*Refund_TransactionInfo) ProtoMessage() {} func (*Refund_TransactionInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{16, 0} + return fileDescriptor_b6d125f880f9ca35, []int{16, 0} } + func (m *Refund_TransactionInfo) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Refund_TransactionInfo.Unmarshal(m, b) } func (m *Refund_TransactionInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Refund_TransactionInfo.Marshal(b, m, deterministic) } -func (dst *Refund_TransactionInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_Refund_TransactionInfo.Merge(dst, src) +func (m *Refund_TransactionInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_Refund_TransactionInfo.Merge(m, src) } func (m *Refund_TransactionInfo) XXX_Size() int { return xxx_messageInfo_Refund_TransactionInfo.Size(m) @@ -3476,16 +3448,17 @@ func (m *VendorFinalizedPayment) Reset() { *m = VendorFinalizedPayment{} func (m *VendorFinalizedPayment) String() string { return proto.CompactTextString(m) } func (*VendorFinalizedPayment) ProtoMessage() {} func (*VendorFinalizedPayment) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{17} + return fileDescriptor_b6d125f880f9ca35, []int{17} } + func (m *VendorFinalizedPayment) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_VendorFinalizedPayment.Unmarshal(m, b) } func (m *VendorFinalizedPayment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_VendorFinalizedPayment.Marshal(b, m, deterministic) } -func (dst *VendorFinalizedPayment) XXX_Merge(src proto.Message) { - xxx_messageInfo_VendorFinalizedPayment.Merge(dst, src) +func (m *VendorFinalizedPayment) XXX_Merge(src proto.Message) { + xxx_messageInfo_VendorFinalizedPayment.Merge(m, src) } func (m *VendorFinalizedPayment) XXX_Size() int { return xxx_messageInfo_VendorFinalizedPayment.Size(m) @@ -3517,16 +3490,17 @@ func (m *ID) Reset() { *m = ID{} } func (m *ID) String() string { return proto.CompactTextString(m) } func (*ID) ProtoMessage() {} func (*ID) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{18} + return fileDescriptor_b6d125f880f9ca35, []int{18} } + func (m *ID) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ID.Unmarshal(m, b) } func (m *ID) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ID.Marshal(b, m, deterministic) } -func (dst *ID) XXX_Merge(src proto.Message) { - xxx_messageInfo_ID.Merge(dst, src) +func (m *ID) XXX_Merge(src proto.Message) { + xxx_messageInfo_ID.Merge(m, src) } func (m *ID) XXX_Size() int { return xxx_messageInfo_ID.Size(m) @@ -3577,16 +3551,17 @@ func (m *ID_Pubkeys) Reset() { *m = ID_Pubkeys{} } func (m *ID_Pubkeys) String() string { return proto.CompactTextString(m) } func (*ID_Pubkeys) ProtoMessage() {} func (*ID_Pubkeys) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{18, 0} + return fileDescriptor_b6d125f880f9ca35, []int{18, 0} } + func (m *ID_Pubkeys) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ID_Pubkeys.Unmarshal(m, b) } func (m *ID_Pubkeys) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_ID_Pubkeys.Marshal(b, m, deterministic) } -func (dst *ID_Pubkeys) XXX_Merge(src proto.Message) { - xxx_messageInfo_ID_Pubkeys.Merge(dst, src) +func (m *ID_Pubkeys) XXX_Merge(src proto.Message) { + xxx_messageInfo_ID_Pubkeys.Merge(m, src) } func (m *ID_Pubkeys) XXX_Size() int { return xxx_messageInfo_ID_Pubkeys.Size(m) @@ -3623,16 +3598,17 @@ func (m *Signature) Reset() { *m = Signature{} } func (m *Signature) String() string { return proto.CompactTextString(m) } func (*Signature) ProtoMessage() {} func (*Signature) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{19} + return fileDescriptor_b6d125f880f9ca35, []int{19} } + func (m *Signature) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Signature.Unmarshal(m, b) } func (m *Signature) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Signature.Marshal(b, m, deterministic) } -func (dst *Signature) XXX_Merge(src proto.Message) { - xxx_messageInfo_Signature.Merge(dst, src) +func (m *Signature) XXX_Merge(src proto.Message) { + xxx_messageInfo_Signature.Merge(m, src) } func (m *Signature) XXX_Size() int { return xxx_messageInfo_Signature.Size(m) @@ -3670,16 +3646,17 @@ func (m *SignedListing) Reset() { *m = SignedListing{} } func (m *SignedListing) String() string { return proto.CompactTextString(m) } func (*SignedListing) ProtoMessage() {} func (*SignedListing) Descriptor() ([]byte, []int) { - return fileDescriptor_contracts_f6c2e11bd5cfebaf, []int{20} + return fileDescriptor_b6d125f880f9ca35, []int{20} } + func (m *SignedListing) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SignedListing.Unmarshal(m, b) } func (m *SignedListing) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_SignedListing.Marshal(b, m, deterministic) } -func (dst *SignedListing) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignedListing.Merge(dst, src) +func (m *SignedListing) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignedListing.Merge(m, src) } func (m *SignedListing) XXX_Size() int { return xxx_messageInfo_SignedListing.Size(m) @@ -3712,6 +3689,11 @@ func (m *SignedListing) GetSignature() []byte { } func init() { + proto.RegisterEnum("Listing_Metadata_ContractType", Listing_Metadata_ContractType_name, Listing_Metadata_ContractType_value) + proto.RegisterEnum("Listing_Metadata_Format", Listing_Metadata_Format_name, Listing_Metadata_Format_value) + proto.RegisterEnum("Listing_ShippingOption_ShippingType", Listing_ShippingOption_ShippingType_name, Listing_ShippingOption_ShippingType_value) + proto.RegisterEnum("Order_Payment_Method", Order_Payment_Method_name, Order_Payment_Method_value) + proto.RegisterEnum("Signature_Section", Signature_Section_name, Signature_Section_value) proto.RegisterType((*RicardianContract)(nil), "RicardianContract") proto.RegisterType((*CurrencyDefinition)(nil), "CurrencyDefinition") proto.RegisterType((*Listing)(nil), "Listing") @@ -3759,243 +3741,239 @@ func init() { proto.RegisterType((*ID_Pubkeys)(nil), "ID.Pubkeys") proto.RegisterType((*Signature)(nil), "Signature") proto.RegisterType((*SignedListing)(nil), "SignedListing") - proto.RegisterEnum("Listing_Metadata_ContractType", Listing_Metadata_ContractType_name, Listing_Metadata_ContractType_value) - proto.RegisterEnum("Listing_Metadata_Format", Listing_Metadata_Format_name, Listing_Metadata_Format_value) - proto.RegisterEnum("Listing_ShippingOption_ShippingType", Listing_ShippingOption_ShippingType_name, Listing_ShippingOption_ShippingType_value) - proto.RegisterEnum("Order_Payment_Method", Order_Payment_Method_name, Order_Payment_Method_value) - proto.RegisterEnum("Signature_Section", Signature_Section_name, Signature_Section_value) } -func init() { proto.RegisterFile("contracts.proto", fileDescriptor_contracts_f6c2e11bd5cfebaf) } - -var fileDescriptor_contracts_f6c2e11bd5cfebaf = []byte{ - // 3645 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3a, 0x4b, 0x93, 0x1b, 0x57, - 0x57, 0x6e, 0xbd, 0x75, 0xa4, 0x19, 0x69, 0xae, 0xe7, 0x1b, 0x0b, 0x55, 0xb0, 0xc7, 0x5d, 0xfe, - 0xc2, 0x7c, 0x89, 0xd3, 0x71, 0x86, 0x54, 0xca, 0x21, 0x54, 0x92, 0x19, 0x49, 0x93, 0x11, 0x9e, - 0x87, 0x72, 0x25, 0x1b, 0xc2, 0xc6, 0xf4, 0xa8, 0xef, 0x68, 0x6e, 0x2c, 0x75, 0x2b, 0xfd, 0x18, - 0x8f, 0x60, 0x43, 0xb1, 0x82, 0x62, 0xc1, 0x8e, 0x2c, 0xf9, 0x03, 0x14, 0x3b, 0x56, 0xb0, 0x62, - 0x4f, 0xa5, 0x2a, 0xab, 0xb0, 0xa5, 0x58, 0xb0, 0x83, 0x2a, 0x16, 0x54, 0x85, 0x0d, 0x75, 0x9f, - 0xfd, 0x90, 0xe4, 0xd8, 0xa1, 0xa8, 0x6f, 0xa5, 0x3e, 0x8f, 0x7b, 0xfb, 0xde, 0xf3, 0x3e, 0xa7, - 0x05, 0x8d, 0xb1, 0xe7, 0x86, 0xbe, 0x3d, 0x0e, 0x03, 0x6b, 0xee, 0x7b, 0xa1, 0xd7, 0x46, 0x63, - 0x2f, 0x72, 0x43, 0x7f, 0x31, 0xf6, 0x1c, 0xa2, 0x70, 0x1b, 0x33, 0x12, 0x04, 0xf6, 0x84, 0x48, - 0xf0, 0xde, 0xc4, 0xf3, 0x26, 0x53, 0xf2, 0x3e, 0x87, 0x2e, 0xa2, 0xcb, 0xf7, 0x43, 0x3a, 0x23, - 0x41, 0x68, 0xcf, 0xe6, 0x82, 0xc1, 0xfc, 0x97, 0x02, 0x6c, 0x61, 0x3a, 0xb6, 0x7d, 0x87, 0xda, - 0x6e, 0x47, 0xbe, 0x00, 0x3d, 0x82, 0xcd, 0x6b, 0xe2, 0x3a, 0x9e, 0x7f, 0x42, 0x83, 0x90, 0xba, - 0x93, 0xa0, 0x65, 0xec, 0xe6, 0xf7, 0x6a, 0xfb, 0x15, 0x4b, 0x22, 0x70, 0x86, 0x8e, 0xde, 0x06, - 0xb8, 0x88, 0x16, 0xc4, 0x3f, 0xf7, 0x1d, 0xe2, 0xb7, 0x72, 0xbb, 0xc6, 0x5e, 0x6d, 0xbf, 0x64, - 0x71, 0x08, 0x27, 0x28, 0xe8, 0x04, 0xee, 0x88, 0x95, 0x1c, 0xec, 0x78, 0xee, 0x25, 0xf5, 0x67, - 0x76, 0x48, 0x3d, 0xb7, 0x95, 0xe7, 0x8b, 0x90, 0xb5, 0x44, 0xc1, 0xeb, 0x96, 0xa0, 0x3e, 0xec, - 0x24, 0x48, 0x47, 0xd1, 0xf4, 0x92, 0x4e, 0xa7, 0x33, 0xe2, 0x86, 0xad, 0x02, 0x3f, 0xef, 0x96, - 0x95, 0x25, 0xe0, 0x35, 0x0b, 0x50, 0x17, 0xb6, 0xe3, 0x63, 0x76, 0xbc, 0xd9, 0x7c, 0x4a, 0xf8, - 0xa9, 0x8a, 0xfc, 0x54, 0x4d, 0x2b, 0x83, 0xc7, 0x2b, 0xb9, 0x91, 0x09, 0x65, 0x87, 0x06, 0xf3, - 0x28, 0x24, 0xad, 0x12, 0x5f, 0x58, 0xb1, 0xba, 0x02, 0xc6, 0x8a, 0x80, 0x3e, 0x87, 0x2d, 0xf9, - 0x88, 0x49, 0xe0, 0x4d, 0x23, 0xfe, 0x9a, 0xb2, 0xbc, 0x7c, 0x37, 0x4b, 0xc1, 0xcb, 0xcc, 0x89, - 0x1d, 0x0e, 0xc6, 0x63, 0x32, 0x0f, 0x6d, 0x77, 0x4c, 0x5a, 0x95, 0xf4, 0x0e, 0x31, 0x05, 0x2f, - 0x33, 0xa3, 0x7b, 0x50, 0xf2, 0xc9, 0x65, 0xe4, 0x3a, 0xad, 0x2a, 0x5f, 0x56, 0xb6, 0x30, 0x07, - 0xb1, 0x44, 0xa3, 0x77, 0x00, 0x02, 0x3a, 0x71, 0xed, 0x30, 0xf2, 0x49, 0xd0, 0x02, 0x2e, 0x4d, - 0xb0, 0x86, 0x0a, 0x85, 0x13, 0x54, 0xb4, 0x03, 0x25, 0xe2, 0xfb, 0x9e, 0x1f, 0xb4, 0x6a, 0xbb, - 0xf9, 0xbd, 0x2a, 0x96, 0x90, 0x79, 0x02, 0xa8, 0x13, 0xf9, 0x3e, 0x71, 0xc7, 0x8b, 0x2e, 0xb9, - 0xa4, 0x2e, 0xe5, 0x87, 0x47, 0x50, 0x60, 0x06, 0xdb, 0x32, 0x76, 0x8d, 0xbd, 0x2a, 0xe6, 0xcf, - 0xc8, 0x84, 0xba, 0x43, 0xaf, 0x69, 0x40, 0x2f, 0xe8, 0x94, 0x86, 0x0b, 0x6e, 0x3f, 0x1b, 0x38, - 0x85, 0x33, 0xff, 0xfe, 0x0e, 0x94, 0xa5, 0xb9, 0xb1, 0x3d, 0x82, 0x69, 0x34, 0x51, 0x7b, 0xb0, - 0x67, 0x74, 0x0f, 0x2a, 0x42, 0xb5, 0xfd, 0xae, 0xb4, 0xbf, 0xbc, 0xd5, 0xef, 0x62, 0x8d, 0x44, - 0xef, 0x41, 0x65, 0x46, 0x42, 0xdb, 0xb1, 0x43, 0x5b, 0xda, 0xda, 0x96, 0x32, 0x67, 0xeb, 0x54, - 0x12, 0xb0, 0x66, 0x41, 0xf7, 0xa1, 0x40, 0x43, 0x32, 0x6b, 0x15, 0x38, 0xeb, 0x86, 0x66, 0xed, - 0x87, 0x64, 0x86, 0x39, 0x09, 0x1d, 0x40, 0x23, 0xb8, 0xa2, 0xf3, 0x39, 0x75, 0x27, 0xe7, 0x73, - 0x76, 0xb9, 0xa0, 0x55, 0xe4, 0x92, 0xba, 0xa3, 0xb9, 0x87, 0x29, 0x3a, 0xce, 0xf2, 0x23, 0x13, - 0x8a, 0xa1, 0x7d, 0x43, 0x82, 0x56, 0x89, 0x2f, 0xac, 0xeb, 0x85, 0x23, 0xfb, 0x06, 0x0b, 0x12, - 0xfa, 0x15, 0x94, 0xc7, 0x5e, 0x34, 0x67, 0xdb, 0x97, 0x39, 0x57, 0x43, 0x73, 0x75, 0x38, 0x1e, - 0x2b, 0x3a, 0xba, 0x0b, 0x30, 0xf3, 0x1c, 0xe2, 0xdb, 0x21, 0x53, 0x47, 0x85, 0xab, 0x23, 0x81, - 0x41, 0x16, 0xa0, 0x90, 0xf8, 0xb3, 0xe0, 0xc0, 0x75, 0x3a, 0x9e, 0xeb, 0x50, 0x71, 0xe8, 0x2a, - 0x17, 0xe3, 0x0a, 0x0a, 0x53, 0x8c, 0x30, 0x88, 0x81, 0x37, 0xa5, 0xe3, 0x45, 0x0b, 0x38, 0x67, - 0x0a, 0xd7, 0xfe, 0x8b, 0x22, 0x54, 0x94, 0xfc, 0x50, 0x0b, 0xca, 0xd7, 0xc4, 0x0f, 0x98, 0x49, - 0x1b, 0x5c, 0x89, 0x0a, 0x44, 0x87, 0x50, 0x57, 0x01, 0x6c, 0xb4, 0x98, 0x13, 0xae, 0xa3, 0xcd, - 0xfd, 0xbb, 0x4b, 0x2a, 0xb0, 0x3a, 0x09, 0x2e, 0x9c, 0x5a, 0x83, 0x1e, 0x41, 0xe9, 0xd2, 0x63, - 0xce, 0xcf, 0x15, 0xb8, 0xb9, 0xdf, 0x5a, 0x5e, 0x7d, 0xc4, 0xe9, 0x58, 0xf2, 0xa1, 0x7d, 0x28, - 0x91, 0x9b, 0x39, 0xf5, 0x17, 0x52, 0x8f, 0x6d, 0x4b, 0x44, 0x44, 0x4b, 0x45, 0x44, 0x6b, 0xa4, - 0x22, 0x22, 0x96, 0x9c, 0x4c, 0x48, 0x36, 0x77, 0x15, 0xe2, 0x48, 0xfb, 0xa5, 0x44, 0x68, 0xb6, - 0x8a, 0x57, 0x50, 0xd0, 0x43, 0x68, 0xcc, 0x7d, 0x3a, 0xa6, 0xee, 0x44, 0x99, 0x3b, 0x77, 0xfe, - 0xea, 0x61, 0xae, 0x65, 0xe0, 0x2c, 0x09, 0xb5, 0xa1, 0x32, 0xb5, 0xdd, 0x49, 0x64, 0x4f, 0x08, - 0xf7, 0xfa, 0x2a, 0xd6, 0x30, 0x7b, 0x33, 0x09, 0xc6, 0xbe, 0xf7, 0x92, 0x1d, 0xca, 0x8b, 0xc2, - 0x63, 0x2f, 0xe2, 0x6a, 0x64, 0x82, 0x5c, 0x41, 0x41, 0x0f, 0x00, 0x8d, 0xfd, 0xc5, 0x3c, 0xf4, - 0xd4, 0xee, 0x1d, 0xe6, 0x59, 0x42, 0x9d, 0x95, 0xb1, 0x47, 0x5d, 0x2e, 0xb5, 0x87, 0x8a, 0xab, - 0x9b, 0xf4, 0x31, 0xe0, 0xbb, 0x36, 0x19, 0x57, 0x12, 0x8f, 0xf6, 0x60, 0x83, 0x1d, 0x99, 0x9c, - 0x7a, 0x0e, 0xbd, 0xa4, 0xc4, 0x6f, 0xd5, 0x76, 0x8d, 0xbd, 0x1c, 0xbf, 0x4b, 0x9a, 0x60, 0x3a, - 0x50, 0x4f, 0xea, 0x0a, 0x6d, 0xc1, 0xc6, 0xe0, 0xf8, 0xab, 0x61, 0xbf, 0x73, 0x70, 0xf2, 0xfc, - 0x8b, 0xf3, 0xf3, 0x6e, 0xf3, 0x16, 0x6a, 0x42, 0xbd, 0xdb, 0xff, 0xa2, 0x3f, 0x52, 0x18, 0x03, - 0xd5, 0xa0, 0x3c, 0xec, 0xe1, 0x67, 0xfd, 0x4e, 0xaf, 0x99, 0x43, 0x9b, 0x00, 0x1d, 0x7c, 0xfe, - 0xfb, 0xdd, 0xe7, 0x47, 0x4f, 0xcf, 0xba, 0xcd, 0x3c, 0x42, 0xb0, 0xd9, 0xc1, 0x5f, 0x0d, 0x46, - 0xe7, 0x9d, 0xa7, 0x18, 0xf7, 0xce, 0x3a, 0x5f, 0x35, 0x0b, 0xe6, 0xbb, 0x50, 0x12, 0x3a, 0x45, - 0x0d, 0xa8, 0x1d, 0xf5, 0xff, 0xa0, 0xd7, 0x7d, 0x3e, 0xc0, 0x6c, 0x39, 0xdf, 0xfd, 0xf4, 0x00, - 0x3f, 0xe9, 0x8d, 0x24, 0x26, 0xd7, 0xfe, 0xbb, 0x0a, 0x14, 0x98, 0x83, 0xa2, 0x6d, 0x28, 0x86, - 0x34, 0x9c, 0xaa, 0x30, 0x23, 0x00, 0xb4, 0x0b, 0x35, 0x87, 0x89, 0x91, 0x72, 0xef, 0xe3, 0x26, - 0x58, 0xc5, 0x49, 0x14, 0x7a, 0x1b, 0x36, 0xe7, 0xbe, 0x37, 0x26, 0x41, 0x40, 0xdd, 0x09, 0x93, - 0x35, 0xb7, 0xb4, 0x2a, 0xce, 0x60, 0x51, 0x0b, 0x8a, 0x5c, 0x18, 0xdc, 0xac, 0x0a, 0x5c, 0x3a, - 0x02, 0xc1, 0x62, 0x93, 0x1b, 0x5c, 0xbe, 0xe4, 0x89, 0xa3, 0x82, 0xf9, 0x33, 0xc3, 0x85, 0xf6, - 0x44, 0x38, 0x79, 0x15, 0xf3, 0x67, 0xf4, 0x2e, 0x94, 0xe8, 0xcc, 0x9e, 0x10, 0xe5, 0xd4, 0xb7, - 0x53, 0x11, 0xc6, 0xea, 0x33, 0x1a, 0x96, 0x2c, 0xcc, 0xaf, 0xc7, 0x76, 0x48, 0x26, 0x9e, 0xcf, - 0x4c, 0x51, 0xfa, 0x75, 0x8c, 0x61, 0xd7, 0x9d, 0xf8, 0xf6, 0x4c, 0xb8, 0x72, 0x0e, 0x0b, 0x00, - 0xbd, 0x05, 0xd5, 0xb1, 0xf2, 0x65, 0xe9, 0xba, 0x31, 0x02, 0x59, 0x50, 0xf6, 0x64, 0xd4, 0xaa, - 0xf1, 0x13, 0x6c, 0xa7, 0x4f, 0x20, 0x43, 0x96, 0x62, 0x42, 0xbf, 0x84, 0x42, 0xf0, 0x22, 0x0a, - 0x5a, 0x75, 0x99, 0x5a, 0x53, 0xcc, 0xc3, 0x17, 0x11, 0xe6, 0x64, 0xf4, 0x20, 0x6b, 0x3f, 0x1b, - 0xfc, 0x48, 0x69, 0x24, 0xf3, 0x82, 0x0b, 0x3a, 0x19, 0x70, 0x11, 0x6e, 0x0a, 0x7b, 0x55, 0x30, - 0xfa, 0x58, 0xee, 0xa0, 0xbd, 0xa9, 0xc1, 0x5d, 0xf7, 0xb6, 0xb5, 0x9c, 0x4d, 0x70, 0x9a, 0xb3, - 0xfd, 0x4f, 0x06, 0x94, 0xc4, 0xb9, 0xb9, 0x1e, 0xec, 0x99, 0xce, 0x33, 0xec, 0xf9, 0x35, 0xf4, - 0xff, 0x18, 0x2a, 0xd7, 0xb6, 0x4f, 0x6d, 0x37, 0x0c, 0x5a, 0x79, 0x7e, 0xd1, 0xb7, 0x56, 0x49, - 0xc5, 0x7a, 0x26, 0x98, 0xb0, 0xe6, 0x6e, 0x1f, 0x43, 0x59, 0x22, 0x57, 0xbe, 0xfa, 0x57, 0x50, - 0xe4, 0xba, 0x94, 0xb9, 0x69, 0xa5, 0xb6, 0x05, 0x47, 0xfb, 0x3b, 0x03, 0xf2, 0xc3, 0x17, 0x11, - 0x0b, 0xbe, 0x72, 0xf7, 0x8e, 0x37, 0xbb, 0xf0, 0x78, 0x0d, 0xb6, 0x81, 0x53, 0x38, 0xa6, 0xe2, - 0xb9, 0xef, 0x39, 0xd1, 0x38, 0x94, 0x69, 0xaf, 0x8a, 0x63, 0x04, 0xda, 0x85, 0x6a, 0x10, 0xf9, - 0xe3, 0x2b, 0xdb, 0x9f, 0x08, 0x43, 0xce, 0x73, 0x4b, 0x8d, 0x91, 0xe8, 0x2e, 0x54, 0xbe, 0x89, - 0x6c, 0x37, 0x64, 0x11, 0xa1, 0xa0, 0x19, 0x34, 0x8e, 0x9d, 0xe1, 0x82, 0x4e, 0x86, 0x7a, 0x93, - 0xa2, 0x48, 0x00, 0x49, 0x1c, 0x93, 0xea, 0x05, 0x9d, 0x7c, 0xa9, 0xb6, 0x29, 0x09, 0xa9, 0x26, - 0x50, 0xed, 0x6f, 0x0d, 0x28, 0xf2, 0x2b, 0x32, 0xbd, 0x5f, 0xd2, 0x29, 0x49, 0x88, 0x47, 0xc3, - 0x8c, 0xe6, 0xf9, 0x74, 0x42, 0x5d, 0x7b, 0x2a, 0xaf, 0xa2, 0x61, 0x66, 0xe0, 0x53, 0x7d, 0x8b, - 0x2a, 0x16, 0x00, 0xab, 0x3c, 0x66, 0xc4, 0xa1, 0x91, 0xc8, 0xd2, 0x55, 0x2c, 0x21, 0xc6, 0x1d, - 0xcc, 0xec, 0xe9, 0x54, 0x1e, 0x57, 0x00, 0xdc, 0x0b, 0xa9, 0xab, 0x0e, 0xc8, 0x9f, 0xdb, 0xff, - 0x9e, 0x87, 0xcd, 0x74, 0x8e, 0x5e, 0xa9, 0xbd, 0xc7, 0x50, 0x08, 0xe3, 0xa4, 0xf5, 0x60, 0x4d, - 0x7a, 0xd7, 0x20, 0x4f, 0x5d, 0x7c, 0x05, 0x7a, 0x1b, 0xca, 0x3e, 0x99, 0x70, 0x2f, 0x63, 0xf6, - 0xb4, 0xb9, 0x5f, 0x67, 0x49, 0x9b, 0x95, 0xed, 0x2c, 0x56, 0x63, 0x45, 0x44, 0x9f, 0x40, 0x25, - 0x20, 0xfe, 0x35, 0x1d, 0x13, 0x55, 0x44, 0xdc, 0x5b, 0xfb, 0x16, 0xc1, 0x87, 0xf5, 0x82, 0xf6, - 0x7f, 0x18, 0x50, 0x96, 0xd8, 0x95, 0xc7, 0xd7, 0xd1, 0x2a, 0x97, 0x8d, 0x56, 0x0f, 0x61, 0x8b, - 0x04, 0x21, 0x9d, 0xd9, 0x21, 0x71, 0xba, 0x64, 0x4a, 0xaf, 0x89, 0xbf, 0x90, 0x32, 0x5e, 0x26, - 0xa0, 0x0f, 0xe1, 0xb6, 0xed, 0x88, 0xf0, 0x61, 0x4f, 0x99, 0xe1, 0x0e, 0x32, 0x31, 0x70, 0x15, - 0x39, 0xe5, 0xeb, 0xc5, 0x8c, 0xaf, 0x7f, 0x04, 0x3b, 0x17, 0x74, 0x72, 0xb0, 0x62, 0x53, 0xa1, - 0xa5, 0x35, 0x54, 0xf3, 0x03, 0xa8, 0x27, 0x85, 0xcd, 0x52, 0xc1, 0xc9, 0x39, 0x4b, 0x3c, 0x83, - 0x7e, 0xe7, 0xc9, 0xd3, 0x41, 0xf3, 0x56, 0x36, 0x5b, 0x18, 0xed, 0xbf, 0x32, 0x20, 0x3f, 0xb2, - 0x6f, 0x58, 0x89, 0x12, 0xda, 0x37, 0xbc, 0x06, 0x11, 0x32, 0x52, 0x20, 0x7a, 0x08, 0x10, 0xda, - 0x37, 0x58, 0xaa, 0x2b, 0xb7, 0x42, 0x5d, 0x09, 0x3a, 0x33, 0xfb, 0xd0, 0xbe, 0x51, 0xa7, 0xe0, - 0x42, 0xab, 0xe0, 0x24, 0x8a, 0x45, 0xed, 0x39, 0xf1, 0xc7, 0xc4, 0x0d, 0x99, 0xe3, 0x17, 0x78, - 0x1c, 0x4c, 0x60, 0xda, 0xff, 0x6a, 0x40, 0x49, 0x54, 0x70, 0x6b, 0xf2, 0xd5, 0x36, 0x14, 0xae, - 0xec, 0xe0, 0x4a, 0x78, 0xc3, 0xf1, 0x2d, 0xcc, 0x21, 0xf4, 0x80, 0x55, 0xcb, 0x01, 0x6f, 0xfe, - 0x78, 0xbe, 0xcf, 0x4b, 0x6a, 0x0a, 0x8b, 0xf6, 0xa0, 0x21, 0x5f, 0xd5, 0x95, 0x68, 0x2e, 0xfc, - 0x1c, 0xce, 0xa2, 0x75, 0xc6, 0xd7, 0x7c, 0x25, 0xad, 0xcf, 0x34, 0x01, 0xbd, 0x03, 0x4d, 0xa5, - 0x39, 0xcd, 0x2c, 0x6a, 0x98, 0x25, 0xfc, 0x61, 0x49, 0xd4, 0xf9, 0xe6, 0x9f, 0xd6, 0xa1, 0x28, - 0x7a, 0xbf, 0x07, 0xb0, 0x21, 0x0a, 0xc7, 0x03, 0xc7, 0xf1, 0x49, 0x10, 0xc8, 0xbb, 0xa6, 0x91, - 0x2c, 0x66, 0x09, 0xc4, 0x11, 0x49, 0xda, 0x6b, 0x8c, 0x44, 0xef, 0x42, 0x25, 0x48, 0x4a, 0x9d, - 0x15, 0xc4, 0xfc, 0x0d, 0xda, 0x51, 0xb0, 0x66, 0x40, 0xbf, 0x09, 0x65, 0xde, 0xa9, 0xf5, 0xbb, - 0xb2, 0x02, 0xe4, 0x5d, 0x81, 0xc2, 0xa1, 0xc7, 0x50, 0xd5, 0x2d, 0xb1, 0xec, 0xf5, 0x5e, 0x55, - 0x22, 0xc6, 0xcc, 0xe8, 0x3e, 0x14, 0x59, 0x13, 0xa0, 0x2a, 0xf7, 0x9a, 0x3c, 0x02, 0x6f, 0x0f, - 0x04, 0x05, 0xed, 0x41, 0x79, 0x6e, 0x2f, 0x78, 0x3f, 0x2a, 0xfa, 0xbb, 0x4d, 0xc9, 0x34, 0x10, - 0x58, 0xac, 0xc8, 0xcc, 0x52, 0x7c, 0x9b, 0xf9, 0xfa, 0x13, 0xb2, 0x10, 0xf9, 0xbd, 0x8e, 0x13, - 0x18, 0xb4, 0x0f, 0xdb, 0xf6, 0x34, 0x24, 0xbe, 0x6b, 0x87, 0x84, 0xd5, 0x5c, 0xf6, 0x38, 0xec, - 0xbb, 0x97, 0x9e, 0x2c, 0xf5, 0x56, 0xd2, 0x92, 0xa5, 0x38, 0xa4, 0x4b, 0x71, 0x11, 0xd4, 0xb1, - 0x96, 0x72, 0x4d, 0x07, 0x75, 0x8d, 0x6b, 0x7f, 0x6f, 0x40, 0x45, 0x1b, 0xf2, 0x0e, 0x94, 0x98, - 0x40, 0x47, 0x9e, 0x54, 0x99, 0x84, 0xd8, 0x2b, 0x6c, 0xa9, 0x4b, 0x11, 0xb0, 0x15, 0xc8, 0xbb, - 0x3c, 0x96, 0x0c, 0xf2, 0xb2, 0xcb, 0x63, 0xb9, 0x84, 0x45, 0xe5, 0xd0, 0x0e, 0x89, 0x0c, 0xd6, - 0x02, 0xe0, 0x4e, 0xe2, 0x05, 0xa1, 0x3d, 0xe5, 0xb6, 0x2c, 0xe2, 0x43, 0x02, 0xc3, 0x02, 0xa8, - 0x9c, 0x73, 0x70, 0xbb, 0x5c, 0x0a, 0xa0, 0x92, 0xc8, 0x2e, 0x25, 0x5f, 0x7e, 0xe6, 0x85, 0xbc, - 0xaa, 0xe2, 0x97, 0x4a, 0xe2, 0xda, 0xdf, 0xe7, 0x65, 0x79, 0xb8, 0x0b, 0xb5, 0xa9, 0x08, 0xae, - 0xc7, 0xcc, 0xbf, 0xc4, 0xad, 0x92, 0xa8, 0x54, 0x62, 0xe4, 0xed, 0x68, 0x26, 0x31, 0x3e, 0x8c, - 0xab, 0x27, 0x51, 0x27, 0xa0, 0x84, 0x01, 0x2c, 0xd5, 0x4e, 0x87, 0xb0, 0x99, 0xee, 0xfc, 0x74, - 0x3b, 0x92, 0x58, 0x94, 0xe9, 0x15, 0x33, 0x2b, 0x98, 0x48, 0x67, 0x64, 0xe6, 0x49, 0x11, 0xf1, - 0x67, 0x76, 0x0f, 0xd1, 0xfa, 0x31, 0x59, 0xa8, 0xfa, 0x32, 0x89, 0xe2, 0x05, 0xad, 0x30, 0x32, - 0xe5, 0x75, 0x65, 0x59, 0xd0, 0xa6, 0xb0, 0xc8, 0x04, 0x50, 0x77, 0xfb, 0xe8, 0x43, 0xde, 0x72, - 0x08, 0xbf, 0x4b, 0x60, 0xb3, 0x89, 0xbe, 0xba, 0x9c, 0xe8, 0xf7, 0x5f, 0x59, 0x7e, 0x6d, 0x43, - 0xf1, 0xda, 0x9e, 0x46, 0x44, 0x1a, 0x8b, 0x00, 0xda, 0x9f, 0xbe, 0x56, 0x06, 0x6e, 0x41, 0x59, - 0xa6, 0x3b, 0x65, 0x6a, 0x12, 0x6c, 0xff, 0x4d, 0x1e, 0xca, 0xd2, 0xa1, 0xd0, 0x7b, 0xac, 0x20, - 0x08, 0xaf, 0x3c, 0x87, 0xaf, 0xdd, 0xdc, 0xff, 0x45, 0xda, 0xe1, 0x58, 0x9b, 0x78, 0xe5, 0x39, - 0x58, 0x32, 0xb1, 0xea, 0x49, 0x37, 0xc7, 0xaa, 0x7a, 0xd2, 0x08, 0xd4, 0x86, 0x92, 0x3d, 0xe3, - 0x31, 0x2e, 0xaf, 0xc5, 0x21, 0x31, 0xbc, 0xb4, 0xbe, 0xb2, 0xa9, 0xcb, 0x47, 0x19, 0x05, 0x59, - 0x5a, 0x2b, 0x44, 0xd2, 0x2f, 0x8a, 0x69, 0xbf, 0xe0, 0x0d, 0xb5, 0x43, 0xc8, 0x6c, 0xc8, 0x4b, - 0x4e, 0x99, 0xe5, 0x52, 0x38, 0xc6, 0xa3, 0x0f, 0xf1, 0x84, 0x2c, 0xb8, 0xc2, 0xea, 0x38, 0x85, - 0x43, 0x3b, 0x2c, 0xba, 0x52, 0x97, 0x2b, 0x4a, 0x34, 0x9a, 0x1c, 0x66, 0xe7, 0x62, 0x19, 0x53, - 0x1c, 0x5b, 0x28, 0x28, 0x46, 0xa0, 0x4f, 0x60, 0x53, 0x9c, 0x5f, 0x97, 0xd6, 0xb0, 0xbe, 0xb4, - 0xce, 0xb0, 0x9a, 0x8f, 0xa1, 0x24, 0xc4, 0x87, 0x6e, 0x43, 0xe3, 0xa0, 0xdb, 0xc5, 0xbd, 0xe1, - 0xf0, 0x39, 0xee, 0x7d, 0xf9, 0xb4, 0x37, 0x1c, 0x35, 0x6f, 0x21, 0x80, 0x52, 0xb7, 0x8f, 0x7b, - 0x9d, 0x51, 0xd3, 0x40, 0x1b, 0x50, 0x3d, 0x3d, 0xef, 0xf6, 0xf0, 0xc1, 0xa8, 0xd7, 0x6d, 0xe6, - 0xcc, 0x1f, 0x73, 0xb0, 0xb5, 0x3c, 0xbc, 0x6b, 0x41, 0xd9, 0x63, 0xc8, 0x7e, 0x57, 0xe5, 0x61, - 0x09, 0xa6, 0x83, 0x72, 0xee, 0x4d, 0x82, 0xf2, 0xb2, 0xb5, 0xe7, 0x57, 0x5a, 0xfb, 0x43, 0x68, - 0xf8, 0xe4, 0x9b, 0x88, 0x04, 0x21, 0x71, 0xa4, 0xb0, 0xe2, 0x22, 0x26, 0x4b, 0x42, 0xbf, 0x0b, - 0x4d, 0x11, 0x8b, 0x87, 0xf1, 0x48, 0x4c, 0xd4, 0x68, 0x4d, 0x0b, 0xa7, 0x09, 0x78, 0x89, 0x93, - 0x35, 0xf5, 0x3c, 0xb2, 0xa6, 0x5f, 0x27, 0x14, 0xbf, 0x82, 0x82, 0x4e, 0xe1, 0x4e, 0xe6, 0x00, - 0x5a, 0x5b, 0xe5, 0xf5, 0xda, 0x5a, 0xb7, 0xc6, 0xfc, 0x73, 0x03, 0x6a, 0x62, 0x0e, 0x4b, 0xbe, - 0x26, 0xe3, 0xf0, 0xff, 0x45, 0xec, 0xac, 0x35, 0xa4, 0x13, 0x15, 0x09, 0xb7, 0xac, 0x43, 0x1a, - 0x32, 0x6b, 0x8c, 0xa5, 0xc2, 0xc9, 0xe6, 0x0f, 0x79, 0x68, 0x64, 0xe4, 0x85, 0x3e, 0x4f, 0x4c, - 0xe5, 0x0c, 0xfe, 0xce, 0x07, 0x59, 0x99, 0x5a, 0x23, 0xdf, 0x76, 0x03, 0x7b, 0xcc, 0xee, 0xb9, - 0x62, 0x50, 0xf7, 0x16, 0x54, 0xf5, 0x30, 0x92, 0x1f, 0xbb, 0x8e, 0x63, 0x44, 0xfb, 0xdf, 0x72, - 0x70, 0x7b, 0xc5, 0xfa, 0x44, 0x06, 0x18, 0xc6, 0x93, 0xc4, 0x24, 0x8a, 0xed, 0xab, 0x33, 0xb0, - 0xda, 0x57, 0x23, 0x96, 0x9c, 0x34, 0xbf, 0xc2, 0x49, 0x4d, 0xa8, 0xcb, 0x0d, 0x47, 0xbc, 0xb6, - 0x13, 0x71, 0x22, 0x85, 0x43, 0xc7, 0x50, 0x0d, 0xaf, 0xa2, 0xd9, 0x85, 0x6b, 0xd3, 0xa9, 0x2c, - 0x40, 0xde, 0x79, 0x1d, 0x01, 0xc8, 0x96, 0x31, 0x5e, 0xdc, 0xfe, 0x13, 0xd5, 0x63, 0xa9, 0x3e, - 0xc7, 0x88, 0xfb, 0x9c, 0xb8, 0x23, 0xca, 0x25, 0x3b, 0xa2, 0xb8, 0x7f, 0xca, 0x67, 0xfb, 0x27, - 0xd1, 0x6d, 0x15, 0x92, 0xdd, 0x56, 0xb2, 0x3f, 0x2b, 0xa6, 0xfb, 0x33, 0x73, 0x00, 0xcd, 0xac, - 0xd2, 0x59, 0x66, 0xa7, 0xee, 0x3c, 0x0a, 0xfb, 0xae, 0x43, 0x6e, 0xe4, 0x38, 0x30, 0x81, 0x79, - 0xb5, 0xe2, 0xcc, 0xef, 0xca, 0xd0, 0x5c, 0x9a, 0xd2, 0x6b, 0xe3, 0x75, 0xd2, 0xc6, 0xeb, 0xe8, - 0x91, 0x70, 0x2e, 0x31, 0x12, 0x4e, 0x19, 0x74, 0xfe, 0x4d, 0x0c, 0xfa, 0x0c, 0x9a, 0xf3, 0xab, - 0x45, 0x40, 0xc7, 0xf6, 0x54, 0x77, 0x45, 0xe2, 0x93, 0x82, 0xb9, 0xf4, 0x49, 0xc1, 0x1a, 0x64, - 0x38, 0xf1, 0xd2, 0x5a, 0xf4, 0x04, 0x1a, 0x0e, 0x9d, 0xd0, 0x30, 0xb1, 0x9d, 0x08, 0x20, 0xf7, - 0x97, 0xb7, 0xeb, 0xa6, 0x19, 0x71, 0x76, 0x25, 0x7a, 0x04, 0xa5, 0xb9, 0xbd, 0xf0, 0xa2, 0x50, - 0x7e, 0x63, 0x68, 0xad, 0x38, 0x12, 0xa7, 0x63, 0xc9, 0x87, 0x7e, 0x07, 0x1a, 0x99, 0xb0, 0x24, - 0x43, 0xc9, 0x72, 0xfc, 0xca, 0x32, 0xf2, 0x64, 0xec, 0x85, 0xe2, 0xfb, 0x02, 0x4b, 0xc6, 0x5e, - 0x48, 0xd0, 0x1f, 0xc1, 0x8e, 0x98, 0x28, 0x8e, 0x75, 0x20, 0x92, 0xb7, 0xaa, 0xf2, 0x5b, 0xed, - 0x2d, 0x9f, 0xa8, 0xb3, 0x92, 0x1f, 0xaf, 0xd9, 0xa7, 0x3d, 0x82, 0x66, 0x56, 0xac, 0xbc, 0x04, - 0x60, 0x85, 0x02, 0xf1, 0x95, 0xf2, 0x25, 0xc8, 0xc2, 0x7e, 0xe8, 0xdb, 0xe3, 0x17, 0xd4, 0x9d, - 0x9c, 0x45, 0xb3, 0x0b, 0xa2, 0x92, 0x79, 0x06, 0xdb, 0xfe, 0x0c, 0x1a, 0x19, 0xe9, 0xa2, 0x26, - 0xe4, 0x23, 0x7f, 0x2a, 0x37, 0x64, 0x8f, 0xcc, 0xcc, 0xe7, 0x76, 0x10, 0xbc, 0xf4, 0x7c, 0x47, - 0x8d, 0x21, 0x14, 0xdc, 0xfe, 0x14, 0x76, 0x56, 0x5f, 0x84, 0x35, 0x37, 0x61, 0xec, 0xa5, 0x3a, - 0xb8, 0xa6, 0x91, 0xed, 0x1f, 0x0d, 0x28, 0x09, 0xdd, 0xe8, 0x98, 0x69, 0xbc, 0x32, 0x66, 0xf2, - 0x71, 0x1a, 0x5f, 0x70, 0x90, 0x2a, 0xb4, 0xd3, 0x48, 0x64, 0x41, 0x53, 0x20, 0x8e, 0x08, 0x19, - 0x10, 0xff, 0x70, 0x11, 0x92, 0x44, 0xd1, 0xb2, 0x44, 0x43, 0x8f, 0xe0, 0x36, 0x6b, 0xd8, 0xb2, - 0x4b, 0x84, 0xbb, 0xaf, 0x22, 0xa1, 0x03, 0xd8, 0xd2, 0xbb, 0xe8, 0x7c, 0x54, 0x5c, 0x9f, 0x8f, - 0x96, 0xb9, 0xcd, 0x7f, 0x30, 0xa0, 0x91, 0xfd, 0x60, 0xb6, 0xde, 0xa1, 0x7f, 0x7e, 0x36, 0xfa, - 0x00, 0x40, 0xbc, 0x7c, 0xf8, 0xca, 0x9c, 0x94, 0x60, 0x42, 0xf7, 0xa1, 0x2c, 0xec, 0x3e, 0x90, - 0x6e, 0x5e, 0x96, 0x8e, 0x81, 0x15, 0xde, 0xfc, 0x5b, 0x03, 0x76, 0xf8, 0xe9, 0x07, 0x7a, 0x12, - 0x7c, 0x64, 0xd3, 0x29, 0x73, 0x91, 0xf5, 0x29, 0xf5, 0x18, 0xb6, 0xed, 0x30, 0x24, 0xb3, 0x79, - 0x48, 0x9c, 0x53, 0xf1, 0x65, 0x36, 0xf1, 0xf1, 0x63, 0xdb, 0x92, 0x38, 0x2b, 0x41, 0xc3, 0x2b, - 0x57, 0x20, 0x0b, 0x2a, 0xea, 0x53, 0x88, 0xfe, 0x52, 0xba, 0xf4, 0xe1, 0x16, 0x6b, 0x1e, 0xf3, - 0x9f, 0x0b, 0x50, 0x12, 0x57, 0x40, 0xfb, 0xaa, 0xb9, 0xec, 0xc6, 0x49, 0x16, 0xc9, 0xfb, 0xc9, - 0x1f, 0x46, 0xc1, 0x09, 0xae, 0x9f, 0x48, 0xaa, 0xff, 0x99, 0x07, 0xc0, 0x29, 0xe6, 0x38, 0x53, - 0x1a, 0xd9, 0x4c, 0xf9, 0x93, 0x1f, 0xe6, 0x2c, 0xa8, 0x8a, 0xe7, 0x21, 0x55, 0x0d, 0xfd, 0x72, - 0x5c, 0x8a, 0x59, 0x7e, 0xaa, 0xa5, 0x67, 0x25, 0x30, 0x7b, 0x3c, 0x63, 0x2d, 0x44, 0x51, 0x96, - 0xc0, 0x0a, 0xc1, 0x87, 0x51, 0x0c, 0x60, 0xef, 0x2a, 0xf1, 0xa3, 0x6a, 0x38, 0x95, 0xd3, 0x19, - 0x3d, 0x5b, 0x78, 0x33, 0x9e, 0x94, 0x59, 0x56, 0xde, 0xc4, 0x2c, 0x99, 0x95, 0x5c, 0x13, 0x9f, - 0x25, 0xe1, 0xaa, 0xe8, 0xc7, 0x25, 0xc8, 0x28, 0xdf, 0x44, 0x76, 0xe2, 0xab, 0x8c, 0x02, 0xb3, - 0x03, 0xeb, 0x1a, 0xa7, 0xa6, 0x06, 0xd6, 0x0f, 0x60, 0xc3, 0x91, 0x31, 0x68, 0x38, 0x27, 0xc4, - 0x69, 0xd5, 0x39, 0x4f, 0x1a, 0x89, 0xf6, 0xa0, 0x31, 0x8e, 0x82, 0xd0, 0x9b, 0x11, 0x5f, 0xce, - 0x09, 0xf9, 0x58, 0x7e, 0x03, 0x67, 0xd1, 0xac, 0x24, 0xf0, 0xc9, 0x35, 0x25, 0x2f, 0xe5, 0x58, - 0x5e, 0x42, 0xe6, 0x0f, 0x06, 0x94, 0xe5, 0xa7, 0xe5, 0xb4, 0x0c, 0x8c, 0x37, 0x91, 0xc1, 0x36, - 0x14, 0xc7, 0x53, 0x9b, 0xce, 0x54, 0x19, 0xc2, 0x81, 0xe5, 0x18, 0x97, 0x5f, 0x15, 0xe3, 0x7e, - 0x0b, 0xaa, 0x5e, 0x14, 0xce, 0x3d, 0xea, 0x86, 0xca, 0x4b, 0xab, 0xd6, 0xb9, 0xc4, 0xe0, 0x98, - 0xc6, 0x0a, 0xee, 0x80, 0xf8, 0xd4, 0x9e, 0xd2, 0x3f, 0x26, 0x8e, 0x72, 0x0d, 0x6e, 0x09, 0x75, - 0xbc, 0x82, 0x62, 0xfe, 0x59, 0x09, 0xb6, 0x96, 0xbe, 0xbb, 0xff, 0x1f, 0x2e, 0x99, 0x88, 0x69, - 0xb9, 0x74, 0x4c, 0xbb, 0x0b, 0x30, 0xf7, 0xbd, 0xb9, 0x17, 0x10, 0xe7, 0x50, 0xcd, 0x46, 0x12, - 0x18, 0x3e, 0x06, 0x8a, 0xff, 0x13, 0x20, 0xa2, 0x71, 0x02, 0x83, 0x3e, 0xd0, 0x99, 0x5f, 0x44, - 0xde, 0xdf, 0x58, 0xfe, 0xbf, 0x40, 0x36, 0xf5, 0x3f, 0x82, 0xdb, 0xda, 0x7e, 0xb5, 0x4f, 0x89, - 0x49, 0x41, 0x1d, 0xaf, 0x22, 0xb5, 0xff, 0x2b, 0xff, 0xa6, 0x39, 0xea, 0x3e, 0x94, 0x78, 0x59, - 0x27, 0x66, 0xa6, 0x29, 0xb5, 0x48, 0x02, 0x3a, 0x84, 0x9a, 0xf8, 0xc3, 0x44, 0x14, 0xce, 0x23, - 0x15, 0xc1, 0x76, 0xd7, 0x1e, 0xdf, 0x12, 0x7c, 0x38, 0xb9, 0x08, 0x75, 0xa1, 0x2e, 0xff, 0xbc, - 0x21, 0x36, 0x29, 0xbc, 0xe6, 0x26, 0xa9, 0x55, 0xe8, 0xf7, 0xa0, 0xa1, 0x6f, 0x2d, 0x37, 0x2a, - 0xbe, 0xe6, 0x46, 0xd9, 0x85, 0xac, 0x9f, 0x16, 0x62, 0x4e, 0x7d, 0xf8, 0x5d, 0xd7, 0x4f, 0xa7, - 0x59, 0xdb, 0x7f, 0x69, 0x40, 0x49, 0xee, 0xd3, 0x82, 0x92, 0xf0, 0x68, 0x91, 0x3f, 0x8e, 0x6f, - 0x61, 0x09, 0xa3, 0x76, 0x3c, 0x49, 0x50, 0x63, 0x5e, 0x3d, 0x4b, 0x88, 0xe7, 0x13, 0xb9, 0x55, - 0xf3, 0x89, 0x78, 0x0e, 0x50, 0xc8, 0xcc, 0x01, 0x0e, 0xb7, 0xa0, 0x21, 0xf6, 0x3f, 0xf7, 0xa5, - 0x77, 0x99, 0x54, 0xfb, 0x40, 0xe2, 0x6f, 0x22, 0x3f, 0xdf, 0x07, 0xda, 0x50, 0x19, 0x4f, 0xa5, - 0x9d, 0xcb, 0x22, 0x4a, 0xc1, 0xe6, 0xd7, 0x50, 0x51, 0xf6, 0xc1, 0xaa, 0xcb, 0xab, 0x78, 0x02, - 0x27, 0xe6, 0xdb, 0xdb, 0x50, 0xa4, 0xbc, 0x65, 0x10, 0x7f, 0x03, 0x11, 0x00, 0x6a, 0xa9, 0xe1, - 0x51, 0x5c, 0xd7, 0x08, 0x84, 0xfc, 0xbe, 0xf0, 0x8c, 0x13, 0x0b, 0xfa, 0xfb, 0x02, 0x87, 0xcd, - 0xff, 0xce, 0x41, 0x49, 0x0c, 0x35, 0x7f, 0x8d, 0x8d, 0x2f, 0xea, 0xc1, 0x96, 0x18, 0x5f, 0x27, - 0x1a, 0x39, 0x69, 0xbe, 0x77, 0xe4, 0x3f, 0x6f, 0x92, 0x3d, 0x5e, 0xdf, 0xbd, 0xf4, 0xf0, 0xf2, - 0x8a, 0x55, 0x13, 0xc0, 0xf6, 0x5f, 0x1b, 0xd0, 0xc8, 0x2c, 0xe5, 0x0d, 0xe0, 0x0d, 0x75, 0x74, - 0x03, 0x78, 0x43, 0x9d, 0x58, 0x7c, 0xb9, 0x57, 0x89, 0x2f, 0x9f, 0x16, 0x1f, 0xfa, 0x18, 0x36, - 0x38, 0x93, 0xb6, 0xef, 0xc2, 0x2b, 0x3e, 0xc5, 0xa6, 0x38, 0xcd, 0x7d, 0xd8, 0x79, 0xc6, 0xfd, - 0xee, 0x88, 0x35, 0x88, 0x2c, 0xe0, 0xaa, 0x21, 0xdd, 0x5a, 0x45, 0x98, 0xff, 0x68, 0x40, 0xae, - 0xdf, 0x65, 0x39, 0x68, 0x4e, 0x12, 0x74, 0x09, 0x31, 0xfc, 0x95, 0xed, 0x3a, 0x53, 0x35, 0x02, - 0x94, 0x10, 0xfa, 0x25, 0x94, 0xe7, 0xd1, 0xc5, 0x0b, 0xb2, 0x08, 0x64, 0x60, 0xa9, 0x59, 0xfd, - 0xae, 0x35, 0x10, 0x28, 0xac, 0x68, 0x2c, 0xba, 0x5e, 0x68, 0xfd, 0xf0, 0x9b, 0xd4, 0x71, 0x02, - 0xd3, 0xfe, 0x0c, 0xca, 0x72, 0x0d, 0x93, 0x09, 0x75, 0x88, 0x18, 0x73, 0x8a, 0x82, 0x46, 0xc3, - 0xec, 0xf8, 0x72, 0x91, 0x2c, 0x8c, 0x14, 0x68, 0xfe, 0x8f, 0x01, 0xd5, 0xb8, 0x71, 0x7a, 0x08, - 0xe5, 0x80, 0x08, 0x55, 0x8b, 0x61, 0x24, 0x8a, 0xff, 0x3f, 0x65, 0x0d, 0x05, 0x05, 0x2b, 0x16, - 0xd6, 0xc2, 0xe8, 0xfa, 0x8a, 0x15, 0xdc, 0x81, 0xdc, 0x3c, 0x83, 0x35, 0xbf, 0xe5, 0x9f, 0xfa, - 0xc4, 0x9a, 0x1a, 0x94, 0x4f, 0xfa, 0xc3, 0x51, 0xff, 0xec, 0x8b, 0xe6, 0x2d, 0x54, 0x85, 0xe2, - 0x39, 0xee, 0xf6, 0x70, 0xd3, 0x40, 0x3b, 0x80, 0xf8, 0xe3, 0xf3, 0xce, 0xf9, 0xd9, 0x51, 0x1f, - 0x9f, 0x1e, 0x8c, 0xfa, 0xe7, 0x67, 0xcd, 0x1c, 0xfa, 0x05, 0x6c, 0x09, 0xfc, 0xd1, 0xd3, 0x93, - 0xa3, 0xfe, 0xc9, 0xc9, 0x69, 0xef, 0x6c, 0xd4, 0xcc, 0xa3, 0x6d, 0x68, 0x2a, 0xf6, 0xd3, 0xc1, - 0x49, 0x8f, 0x33, 0x17, 0xd8, 0xe6, 0xdd, 0xfe, 0x70, 0xf0, 0x74, 0xd4, 0x6b, 0x16, 0xd9, 0x8e, - 0x12, 0x78, 0x8e, 0x7b, 0xc3, 0xf3, 0x93, 0xa7, 0x9c, 0xa9, 0x84, 0x00, 0x4a, 0xb8, 0xc7, 0xff, - 0xbc, 0x51, 0x36, 0x09, 0x6c, 0xb0, 0xfb, 0x11, 0x47, 0xfd, 0x4b, 0xcb, 0x84, 0xb2, 0x1c, 0x75, - 0xc8, 0xd8, 0x11, 0xff, 0x7d, 0x50, 0x11, 0xb4, 0xff, 0xe7, 0x12, 0xfe, 0x9f, 0xaa, 0x3d, 0xf3, - 0x99, 0xda, 0xf3, 0xb0, 0xf0, 0x87, 0xb9, 0xf9, 0xc5, 0x45, 0x89, 0xfb, 0xe5, 0x6f, 0xff, 0x6f, - 0x00, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xc3, 0x3b, 0x5c, 0x15, 0x29, 0x00, 0x00, +func init() { proto.RegisterFile("contracts.proto", fileDescriptor_b6d125f880f9ca35) } + +var fileDescriptor_b6d125f880f9ca35 = []byte{ + // 3661 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3a, 0x4b, 0x8f, 0x23, 0xd7, + 0x5a, 0x53, 0x7e, 0xfb, 0xb3, 0xbb, 0xed, 0x3e, 0xd3, 0xb7, 0xc7, 0x58, 0x61, 0xa6, 0xa7, 0x34, + 0x37, 0xf4, 0x9d, 0xf4, 0xad, 0x3b, 0x69, 0xae, 0xae, 0xe6, 0x72, 0x51, 0x92, 0x6e, 0xdb, 0x9d, + 0x36, 0xd3, 0x0f, 0xe7, 0xd8, 0x33, 0x10, 0x36, 0x43, 0xb5, 0xeb, 0xb4, 0xfb, 0x64, 0xec, 0x2a, + 0xa7, 0x1e, 0x3d, 0x6d, 0xd8, 0x20, 0x56, 0x20, 0x16, 0xec, 0xc8, 0x92, 0x3f, 0x80, 0xf8, 0x03, + 0xb0, 0x62, 0xc3, 0x0a, 0x45, 0xca, 0x2a, 0xec, 0x59, 0xb0, 0x03, 0x09, 0x24, 0xa4, 0xb0, 0x41, + 0xe7, 0x59, 0x0f, 0xdb, 0x93, 0x99, 0x20, 0x74, 0x57, 0xae, 0xef, 0x71, 0x4e, 0x9d, 0xf3, 0xbd, + 0xbf, 0xaf, 0x0c, 0x8d, 0xb1, 0xe7, 0x86, 0xbe, 0x3d, 0x0e, 0x03, 0x6b, 0xee, 0x7b, 0xa1, 0xd7, + 0x46, 0x63, 0x2f, 0x72, 0x43, 0x7f, 0x31, 0xf6, 0x1c, 0xa2, 0x70, 0x1b, 0x33, 0x12, 0x04, 0xf6, + 0x84, 0x48, 0xf0, 0xc1, 0xc4, 0xf3, 0x26, 0x53, 0xf2, 0x33, 0x0e, 0x5d, 0x46, 0x57, 0x3f, 0x0b, + 0xe9, 0x8c, 0x04, 0xa1, 0x3d, 0x9b, 0x0b, 0x06, 0xf3, 0x5f, 0x0a, 0xb0, 0x85, 0xe9, 0xd8, 0xf6, + 0x1d, 0x6a, 0xbb, 0x1d, 0xf9, 0x02, 0xf4, 0x04, 0x36, 0x6f, 0x88, 0xeb, 0x78, 0xfe, 0x29, 0x0d, + 0x42, 0xea, 0x4e, 0x82, 0x96, 0xb1, 0x9b, 0xdf, 0xab, 0x1d, 0x54, 0x2c, 0x89, 0xc0, 0x19, 0x3a, + 0x7a, 0x1f, 0xe0, 0x32, 0x5a, 0x10, 0xff, 0xc2, 0x77, 0x88, 0xdf, 0xca, 0xed, 0x1a, 0x7b, 0xb5, + 0x83, 0x92, 0xc5, 0x21, 0x9c, 0xa0, 0xa0, 0x53, 0xb8, 0x27, 0x56, 0x72, 0xb0, 0xe3, 0xb9, 0x57, + 0xd4, 0x9f, 0xd9, 0x21, 0xf5, 0xdc, 0x56, 0x9e, 0x2f, 0x42, 0xd6, 0x12, 0x05, 0xaf, 0x5b, 0x82, + 0xfa, 0xb0, 0x93, 0x20, 0x1d, 0x47, 0xd3, 0x2b, 0x3a, 0x9d, 0xce, 0x88, 0x1b, 0xb6, 0x0a, 0xfc, + 0xbc, 0x5b, 0x56, 0x96, 0x80, 0xd7, 0x2c, 0x40, 0x5d, 0xd8, 0x8e, 0x8f, 0xd9, 0xf1, 0x66, 0xf3, + 0x29, 0xe1, 0xa7, 0x2a, 0xf2, 0x53, 0x35, 0xad, 0x0c, 0x1e, 0xaf, 0xe4, 0x46, 0x26, 0x94, 0x1d, + 0x1a, 0xcc, 0xa3, 0x90, 0xb4, 0x4a, 0x7c, 0x61, 0xc5, 0xea, 0x0a, 0x18, 0x2b, 0x02, 0xfa, 0x04, + 0xb6, 0xe4, 0x23, 0x26, 0x81, 0x37, 0x8d, 0xf8, 0x6b, 0xca, 0xf2, 0xf2, 0xdd, 0x2c, 0x05, 0x2f, + 0x33, 0x27, 0x76, 0x38, 0x1c, 0x8f, 0xc9, 0x3c, 0xb4, 0xdd, 0x31, 0x69, 0x55, 0xd2, 0x3b, 0xc4, + 0x14, 0xbc, 0xcc, 0x8c, 0x1e, 0x40, 0xc9, 0x27, 0x57, 0x91, 0xeb, 0xb4, 0xaa, 0x7c, 0x59, 0xd9, + 0xc2, 0x1c, 0xc4, 0x12, 0x8d, 0x1e, 0x03, 0x04, 0x74, 0xe2, 0xda, 0x61, 0xe4, 0x93, 0xa0, 0x05, + 0x5c, 0x9a, 0x60, 0x0d, 0x15, 0x0a, 0x27, 0xa8, 0x68, 0x07, 0x4a, 0xc4, 0xf7, 0x3d, 0x3f, 0x68, + 0xd5, 0x76, 0xf3, 0x7b, 0x55, 0x2c, 0x21, 0xf3, 0x14, 0x50, 0x27, 0xf2, 0x7d, 0xe2, 0x8e, 0x17, + 0x5d, 0x72, 0x45, 0x5d, 0xca, 0x0f, 0x8f, 0xa0, 0xc0, 0x0c, 0xb6, 0x65, 0xec, 0x1a, 0x7b, 0x55, + 0xcc, 0x9f, 0x91, 0x09, 0x75, 0x87, 0xde, 0xd0, 0x80, 0x5e, 0xd2, 0x29, 0x0d, 0x17, 0xdc, 0x7e, + 0x36, 0x70, 0x0a, 0x67, 0xfe, 0xd3, 0x3d, 0x28, 0x4b, 0x73, 0x63, 0x7b, 0x04, 0xd3, 0x68, 0xa2, + 0xf6, 0x60, 0xcf, 0xe8, 0x01, 0x54, 0x84, 0x6a, 0xfb, 0x5d, 0x69, 0x7f, 0x79, 0xab, 0xdf, 0xc5, + 0x1a, 0x89, 0x7e, 0x0a, 0x95, 0x19, 0x09, 0x6d, 0xc7, 0x0e, 0x6d, 0x69, 0x6b, 0x5b, 0xca, 0x9c, + 0xad, 0x33, 0x49, 0xc0, 0x9a, 0x05, 0x3d, 0x84, 0x02, 0x0d, 0xc9, 0xac, 0x55, 0xe0, 0xac, 0x1b, + 0x9a, 0xb5, 0x1f, 0x92, 0x19, 0xe6, 0x24, 0x74, 0x08, 0x8d, 0xe0, 0x9a, 0xce, 0xe7, 0xd4, 0x9d, + 0x5c, 0xcc, 0xd9, 0xe5, 0x82, 0x56, 0x91, 0x4b, 0xea, 0x9e, 0xe6, 0x1e, 0xa6, 0xe8, 0x38, 0xcb, + 0x8f, 0x4c, 0x28, 0x86, 0xf6, 0x2d, 0x09, 0x5a, 0x25, 0xbe, 0xb0, 0xae, 0x17, 0x8e, 0xec, 0x5b, + 0x2c, 0x48, 0xe8, 0x27, 0x50, 0x1e, 0x7b, 0xd1, 0x9c, 0x6d, 0x5f, 0xe6, 0x5c, 0x0d, 0xcd, 0xd5, + 0xe1, 0x78, 0xac, 0xe8, 0xe8, 0x3e, 0xc0, 0xcc, 0x73, 0x88, 0x6f, 0x87, 0x4c, 0x1d, 0x15, 0xae, + 0x8e, 0x04, 0x06, 0x59, 0x80, 0x42, 0xe2, 0xcf, 0x82, 0x43, 0xd7, 0xe9, 0x78, 0xae, 0x43, 0xc5, + 0xa1, 0xab, 0x5c, 0x8c, 0x2b, 0x28, 0x4c, 0x31, 0xc2, 0x20, 0x06, 0xde, 0x94, 0x8e, 0x17, 0x2d, + 0xe0, 0x9c, 0x29, 0x5c, 0xfb, 0x2f, 0x8a, 0x50, 0x51, 0xf2, 0x43, 0x2d, 0x28, 0xdf, 0x10, 0x3f, + 0x60, 0x26, 0x6d, 0x70, 0x25, 0x2a, 0x10, 0x1d, 0x41, 0x5d, 0x05, 0xb0, 0xd1, 0x62, 0x4e, 0xb8, + 0x8e, 0x36, 0x0f, 0xee, 0x2f, 0xa9, 0xc0, 0xea, 0x24, 0xb8, 0x70, 0x6a, 0x0d, 0x7a, 0x02, 0xa5, + 0x2b, 0x8f, 0x39, 0x3f, 0x57, 0xe0, 0xe6, 0x41, 0x6b, 0x79, 0xf5, 0x31, 0xa7, 0x63, 0xc9, 0x87, + 0x0e, 0xa0, 0x44, 0x6e, 0xe7, 0xd4, 0x5f, 0x48, 0x3d, 0xb6, 0x2d, 0x11, 0x11, 0x2d, 0x15, 0x11, + 0xad, 0x91, 0x8a, 0x88, 0x58, 0x72, 0x32, 0x21, 0xd9, 0xdc, 0x55, 0x88, 0x23, 0xed, 0x97, 0x12, + 0xa1, 0xd9, 0x2a, 0x5e, 0x41, 0x41, 0xfb, 0xd0, 0x98, 0xfb, 0x74, 0x4c, 0xdd, 0x89, 0x32, 0x77, + 0xee, 0xfc, 0xd5, 0xa3, 0x5c, 0xcb, 0xc0, 0x59, 0x12, 0x6a, 0x43, 0x65, 0x6a, 0xbb, 0x93, 0xc8, + 0x9e, 0x10, 0xee, 0xf5, 0x55, 0xac, 0x61, 0xf6, 0x66, 0x12, 0x8c, 0x7d, 0xef, 0x35, 0x3b, 0x94, + 0x17, 0x85, 0x27, 0x5e, 0xc4, 0xd5, 0xc8, 0x04, 0xb9, 0x82, 0x82, 0x1e, 0x01, 0x1a, 0xfb, 0x8b, + 0x79, 0xe8, 0xa9, 0xdd, 0x3b, 0xcc, 0xb3, 0x84, 0x3a, 0x2b, 0x63, 0x8f, 0xba, 0x5c, 0x6a, 0xfb, + 0x8a, 0xab, 0x9b, 0xf4, 0x31, 0xe0, 0xbb, 0x36, 0x19, 0x57, 0x12, 0x8f, 0xf6, 0x60, 0x83, 0x1d, + 0x99, 0x9c, 0x79, 0x0e, 0xbd, 0xa2, 0xc4, 0x6f, 0xd5, 0x76, 0x8d, 0xbd, 0x1c, 0xbf, 0x4b, 0x9a, + 0x60, 0x3a, 0x50, 0x4f, 0xea, 0x0a, 0x6d, 0xc1, 0xc6, 0xe0, 0xe4, 0xf3, 0x61, 0xbf, 0x73, 0x78, + 0xfa, 0xf2, 0xd3, 0x8b, 0x8b, 0x6e, 0xf3, 0x0e, 0x6a, 0x42, 0xbd, 0xdb, 0xff, 0xb4, 0x3f, 0x52, + 0x18, 0x03, 0xd5, 0xa0, 0x3c, 0xec, 0xe1, 0x17, 0xfd, 0x4e, 0xaf, 0x99, 0x43, 0x9b, 0x00, 0x1d, + 0x7c, 0xf1, 0xfb, 0xdd, 0x97, 0xc7, 0xcf, 0xcf, 0xbb, 0xcd, 0x3c, 0x42, 0xb0, 0xd9, 0xc1, 0x9f, + 0x0f, 0x46, 0x17, 0x9d, 0xe7, 0x18, 0xf7, 0xce, 0x3b, 0x9f, 0x37, 0x0b, 0xe6, 0x07, 0x50, 0x12, + 0x3a, 0x45, 0x0d, 0xa8, 0x1d, 0xf7, 0xff, 0xa0, 0xd7, 0x7d, 0x39, 0xc0, 0x6c, 0x39, 0xdf, 0xfd, + 0xec, 0x10, 0x3f, 0xeb, 0x8d, 0x24, 0x26, 0xd7, 0xfe, 0xbb, 0x0a, 0x14, 0x98, 0x83, 0xa2, 0x6d, + 0x28, 0x86, 0x34, 0x9c, 0xaa, 0x30, 0x23, 0x00, 0xb4, 0x0b, 0x35, 0x87, 0x89, 0x91, 0x72, 0xef, + 0xe3, 0x26, 0x58, 0xc5, 0x49, 0x14, 0x7a, 0x1f, 0x36, 0xe7, 0xbe, 0x37, 0x26, 0x41, 0x40, 0xdd, + 0x09, 0x93, 0x35, 0xb7, 0xb4, 0x2a, 0xce, 0x60, 0x51, 0x0b, 0x8a, 0x5c, 0x18, 0xdc, 0xac, 0x0a, + 0x5c, 0x3a, 0x02, 0xc1, 0x62, 0x93, 0x1b, 0x5c, 0xbd, 0xe6, 0x89, 0xa3, 0x82, 0xf9, 0x33, 0xc3, + 0x85, 0xf6, 0x44, 0x38, 0x79, 0x15, 0xf3, 0x67, 0xf4, 0x01, 0x94, 0xe8, 0xcc, 0x9e, 0x10, 0xe5, + 0xd4, 0x77, 0x53, 0x11, 0xc6, 0xea, 0x33, 0x1a, 0x96, 0x2c, 0xcc, 0xaf, 0xc7, 0x76, 0x48, 0x26, + 0x9e, 0xcf, 0x4c, 0x51, 0xfa, 0x75, 0x8c, 0x61, 0xd7, 0x9d, 0xf8, 0xf6, 0x4c, 0xb8, 0x72, 0x0e, + 0x0b, 0x00, 0xbd, 0x07, 0xd5, 0xb1, 0xf2, 0x65, 0xe9, 0xba, 0x31, 0x02, 0x59, 0x50, 0xf6, 0x64, + 0xd4, 0xaa, 0xf1, 0x13, 0x6c, 0xa7, 0x4f, 0x20, 0x43, 0x96, 0x62, 0x42, 0x3f, 0x86, 0x42, 0xf0, + 0x2a, 0x0a, 0x5a, 0x75, 0x99, 0x5a, 0x53, 0xcc, 0xc3, 0x57, 0x11, 0xe6, 0x64, 0xf4, 0x28, 0x6b, + 0x3f, 0x1b, 0xfc, 0x48, 0x69, 0x24, 0xf3, 0x82, 0x4b, 0x3a, 0x19, 0x70, 0x11, 0x6e, 0x0a, 0x7b, + 0x55, 0x30, 0xfa, 0xa5, 0xdc, 0x41, 0x7b, 0x53, 0x83, 0xbb, 0xee, 0x5d, 0x6b, 0x39, 0x9b, 0xe0, + 0x34, 0x67, 0xfb, 0x1f, 0x0d, 0x28, 0x89, 0x73, 0x73, 0x3d, 0xd8, 0x33, 0x9d, 0x67, 0xd8, 0xf3, + 0x5b, 0xe8, 0xff, 0x29, 0x54, 0x6e, 0x6c, 0x9f, 0xda, 0x6e, 0x18, 0xb4, 0xf2, 0xfc, 0xa2, 0xef, + 0xad, 0x92, 0x8a, 0xf5, 0x42, 0x30, 0x61, 0xcd, 0xdd, 0x3e, 0x81, 0xb2, 0x44, 0xae, 0x7c, 0xf5, + 0x4f, 0xa0, 0xc8, 0x75, 0x29, 0x73, 0xd3, 0x4a, 0x6d, 0x0b, 0x8e, 0xf6, 0xd7, 0x06, 0xe4, 0x87, + 0xaf, 0x22, 0x16, 0x7c, 0xe5, 0xee, 0x1d, 0x6f, 0x76, 0xe9, 0xf1, 0x1a, 0x6c, 0x03, 0xa7, 0x70, + 0x4c, 0xc5, 0x73, 0xdf, 0x73, 0xa2, 0x71, 0x28, 0xd3, 0x5e, 0x15, 0xc7, 0x08, 0xb4, 0x0b, 0xd5, + 0x20, 0xf2, 0xc7, 0xd7, 0xb6, 0x3f, 0x11, 0x86, 0x9c, 0xe7, 0x96, 0x1a, 0x23, 0xd1, 0x7d, 0xa8, + 0x7c, 0x19, 0xd9, 0x6e, 0xc8, 0x22, 0x42, 0x41, 0x33, 0x68, 0x1c, 0x3b, 0xc3, 0x25, 0x9d, 0x0c, + 0xf5, 0x26, 0x45, 0x91, 0x00, 0x92, 0x38, 0x26, 0xd5, 0x4b, 0x3a, 0xf9, 0x4c, 0x6d, 0x53, 0x12, + 0x52, 0x4d, 0xa0, 0xda, 0x5f, 0x19, 0x50, 0xe4, 0x57, 0x64, 0x7a, 0xbf, 0xa2, 0x53, 0x92, 0x10, + 0x8f, 0x86, 0x19, 0xcd, 0xf3, 0xe9, 0x84, 0xba, 0xf6, 0x54, 0x5e, 0x45, 0xc3, 0xcc, 0xc0, 0xa7, + 0xfa, 0x16, 0x55, 0x2c, 0x00, 0x56, 0x79, 0xcc, 0x88, 0x43, 0x23, 0x91, 0xa5, 0xab, 0x58, 0x42, + 0x8c, 0x3b, 0x98, 0xd9, 0xd3, 0xa9, 0x3c, 0xae, 0x00, 0xb8, 0x17, 0x52, 0x57, 0x1d, 0x90, 0x3f, + 0xb7, 0xff, 0x2d, 0x0f, 0x9b, 0xe9, 0x1c, 0xbd, 0x52, 0x7b, 0x4f, 0xa1, 0x10, 0xc6, 0x49, 0xeb, + 0xd1, 0x9a, 0xf4, 0xae, 0x41, 0x9e, 0xba, 0xf8, 0x0a, 0xf4, 0x3e, 0x94, 0x7d, 0x32, 0xe1, 0x5e, + 0xc6, 0xec, 0x69, 0xf3, 0xa0, 0xce, 0x92, 0x36, 0x2b, 0xdb, 0x59, 0xac, 0xc6, 0x8a, 0x88, 0x7e, + 0x05, 0x95, 0x80, 0xf8, 0x37, 0x74, 0x4c, 0x54, 0x11, 0xf1, 0x60, 0xed, 0x5b, 0x04, 0x1f, 0xd6, + 0x0b, 0xda, 0xff, 0x6e, 0x40, 0x59, 0x62, 0x57, 0x1e, 0x5f, 0x47, 0xab, 0x5c, 0x36, 0x5a, 0xed, + 0xc3, 0x16, 0x09, 0x42, 0x3a, 0xb3, 0x43, 0xe2, 0x74, 0xc9, 0x94, 0xde, 0x10, 0x7f, 0x21, 0x65, + 0xbc, 0x4c, 0x40, 0x3f, 0x87, 0xbb, 0xb6, 0x23, 0xc2, 0x87, 0x3d, 0x65, 0x86, 0x3b, 0xc8, 0xc4, + 0xc0, 0x55, 0xe4, 0x94, 0xaf, 0x17, 0x33, 0xbe, 0xfe, 0x0b, 0xd8, 0xb9, 0xa4, 0x93, 0xc3, 0x15, + 0x9b, 0x0a, 0x2d, 0xad, 0xa1, 0x9a, 0x1f, 0x42, 0x3d, 0x29, 0x6c, 0x96, 0x0a, 0x4e, 0x2f, 0x58, + 0xe2, 0x19, 0xf4, 0x3b, 0xcf, 0x9e, 0x0f, 0x9a, 0x77, 0xb2, 0xd9, 0xc2, 0x68, 0xff, 0x95, 0x01, + 0xf9, 0x91, 0x7d, 0xcb, 0x4a, 0x94, 0xd0, 0xbe, 0xe5, 0x35, 0x88, 0x90, 0x91, 0x02, 0xd1, 0x3e, + 0x40, 0x68, 0xdf, 0x62, 0xa9, 0xae, 0xdc, 0x0a, 0x75, 0x25, 0xe8, 0xcc, 0xec, 0x43, 0xfb, 0x56, + 0x9d, 0x82, 0x0b, 0xad, 0x82, 0x93, 0x28, 0x16, 0xb5, 0xe7, 0xc4, 0x1f, 0x13, 0x37, 0x64, 0x8e, + 0x5f, 0xe0, 0x71, 0x30, 0x81, 0x69, 0xff, 0x97, 0x01, 0x25, 0x51, 0xc1, 0xad, 0xc9, 0x57, 0xdb, + 0x50, 0xb8, 0xb6, 0x83, 0x6b, 0xe1, 0x0d, 0x27, 0x77, 0x30, 0x87, 0xd0, 0x23, 0x56, 0x2d, 0x07, + 0xbc, 0xf9, 0xe3, 0xf9, 0x3e, 0x2f, 0xa9, 0x29, 0x2c, 0x7a, 0x0c, 0x0d, 0xf9, 0xaa, 0xae, 0x44, + 0x73, 0xe1, 0xe7, 0x4e, 0x58, 0x4d, 0x92, 0x26, 0xa0, 0xc7, 0x32, 0xe2, 0x6a, 0xce, 0x92, 0xd2, + 0xe8, 0x89, 0xca, 0xfa, 0x9a, 0x77, 0x1f, 0x9a, 0x4a, 0x7b, 0x9a, 0x9d, 0xd7, 0x31, 0x27, 0x06, + 0x5e, 0xa2, 0x1c, 0x95, 0x44, 0xb5, 0x7f, 0x04, 0x50, 0x51, 0xa7, 0x33, 0xff, 0xb4, 0x0e, 0x45, + 0xd1, 0x0d, 0x3e, 0x82, 0x0d, 0x51, 0x4a, 0x1e, 0x3a, 0x8e, 0x4f, 0x82, 0x40, 0xde, 0x3e, 0x8d, + 0x64, 0x51, 0x4c, 0x20, 0x8e, 0x49, 0xd2, 0x82, 0x63, 0x24, 0xfa, 0x00, 0x2a, 0x41, 0x52, 0x0f, + 0xac, 0x44, 0xe6, 0x6f, 0xd0, 0xae, 0x83, 0x35, 0x03, 0xfa, 0x4d, 0x28, 0xf3, 0xde, 0xad, 0xdf, + 0x95, 0x35, 0x21, 0xef, 0x13, 0x14, 0x0e, 0x3d, 0x85, 0xaa, 0x6e, 0x92, 0x65, 0xf7, 0xf7, 0xa6, + 0xa2, 0x31, 0x66, 0x46, 0x0f, 0xa1, 0xc8, 0xda, 0x02, 0x55, 0xcb, 0xd7, 0xe4, 0x11, 0x78, 0xc3, + 0x20, 0x28, 0x68, 0x0f, 0xca, 0x73, 0x7b, 0xc1, 0x3b, 0x54, 0xd1, 0xf1, 0x6d, 0x4a, 0xa6, 0x81, + 0xc0, 0x62, 0x45, 0x66, 0xb6, 0xe3, 0xdb, 0xcc, 0xfb, 0x9f, 0x91, 0x85, 0xc8, 0xf8, 0x75, 0x9c, + 0xc0, 0xa0, 0x03, 0xd8, 0xb6, 0xa7, 0x21, 0xf1, 0x5d, 0x3b, 0x24, 0xac, 0x0a, 0xb3, 0xc7, 0x61, + 0xdf, 0xbd, 0xf2, 0x64, 0xf1, 0xb7, 0x92, 0x96, 0x2c, 0xce, 0x21, 0x5d, 0x9c, 0x8b, 0x30, 0x8f, + 0xb5, 0x94, 0x6b, 0x3a, 0xcc, 0x6b, 0x5c, 0xfb, 0x1b, 0x03, 0x2a, 0xda, 0xb4, 0x77, 0xa0, 0xc4, + 0x04, 0x3a, 0xf2, 0xa4, 0xca, 0x24, 0xc4, 0x5e, 0x61, 0x4b, 0x5d, 0x8a, 0x10, 0xae, 0x40, 0xde, + 0xf7, 0xb1, 0xf4, 0x90, 0x97, 0x7d, 0x1f, 0xcb, 0x2e, 0x2c, 0x4e, 0x87, 0x76, 0x48, 0x64, 0xf8, + 0x16, 0x00, 0x77, 0x1b, 0x2f, 0x08, 0xed, 0x29, 0xb7, 0x6e, 0x11, 0x31, 0x12, 0x18, 0x16, 0x52, + 0xe5, 0xe4, 0x83, 0xdb, 0xe9, 0x52, 0x48, 0x95, 0x44, 0x76, 0x29, 0xf9, 0xf2, 0x73, 0x2f, 0xe4, + 0x75, 0x16, 0xbf, 0x54, 0x12, 0xd7, 0xfe, 0x26, 0x2f, 0x0b, 0xc6, 0x5d, 0xa8, 0x4d, 0x45, 0xb8, + 0x3d, 0x61, 0x1e, 0x27, 0x6e, 0x95, 0x44, 0xa5, 0x52, 0x25, 0x6f, 0x50, 0x33, 0xa9, 0x72, 0x3f, + 0xae, 0xa7, 0x44, 0xe5, 0x80, 0x12, 0x06, 0xb0, 0x54, 0x4d, 0x1d, 0xc1, 0x66, 0xba, 0x17, 0xd4, + 0x0d, 0x4a, 0x62, 0x51, 0xa6, 0x7b, 0xcc, 0xac, 0x60, 0x22, 0x9d, 0x91, 0x99, 0x27, 0x45, 0xc4, + 0x9f, 0xd9, 0x3d, 0x44, 0x33, 0xc8, 0x64, 0xa1, 0x2a, 0xce, 0x24, 0x8a, 0x97, 0xb8, 0xc2, 0xc8, + 0x94, 0xd7, 0x95, 0x65, 0x89, 0x9b, 0xc2, 0x22, 0x13, 0x40, 0xdd, 0xed, 0x17, 0x3f, 0xe7, 0x4d, + 0x88, 0xf0, 0xbb, 0x04, 0x36, 0x9b, 0xfa, 0xab, 0xcb, 0xa9, 0xff, 0xe0, 0x8d, 0x05, 0xd9, 0x36, + 0x14, 0x6f, 0xec, 0x69, 0x44, 0xa4, 0xb1, 0x08, 0xa0, 0xfd, 0xd1, 0x5b, 0xe5, 0xe4, 0x16, 0x94, + 0x65, 0x02, 0x54, 0xa6, 0x26, 0xc1, 0xf6, 0xdf, 0xe4, 0xa1, 0x2c, 0x1d, 0x0a, 0xfd, 0x94, 0x95, + 0x08, 0xe1, 0xb5, 0xe7, 0xf0, 0xb5, 0x9b, 0x07, 0x3f, 0x4a, 0x3b, 0x1c, 0x6b, 0x1c, 0xaf, 0x3d, + 0x07, 0x4b, 0x26, 0x56, 0x4f, 0xe9, 0x76, 0x59, 0xd5, 0x53, 0x1a, 0x81, 0xda, 0x50, 0xb2, 0x67, + 0x3c, 0xe2, 0xe5, 0xb5, 0x38, 0x24, 0x86, 0x17, 0xdb, 0xd7, 0x36, 0x75, 0xf9, 0x70, 0xa3, 0x20, + 0x8b, 0x6d, 0x85, 0x48, 0xfa, 0x45, 0x31, 0xed, 0x17, 0xbc, 0xc5, 0x76, 0x08, 0x99, 0x0d, 0x79, + 0x11, 0x2a, 0xf3, 0x5e, 0x0a, 0xc7, 0x78, 0xf4, 0x21, 0x9e, 0x91, 0x05, 0x57, 0x58, 0x1d, 0xa7, + 0x70, 0x68, 0x87, 0x45, 0x5a, 0xea, 0x72, 0x45, 0x89, 0xd6, 0x93, 0xc3, 0xec, 0x5c, 0x2c, 0x87, + 0x8a, 0x63, 0x0b, 0x05, 0xc5, 0x08, 0xf4, 0x2b, 0xd8, 0x14, 0xe7, 0xd7, 0xc5, 0x36, 0xac, 0x2f, + 0xb6, 0x33, 0xac, 0xe6, 0x53, 0x28, 0x09, 0xf1, 0xa1, 0xbb, 0xd0, 0x38, 0xec, 0x76, 0x71, 0x6f, + 0x38, 0x7c, 0x89, 0x7b, 0x9f, 0x3d, 0xef, 0x0d, 0x47, 0xcd, 0x3b, 0x08, 0xa0, 0xd4, 0xed, 0xe3, + 0x5e, 0x67, 0xd4, 0x34, 0xd0, 0x06, 0x54, 0xcf, 0x2e, 0xba, 0x3d, 0x7c, 0x38, 0xea, 0x75, 0x9b, + 0x39, 0xf3, 0xbb, 0x1c, 0x6c, 0x2d, 0x8f, 0xf3, 0x5a, 0x50, 0xf6, 0x18, 0xb2, 0xdf, 0x55, 0x99, + 0x59, 0x82, 0xe9, 0xa0, 0x9c, 0x7b, 0x97, 0xa0, 0xbc, 0x6c, 0xed, 0xf9, 0x95, 0xd6, 0xbe, 0x0f, + 0x0d, 0x9f, 0x7c, 0x19, 0x91, 0x20, 0x24, 0x8e, 0x14, 0x56, 0x5c, 0xd6, 0x64, 0x49, 0xe8, 0x77, + 0xa1, 0x29, 0x62, 0xf1, 0x30, 0x1e, 0x92, 0x89, 0xaa, 0xad, 0x69, 0xe1, 0x34, 0x01, 0x2f, 0x71, + 0xb2, 0x36, 0x9f, 0x47, 0xd6, 0xf4, 0xeb, 0x84, 0xe2, 0x57, 0x50, 0xd0, 0x19, 0xdc, 0xcb, 0x1c, + 0x40, 0x6b, 0xab, 0xbc, 0x5e, 0x5b, 0xeb, 0xd6, 0x98, 0x7f, 0x6e, 0x40, 0x4d, 0x4c, 0x66, 0xc9, + 0x17, 0x64, 0x1c, 0xfe, 0xbf, 0x88, 0x9d, 0x35, 0x8b, 0x74, 0xa2, 0x22, 0xe1, 0x96, 0x75, 0x44, + 0x43, 0x66, 0x8d, 0xb1, 0x54, 0x38, 0xd9, 0xfc, 0x36, 0x0f, 0x8d, 0x8c, 0xbc, 0xd0, 0x27, 0x89, + 0x39, 0x9d, 0xc1, 0xdf, 0xf9, 0x28, 0x2b, 0x53, 0x6b, 0xe4, 0xdb, 0x6e, 0x60, 0x8f, 0xd9, 0x3d, + 0x57, 0x8c, 0xee, 0xde, 0x83, 0xaa, 0x1e, 0x4f, 0xf2, 0x63, 0xd7, 0x71, 0x8c, 0x68, 0xff, 0x6b, + 0x0e, 0xee, 0xae, 0x58, 0x9f, 0xc8, 0x00, 0xc3, 0x78, 0xb6, 0x98, 0x44, 0xb1, 0x7d, 0x75, 0x06, + 0x56, 0xfb, 0x6a, 0xc4, 0x92, 0x93, 0xe6, 0x57, 0x38, 0xa9, 0x09, 0x75, 0xb9, 0xe1, 0x88, 0x57, + 0x7b, 0x22, 0x4e, 0xa4, 0x70, 0xe8, 0x04, 0xaa, 0xe1, 0x75, 0x34, 0xbb, 0x74, 0x6d, 0x3a, 0x95, + 0x05, 0xc8, 0xe3, 0xb7, 0x11, 0x80, 0x6c, 0x22, 0xe3, 0xc5, 0xed, 0x3f, 0x51, 0x5d, 0x97, 0xea, + 0x7c, 0x8c, 0xb8, 0xf3, 0x89, 0x7b, 0xa4, 0x5c, 0xb2, 0x47, 0x8a, 0x3b, 0xaa, 0x7c, 0xb6, 0xa3, + 0x12, 0xfd, 0x57, 0x21, 0xd9, 0x7f, 0x25, 0x3b, 0xb6, 0x62, 0xba, 0x63, 0x33, 0x07, 0xd0, 0xcc, + 0x2a, 0x9d, 0x65, 0x76, 0xea, 0xce, 0xa3, 0xb0, 0xef, 0x3a, 0xe4, 0x56, 0x0e, 0x08, 0x13, 0x98, + 0x37, 0x2b, 0xce, 0xfc, 0xba, 0x0c, 0xcd, 0xa5, 0xb9, 0xbd, 0x36, 0x5e, 0x27, 0x6d, 0xbc, 0x8e, + 0x1e, 0x12, 0xe7, 0x12, 0x43, 0xe2, 0x94, 0x41, 0xe7, 0xdf, 0xc5, 0xa0, 0xcf, 0xa1, 0x39, 0xbf, + 0x5e, 0x04, 0x74, 0x6c, 0x4f, 0x75, 0x9f, 0x24, 0x3e, 0x32, 0x98, 0x4b, 0x1f, 0x19, 0xac, 0x41, + 0x86, 0x13, 0x2f, 0xad, 0x45, 0xcf, 0xa0, 0xe1, 0xd0, 0x09, 0x0d, 0x13, 0xdb, 0x89, 0x00, 0xf2, + 0x70, 0x79, 0xbb, 0x6e, 0x9a, 0x11, 0x67, 0x57, 0xa2, 0x27, 0x50, 0x9a, 0xdb, 0x0b, 0x2f, 0x0a, + 0xe5, 0x57, 0x87, 0xd6, 0x8a, 0x23, 0x71, 0x3a, 0x96, 0x7c, 0xe8, 0x77, 0xa0, 0x91, 0x09, 0x4b, + 0x32, 0x94, 0x2c, 0xc7, 0xaf, 0x2c, 0x23, 0x4f, 0xc6, 0x5e, 0x28, 0xbe, 0x38, 0xb0, 0x64, 0xec, + 0x85, 0x04, 0xfd, 0x11, 0xec, 0x88, 0x19, 0xe3, 0x58, 0x07, 0x22, 0x79, 0xab, 0x2a, 0xbf, 0xd5, + 0xde, 0xf2, 0x89, 0x3a, 0x2b, 0xf9, 0xf1, 0x9a, 0x7d, 0xda, 0x23, 0x68, 0x66, 0xc5, 0xca, 0x4b, + 0x00, 0x56, 0x28, 0x10, 0x5f, 0x29, 0x5f, 0x82, 0x2c, 0xec, 0x87, 0xbe, 0x3d, 0x7e, 0x45, 0xdd, + 0xc9, 0x79, 0x34, 0xbb, 0x24, 0x2a, 0x99, 0x67, 0xb0, 0xed, 0x8f, 0xa1, 0x91, 0x91, 0x2e, 0x6a, + 0x42, 0x3e, 0xf2, 0xa7, 0x72, 0x43, 0xf6, 0xc8, 0xcc, 0x7c, 0x6e, 0x07, 0xc1, 0x6b, 0xcf, 0x77, + 0xd4, 0x60, 0x42, 0xc1, 0xed, 0x8f, 0x60, 0x67, 0xf5, 0x45, 0x58, 0x73, 0x13, 0xc6, 0x5e, 0xaa, + 0x83, 0x6b, 0x1a, 0xd9, 0xfe, 0xce, 0x80, 0x92, 0xd0, 0x8d, 0x8e, 0x99, 0xc6, 0x1b, 0x63, 0x26, + 0x1f, 0xb0, 0xf1, 0x05, 0x87, 0xa9, 0x42, 0x3b, 0x8d, 0x44, 0x16, 0x34, 0x05, 0xe2, 0x98, 0x90, + 0x01, 0xf1, 0x8f, 0x16, 0x21, 0x49, 0x14, 0x2d, 0x4b, 0x34, 0xf4, 0x04, 0xee, 0xb2, 0xe6, 0x2d, + 0xbb, 0x44, 0xb8, 0xfb, 0x2a, 0x12, 0x3a, 0x84, 0x2d, 0xbd, 0x8b, 0xce, 0x47, 0xc5, 0xf5, 0xf9, + 0x68, 0x99, 0xdb, 0xfc, 0x7b, 0x03, 0x1a, 0xd9, 0x4f, 0x68, 0xeb, 0x1d, 0xfa, 0x87, 0x67, 0xa3, + 0x0f, 0x01, 0xc4, 0xcb, 0x87, 0x6f, 0xcc, 0x49, 0x09, 0x26, 0xf4, 0x10, 0xca, 0xc2, 0xee, 0x03, + 0xe9, 0xe6, 0x65, 0xe9, 0x18, 0x58, 0xe1, 0xcd, 0xbf, 0x35, 0x60, 0x87, 0x9f, 0x7e, 0xa0, 0x67, + 0xc3, 0xc7, 0x36, 0x9d, 0x32, 0x17, 0x59, 0x9f, 0x52, 0x4f, 0x60, 0xdb, 0x0e, 0x43, 0x32, 0x9b, + 0x87, 0xc4, 0x39, 0x13, 0xdf, 0x6a, 0x13, 0x9f, 0x43, 0xb6, 0x2d, 0x89, 0xb3, 0x12, 0x34, 0xbc, + 0x72, 0x05, 0xb2, 0xa0, 0xa2, 0x3e, 0x8e, 0xe8, 0x6f, 0xa7, 0x4b, 0x9f, 0x72, 0xb1, 0xe6, 0x31, + 0xff, 0xb9, 0x00, 0x25, 0x71, 0x05, 0x74, 0xa0, 0x9a, 0xcb, 0x6e, 0x9c, 0x64, 0x91, 0xbc, 0x9f, + 0xfc, 0x61, 0x14, 0x9c, 0xe0, 0xfa, 0x9e, 0xa4, 0xfa, 0x1f, 0x79, 0x00, 0x9c, 0x62, 0x8e, 0x33, + 0xa5, 0x91, 0xcd, 0x94, 0xdf, 0xfb, 0xa9, 0xce, 0x82, 0xaa, 0x78, 0x1e, 0x52, 0xd5, 0xd0, 0x2f, + 0xc7, 0xa5, 0x98, 0xe5, 0xfb, 0x5a, 0x7a, 0x56, 0x02, 0xb3, 0xc7, 0x73, 0xd6, 0x42, 0x14, 0x65, + 0x09, 0xac, 0x10, 0x7c, 0x3c, 0xc5, 0x00, 0xf6, 0xae, 0x12, 0x3f, 0xaa, 0x86, 0x53, 0x39, 0x9d, + 0xd1, 0xb3, 0x85, 0x37, 0xe3, 0x49, 0x99, 0x65, 0xe5, 0x5d, 0xcc, 0x92, 0x59, 0xc9, 0x0d, 0xf1, + 0x59, 0x12, 0xae, 0x8a, 0x7e, 0x5c, 0x82, 0x8c, 0xf2, 0x65, 0x64, 0x27, 0xbe, 0xd3, 0x28, 0x30, + 0x3b, 0xc2, 0xae, 0x71, 0x6a, 0x6a, 0x84, 0xfd, 0x08, 0x36, 0x1c, 0x19, 0x83, 0x86, 0x73, 0x42, + 0x9c, 0x56, 0x9d, 0xf3, 0xa4, 0x91, 0x68, 0x0f, 0x1a, 0xe3, 0x28, 0x08, 0xbd, 0x19, 0xf1, 0xe5, + 0xe4, 0x90, 0x0f, 0xea, 0x37, 0x70, 0x16, 0xcd, 0x4a, 0x02, 0x9f, 0xdc, 0x50, 0xf2, 0x5a, 0x0e, + 0xea, 0x25, 0x64, 0x7e, 0x6b, 0x40, 0x59, 0x7e, 0x6c, 0x4e, 0xcb, 0xc0, 0x78, 0x17, 0x19, 0x6c, + 0x43, 0x71, 0x3c, 0xb5, 0xe9, 0x4c, 0x95, 0x21, 0x1c, 0x58, 0x8e, 0x71, 0xf9, 0x55, 0x31, 0xee, + 0xb7, 0xa0, 0xea, 0x45, 0xe1, 0xdc, 0xa3, 0x6e, 0xa8, 0xbc, 0xb4, 0x6a, 0x5d, 0x48, 0x0c, 0x8e, + 0x69, 0xac, 0xe0, 0x0e, 0x88, 0x4f, 0xed, 0x29, 0xfd, 0x63, 0xe2, 0x28, 0xd7, 0xe0, 0x96, 0x50, + 0xc7, 0x2b, 0x28, 0xe6, 0x9f, 0x95, 0x60, 0x6b, 0xe9, 0x4b, 0xfc, 0xff, 0xe1, 0x92, 0x89, 0x98, + 0x96, 0x4b, 0xc7, 0xb4, 0xfb, 0x00, 0x73, 0xdf, 0x9b, 0x7b, 0x01, 0x71, 0x8e, 0xd4, 0x6c, 0x24, + 0x81, 0xe1, 0x63, 0xa0, 0xf8, 0x5f, 0x02, 0x22, 0x1a, 0x27, 0x30, 0xe8, 0x43, 0x9d, 0xf9, 0x45, + 0xe4, 0xfd, 0x8d, 0xe5, 0x7f, 0x10, 0x64, 0x53, 0xff, 0x13, 0xb8, 0xab, 0xed, 0x57, 0xfb, 0x94, + 0x98, 0x14, 0xd4, 0xf1, 0x2a, 0x52, 0xfb, 0x3f, 0xf3, 0xef, 0x9a, 0xa3, 0x1e, 0x42, 0x89, 0x97, + 0x75, 0x62, 0x8a, 0x9a, 0x52, 0x8b, 0x24, 0xa0, 0x23, 0xa8, 0x89, 0xbf, 0x50, 0x44, 0xe1, 0x3c, + 0x52, 0x11, 0x6c, 0x77, 0xed, 0xf1, 0x2d, 0xc1, 0x87, 0x93, 0x8b, 0x50, 0x17, 0xea, 0xf2, 0xef, + 0x1c, 0x62, 0x93, 0xc2, 0x5b, 0x6e, 0x92, 0x5a, 0x85, 0x7e, 0x0f, 0x1a, 0xfa, 0xd6, 0x72, 0xa3, + 0xe2, 0x5b, 0x6e, 0x94, 0x5d, 0xc8, 0xfa, 0x69, 0x21, 0xe6, 0xd4, 0xa7, 0xe0, 0x75, 0xfd, 0x74, + 0x9a, 0xb5, 0xfd, 0x97, 0x06, 0x94, 0xe4, 0x3e, 0x2d, 0x28, 0x09, 0x8f, 0x16, 0xf9, 0xe3, 0xe4, + 0x0e, 0x96, 0x30, 0x6a, 0xc7, 0x93, 0x04, 0x35, 0xf8, 0xd5, 0xb3, 0x84, 0x78, 0x3e, 0x91, 0x5b, + 0x35, 0x9f, 0x88, 0xe7, 0x00, 0x85, 0xcc, 0x1c, 0xe0, 0x68, 0x0b, 0x1a, 0x62, 0xff, 0x0b, 0x5f, + 0x7a, 0x97, 0x49, 0xb5, 0x0f, 0x24, 0xfe, 0x38, 0xf2, 0xc3, 0x7d, 0xa0, 0x0d, 0x95, 0xf1, 0x54, + 0xda, 0xb9, 0x2c, 0xa2, 0x14, 0x6c, 0x7e, 0x01, 0x15, 0x65, 0x1f, 0xac, 0xba, 0xbc, 0x8e, 0x27, + 0x70, 0x62, 0xe2, 0xbd, 0x0d, 0x45, 0xca, 0x5b, 0x06, 0xf1, 0xc7, 0x10, 0x01, 0xa0, 0x96, 0x1a, + 0x1e, 0xc5, 0x75, 0x8d, 0x40, 0xc8, 0x2f, 0x0e, 0x2f, 0x38, 0xb1, 0xa0, 0xbf, 0x38, 0x70, 0xd8, + 0xfc, 0xef, 0x1c, 0x94, 0xc4, 0x50, 0xf3, 0xd7, 0xd8, 0xf8, 0xa2, 0x1e, 0x6c, 0x89, 0xf1, 0x75, + 0xa2, 0x91, 0x93, 0xe6, 0x7b, 0x4f, 0xfe, 0x17, 0x27, 0xd9, 0xe3, 0xf5, 0xdd, 0x2b, 0x0f, 0x2f, + 0xaf, 0x58, 0x35, 0x01, 0x6c, 0xff, 0xb5, 0x01, 0x8d, 0xcc, 0x52, 0xde, 0x00, 0xde, 0x52, 0x47, + 0x37, 0x80, 0xb7, 0xd4, 0x89, 0xc5, 0x97, 0x7b, 0x93, 0xf8, 0xf2, 0x69, 0xf1, 0xa1, 0x5f, 0xc2, + 0x06, 0x67, 0xd2, 0xf6, 0x5d, 0x78, 0xc3, 0xc7, 0xd9, 0x14, 0xa7, 0x79, 0x00, 0x3b, 0x2f, 0xb8, + 0xdf, 0x1d, 0xb3, 0x06, 0x91, 0x05, 0x5c, 0x35, 0xa4, 0x5b, 0xab, 0x08, 0xf3, 0x1f, 0x0c, 0xc8, + 0xf5, 0xbb, 0x2c, 0x07, 0xcd, 0x49, 0x82, 0x2e, 0x21, 0x86, 0xbf, 0xb6, 0x5d, 0x67, 0xaa, 0x46, + 0x80, 0x12, 0x42, 0x3f, 0x86, 0xf2, 0x3c, 0xba, 0x7c, 0x45, 0x16, 0x81, 0x0c, 0x2c, 0x35, 0xab, + 0xdf, 0xb5, 0x06, 0x02, 0x85, 0x15, 0x8d, 0x45, 0xd7, 0x4b, 0xad, 0x1f, 0x7e, 0x93, 0x3a, 0x4e, + 0x60, 0xda, 0x1f, 0x43, 0x59, 0xae, 0x61, 0x32, 0xa1, 0x0e, 0x11, 0x63, 0x4e, 0x51, 0xd0, 0x68, + 0x98, 0x1d, 0x5f, 0x2e, 0x92, 0x85, 0x91, 0x02, 0xcd, 0xff, 0x31, 0xa0, 0x1a, 0x37, 0x4e, 0xfb, + 0x50, 0x0e, 0x88, 0x50, 0xb5, 0x18, 0x46, 0xa2, 0xf8, 0x1f, 0x55, 0xd6, 0x50, 0x50, 0xb0, 0x62, + 0x61, 0x2d, 0x8c, 0xae, 0xaf, 0x58, 0xc1, 0x1d, 0xc8, 0xcd, 0x33, 0x58, 0xf3, 0x2b, 0xfe, 0xf1, + 0x4f, 0xac, 0xa9, 0x41, 0xf9, 0xb4, 0x3f, 0x1c, 0xf5, 0xcf, 0x3f, 0x6d, 0xde, 0x41, 0x55, 0x28, + 0x5e, 0xe0, 0x6e, 0x0f, 0x37, 0x0d, 0xb4, 0x03, 0x88, 0x3f, 0xbe, 0xec, 0x5c, 0x9c, 0x1f, 0xf7, + 0xf1, 0xd9, 0xe1, 0xa8, 0x7f, 0x71, 0xde, 0xcc, 0xa1, 0x1f, 0xc1, 0x96, 0xc0, 0x1f, 0x3f, 0x3f, + 0x3d, 0xee, 0x9f, 0x9e, 0x9e, 0xf5, 0xce, 0x47, 0xcd, 0x3c, 0xda, 0x86, 0xa6, 0x62, 0x3f, 0x1b, + 0x9c, 0xf6, 0x38, 0x73, 0x81, 0x6d, 0xde, 0xed, 0x0f, 0x07, 0xcf, 0x47, 0xbd, 0x66, 0x91, 0xed, + 0x28, 0x81, 0x97, 0xb8, 0x37, 0xbc, 0x38, 0x7d, 0xce, 0x99, 0x4a, 0x08, 0xa0, 0x84, 0x7b, 0xfc, + 0xef, 0x1c, 0x65, 0x93, 0xc0, 0x06, 0xbb, 0x1f, 0x71, 0xd4, 0xff, 0xb6, 0x4c, 0x28, 0xcb, 0x51, + 0x87, 0x8c, 0x1d, 0xf1, 0x1f, 0x0a, 0x15, 0x41, 0xfb, 0x7f, 0x2e, 0xe1, 0xff, 0xa9, 0xda, 0x33, + 0x9f, 0xa9, 0x3d, 0x8f, 0x0a, 0x7f, 0x98, 0x9b, 0x5f, 0x5e, 0x96, 0xb8, 0x5f, 0xfe, 0xf6, 0xff, + 0x06, 0x00, 0x00, 0xff, 0xff, 0x96, 0xe1, 0x7f, 0x57, 0x27, 0x29, 0x00, 0x00, } diff --git a/pb/countrycodes.pb.go b/pb/countrycodes.pb.go index 848b63be1f..2cbe9d1e80 100644 --- a/pb/countrycodes.pb.go +++ b/pb/countrycodes.pb.go @@ -3,9 +3,11 @@ package pb -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -16,7 +18,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type CountryCode int32 @@ -541,6 +543,7 @@ var CountryCode_name = map[int32]string{ 507: "SOUTH_AMERICA", 508: "OCEANIA", } + var CountryCode_value = map[string]int32{ "NA": 0, "AFGHANISTAN": 1, @@ -805,17 +808,18 @@ var CountryCode_value = map[string]int32{ func (x CountryCode) String() string { return proto.EnumName(CountryCode_name, int32(x)) } + func (CountryCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_countrycodes_35efbc79bf99ad19, []int{0} + return fileDescriptor_18ecd71e04cfbc43, []int{0} } func init() { proto.RegisterEnum("CountryCode", CountryCode_name, CountryCode_value) } -func init() { proto.RegisterFile("countrycodes.proto", fileDescriptor_countrycodes_35efbc79bf99ad19) } +func init() { proto.RegisterFile("countrycodes.proto", fileDescriptor_18ecd71e04cfbc43) } -var fileDescriptor_countrycodes_35efbc79bf99ad19 = []byte{ +var fileDescriptor_18ecd71e04cfbc43 = []byte{ // 2291 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x5c, 0x57, 0x65, 0xbc, 0x1c, 0xc7, 0x91, 0xbf, 0xd5, 0x93, 0x05, 0x23, 0x2a, 0x8d, 0x65, 0x9d, 0x6d, 0x99, 0xce, 0x77, 0x17, 0x70, diff --git a/pb/message.pb.go b/pb/message.pb.go index e64c84088b..073038f1e6 100644 --- a/pb/message.pb.go +++ b/pb/message.pb.go @@ -3,11 +3,13 @@ package pb -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import any "github.com/golang/protobuf/ptypes/any" -import timestamp "github.com/golang/protobuf/ptypes/timestamp" +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + any "github.com/golang/protobuf/ptypes/any" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -18,7 +20,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type Message_MessageType int32 @@ -75,6 +77,7 @@ var Message_MessageType_name = map[int32]string{ 500: "ERROR", 501: "ORDER_PROCESSING_FAILURE", } + var Message_MessageType_value = map[string]int32{ "PING": 0, "CHAT": 1, @@ -105,8 +108,9 @@ var Message_MessageType_value = map[string]int32{ func (x Message_MessageType) String() string { return proto.EnumName(Message_MessageType_name, int32(x)) } + func (Message_MessageType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_message_9461cb3f76d04d41, []int{0, 0} + return fileDescriptor_33c57e4bae7b9afd, []int{0, 0} } type Chat_Flag int32 @@ -122,6 +126,7 @@ var Chat_Flag_name = map[int32]string{ 1: "TYPING", 2: "READ", } + var Chat_Flag_value = map[string]int32{ "MESSAGE": 0, "TYPING": 1, @@ -131,8 +136,9 @@ var Chat_Flag_value = map[string]int32{ func (x Chat_Flag) String() string { return proto.EnumName(Chat_Flag_name, int32(x)) } + func (Chat_Flag) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_message_9461cb3f76d04d41, []int{2, 0} + return fileDescriptor_33c57e4bae7b9afd, []int{2, 0} } type Message struct { @@ -149,16 +155,17 @@ func (m *Message) Reset() { *m = Message{} } func (m *Message) String() string { return proto.CompactTextString(m) } func (*Message) ProtoMessage() {} func (*Message) Descriptor() ([]byte, []int) { - return fileDescriptor_message_9461cb3f76d04d41, []int{0} + return fileDescriptor_33c57e4bae7b9afd, []int{0} } + func (m *Message) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Message.Unmarshal(m, b) } func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Message.Marshal(b, m, deterministic) } -func (dst *Message) XXX_Merge(src proto.Message) { - xxx_messageInfo_Message.Merge(dst, src) +func (m *Message) XXX_Merge(src proto.Message) { + xxx_messageInfo_Message.Merge(m, src) } func (m *Message) XXX_Size() int { return xxx_messageInfo_Message.Size(m) @@ -210,16 +217,17 @@ func (m *Envelope) Reset() { *m = Envelope{} } func (m *Envelope) String() string { return proto.CompactTextString(m) } func (*Envelope) ProtoMessage() {} func (*Envelope) Descriptor() ([]byte, []int) { - return fileDescriptor_message_9461cb3f76d04d41, []int{1} + return fileDescriptor_33c57e4bae7b9afd, []int{1} } + func (m *Envelope) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Envelope.Unmarshal(m, b) } func (m *Envelope) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Envelope.Marshal(b, m, deterministic) } -func (dst *Envelope) XXX_Merge(src proto.Message) { - xxx_messageInfo_Envelope.Merge(dst, src) +func (m *Envelope) XXX_Merge(src proto.Message) { + xxx_messageInfo_Envelope.Merge(m, src) } func (m *Envelope) XXX_Size() int { return xxx_messageInfo_Envelope.Size(m) @@ -266,16 +274,17 @@ func (m *Chat) Reset() { *m = Chat{} } func (m *Chat) String() string { return proto.CompactTextString(m) } func (*Chat) ProtoMessage() {} func (*Chat) Descriptor() ([]byte, []int) { - return fileDescriptor_message_9461cb3f76d04d41, []int{2} + return fileDescriptor_33c57e4bae7b9afd, []int{2} } + func (m *Chat) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Chat.Unmarshal(m, b) } func (m *Chat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Chat.Marshal(b, m, deterministic) } -func (dst *Chat) XXX_Merge(src proto.Message) { - xxx_messageInfo_Chat.Merge(dst, src) +func (m *Chat) XXX_Merge(src proto.Message) { + xxx_messageInfo_Chat.Merge(m, src) } func (m *Chat) XXX_Size() int { return xxx_messageInfo_Chat.Size(m) @@ -334,16 +343,17 @@ func (m *SignedData) Reset() { *m = SignedData{} } func (m *SignedData) String() string { return proto.CompactTextString(m) } func (*SignedData) ProtoMessage() {} func (*SignedData) Descriptor() ([]byte, []int) { - return fileDescriptor_message_9461cb3f76d04d41, []int{3} + return fileDescriptor_33c57e4bae7b9afd, []int{3} } + func (m *SignedData) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SignedData.Unmarshal(m, b) } func (m *SignedData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_SignedData.Marshal(b, m, deterministic) } -func (dst *SignedData) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignedData.Merge(dst, src) +func (m *SignedData) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignedData.Merge(m, src) } func (m *SignedData) XXX_Size() int { return xxx_messageInfo_SignedData.Size(m) @@ -388,16 +398,17 @@ func (m *SignedData_Command) Reset() { *m = SignedData_Command{} } func (m *SignedData_Command) String() string { return proto.CompactTextString(m) } func (*SignedData_Command) ProtoMessage() {} func (*SignedData_Command) Descriptor() ([]byte, []int) { - return fileDescriptor_message_9461cb3f76d04d41, []int{3, 0} + return fileDescriptor_33c57e4bae7b9afd, []int{3, 0} } + func (m *SignedData_Command) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SignedData_Command.Unmarshal(m, b) } func (m *SignedData_Command) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_SignedData_Command.Marshal(b, m, deterministic) } -func (dst *SignedData_Command) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignedData_Command.Merge(dst, src) +func (m *SignedData_Command) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignedData_Command.Merge(m, src) } func (m *SignedData_Command) XXX_Size() int { return xxx_messageInfo_SignedData_Command.Size(m) @@ -440,16 +451,17 @@ func (m *CidList) Reset() { *m = CidList{} } func (m *CidList) String() string { return proto.CompactTextString(m) } func (*CidList) ProtoMessage() {} func (*CidList) Descriptor() ([]byte, []int) { - return fileDescriptor_message_9461cb3f76d04d41, []int{4} + return fileDescriptor_33c57e4bae7b9afd, []int{4} } + func (m *CidList) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_CidList.Unmarshal(m, b) } func (m *CidList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_CidList.Marshal(b, m, deterministic) } -func (dst *CidList) XXX_Merge(src proto.Message) { - xxx_messageInfo_CidList.Merge(dst, src) +func (m *CidList) XXX_Merge(src proto.Message) { + xxx_messageInfo_CidList.Merge(m, src) } func (m *CidList) XXX_Size() int { return xxx_messageInfo_CidList.Size(m) @@ -479,16 +491,17 @@ func (m *Block) Reset() { *m = Block{} } func (m *Block) String() string { return proto.CompactTextString(m) } func (*Block) ProtoMessage() {} func (*Block) Descriptor() ([]byte, []int) { - return fileDescriptor_message_9461cb3f76d04d41, []int{5} + return fileDescriptor_33c57e4bae7b9afd, []int{5} } + func (m *Block) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Block.Unmarshal(m, b) } func (m *Block) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Block.Marshal(b, m, deterministic) } -func (dst *Block) XXX_Merge(src proto.Message) { - xxx_messageInfo_Block.Merge(dst, src) +func (m *Block) XXX_Merge(src proto.Message) { + xxx_messageInfo_Block.Merge(m, src) } func (m *Block) XXX_Size() int { return xxx_messageInfo_Block.Size(m) @@ -526,16 +539,17 @@ func (m *Error) Reset() { *m = Error{} } func (m *Error) String() string { return proto.CompactTextString(m) } func (*Error) ProtoMessage() {} func (*Error) Descriptor() ([]byte, []int) { - return fileDescriptor_message_9461cb3f76d04d41, []int{6} + return fileDescriptor_33c57e4bae7b9afd, []int{6} } + func (m *Error) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Error.Unmarshal(m, b) } func (m *Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Error.Marshal(b, m, deterministic) } -func (dst *Error) XXX_Merge(src proto.Message) { - xxx_messageInfo_Error.Merge(dst, src) +func (m *Error) XXX_Merge(src proto.Message) { + xxx_messageInfo_Error.Merge(m, src) } func (m *Error) XXX_Size() int { return xxx_messageInfo_Error.Size(m) @@ -581,16 +595,17 @@ func (m *OrderPaymentTxn) Reset() { *m = OrderPaymentTxn{} } func (m *OrderPaymentTxn) String() string { return proto.CompactTextString(m) } func (*OrderPaymentTxn) ProtoMessage() {} func (*OrderPaymentTxn) Descriptor() ([]byte, []int) { - return fileDescriptor_message_9461cb3f76d04d41, []int{7} + return fileDescriptor_33c57e4bae7b9afd, []int{7} } + func (m *OrderPaymentTxn) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_OrderPaymentTxn.Unmarshal(m, b) } func (m *OrderPaymentTxn) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_OrderPaymentTxn.Marshal(b, m, deterministic) } -func (dst *OrderPaymentTxn) XXX_Merge(src proto.Message) { - xxx_messageInfo_OrderPaymentTxn.Merge(dst, src) +func (m *OrderPaymentTxn) XXX_Merge(src proto.Message) { + xxx_messageInfo_OrderPaymentTxn.Merge(m, src) } func (m *OrderPaymentTxn) XXX_Size() int { return xxx_messageInfo_OrderPaymentTxn.Size(m) @@ -630,6 +645,8 @@ func (m *OrderPaymentTxn) GetWithInput() bool { } func init() { + proto.RegisterEnum("Message_MessageType", Message_MessageType_name, Message_MessageType_value) + proto.RegisterEnum("Chat_Flag", Chat_Flag_name, Chat_Flag_value) proto.RegisterType((*Message)(nil), "Message") proto.RegisterType((*Envelope)(nil), "Envelope") proto.RegisterType((*Chat)(nil), "Chat") @@ -639,13 +656,11 @@ func init() { proto.RegisterType((*Block)(nil), "Block") proto.RegisterType((*Error)(nil), "Error") proto.RegisterType((*OrderPaymentTxn)(nil), "OrderPaymentTxn") - proto.RegisterEnum("Message_MessageType", Message_MessageType_name, Message_MessageType_value) - proto.RegisterEnum("Chat_Flag", Chat_Flag_name, Chat_Flag_value) } -func init() { proto.RegisterFile("message.proto", fileDescriptor_message_9461cb3f76d04d41) } +func init() { proto.RegisterFile("message.proto", fileDescriptor_33c57e4bae7b9afd) } -var fileDescriptor_message_9461cb3f76d04d41 = []byte{ +var fileDescriptor_33c57e4bae7b9afd = []byte{ // 873 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x54, 0x41, 0x8f, 0xdb, 0x44, 0x14, 0xae, 0x63, 0x67, 0x93, 0xbc, 0x64, 0x77, 0x67, 0x87, 0x6d, 0x65, 0x56, 0x6d, 0x89, 0x2c, diff --git a/pb/moderator.pb.go b/pb/moderator.pb.go index 1bb9293b48..b4102f1525 100644 --- a/pb/moderator.pb.go +++ b/pb/moderator.pb.go @@ -3,9 +3,11 @@ package pb -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -16,7 +18,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type Moderator_Fee_FeeType int32 @@ -31,6 +33,7 @@ var Moderator_Fee_FeeType_name = map[int32]string{ 1: "PERCENTAGE", 2: "FIXED_PLUS_PERCENTAGE", } + var Moderator_Fee_FeeType_value = map[string]int32{ "FIXED": 0, "PERCENTAGE": 1, @@ -40,8 +43,9 @@ var Moderator_Fee_FeeType_value = map[string]int32{ func (x Moderator_Fee_FeeType) String() string { return proto.EnumName(Moderator_Fee_FeeType_name, int32(x)) } + func (Moderator_Fee_FeeType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_moderator_693ca1f6a156447c, []int{0, 0, 0} + return fileDescriptor_44f20453d9230215, []int{0, 0, 0} } type Moderator struct { @@ -59,16 +63,17 @@ func (m *Moderator) Reset() { *m = Moderator{} } func (m *Moderator) String() string { return proto.CompactTextString(m) } func (*Moderator) ProtoMessage() {} func (*Moderator) Descriptor() ([]byte, []int) { - return fileDescriptor_moderator_693ca1f6a156447c, []int{0} + return fileDescriptor_44f20453d9230215, []int{0} } + func (m *Moderator) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Moderator.Unmarshal(m, b) } func (m *Moderator) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Moderator.Marshal(b, m, deterministic) } -func (dst *Moderator) XXX_Merge(src proto.Message) { - xxx_messageInfo_Moderator.Merge(dst, src) +func (m *Moderator) XXX_Merge(src proto.Message) { + xxx_messageInfo_Moderator.Merge(m, src) } func (m *Moderator) XXX_Size() int { return xxx_messageInfo_Moderator.Size(m) @@ -127,16 +132,17 @@ func (m *Moderator_Fee) Reset() { *m = Moderator_Fee{} } func (m *Moderator_Fee) String() string { return proto.CompactTextString(m) } func (*Moderator_Fee) ProtoMessage() {} func (*Moderator_Fee) Descriptor() ([]byte, []int) { - return fileDescriptor_moderator_693ca1f6a156447c, []int{0, 0} + return fileDescriptor_44f20453d9230215, []int{0, 0} } + func (m *Moderator_Fee) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Moderator_Fee.Unmarshal(m, b) } func (m *Moderator_Fee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Moderator_Fee.Marshal(b, m, deterministic) } -func (dst *Moderator_Fee) XXX_Merge(src proto.Message) { - xxx_messageInfo_Moderator_Fee.Merge(dst, src) +func (m *Moderator_Fee) XXX_Merge(src proto.Message) { + xxx_messageInfo_Moderator_Fee.Merge(m, src) } func (m *Moderator_Fee) XXX_Size() int { return xxx_messageInfo_Moderator_Fee.Size(m) @@ -182,16 +188,17 @@ func (m *Moderator_Price) Reset() { *m = Moderator_Price{} } func (m *Moderator_Price) String() string { return proto.CompactTextString(m) } func (*Moderator_Price) ProtoMessage() {} func (*Moderator_Price) Descriptor() ([]byte, []int) { - return fileDescriptor_moderator_693ca1f6a156447c, []int{0, 1} + return fileDescriptor_44f20453d9230215, []int{0, 1} } + func (m *Moderator_Price) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Moderator_Price.Unmarshal(m, b) } func (m *Moderator_Price) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Moderator_Price.Marshal(b, m, deterministic) } -func (dst *Moderator_Price) XXX_Merge(src proto.Message) { - xxx_messageInfo_Moderator_Price.Merge(dst, src) +func (m *Moderator_Price) XXX_Merge(src proto.Message) { + xxx_messageInfo_Moderator_Price.Merge(m, src) } func (m *Moderator_Price) XXX_Size() int { return xxx_messageInfo_Moderator_Price.Size(m) @@ -246,16 +253,17 @@ func (m *DisputeUpdate) Reset() { *m = DisputeUpdate{} } func (m *DisputeUpdate) String() string { return proto.CompactTextString(m) } func (*DisputeUpdate) ProtoMessage() {} func (*DisputeUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_moderator_693ca1f6a156447c, []int{1} + return fileDescriptor_44f20453d9230215, []int{1} } + func (m *DisputeUpdate) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_DisputeUpdate.Unmarshal(m, b) } func (m *DisputeUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_DisputeUpdate.Marshal(b, m, deterministic) } -func (dst *DisputeUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_DisputeUpdate.Merge(dst, src) +func (m *DisputeUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_DisputeUpdate.Merge(m, src) } func (m *DisputeUpdate) XXX_Size() int { return xxx_messageInfo_DisputeUpdate.Size(m) @@ -295,16 +303,16 @@ func (m *DisputeUpdate) GetSerializedContract() []byte { } func init() { + proto.RegisterEnum("Moderator_Fee_FeeType", Moderator_Fee_FeeType_name, Moderator_Fee_FeeType_value) proto.RegisterType((*Moderator)(nil), "Moderator") proto.RegisterType((*Moderator_Fee)(nil), "Moderator.Fee") proto.RegisterType((*Moderator_Price)(nil), "Moderator.Price") proto.RegisterType((*DisputeUpdate)(nil), "DisputeUpdate") - proto.RegisterEnum("Moderator_Fee_FeeType", Moderator_Fee_FeeType_name, Moderator_Fee_FeeType_value) } -func init() { proto.RegisterFile("moderator.proto", fileDescriptor_moderator_693ca1f6a156447c) } +func init() { proto.RegisterFile("moderator.proto", fileDescriptor_44f20453d9230215) } -var fileDescriptor_moderator_693ca1f6a156447c = []byte{ +var fileDescriptor_44f20453d9230215 = []byte{ // 469 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0xdb, 0x8b, 0xd3, 0x40, 0x14, 0xc6, 0xcd, 0xa5, 0x5b, 0x73, 0xba, 0xdb, 0x2d, 0x23, 0x4a, 0x2c, 0x22, 0xa1, 0x88, 0xf6, diff --git a/pb/orders.pb.go b/pb/orders.pb.go index 89520fedbc..095d2bd9c2 100644 --- a/pb/orders.pb.go +++ b/pb/orders.pb.go @@ -3,9 +3,11 @@ package pb -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -16,7 +18,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type OrderState int32 @@ -75,6 +77,7 @@ var OrderState_name = map[int32]string{ 13: "PAYMENT_FINALIZED", 14: "PROCESSING_ERROR", } + var OrderState_value = map[string]int32{ "PENDING": 0, "AWAITING_PAYMENT": 1, @@ -96,17 +99,18 @@ var OrderState_value = map[string]int32{ func (x OrderState) String() string { return proto.EnumName(OrderState_name, int32(x)) } + func (OrderState) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_orders_c6051e92f6cf6ced, []int{0} + return fileDescriptor_e0f5d4cf0fc9e41b, []int{0} } func init() { proto.RegisterEnum("OrderState", OrderState_name, OrderState_value) } -func init() { proto.RegisterFile("orders.proto", fileDescriptor_orders_c6051e92f6cf6ced) } +func init() { proto.RegisterFile("orders.proto", fileDescriptor_e0f5d4cf0fc9e41b) } -var fileDescriptor_orders_c6051e92f6cf6ced = []byte{ +var fileDescriptor_e0f5d4cf0fc9e41b = []byte{ // 243 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x44, 0x90, 0x4d, 0x4e, 0xc3, 0x30, 0x10, 0x85, 0xa1, 0x94, 0xfe, 0x4c, 0x53, 0x18, 0xdc, 0x22, 0x38, 0x03, 0x0b, 0x36, 0x9c, 0xc0, diff --git a/pb/posts.pb.go b/pb/posts.pb.go index 3f05963eba..0deb6cfcbb 100644 --- a/pb/posts.pb.go +++ b/pb/posts.pb.go @@ -3,10 +3,12 @@ package pb -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import timestamp "github.com/golang/protobuf/ptypes/timestamp" +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -17,7 +19,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type Post_PostType int32 @@ -32,6 +34,7 @@ var Post_PostType_name = map[int32]string{ 1: "COMMENT", 2: "REPOST", } + var Post_PostType_value = map[string]int32{ "POST": 0, "COMMENT": 1, @@ -41,8 +44,9 @@ var Post_PostType_value = map[string]int32{ func (x Post_PostType) String() string { return proto.EnumName(Post_PostType_name, int32(x)) } + func (Post_PostType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_posts_590fe5621382a1af, []int{0, 0} + return fileDescriptor_b14bd1586479c33d, []int{0, 0} } type Post struct { @@ -65,16 +69,17 @@ func (m *Post) Reset() { *m = Post{} } func (m *Post) String() string { return proto.CompactTextString(m) } func (*Post) ProtoMessage() {} func (*Post) Descriptor() ([]byte, []int) { - return fileDescriptor_posts_590fe5621382a1af, []int{0} + return fileDescriptor_b14bd1586479c33d, []int{0} } + func (m *Post) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Post.Unmarshal(m, b) } func (m *Post) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Post.Marshal(b, m, deterministic) } -func (dst *Post) XXX_Merge(src proto.Message) { - xxx_messageInfo_Post.Merge(dst, src) +func (m *Post) XXX_Merge(src proto.Message) { + xxx_messageInfo_Post.Merge(m, src) } func (m *Post) XXX_Size() int { return xxx_messageInfo_Post.Size(m) @@ -171,16 +176,17 @@ func (m *Post_Image) Reset() { *m = Post_Image{} } func (m *Post_Image) String() string { return proto.CompactTextString(m) } func (*Post_Image) ProtoMessage() {} func (*Post_Image) Descriptor() ([]byte, []int) { - return fileDescriptor_posts_590fe5621382a1af, []int{0, 0} + return fileDescriptor_b14bd1586479c33d, []int{0, 0} } + func (m *Post_Image) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Post_Image.Unmarshal(m, b) } func (m *Post_Image) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Post_Image.Marshal(b, m, deterministic) } -func (dst *Post_Image) XXX_Merge(src proto.Message) { - xxx_messageInfo_Post_Image.Merge(dst, src) +func (m *Post_Image) XXX_Merge(src proto.Message) { + xxx_messageInfo_Post_Image.Merge(m, src) } func (m *Post_Image) XXX_Size() int { return xxx_messageInfo_Post_Image.Size(m) @@ -246,16 +252,17 @@ func (m *SignedPost) Reset() { *m = SignedPost{} } func (m *SignedPost) String() string { return proto.CompactTextString(m) } func (*SignedPost) ProtoMessage() {} func (*SignedPost) Descriptor() ([]byte, []int) { - return fileDescriptor_posts_590fe5621382a1af, []int{1} + return fileDescriptor_b14bd1586479c33d, []int{1} } + func (m *SignedPost) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_SignedPost.Unmarshal(m, b) } func (m *SignedPost) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_SignedPost.Marshal(b, m, deterministic) } -func (dst *SignedPost) XXX_Merge(src proto.Message) { - xxx_messageInfo_SignedPost.Merge(dst, src) +func (m *SignedPost) XXX_Merge(src proto.Message) { + xxx_messageInfo_SignedPost.Merge(m, src) } func (m *SignedPost) XXX_Size() int { return xxx_messageInfo_SignedPost.Size(m) @@ -288,15 +295,15 @@ func (m *SignedPost) GetSignature() []byte { } func init() { + proto.RegisterEnum("Post_PostType", Post_PostType_name, Post_PostType_value) proto.RegisterType((*Post)(nil), "Post") proto.RegisterType((*Post_Image)(nil), "Post.Image") proto.RegisterType((*SignedPost)(nil), "SignedPost") - proto.RegisterEnum("Post_PostType", Post_PostType_name, Post_PostType_value) } -func init() { proto.RegisterFile("posts.proto", fileDescriptor_posts_590fe5621382a1af) } +func init() { proto.RegisterFile("posts.proto", fileDescriptor_b14bd1586479c33d) } -var fileDescriptor_posts_590fe5621382a1af = []byte{ +var fileDescriptor_b14bd1586479c33d = []byte{ // 429 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x44, 0x92, 0x4f, 0x8b, 0xdb, 0x30, 0x10, 0xc5, 0xeb, 0xc4, 0xf6, 0xda, 0xe3, 0xb2, 0x5d, 0x44, 0x29, 0x6a, 0x28, 0xac, 0x49, 0x2f, diff --git a/pb/profile.pb.go b/pb/profile.pb.go index 4cc25da0e4..20fd743a42 100644 --- a/pb/profile.pb.go +++ b/pb/profile.pb.go @@ -3,10 +3,12 @@ package pb -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import timestamp "github.com/golang/protobuf/ptypes/timestamp" +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + timestamp "github.com/golang/protobuf/ptypes/timestamp" + math "math" +) // Reference imports to suppress errors if they are not otherwise used. var _ = proto.Marshal @@ -17,7 +19,7 @@ var _ = math.Inf // is compatible with the proto package it is being compiled against. // A compilation error at this line likely means your copy of the // proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type Profile struct { PeerID string `protobuf:"bytes,1,opt,name=peerID,proto3" json:"peerID,omitempty"` @@ -48,16 +50,17 @@ func (m *Profile) Reset() { *m = Profile{} } func (m *Profile) String() string { return proto.CompactTextString(m) } func (*Profile) ProtoMessage() {} func (*Profile) Descriptor() ([]byte, []int) { - return fileDescriptor_profile_0226022e2946dd53, []int{0} + return fileDescriptor_744bf7a47b381504, []int{0} } + func (m *Profile) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Profile.Unmarshal(m, b) } func (m *Profile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Profile.Marshal(b, m, deterministic) } -func (dst *Profile) XXX_Merge(src proto.Message) { - xxx_messageInfo_Profile.Merge(dst, src) +func (m *Profile) XXX_Merge(src proto.Message) { + xxx_messageInfo_Profile.Merge(m, src) } func (m *Profile) XXX_Size() int { return xxx_messageInfo_Profile.Size(m) @@ -215,16 +218,17 @@ func (m *Profile_Contact) Reset() { *m = Profile_Contact{} } func (m *Profile_Contact) String() string { return proto.CompactTextString(m) } func (*Profile_Contact) ProtoMessage() {} func (*Profile_Contact) Descriptor() ([]byte, []int) { - return fileDescriptor_profile_0226022e2946dd53, []int{0, 0} + return fileDescriptor_744bf7a47b381504, []int{0, 0} } + func (m *Profile_Contact) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Profile_Contact.Unmarshal(m, b) } func (m *Profile_Contact) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Profile_Contact.Marshal(b, m, deterministic) } -func (dst *Profile_Contact) XXX_Merge(src proto.Message) { - xxx_messageInfo_Profile_Contact.Merge(dst, src) +func (m *Profile_Contact) XXX_Merge(src proto.Message) { + xxx_messageInfo_Profile_Contact.Merge(m, src) } func (m *Profile_Contact) XXX_Size() int { return xxx_messageInfo_Profile_Contact.Size(m) @@ -276,16 +280,17 @@ func (m *Profile_SocialAccount) Reset() { *m = Profile_SocialAccount{} } func (m *Profile_SocialAccount) String() string { return proto.CompactTextString(m) } func (*Profile_SocialAccount) ProtoMessage() {} func (*Profile_SocialAccount) Descriptor() ([]byte, []int) { - return fileDescriptor_profile_0226022e2946dd53, []int{0, 1} + return fileDescriptor_744bf7a47b381504, []int{0, 1} } + func (m *Profile_SocialAccount) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Profile_SocialAccount.Unmarshal(m, b) } func (m *Profile_SocialAccount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Profile_SocialAccount.Marshal(b, m, deterministic) } -func (dst *Profile_SocialAccount) XXX_Merge(src proto.Message) { - xxx_messageInfo_Profile_SocialAccount.Merge(dst, src) +func (m *Profile_SocialAccount) XXX_Merge(src proto.Message) { + xxx_messageInfo_Profile_SocialAccount.Merge(m, src) } func (m *Profile_SocialAccount) XXX_Size() int { return xxx_messageInfo_Profile_SocialAccount.Size(m) @@ -332,16 +337,17 @@ func (m *Profile_Image) Reset() { *m = Profile_Image{} } func (m *Profile_Image) String() string { return proto.CompactTextString(m) } func (*Profile_Image) ProtoMessage() {} func (*Profile_Image) Descriptor() ([]byte, []int) { - return fileDescriptor_profile_0226022e2946dd53, []int{0, 2} + return fileDescriptor_744bf7a47b381504, []int{0, 2} } + func (m *Profile_Image) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Profile_Image.Unmarshal(m, b) } func (m *Profile_Image) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Profile_Image.Marshal(b, m, deterministic) } -func (dst *Profile_Image) XXX_Merge(src proto.Message) { - xxx_messageInfo_Profile_Image.Merge(dst, src) +func (m *Profile_Image) XXX_Merge(src proto.Message) { + xxx_messageInfo_Profile_Image.Merge(m, src) } func (m *Profile_Image) XXX_Size() int { return xxx_messageInfo_Profile_Image.Size(m) @@ -402,16 +408,17 @@ func (m *Profile_Colors) Reset() { *m = Profile_Colors{} } func (m *Profile_Colors) String() string { return proto.CompactTextString(m) } func (*Profile_Colors) ProtoMessage() {} func (*Profile_Colors) Descriptor() ([]byte, []int) { - return fileDescriptor_profile_0226022e2946dd53, []int{0, 3} + return fileDescriptor_744bf7a47b381504, []int{0, 3} } + func (m *Profile_Colors) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Profile_Colors.Unmarshal(m, b) } func (m *Profile_Colors) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Profile_Colors.Marshal(b, m, deterministic) } -func (dst *Profile_Colors) XXX_Merge(src proto.Message) { - xxx_messageInfo_Profile_Colors.Merge(dst, src) +func (m *Profile_Colors) XXX_Merge(src proto.Message) { + xxx_messageInfo_Profile_Colors.Merge(m, src) } func (m *Profile_Colors) XXX_Size() int { return xxx_messageInfo_Profile_Colors.Size(m) @@ -473,16 +480,17 @@ func (m *Profile_Stats) Reset() { *m = Profile_Stats{} } func (m *Profile_Stats) String() string { return proto.CompactTextString(m) } func (*Profile_Stats) ProtoMessage() {} func (*Profile_Stats) Descriptor() ([]byte, []int) { - return fileDescriptor_profile_0226022e2946dd53, []int{0, 4} + return fileDescriptor_744bf7a47b381504, []int{0, 4} } + func (m *Profile_Stats) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_Profile_Stats.Unmarshal(m, b) } func (m *Profile_Stats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Profile_Stats.Marshal(b, m, deterministic) } -func (dst *Profile_Stats) XXX_Merge(src proto.Message) { - xxx_messageInfo_Profile_Stats.Merge(dst, src) +func (m *Profile_Stats) XXX_Merge(src proto.Message) { + xxx_messageInfo_Profile_Stats.Merge(m, src) } func (m *Profile_Stats) XXX_Size() int { return xxx_messageInfo_Profile_Stats.Size(m) @@ -544,9 +552,9 @@ func init() { proto.RegisterType((*Profile_Stats)(nil), "Profile.Stats") } -func init() { proto.RegisterFile("profile.proto", fileDescriptor_profile_0226022e2946dd53) } +func init() { proto.RegisterFile("profile.proto", fileDescriptor_744bf7a47b381504) } -var fileDescriptor_profile_0226022e2946dd53 = []byte{ +var fileDescriptor_744bf7a47b381504 = []byte{ // 716 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x94, 0xcf, 0x6e, 0xc3, 0x44, 0x10, 0xc6, 0xe5, 0xfc, 0x6d, 0x36, 0x49, 0x5b, 0x16, 0x54, 0xad, 0x2c, 0x04, 0x51, 0x55, 0x41, diff --git a/pb/protos/contracts.proto b/pb/protos/contracts.proto index e1ba78ceab..4cfedcd779 100644 --- a/pb/protos/contracts.proto +++ b/pb/protos/contracts.proto @@ -145,9 +145,11 @@ message Listing { string hash = 2; string discountCode = 3; } - float percentDiscount = 5; - uint64 priceDiscount = 6 [deprecated = true]; // prefer bigPriceDiscount - string bigPriceDiscount = 7; // added schema v5 + oneof discount { + float percentDiscount = 5; + uint64 priceDiscount = 6 [deprecated = true]; // prefer bigPriceDiscount + string bigPriceDiscount = 7; // added schema v5 + } } } diff --git a/repo/listing.go b/repo/listing.go index dd3a6fcc17..94745264d9 100644 --- a/repo/listing.go +++ b/repo/listing.go @@ -920,10 +920,15 @@ func (cs ListingCoupons) GetProtobuf() []*pb.Listing_Coupon { for i, c := range cs { cspb[i] = &pb.Listing_Coupon{ Title: c.GetTitle(), - PercentDiscount: c.GetPercentOff(), } - if c.GetAmountOff() != nil { - cspb[i].BigPriceDiscount = c.GetAmountOff().Amount.String() + if c.GetPercentOff() > 0 { + cspb[i].Discount = &pb.Listing_Coupon_PercentDiscount{ + PercentDiscount: c.GetPercentOff(), + } + } else if c.GetAmountOff() != nil { + cspb[i].Discount = &pb.Listing_Coupon_BigPriceDiscount{ + BigPriceDiscount: c.GetAmountOff().Amount.String(), + } } if hash, err := c.GetRedemptionHash(); err == nil { cspb[i].Code = &pb.Listing_Coupon_Hash{Hash: hash} @@ -1488,16 +1493,16 @@ func (l *Listing) ValidateListing(testnet bool) (err error) { if coupon.GetPercentDiscount() > 100 { return errors.New("percent discount cannot be over 100 percent") } - n, ok := new(big.Int).SetString(l.listingProto.Item.BigPrice, 10) - if !ok { - return errors.New("price was invalid") + price, err := l.GetPrice() + if err != nil { + return err } if coupon.GetBigPriceDiscount() != "" { - discount0, ok := new(big.Int).SetString(coupon.BigPriceDiscount, 10) + discount0, ok := new(big.Int).SetString(coupon.GetBigPriceDiscount(), 10) if !ok { return errors.New("coupon discount was invalid") } - if n.Cmp(discount0) < 0 { + if price.Amount.Cmp(discount0) < 0 { return errors.New("price discount cannot be greater than the item price") } } @@ -1545,19 +1550,20 @@ func (l *Listing) ValidateListing(testnet bool) (err error) { // Non-crypto validations if l.listingProto.Metadata.ContractType != pb.Listing_Metadata_CRYPTOCURRENCY { - if l.listingProto.Item.PriceCurrency == nil { + price, err := l.GetPrice() + if err != nil { + return err + } + if price.Currency.Code == "" { return errors.New("pricing currency is missing") } - if priceCurrency, err := AllCurrencies().Lookup(l.listingProto.Item.PriceCurrency.Code); err != nil { + if priceCurrency, err := AllCurrencies().Lookup(price.Currency.Code.String()); err != nil { return errors.New("invalid pricing currency") } else { - if uint(l.listingProto.Item.PriceCurrency.Divisibility) > priceCurrency.Divisibility { + if uint(price.Currency.Divisibility) > priceCurrency.Divisibility { return errors.New("pricing currency divisibility is too large") } } - if _, ok := new(big.Int).SetString(l.listingProto.Item.BigPrice, 10); !ok { - return errors.New("invalid item price amount") - } } // Format-specific validations @@ -1587,7 +1593,11 @@ func (l *Listing) validatePhysicalListing() error { return fmt.Errorf("number of shipping options is greater than the max of %d", MaxListItems) } var shippingTitles []string - for _, shippingOption := range l.listingProto.ShippingOptions { + shippingOptions, err := l.GetShippingOptions() + if err != nil { + return err + } + for _, shippingOption := range shippingOptions { if shippingOption.Name == "" { return errors.New("shipping option title name must not be empty") } diff --git a/repo/signed_listing.go b/repo/signed_listing.go index 9c9c735bc7..4603e38a59 100644 --- a/repo/signed_listing.go +++ b/repo/signed_listing.go @@ -132,7 +132,6 @@ func (l SignedListing) VerifySignature() error { if err != nil { return fmt.Errorf("marshaling listing: %s", err.Error()) } - pubkey, err := l.GetListing().GetVendorID().IdentityKey() if err != nil { return fmt.Errorf("getting identity pubkey: %s", err.Error()) diff --git a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/erc20_wallet.go b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/erc20_wallet.go index a6aff85b06..d842fa7bb2 100644 --- a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/erc20_wallet.go +++ b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/erc20_wallet.go @@ -296,6 +296,9 @@ func (wallet *ERC20Wallet) Transactions() ([]wi.Txn, error) { if t.IsError != 0 { status = wi.StatusError } + if t.Confirmations > 0 && t.Confirmations < 300 { + status = wi.StatusPending + } tnew := wi.Txn{ Txid: t.Hash, Value: t.Value.Int().String(), From 3f25b69eb1060332f6e9bc07a8500b3082804e9d Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 17 Mar 2020 09:01:58 -0400 Subject: [PATCH 23/34] Put eth unconfirmed txs at begining of list return --- .../OpenBazaar/go-ethwallet/wallet/wallet.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go index bc669641ec..3c4780f476 100644 --- a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go +++ b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go @@ -520,17 +520,12 @@ func (wallet *EthereumWallet) Balance() (confirmed, unconfirmed wi.CurrencyValue // TransactionsFromBlock - Returns a list of transactions for this wallet begining from the specified block func (wallet *EthereumWallet) TransactionsFromBlock(startBlock *int) ([]wi.Txn, error) { ret := []wi.Txn{} - unconf, err := wallet.db.Txns().GetAll(false) - if err == nil { - for _, u := range unconf { - u.Status = wi.StatusUnconfirmed - ret = append(ret, u) - } - } + + unconf, uerr := wallet.db.Txns().GetAll(false) txns, err := wallet.client.eClient.NormalTxByAddress(util.EnsureCorrectPrefix(wallet.account.Address().String()), startBlock, nil, 1, 0, false) - if err != nil { + if err != nil && len(unconf) == 0 { log.Error("err fetching transactions : ", err) return []wi.Txn{}, nil } @@ -560,6 +555,11 @@ func (wallet *EthereumWallet) TransactionsFromBlock(startBlock *int) ([]wi.Txn, ret = append(ret, tnew) } + for _, u := range unconf { + u.Status = wi.StatusUnconfirmed + ret = append(ret, u) + } + return ret, nil } From 01a24c1d523ed619016bd2107795abbed5852b38 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 17 Mar 2020 10:57:33 -0400 Subject: [PATCH 24/34] Ignore eth error fetching txs --- vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go index 3c4780f476..4bceb0b095 100644 --- a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go +++ b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go @@ -521,7 +521,7 @@ func (wallet *EthereumWallet) Balance() (confirmed, unconfirmed wi.CurrencyValue func (wallet *EthereumWallet) TransactionsFromBlock(startBlock *int) ([]wi.Txn, error) { ret := []wi.Txn{} - unconf, uerr := wallet.db.Txns().GetAll(false) + unconf, _ := wallet.db.Txns().GetAll(false) txns, err := wallet.client.eClient.NormalTxByAddress(util.EnsureCorrectPrefix(wallet.account.Address().String()), startBlock, nil, 1, 0, false) From fa5e79b0abc4cc4d85b61cdc72adec9180d74444 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 17 Mar 2020 11:07:05 -0400 Subject: [PATCH 25/34] Fix zero amount on unconfirmed tx --- vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go index 4bceb0b095..a95db5d5d3 100644 --- a/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go +++ b/vendor/github.com/OpenBazaar/go-ethwallet/wallet/wallet.go @@ -747,7 +747,7 @@ func (wallet *EthereumWallet) Spend(amount big.Int, addr btcutil.Address, feeLev WithInput: false, }) if err == nil { - err0 := wallet.db.Txns().Put(data, ut.NormalizeAddress(hash.Hex()), "0", 0, time.Now(), watchOnly) + err0 := wallet.db.Txns().Put(data, ut.NormalizeAddress(hash.Hex()), amount.String(), 0, time.Now(), watchOnly) if err0 != nil { log.Error(err0.Error()) } From cffc9c8ae44d1e9885e39358d774c3e4a0a05d16 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 20 Mar 2020 12:09:27 -0400 Subject: [PATCH 26/34] Don't set v5 fields when sending v4 contract --- api/jsonapi.go | 15 +++++- core/order.go | 65 +++++++++++++++++------- qa/cancel_direct_offline.py | 4 +- qa/complete_direct_online.py | 6 +-- qa/purchase_direct_online.py | 2 +- repo/buyer_order.go | 3 ++ wallet/listeners/transaction_listener.go | 22 +++++--- 7 files changed, 84 insertions(+), 33 deletions(-) diff --git a/api/jsonapi.go b/api/jsonapi.go index ee6198d069..2ab0d0c632 100644 --- a/api/jsonapi.go +++ b/api/jsonapi.go @@ -1675,9 +1675,14 @@ func (i *jsonAPIHandler) POSTOrderCancel(w http.ResponseWriter, r *http.Request) ErrorResponse(w, http.StatusNotFound, "order not found") return } + v5order, err := repo.ToV5Order(contract.BuyerOrder, nil) + if err != nil { + ErrorResponse(w, http.StatusNotFound, "order not found") + return + } // TODO: Remove once broken contracts are migrated - lookupCoin := contract.BuyerOrder.Payment.AmountCurrency.Code + lookupCoin := v5order.Payment.AmountCurrency.Code _, err = i.node.LookupCurrency(lookupCoin) if err != nil { log.Warningf("invalid BuyerOrder.Payment.Coin (%s) on order (%s)", lookupCoin, can.OrderID) @@ -2022,8 +2027,14 @@ func (i *jsonAPIHandler) POSTOrderComplete(w http.ResponseWriter, r *http.Reques return } + v5order, err := repo.ToV5Order(contract.BuyerOrder, nil) + if err != nil { + ErrorResponse(w, http.StatusNotFound, "order not found") + return + } + // TODO: Remove once broken contracts are migrated - lookupCoin := contract.BuyerOrder.Payment.AmountCurrency.Code + lookupCoin := v5order.Payment.AmountCurrency.Code _, err = i.node.LookupCurrency(lookupCoin) if err != nil { log.Warningf("invalid BuyerOrder.Payment.Coin (%s) on order (%s)", lookupCoin, or.OrderID) diff --git a/core/order.go b/core/order.go index 6aa19993c0..50557aa472 100644 --- a/core/order.go +++ b/core/order.go @@ -165,11 +165,14 @@ func (n *OpenBazaarNode) Purchase(data *repo.PurchaseData) (orderID string, paym payment.Method = pb.Order_Payment_ADDRESS_REQUEST contract.BuyerOrder.Payment = payment - payment.AmountCurrency = &pb.CurrencyDefinition{ - Code: defn.Code.String(), - Divisibility: uint32(defn.Divisibility), + if contract.VendorListings[0].Metadata.Version >= repo.ListingVersion { + payment.AmountCurrency = &pb.CurrencyDefinition{ + Code: defn.Code.String(), + Divisibility: uint32(defn.Divisibility), + } + } else { + payment.Coin = defn.Code.String() } - payment.Coin = defn.Code.String() // Calculate payment amount total, err := n.CalculateOrderTotal(contract) @@ -181,8 +184,11 @@ func (n *OpenBazaarNode) Purchase(data *repo.PurchaseData) (orderID string, paym return "", "", retCurrency, false, ErrSpendAmountIsDust } - payment.BigAmount = total.String() - payment.Amount = total.Uint64() + if contract.VendorListings[0].Metadata.Version >= repo.ListingVersion { + payment.BigAmount = total.String() + } else { + payment.Amount = total.Uint64() + } contract, err = n.SignOrder(contract) if err != nil { @@ -236,17 +242,24 @@ func prepareModeratedOrderContract(data *repo.PurchaseData, n *OpenBazaarNode, c return nil, errors.New("moderator does not accept our currency") } contract.BuyerOrder.Payment = payment - payment.AmountCurrency = &pb.CurrencyDefinition{ - Code: defn.Code.String(), - Divisibility: uint32(defn.Divisibility), + if contract.VendorListings[0].Metadata.Version >= repo.ListingVersion { + payment.AmountCurrency = &pb.CurrencyDefinition{ + Code: defn.Code.String(), + Divisibility: uint32(defn.Divisibility), + } + } else { + payment.Coin = defn.Code.String() } - payment.Coin = defn.Code.String() + total, err := n.CalculateOrderTotal(contract) if err != nil { return nil, err } - payment.BigAmount = total.String() - payment.Amount = total.Uint64() + if contract.VendorListings[0].Metadata.Version >= repo.ListingVersion { + payment.BigAmount = total.String() + } else { + payment.Amount = total.Uint64() + } contract.BuyerOrder.Payment = payment fpb := wal.GetFeePerByte(wallet.NORMAL) @@ -345,7 +358,12 @@ func processOnlineDirectOrder(resp *pb.Message, n *OpenBazaarNode, wal wallet.Wa if err != nil { return "", "", *big.NewInt(0), false, err } - total, ok := new(big.Int).SetString(contract.BuyerOrder.Payment.BigAmount, 10) + + v5Order, err := repo.ToV5Order(contract.BuyerOrder, nil) + if err != nil { + return "", "", *big.NewInt(0), false, err + } + total, ok := new(big.Int).SetString(v5Order.Payment.BigAmount, 10) if !ok { return "", "", *big.NewInt(0), false, errors.New("invalid payment amount") } @@ -355,8 +373,12 @@ func processOnlineDirectOrder(resp *pb.Message, n *OpenBazaarNode, wal wallet.Wa func processOfflineDirectOrder(n *OpenBazaarNode, wal wallet.Wallet, contract *pb.RicardianContract, payment *pb.Order_Payment) (string, string, big.Int, error) { // Vendor offline // Change payment code to direct + v5Order, err := repo.ToV5Order(contract.BuyerOrder, nil) + if err != nil { + return "", "", *big.NewInt(0), err + } - total, ok := new(big.Int).SetString(contract.BuyerOrder.Payment.BigAmount, 10) + total, ok := new(big.Int).SetString(v5Order.Payment.BigAmount, 10) if !ok { return "", "", *big.NewInt(0), errors.New("invalid payment amount") } @@ -372,7 +394,7 @@ func processOfflineDirectOrder(n *OpenBazaarNode, wal wallet.Wallet, contract *p /* Generate a payment address using the first child key derived from the buyer's and vendors's masterPubKeys and a random chaincode. */ chaincode := make([]byte, 32) - _, err := rand.Read(chaincode) + _, err = rand.Read(chaincode) if err != nil { return "", "", *big.NewInt(0), err } @@ -823,11 +845,16 @@ func (n *OpenBazaarNode) EstimateOrderTotal(data *repo.PurchaseData) (*big.Int, // CancelOfflineOrder - cancel order func (n *OpenBazaarNode) CancelOfflineOrder(contract *pb.RicardianContract, records []*wallet.TransactionRecord) error { + v5Order, err := repo.ToV5Order(contract.BuyerOrder, nil) + if err != nil { + return err + } + orderID, err := n.CalcOrderID(contract.BuyerOrder) if err != nil { return err } - wal, err := n.Multiwallet.WalletForCurrencyCode(contract.BuyerOrder.Payment.AmountCurrency.Code) + wal, err := n.Multiwallet.WalletForCurrencyCode(v5Order.Payment.AmountCurrency.Code) if err != nil { return err } @@ -857,7 +884,7 @@ func (n *OpenBazaarNode) CancelOfflineOrder(contract *pb.RicardianContract, reco return errors.New("cannot cancel order because utxo has already been spent") } - chaincode, err := hex.DecodeString(contract.BuyerOrder.Payment.Chaincode) + chaincode, err := hex.DecodeString(v5Order.Payment.Chaincode) if err != nil { return err } @@ -869,11 +896,11 @@ func (n *OpenBazaarNode) CancelOfflineOrder(contract *pb.RicardianContract, reco if err != nil { return err } - redeemScript, err := hex.DecodeString(contract.BuyerOrder.Payment.RedeemScript) + redeemScript, err := hex.DecodeString(v5Order.Payment.RedeemScript) if err != nil { return err } - refundAddress, err := wal.DecodeAddress(contract.BuyerOrder.RefundAddress) + refundAddress, err := wal.DecodeAddress(v5Order.RefundAddress) if err != nil { return err } diff --git a/qa/cancel_direct_offline.py b/qa/cancel_direct_offline.py index a6260c9653..5d354efafc 100644 --- a/qa/cancel_direct_offline.py +++ b/qa/cancel_direct_offline.py @@ -39,7 +39,7 @@ def run_test(self): with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -108,7 +108,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype diff --git a/qa/complete_direct_online.py b/qa/complete_direct_online.py index 451c455002..7fcb792f33 100644 --- a/qa/complete_direct_online.py +++ b/qa/complete_direct_online.py @@ -39,7 +39,7 @@ def run_test(self): with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["metadata"]["acceptedCurrencies"] = ["T" + self.cointype] - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -110,7 +110,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype @@ -144,7 +144,7 @@ def run_test(self): raise TestFailure("CompleteDirectOnlineTest - FAIL: Alice failed to detect payment") if resp["funded"] == False: raise TestFailure("CompleteDirectOnlineTest - FAIL: Alice incorrectly saved as unfunded") - + # alice send order fulfillment with open('testdata/'+ self.vendor_version +'/fulfillment.json') as fulfillment_file: fulfillment_json = json.load(fulfillment_file, object_pairs_hook=OrderedDict) diff --git a/qa/purchase_direct_online.py b/qa/purchase_direct_online.py index 8e73b8cdb1..550923178f 100644 --- a/qa/purchase_direct_online.py +++ b/qa/purchase_direct_online.py @@ -158,7 +158,7 @@ def run_test(self): raise TestFailure("PurchaseDirectOnlineTest - FAIL: Purchase POST failed with incorrect reason: %s", resp["reason"]) if resp["code"] != "ERR_INSUFFICIENT_INVENTORY": raise TestFailure("PurchaseDirectOnlineTest - FAIL: Purchase POST failed with incorrect code: %s", resp["code"]) - if resp["remainingInventory"] != "6": + if int(resp["remainingInventory"]) != 6: raise TestFailure("PurchaseDirectOnlineTest - FAIL: Purchase POST failed with incorrect remainingInventory: %d", resp["remainingInventory"]) print("PurchaseDirectOnlineTest - PASS") diff --git a/repo/buyer_order.go b/repo/buyer_order.go index 89a7eb4058..70299d8376 100644 --- a/repo/buyer_order.go +++ b/repo/buyer_order.go @@ -8,6 +8,9 @@ import ( // ToV5Order scans through the order looking for any deprecated fields and turns them into their v5 counterpart. func ToV5Order(order *pb.Order, lookupFunc func(currencyCode string) (CurrencyDefinition, error)) (*pb.Order, error) { + if lookupFunc == nil { + lookupFunc = AllCurrencies().Lookup + } newOrder := proto.Clone(order).(*pb.Order) if order.RefundFee != 0 && order.BigRefundFee == "" { diff --git a/wallet/listeners/transaction_listener.go b/wallet/listeners/transaction_listener.go index eaf8853b83..86a3dbd7b9 100644 --- a/wallet/listeners/transaction_listener.go +++ b/wallet/listeners/transaction_listener.go @@ -225,12 +225,17 @@ func (l *TransactionListener) processSalePayment(txid string, output wallet.Tran if err != nil { return } + order, err := repo.ToV5Order(contract.BuyerOrder, nil) + if err != nil { + log.Error(err) + return + } if !funded { - currencyValue, err := repo.NewCurrencyValueWithLookup(contract.BuyerOrder.Payment.BigAmount, contract.BuyerOrder.Payment.AmountCurrency.Code) + currencyValue, err := repo.NewCurrencyValueWithLookup(order.Payment.BigAmount, order.Payment.AmountCurrency.Code) if err != nil { log.Errorf("Failed parsing CurrencyValue for (%s, %s): %s", - contract.BuyerOrder.Payment.BigAmount, - contract.BuyerOrder.Payment.AmountCurrency.Code, + order.Payment.BigAmount, + order.Payment.AmountCurrency.Code, err.Error(), ) return @@ -322,8 +327,13 @@ func (l *TransactionListener) processPurchasePayment(txid string, output wallet. if err != nil { return } + order, err := repo.ToV5Order(contract.BuyerOrder, nil) + if err != nil { + log.Error(err) + return + } if !funded { - requestedAmount, _ := new(big.Int).SetString(contract.BuyerOrder.Payment.BigAmount, 10) + requestedAmount, _ := new(big.Int).SetString(order.Payment.BigAmount, 10) if funding.Cmp(requestedAmount) >= 0 { log.Debugf("Payment for purchase %s detected", orderId) funded = true @@ -337,7 +347,7 @@ func (l *TransactionListener) processPurchasePayment(txid string, output wallet. } } } - def, err := repo.AllCurrencies().Lookup(contract.BuyerOrder.Payment.AmountCurrency.Code) + def, err := repo.AllCurrencies().Lookup(order.Payment.AmountCurrency.Code) if err != nil { log.Errorf("Error looking up currency: %s", err) return @@ -352,7 +362,7 @@ func (l *TransactionListener) processPurchasePayment(txid string, output wallet. Type: "payment", OrderId: orderId, FundingTotal: cv, - CoinType: contract.BuyerOrder.Payment.AmountCurrency.Code, + CoinType: order.Payment.AmountCurrency.Code, } l.broadcast <- n err = l.db.Notifications().PutRecord(repo.NewNotification(n, time.Now(), false)) From bd6707c6b766171f1f5208ad7f2f967c5ede8105 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 23 Mar 2020 15:10:08 -0400 Subject: [PATCH 27/34] Update qa tests with v4 fixes --- core/order.go | 16 ++++++++++++---- qa/complete_moderated_online.py | 4 ++-- qa/listings.py | 2 +- qa/reject_direct_offline.py | 6 ++++-- qa/smtp_notification.py | 5 +++-- qa/upload_listing.py | 7 ++++--- 6 files changed, 26 insertions(+), 14 deletions(-) diff --git a/core/order.go b/core/order.go index 50557aa472..766977f64b 100644 --- a/core/order.go +++ b/core/order.go @@ -460,6 +460,10 @@ func processOfflineDirectOrder(n *OpenBazaarNode, wal wallet.Wallet, contract *p } func processOnlineModeratedOrder(resp *pb.Message, n *OpenBazaarNode, contract *pb.RicardianContract) (string, string, big.Int, bool, error) { + v5Order, err := repo.ToV5Order(contract.BuyerOrder, nil) + if err != nil { + return "", "", *big.NewInt(0), false, err + } // Vendor responded if resp.MessageType == pb.Message_ERROR { return "", "", *big.NewInt(0), false, extractErrorMessage(resp) @@ -468,7 +472,7 @@ func processOnlineModeratedOrder(resp *pb.Message, n *OpenBazaarNode, contract * return "", "", *big.NewInt(0), false, errors.New("vendor responded to the order with an incorrect message type") } rc := new(pb.RicardianContract) - err := proto.Unmarshal(resp.Payload.Value, rc) + err = proto.Unmarshal(resp.Payload.Value, rc) if err != nil { return "", "", *big.NewInt(0), false, errors.New("error parsing the vendor's response") } @@ -493,7 +497,7 @@ func processOnlineModeratedOrder(resp *pb.Message, n *OpenBazaarNode, contract * if err != nil { return "", "", *big.NewInt(0), false, err } - total, ok := new(big.Int).SetString(contract.BuyerOrder.Payment.BigAmount, 10) + total, ok := new(big.Int).SetString(v5Order.Payment.BigAmount, 10) if !ok { return "", "", *big.NewInt(0), false, errors.New("invalid payment amount") } @@ -501,6 +505,10 @@ func processOnlineModeratedOrder(resp *pb.Message, n *OpenBazaarNode, contract * } func processOfflineModeratedOrder(n *OpenBazaarNode, contract *pb.RicardianContract) (string, string, big.Int, error) { + v5Order, err := repo.ToV5Order(contract.BuyerOrder, nil) + if err != nil { + return "", "", *big.NewInt(0), err + } // Vendor offline // Send using offline messaging log.Warningf("Vendor %s is offline, sending offline order message", contract.VendorListings[0].VendorID.PeerID) @@ -532,11 +540,11 @@ func processOfflineModeratedOrder(n *OpenBazaarNode, contract *pb.RicardianContr if err != nil { log.Error(err) } - total, ok := new(big.Int).SetString(contract.BuyerOrder.Payment.BigAmount, 10) + total, ok := new(big.Int).SetString(v5Order.Payment.BigAmount, 10) if !ok { return "", "", *big.NewInt(0), errors.New("invalid payment amount") } - return orderID, contract.BuyerOrder.Payment.Address, *total, err + return orderID, v5Order.Payment.Address, *total, err } func extractErrorMessage(m *pb.Message) error { diff --git a/qa/complete_moderated_online.py b/qa/complete_moderated_online.py index effd5122e9..6db5fc4a7e 100644 --- a/qa/complete_moderated_online.py +++ b/qa/complete_moderated_online.py @@ -63,7 +63,7 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -138,7 +138,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype diff --git a/qa/listings.py b/qa/listings.py index 62c1d8b373..7fece4c8f8 100644 --- a/qa/listings.py +++ b/qa/listings.py @@ -35,7 +35,7 @@ def run_test(self): # POST listing with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: ljson = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": ljson["metadata"]["priceCurrency"] = "t" + self.cointype else: ljson["item"]["priceCurrency"]["code"] = "t" + self.cointype diff --git a/qa/reject_direct_offline.py b/qa/reject_direct_offline.py index 600d037932..7bc2892c64 100644 --- a/qa/reject_direct_offline.py +++ b/qa/reject_direct_offline.py @@ -38,7 +38,7 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -108,7 +108,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype @@ -149,10 +149,12 @@ def run_test(self): } r = requests.post(api_url, data=json.dumps(oc, indent=4)) if r.status_code == 404: + print(r.text, r.status_code) raise TestFailure("RejectDirectOfflineTest - FAIL: Order confirmation post endpoint not found") elif r.status_code != 200: resp = json.loads(r.text) raise TestFailure("RejectDirectOfflineTest - FAIL: OrderConfirmation POST failed. Reason: %s", resp["reason"]) + time.sleep(20) # alice check order rejected correctly diff --git a/qa/smtp_notification.py b/qa/smtp_notification.py index d89a71b928..7024c143fe 100644 --- a/qa/smtp_notification.py +++ b/qa/smtp_notification.py @@ -79,10 +79,11 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype + listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] api_url = alice["gateway_url"] + "ob/listing" r = requests.post(api_url, data=json.dumps(listing_json, indent=4)) @@ -126,7 +127,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype diff --git a/qa/upload_listing.py b/qa/upload_listing.py index 80dd8b02cc..5302e3d859 100644 --- a/qa/upload_listing.py +++ b/qa/upload_listing.py @@ -16,11 +16,12 @@ def setup_network(self): def run_test(self): with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype - listing_json["item"]["priceCurrency"]["divisibility"] = 8 + listing_json["item"]["priceCurrency"]["divisibility"] = 8 + listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] api_url = self.nodes[1]["gateway_url"] + "ob/listing" r = requests.post(api_url, data=json.dumps(listing_json, indent=4)) if r.status_code == 404: @@ -35,7 +36,7 @@ def run_test(self): inv = resp["ron-swanson-tshirt"] if inv == None: raise TestFailure("UploadListingTest - FAIL: Did not return inventory for listing") - if inv["inventory"] != "213": + if int(inv["inventory"]) != 213: raise TestFailure("UploadListingTest - FAIL: Returned incorrect amount of inventory: %d", inv["inventory"]) elif r.status_code == 404: raise TestFailure("UploadListingTest - FAIL: Listing post endpoint not found") From 39b12306a22d284292b014d86a9a789143ec7300 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 23 Mar 2020 21:15:09 -0400 Subject: [PATCH 28/34] Fix bug creating v4 moderated order --- core/order.go | 22 +++++++++++++--------- qa/purchase_crypto_listing.py | 20 +++++++++----------- qa/purchase_digital.py | 4 ++-- qa/purchase_moderated_online.py | 4 ++-- repo/listing.go | 2 +- 5 files changed, 27 insertions(+), 25 deletions(-) diff --git a/core/order.go b/core/order.go index 766977f64b..1dee49cc87 100644 --- a/core/order.go +++ b/core/order.go @@ -217,14 +217,6 @@ func prepareModeratedOrderContract(data *repo.PurchaseData, n *OpenBazaarNode, c payment := new(pb.Order_Payment) payment.Method = pb.Order_Payment_MODERATED payment.Moderator = data.Moderator - defn, err := n.LookupCurrency(data.PaymentCoin) - if err != nil { - return nil, errors.New("invalid payment coin") - } - payment.AmountCurrency = &pb.CurrencyDefinition{ - Code: defn.Code.String(), - Divisibility: uint32(defn.Divisibility), - } profile, err := n.FetchProfile(data.Moderator, true) if err != nil { @@ -242,11 +234,19 @@ func prepareModeratedOrderContract(data *repo.PurchaseData, n *OpenBazaarNode, c return nil, errors.New("moderator does not accept our currency") } contract.BuyerOrder.Payment = payment + defn, err := n.LookupCurrency(data.PaymentCoin) + if err != nil { + return nil, errors.New("invalid payment coin") + } if contract.VendorListings[0].Metadata.Version >= repo.ListingVersion { payment.AmountCurrency = &pb.CurrencyDefinition{ Code: defn.Code.String(), Divisibility: uint32(defn.Divisibility), } + payment.AmountCurrency = &pb.CurrencyDefinition{ + Code: defn.Code.String(), + Divisibility: uint32(defn.Divisibility), + } } else { payment.Coin = defn.Code.String() } @@ -307,7 +307,11 @@ func prepareModeratedOrderContract(data *repo.PurchaseData, n *OpenBazaarNode, c payment.RedeemScript = hex.EncodeToString(redeemScript) payment.Chaincode = hex.EncodeToString(chaincode) fee := wal.GetFeePerByte(wallet.NORMAL) - contract.BuyerOrder.BigRefundFee = fee.String() + if contract.VendorListings[0].Metadata.Version >= repo.ListingVersion { + contract.BuyerOrder.BigRefundFee = fee.String() + } else { + contract.BuyerOrder.RefundFee = fee.Uint64() + } err = wal.AddWatchedAddresses(addr) if err != nil { diff --git a/qa/purchase_crypto_listing.py b/qa/purchase_crypto_listing.py index b2b8d3ff7b..471aa43e5f 100644 --- a/qa/purchase_crypto_listing.py +++ b/qa/purchase_crypto_listing.py @@ -56,10 +56,7 @@ def run_test(self): if r.status_code != 200: raise TestFailure("PurchaseCryptoListingTest - FAIL: Inventory get endpoint failed") - check_amt = "350000000000000000" - if self.vendor_version == 4: - check_amt = 350000000000000000 - if resp["ether"]["inventory"] != check_amt: + if int(resp["ether"]["inventory"]) != 350000000000000000: raise TestFailure("PurchaseCryptoListingTest - FAIL: Inventory incorrect: %d", resp["ether"]["inventory"]) # get listing hash @@ -89,7 +86,7 @@ def run_test(self): payment_address = resp["paymentAddress"] payment_amount = resp["amount"] amt = 0 - if self.buyer_version == 4: + if self.buyer_version == "v4": amt = payment_amount else: amt = int(payment_amount["amount"]) @@ -136,7 +133,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype @@ -205,11 +202,12 @@ def run_test(self): if r.status_code != 200: raise TestFailure("PurchaseCryptoListingTest - FAIL: Inventory get endpoint failed") - check_amt = "340000000000000000" - if self.buyer_version == 4: - check_amt = 340000000000000000 - if resp["ether"]["inventory"] != check_amt: - raise TestFailure("PurchaseCryptoListingTest - FAIL: Inventory incorrect: %d", resp["ether"]["inventory"]) + if self.buyer_version == "v4": + if int(resp["ether"]["inventory"]) != 340000000000000000: + raise TestFailure("PurchaseCryptoListingTest - FAIL: Inventory incorrect: %d", resp["ether"]["inventory"]) + if self.vendor_version == "v4": + if int(resp["ether"]["inventory"]) != 350000000: + raise TestFailure("PurchaseCryptoListingTest - FAIL: Inventory incorrect: %d", resp["ether"]["inventory"]) print("PurchaseCryptoListingTest - PASS") diff --git a/qa/purchase_digital.py b/qa/purchase_digital.py index c01485505d..7925400ea5 100644 --- a/qa/purchase_digital.py +++ b/qa/purchase_digital.py @@ -38,7 +38,7 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/digital.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -108,7 +108,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype diff --git a/qa/purchase_moderated_online.py b/qa/purchase_moderated_online.py index 08c53b9cf0..54426ec389 100644 --- a/qa/purchase_moderated_online.py +++ b/qa/purchase_moderated_online.py @@ -63,7 +63,7 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -136,7 +136,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype diff --git a/repo/listing.go b/repo/listing.go index 94745264d9..f0dba2666a 100644 --- a/repo/listing.go +++ b/repo/listing.go @@ -919,7 +919,7 @@ func (cs ListingCoupons) GetProtobuf() []*pb.Listing_Coupon { var cspb = make([]*pb.Listing_Coupon, len(cs)) for i, c := range cs { cspb[i] = &pb.Listing_Coupon{ - Title: c.GetTitle(), + Title: c.GetTitle(), } if c.GetPercentOff() > 0 { cspb[i].Discount = &pb.Listing_Coupon_PercentDiscount{ From d4f9eb072aa3a3f637a6262d5191c7483eef1d48 Mon Sep 17 00:00:00 2001 From: Chris Date: Mon, 23 Mar 2020 21:22:23 -0400 Subject: [PATCH 29/34] Fix fulfill qa test --- qa/fulfill_direct_online.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/qa/fulfill_direct_online.py b/qa/fulfill_direct_online.py index b25dc4fef7..1f7524e4ab 100644 --- a/qa/fulfill_direct_online.py +++ b/qa/fulfill_direct_online.py @@ -38,7 +38,7 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -110,7 +110,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype @@ -144,7 +144,7 @@ def run_test(self): raise TestFailure("FulfillDirectOnlineTest - FAIL: Alice failed to detect payment") if resp["funded"] == False: raise TestFailure("FulfillDirectOnlineTest - FAIL: Alice incorrectly saved as unfunded") - + # alice send order fulfillment with open('testdata/'+ self.vendor_version +'/fulfillment.json') as fulfillment_file: fulfillment_json = json.load(fulfillment_file, object_pairs_hook=OrderedDict) From f87525ca7835cf976cf19e85b4c9e8d4d0b6de8c Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 25 Mar 2020 13:26:25 -0400 Subject: [PATCH 30/34] Use v4 contract in dispute where needed --- api/jsonapi.go | 16 ++++++++++++++-- core/disputes.go | 26 ++++++++++++++++++++------ qa/complete_disputed.py | 8 ++++---- qa/complete_moderated_with_timeout.py | 4 ++-- repo/dispute_case_record.go | 3 ++- 5 files changed, 42 insertions(+), 15 deletions(-) diff --git a/api/jsonapi.go b/api/jsonapi.go index 2ab0d0c632..d73fa32b2e 100644 --- a/api/jsonapi.go +++ b/api/jsonapi.go @@ -2122,7 +2122,13 @@ func (i *jsonAPIHandler) POSTOpenDispute(w http.ResponseWriter, r *http.Request) } // TODO: Remove once broken contracts are migrated - lookupCoin := contract.BuyerOrder.Payment.AmountCurrency.Code + v5order, err := repo.ToV5Order(contract.BuyerOrder, nil) + if err != nil { + ErrorResponse(w, http.StatusBadRequest, err.Error()) + return + } + + lookupCoin := v5order.Payment.AmountCurrency.Code _, err = i.node.LookupCurrency(lookupCoin) if err != nil { log.Warningf("invalid BuyerOrder.Payment.Coin (%s) on order (%s)", lookupCoin, d.OrderID) @@ -2268,8 +2274,14 @@ func (i *jsonAPIHandler) POSTReleaseFunds(w http.ResponseWriter, r *http.Request } } + v5order, err := repo.ToV5Order(contract.BuyerOrder, nil) + if err != nil { + ErrorResponse(w, http.StatusBadRequest, err.Error()) + return + } + // TODO: Remove once broken contracts are migrated - lookupCoin := contract.BuyerOrder.Payment.AmountCurrency.Code + lookupCoin := v5order.Payment.AmountCurrency.Code _, err = i.node.LookupCurrency(lookupCoin) if err != nil { log.Warningf("invalid BuyerOrder.Payment.Coin (%s) on order (%s)", lookupCoin, rel.OrderID) diff --git a/core/disputes.go b/core/disputes.go index 3abdbda80b..7da81e7466 100644 --- a/core/disputes.go +++ b/core/disputes.go @@ -738,25 +738,39 @@ func (n *OpenBazaarNode) CloseDispute(orderID string, buyerPercentage, vendorPer if out, ok := outMap["buyer"]; ok { payout.BuyerOutput = &pb.DisputeResolution_Payout_Output{ ScriptOrAddress: &pb.DisputeResolution_Payout_Output_Address{Address: buyerAddr.String()}, - BigAmount: out.Value.String(), + } + if preferredContract.VendorListings[0].Metadata.Version >= repo.ListingVersion { + payout.BuyerOutput.BigAmount = out.Value.String() + } else { + payout.BuyerOutput.Amount = out.Value.Uint64() } } if out, ok := outMap["vendor"]; ok { payout.VendorOutput = &pb.DisputeResolution_Payout_Output{ ScriptOrAddress: &pb.DisputeResolution_Payout_Output_Address{Address: vendorAddr.String()}, - BigAmount: out.Value.String(), + } + if preferredContract.VendorListings[0].Metadata.Version >= repo.ListingVersion { + payout.VendorOutput.BigAmount = out.Value.String() + } else { + payout.VendorOutput.Amount = out.Value.Uint64() } } if out, ok := outMap["moderator"]; ok { payout.ModeratorOutput = &pb.DisputeResolution_Payout_Output{ ScriptOrAddress: &pb.DisputeResolution_Payout_Output_Address{Address: modAddr.String()}, - BigAmount: out.Value.String(), + } + if preferredContract.VendorListings[0].Metadata.Version >= repo.ListingVersion { + payout.ModeratorOutput.BigAmount = out.Value.String() + } else { + payout.ModeratorOutput.Amount = out.Value.Uint64() } } - payout.PayoutCurrency = &pb.CurrencyDefinition{ - Code: preferredOrder.Payment.AmountCurrency.Code, - Divisibility: preferredOrder.Payment.AmountCurrency.Divisibility, + if preferredContract.VendorListings[0].Metadata.Version >= repo.ListingVersion { + payout.PayoutCurrency = &pb.CurrencyDefinition{ + Code: preferredOrder.Payment.AmountCurrency.Code, + Divisibility: preferredOrder.Payment.AmountCurrency.Divisibility, + } } d.Payout = payout diff --git a/qa/complete_disputed.py b/qa/complete_disputed.py index 6a000aa46e..a0c4afcee1 100644 --- a/qa/complete_disputed.py +++ b/qa/complete_disputed.py @@ -65,7 +65,7 @@ def run_test(self): with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) listing_json["metadata"]["acceptedCurrencies"] = ["t" + self.cointype] - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -139,7 +139,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype @@ -187,7 +187,7 @@ def run_test(self): resp = json.loads(r.text) raise TestFailure("CompleteDisputedTest - FAIL: Fulfillment POST failed. Reason: %s", resp["reason"]) time.sleep(4) - + # Bob open dispute dispute = { "orderId": orderId, @@ -297,7 +297,7 @@ def run_test(self): confirmed = int(resp["confirmed"]) #unconfirmed = int(resp["unconfirmed"]) amt = 0 - if self.buyer_version == 4: + if self.buyer_version == "v4": amt = payment_amount else: amt = int(payment_amount["amount"]) diff --git a/qa/complete_moderated_with_timeout.py b/qa/complete_moderated_with_timeout.py index cae50facc3..58928abac3 100644 --- a/qa/complete_moderated_with_timeout.py +++ b/qa/complete_moderated_with_timeout.py @@ -63,7 +63,7 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -139,7 +139,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype diff --git a/repo/dispute_case_record.go b/repo/dispute_case_record.go index 4369817750..b68d45c4f9 100644 --- a/repo/dispute_case_record.go +++ b/repo/dispute_case_record.go @@ -107,7 +107,8 @@ func (r *DisputeCaseRecord) ResolutionPaymentFeePerByte(ratio PayoutRatio, defau n := new(big.Int) switch { case ratio.BuyerMajority(), ratio.EvenMajority(): - n, _ = n.SetString(r.BuyerContract.BuyerOrder.BigRefundFee, 10) + v5order, _ := ToV5Order(r.BuyerContract.BuyerOrder, nil) + n, _ = n.SetString(v5order.BigRefundFee, 10) return n case ratio.VendorMajority(): if len(r.VendorContract.VendorOrderFulfillment) > 0 && r.VendorContract.VendorOrderFulfillment[0].Payout != nil { From 0a885c54ac0c9dbb79488043e9077c3cd23de657 Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 26 Mar 2020 15:14:45 -0400 Subject: [PATCH 31/34] Fix disputes payouts to v4 vendor --- core/disputes.go | 48 ++++++++++++++++++++++++++++---------- qa/dispute_close_buyer.py | 8 +++---- qa/dispute_close_split.py | 6 ++--- qa/dispute_close_vendor.py | 8 +++---- 4 files changed, 47 insertions(+), 23 deletions(-) diff --git a/core/disputes.go b/core/disputes.go index 7da81e7466..f4324229ec 100644 --- a/core/disputes.go +++ b/core/disputes.go @@ -502,12 +502,6 @@ func (n *OpenBazaarNode) CloseDispute(orderID string, buyerPercentage, vendorPer return ErrCloseFailureCaseExpired } - var outpoints = dispute.ResolutionPaymentOutpoints(payDivision) - if outpoints == nil { - log.Errorf("no outpoints to resolve in dispute for order %s", orderID) - return ErrCloseFailureNoOutpoints - } - if dispute.VendorContract == nil && vendorPercentage > 0 { return errors.New("vendor must provide his copy of the contract before you can release funds to the vendor") } @@ -521,6 +515,24 @@ func (n *OpenBazaarNode) CloseDispute(orderID string, buyerPercentage, vendorPer return err } + var outpoints = dispute.ResolutionPaymentOutpoints(payDivision) + if outpoints == nil { + log.Errorf("no outpoints to resolve in dispute for order %s", orderID) + return ErrCloseFailureNoOutpoints + } + for i, o := range outpoints { + if preferredContract.VendorListings[0].Metadata.Version < repo.ListingVersion { + if o.BigValue != "" { + n, ok := new(big.Int).SetString(o.BigValue, 10) + if !ok { + return errors.New("invalid amount") + } + outpoints[i].Value = n.Uint64() + outpoints[i].BigValue = "" + } + } + } + // TODO: Remove once broken contracts are migrated paymentCoin := preferredOrder.Payment.AmountCurrency.Code _, err = n.LookupCurrency(paymentCoin) @@ -563,9 +575,15 @@ func (n *OpenBazaarNode) CloseDispute(orderID string, buyerPercentage, vendorPer // Calculate total out value totalOut := big.NewInt(0) for _, o := range outpoints { - n, ok := new(big.Int).SetString(o.BigValue, 10) - if !ok { - return errors.New("invalid total out amount") + var n *big.Int + if o.Value > 0 { + n = big.NewInt(int64(o.Value)) + } else { + ok := false + n, ok = new(big.Int).SetString(o.BigValue, 10) + if !ok { + return errors.New("invalid amount") + } } totalOut = new(big.Int).Add(totalOut, n) } @@ -640,9 +658,15 @@ func (n *OpenBazaarNode) CloseDispute(orderID string, buyerPercentage, vendorPer if err != nil { return err } - n, ok := new(big.Int).SetString(o.BigValue, 10) - if !ok { - return errors.New("invalid amount") + var n *big.Int + if o.Value > 0 { + n = big.NewInt(int64(o.Value)) + } else { + ok := false + n, ok = new(big.Int).SetString(o.BigValue, 10) + if !ok { + return errors.New("invalid amount") + } } input := wallet.TransactionInput{ OutpointHash: decodedHash, diff --git a/qa/dispute_close_buyer.py b/qa/dispute_close_buyer.py index b315005ecc..c02f6dbb0e 100644 --- a/qa/dispute_close_buyer.py +++ b/qa/dispute_close_buyer.py @@ -64,7 +64,7 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -137,7 +137,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype @@ -171,7 +171,7 @@ def run_test(self): raise TestFailure("DisputeCloseBuyerTest - FAIL: Alice failed to detect payment") if resp["funded"] == False: raise TestFailure("DisputeCloseBuyerTest - FAIL: Alice incorrectly saved as unfunded") - + # Bob open dispute dispute = { "orderId": orderId, @@ -281,7 +281,7 @@ def run_test(self): confirmed = int(resp["confirmed"]) #unconfirmed = int(resp["unconfirmed"]) amt = 0 - if self.buyer_version == 4: + if self.buyer_version == "v4": amt = payment_amount else: amt = int(payment_amount["amount"]) diff --git a/qa/dispute_close_split.py b/qa/dispute_close_split.py index 9cb2a81585..7b39a4fb07 100644 --- a/qa/dispute_close_split.py +++ b/qa/dispute_close_split.py @@ -64,7 +64,7 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -137,7 +137,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype @@ -281,7 +281,7 @@ def run_test(self): confirmed = int(resp["confirmed"]) unconfirmed = int(resp["unconfirmed"]) amt = 0 - if self.buyer_version == 4: + if self.buyer_version == "v4": amt = payment_amount else: amt = int(payment_amount["amount"]) diff --git a/qa/dispute_close_vendor.py b/qa/dispute_close_vendor.py index 5024cf1503..86b9bc4025 100644 --- a/qa/dispute_close_vendor.py +++ b/qa/dispute_close_vendor.py @@ -64,7 +64,7 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -139,7 +139,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype @@ -205,7 +205,7 @@ def run_test(self): resp = json.loads(r.text) if resp["state"] != "FULFILLED": raise TestFailure("FulfillDirectOnlineTest - FAIL: Alice failed to order fulfillment") - + # Alice open dispute dispute = { "orderId": orderId, @@ -304,7 +304,7 @@ def run_test(self): time.sleep(20) self.send_bitcoin_cmd("generate", 1) - time.sleep(2) + time.sleep(20) # Check alice received payout api_url = alice["gateway_url"] + "wallet/balance/T" + self.cointype From 0295494e8fa55198ca7ca518aad5b858092cfec5 Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 26 Mar 2020 15:28:18 -0400 Subject: [PATCH 32/34] Update escrow release after timeout qa test --- qa/escrow_release_after_timeout.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qa/escrow_release_after_timeout.py b/qa/escrow_release_after_timeout.py index 3a55aa2e77..ebda8ba9b1 100644 --- a/qa/escrow_release_after_timeout.py +++ b/qa/escrow_release_after_timeout.py @@ -63,7 +63,7 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype @@ -139,7 +139,7 @@ def run_test(self): "feeLevel": "NORMAL", "requireAssociateOrder": False } - if self.buyer_version == 4: + if self.buyer_version == "v4": spend["amount"] = payment_amount spend["wallet"] = "T" + self.cointype From 009285fc280f36ebecbfd90814c500a92a47cf10 Mon Sep 17 00:00:00 2001 From: Brian Hoffman Date: Tue, 24 Mar 2020 10:05:07 -0400 Subject: [PATCH 33/34] Check for correct vendor_version --- qa/refund_moderated.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qa/refund_moderated.py b/qa/refund_moderated.py index 0624a54ff7..04ecd59a60 100644 --- a/qa/refund_moderated.py +++ b/qa/refund_moderated.py @@ -63,7 +63,7 @@ def run_test(self): # post listing to alice with open('testdata/'+ self.vendor_version +'/listing.json') as listing_file: listing_json = json.load(listing_file, object_pairs_hook=OrderedDict) - if self.vendor_version == 4: + if self.vendor_version == "v4": listing_json["metadata"]["priceCurrency"] = "t" + self.cointype else: listing_json["item"]["priceCurrency"]["code"] = "t" + self.cointype From 918150358069ef6d8ec0b3ddbe1ce162038b2e6d Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 2 Apr 2020 15:09:33 -0400 Subject: [PATCH 34/34] Update cryptolisting qa test --- core/profile.go | 1 + qa/chat_offline.py | 2 +- qa/testdata/v5/order_crypto.json | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/profile.go b/core/profile.go index 23f17a40c4..911c9ac1e9 100644 --- a/core/profile.go +++ b/core/profile.go @@ -52,6 +52,7 @@ func (n *OpenBazaarNode) FetchProfile(peerID string, useCache bool) (pb.Profile, } p, err := repo.UnmarshalJSONProfile(b) if err != nil { + log.Error("Profile fetch error", peerID, err) return pro, err } p.NormalizeDataForAllSchemas() diff --git a/qa/chat_offline.py b/qa/chat_offline.py index b7046a5ddb..f4897b501e 100644 --- a/qa/chat_offline.py +++ b/qa/chat_offline.py @@ -123,4 +123,4 @@ def run_test(self): if __name__ == '__main__': print("Running ChatOfflineTest") - ChatOfflineTest().main(["--regtest", "--disableexchangerates"]) \ No newline at end of file + ChatOfflineTest().main(["--regtest", "--disableexchangerates"]) diff --git a/qa/testdata/v5/order_crypto.json b/qa/testdata/v5/order_crypto.json index 7d919b6c1c..dba9f51a3b 100644 --- a/qa/testdata/v5/order_crypto.json +++ b/qa/testdata/v5/order_crypto.json @@ -2,8 +2,8 @@ "moderator": "", "items": [{ "listingHash": "", - "bigQuantity": "10000000000000000", + "bigQuantity": "100000000", "paymentAddress": "crypto_payment_address", "memo": "thanks!" }] -} \ No newline at end of file +}