Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(connector): add amount framework to payme & Trustpay with googlePay, ApplePay for bluesnap, Noon & Trustpay #4833

Merged

Conversation

sahkal
Copy link
Contributor

@sahkal sahkal commented May 31, 2024

Type of Change

  • Refactoring

Description

This PR adds Amount conversion framework to Payme, along with ApplePay GooglePay flows for all connectors

Note:

Payme works in MinorUnit, so no conversion is involved

TrustPay, Bluesnap, Noon works in string Major Unit

ApplePay, GooglePay also works in string Major Unit

ApplePay
Screenshot 2024-06-06 at 4 10 52 PM

GooglePay
Screenshot 2024-06-06 at 4 13 08 PM

Additional Changes

  • This PR modifies the API contract
  • This PR modifies the database schema
  • This PR modifies application configuration/environment variables

Motivation and Context

How did you test it?

Flows to test

Payme

  • Authorise
  • Refunds
  • ApplePay

TrustPay

  • Authorise
  • Refunds
  • Bank redirects( Ideal, giropay )
  • ApplePay & Google Pay

BlueSnap

  • ApplePay & GooglePay

Noon

  • ApplePay & GooglePay

Payments Authorise

curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_WFGYwzFgFxWy9YEwtZTVU2O25M7vO2TGspSXG72pR6Hb4ZHpN3AuGnw9AKloaG5K' \
--data-raw '{   
    "confirm":true,
    "currency":"USD",
      "billing": {
    "address": {
      "line1": "1467",
      "line2": "Harrison Street",
      "line3": "Harrison Street",
      "city": "San Fransico",
      "state": "California",
      "zip": "94122",
      "country": "IN",
      "first_name": "joseph",
      "last_name": "Doe"
    },
    "phone": {
      "number": "8056594427",
      "country_code": "+91"
    }
  },
    "order_details": [
        {
            "product_name": "Tea",
            "quantity": 1,
            "amount": 110,
            "product_img_link": "https://thumbs.dreamstime.com/b/indian-tea-spices-masala-chai-33827904.jpg"
        },
        {
            "product_name": "Tea",
            "quantity": 20,
            "amount": 110,
            "product_img_link": "https://thumbs.dreamstime.com/b/indian-tea-spices-masala-chai-33827904.jpg"
        },
        {
            "product_name": "Tea",
            "quantity": 1,
            "amount": 110,
            "product_img_link": "https://thumbs.dreamstime.com/b/indian-tea-spices-masala-chai-33827904.jpg"
        }
    ],
    "return_url":"https://google.com",
    "email":"test@gmail.com",
    "payment_method": "card",
    "payment_method_type": "credit",
    "payment_method_data": {
        "card": {
            "card_number": "4111111111111111",
            "card_exp_month": "10",
            "card_exp_year": "2027",
            "card_holder_name": "joseph Doe",
            "card_cvc": "2732"
        }
    },
    "amount":2345
}
'
Screenshot 2024-06-06 at 4 23 53 PM

Refund Flow

curl --location 'http://localhost:8080/refunds' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_WFGYwzFgFxWy9YEwtZTVU2O25M7vO2TGspSXG72pR6Hb4ZHpN3AuGnw9AKloaG5K' \
--data '{
    "payment_id": "pay_bziDv82xazJ80qYwcMyI",
    "amount": 2345,
    "reason": "Customer returned product",
    "refund_type": "instant",
    "metadata": {
        "udf1": "value1",
        "new_customer": "true",
        "login_date": "2019-09-10T10:11:12Z"
    }
}'
Screenshot 2024-06-06 at 6 31 39 PM

Trustpay :

Authorise:

curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_nhddAVimdzryaUmPYHUx33YnboKvcW5b3AeiPJnbX7tXbIQ8lMlaNrQ4KZcpi5a4' \
--data-raw '{
    "amount": 6540,
    "currency": "USD",
    "confirm": true,
    "capture_method": "automatic",
    "capture_on": "2022-09-10T10:11:12Z",
    "amount_to_capture": 6540,
    "customer_id": "StripeCustomer",
    "email": "guest@example.com",
    "name": "John Doe",
    "phone": "999999999",
    "phone_country_code": "+1",
    "description": "Its my first payment request",
    "authentication_type": "no_three_ds",
    "return_url": "https://duck.com",
    "payment_method": "card",
    "payment_method_type": "credit",
    "payment_method_data": {
        "card": {
            "card_number": "5200000000001005",
            "card_exp_month": "10",
            "card_exp_year": "25",
            "card_holder_name": "joseph Doe",
            "card_cvc": "123"
        }
    },
    "billing": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "US",
            "first_name": "joseph",
            "last_name": "Doe"
        },
        "phone": {
            "number": "8056594427",
            "country_code": "+91"
        }
    },
    "shipping": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "US",
            "first_name": "joseph",
            "last_name": "Doe"
        },
        "phone": {
            "number": "8056594427",
            "country_code": "+91"
        }
    },
    "browser_info": {
        "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
        "accept_header": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "language": "nl-NL",
        "color_depth": 24,
        "screen_height": 723,
        "screen_width": 1536,
        "time_zone": 0,
        "java_enabled": true,
        "java_script_enabled": true,
        "ip_address": "125.0.0.1"
    },
    "statement_descriptor_name": "joseph",
    "statement_descriptor_suffix": "JS",
    "metadata": {
        "udf1": "value1",
        "new_customer": "true",
        "login_date": "2019-09-10T10:11:12Z"
    }
}
'
Screenshot 2024-06-07 at 3 00 29 PM

Refund:

curl --location 'http://localhost:8080/refunds' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_nhddAVimdzryaUmPYHUx33YnboKvcW5b3AeiPJnbX7tXbIQ8lMlaNrQ4KZcpi5a4' \
--data '{
    "payment_id": "pay_Y2KCfAMdAe4Q45u8RDkH",
    "amount": 6540,
    "reason": "Customer returned product",
    "refund_type": "instant",
    "metadata": {
        "udf1": "value1",
        "new_customer": "true",
        "login_date": "2019-09-10T10:11:12Z"
    }
}'
Screenshot 2024-06-07 at 3 02 12 PM

TrustPay

  • ApplePay & GooglePay

GooglePay

curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_jHQnaO31f4y9Ride9rMBTaygae3MgRQ63BzzsJk8A43K7J4hd2oL6CP8Wf7B8gIr' \
--data-raw '{
    "amount": 1000,
    "currency": "EUR",
    "confirm": true,
    "capture_method": "automatic",
    "capture_on": "2022-09-10T10:11:12Z",
    "customer_id": "CustomerX",
    "email": "guest@example.com",
    "name": "John Doe",
    "phone": "999999999",
    "phone_country_code": "+1",
    "description": "Its my first payment request",
    "authentication_type": "no_three_ds",
    "return_url": "https://google.com",
    "payment_method": "wallet",
    "payment_method_type": "google_pay",
    "payment_method_data": {
        "wallet": {
            "google_pay": {
                "type": "CARD",
                "description": "Visa •••• 1111",
                "info": {
                    "card_network": "VISA",
                    "card_details": "1111"
                },
                "tokenization_data": {
                    "type": "PAYMENT_GATEWAY",
                    "token": "{\"signature\":\"MEUCIQDq+hdZFXgAupCk3R5cr9wrDAP/jGPMJkqRsL9pBl8JMQIgA35XbERBWAxupnnSVlVc7yKqTiskRJHfQfWsy8dedLE\\u003d\",\"protocolVersion\":\"ECv1\",\"signedMessage\":\"{\\\"encryptedMessage\\\":\\\"sl3vpO1yFN8a1eYASko9fXRoFsRhGGLMvlewvZxmUhfND29xlG3j4PZAD9Kcov7jd0uP63LNhaZ8iYNkV/6Qwv0j6UfY1IST+HyndIOUQZlN5H6I8hbpvpP5nmjU3gbLnlkk8W5WUp6MAC76keYEW1rRF2qRgLqymYWEWicl9LkDVW6bz0bMuybsqljxaDIp5tGO4dQ9ajV2qwuw4AZx5MA3brKsKjmsJQbe5XIX48rt88yPZDcNQFKfoeo+DCgNpjATIlhIZNZxSue1oBi2can82Fa0+38nM446R8TUwN2pGgTJFqymvIKTZZEtutd8UW1+qCnlogRmyuAfK08QD7OuFFPcVUMiMsYjkS2baHEa9jczpjrBUPbm/DQnHbLkqarsuRqHJ86ZqxMPXMAAato6UsMgwgIeGHAgSWUj0x+e8oQCBm8TGbnIwxsGXlIutIfa9GooIUM1paz+\\\",\\\"ephemeralPublicKey\\\":\\\"BKxNuDGBs2YhCYpcZDWvw4nyo6w95pN2e+V3bfZm/cg8aN1wLHL1KkKceG7LrFkjOFbrO8RDQ3FQ+Yo+CMCtzk0\\\\u003d\\\",\\\"tag\\\":\\\"jbyoC/PCw4pJyK54vvZsL8eqzFOzUVd4hG4qCVHfKN4\\\\u003d\\\"}\"}"
                }
            }
        }
    },
    "billing": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "Dubai",
            "zip": "94122",
            "country": "AE",
            "first_name": "joseph",
            "last_name": "Doe"
        },
        "phone": {
            "number": "8056594427",
            "country_code": "+97"
        }
    },
    "shipping": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "AE",
            "first_name": "joseph",
            "last_name": "Doe"
        },
        "phone": {
            "number": "8056594427",
            "country_code": "+91"
        }
    },
    "metadata": {
        "count_tickets": 1,
        "transaction_number": "5590043"
    },
    "payment_type": "setup_mandate",
    "setup_future_usage": "off_session",
    "customer_acceptance": {
        "acceptance_type": "offline",
        "accepted_at": "1963-05-03T04:07:52.723Z",
        "online": {
            "ip_address": "13.232.74.226",
            "user_agent": "amet irure esse"
        }
    }
}
'
Screenshot 2024-06-07 at 3 24 20 PM

BlueSnap

  • ApplePay & GooglePay

Google

curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_m3D6IZzGh9dAGXeDn1RHCMooq6YWaRpYw65iefMCRoJrWOznbc1CZ0mLjXbARTkv' \
--data-raw '{
    "amount": 1000,
    "currency": "EUR",
    "confirm": true,
    "capture_method": "automatic",
    "capture_on": "2022-09-10T10:11:12Z",
    "customer_id": "CustomerX",
    "email": "guest@example.com",
    "name": "John Doe",
    "phone": "999999999",
    "phone_country_code": "+1",
    "description": "Its my first payment request",
    "authentication_type": "no_three_ds",
    "return_url": "https://google.com",
    "payment_method": "wallet",
    "payment_method_type": "google_pay",
    "payment_method_data": {
        "wallet": {
            "google_pay": {
                "type": "CARD",
                "description": "Visa •••• 1111",
                "info": {
                    "card_network": "VISA",
                    "card_details": "1111"
                },
                "tokenization_data": {
                    "type": "PAYMENT_GATEWAY",
                    "token": "{\"signature\":\"MEUCIQDq+hdZFXgAupCk3R5cr9wrDAP/jGPMJkqRsL9pBl8JMQIgA35XbERBWAxupnnSVlVc7yKqTiskRJHfQfWsy8dedLE\\u003d\",\"protocolVersion\":\"ECv1\",\"signedMessage\":\"{\\\"encryptedMessage\\\":\\\"sl3vpO1yFN8a1eYASko9fXRoFsRhGGLMvlewvZxmUhfND29xlG3j4PZAD9Kcov7jd0uP63LNhaZ8iYNkV/6Qwv0j6UfY1IST+HyndIOUQZlN5H6I8hbpvpP5nmjU3gbLnlkk8W5WUp6MAC76keYEW1rRF2qRgLqymYWEWicl9LkDVW6bz0bMuybsqljxaDIp5tGO4dQ9ajV2qwuw4AZx5MA3brKsKjmsJQbe5XIX48rt88yPZDcNQFKfoeo+DCgNpjATIlhIZNZxSue1oBi2can82Fa0+38nM446R8TUwN2pGgTJFqymvIKTZZEtutd8UW1+qCnlogRmyuAfK08QD7OuFFPcVUMiMsYjkS2baHEa9jczpjrBUPbm/DQnHbLkqarsuRqHJ86ZqxMPXMAAato6UsMgwgIeGHAgSWUj0x+e8oQCBm8TGbnIwxsGXlIutIfa9GooIUM1paz+\\\",\\\"ephemeralPublicKey\\\":\\\"BKxNuDGBs2YhCYpcZDWvw4nyo6w95pN2e+V3bfZm/cg8aN1wLHL1KkKceG7LrFkjOFbrO8RDQ3FQ+Yo+CMCtzk0\\\\u003d\\\",\\\"tag\\\":\\\"jbyoC/PCw4pJyK54vvZsL8eqzFOzUVd4hG4qCVHfKN4\\\\u003d\\\"}\"}"
                }
            }
        }
    },
    "billing": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "Dubai",
            "zip": "94122",
            "country": "AE",
            "first_name": "joseph",
            "last_name": "Doe"
        },
        "phone": {
            "number": "8056594427",
            "country_code": "+97"
        }
    },
    "shipping": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "AE",
            "first_name": "joseph",
            "last_name": "Doe"
        },
        "phone": {
            "number": "8056594427",
            "country_code": "+91"
        }
    },
    "metadata": {
        "count_tickets": 1,
        "transaction_number": "5590043"
    },
    "customer_acceptance": {
        "acceptance_type": "offline",
        "accepted_at": "1963-05-03T04:07:52.723Z",
        "online": {
            "ip_address": "13.232.74.226",
            "user_agent": "amet irure esse"
        }
    }
}
'
Screenshot 2024-06-07 at 3 27 38 PM

Noon

  • ApplePay & GooglePay

GooglePay

curl --location 'http://localhost:8080/payments' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'api-key: dev_1h5hh8cuGtbJ21LNolWVJHFqgIygpHk19ZeeTmmbrFcTavrs35F4KhNqbH8fB0S6' \
--data-raw '{
    "amount": 124320,
    "currency": "AED",
    "confirm": true,
    "capture_method": "automatic",
    "capture_on": "2022-09-10T10:11:12Z",
    "customer_id": "CustomerX",
    "email": "guest@example.com",
    "name": "John Doe",
    "phone": "999999999",
    "phone_country_code": "+1",
    "description": "Its my first payment request",
    "authentication_type": "no_three_ds",
    "return_url": "https://google.com",
    "payment_method": "wallet",
    "payment_method_type": "google_pay",
    "payment_method_data": {
        "wallet": {
            "google_pay": {
                "type": "CARD",
                "description": "Visa •••• 1111",
                "info": {
                    "card_network": "VISA",
                    "card_details": "1111"
                },
                "tokenization_data": {
                    "type": "PAYMENT_GATEWAY",
                    "token": "{\"signature\":\"MEUCIQDq+hdZFXgAupCk3R5cr9wrDAP/jGPMJkqRsL9pBl8JMQIgA35XbERBWAxupnnSVlVc7yKqTiskRJHfQfWsy8dedLE\\u003d\",\"protocolVersion\":\"ECv1\",\"signedMessage\":\"{\\\"encryptedMessage\\\":\\\"sl3vpO1yFN8a1eYASko9fXRoFsRhGGLMvlewvZxmUhfND29xlG3j4PZAD9Kcov7jd0uP63LNhaZ8iYNkV/6Qwv0j6UfY1IST+HyndIOUQZlN5H6I8hbpvpP5nmjU3gbLnlkk8W5WUp6MAC76keYEW1rRF2qRgLqymYWEWicl9LkDVW6bz0bMuybsqljxaDIp5tGO4dQ9ajV2qwuw4AZx5MA3brKsKjmsJQbe5XIX48rt88yPZDcNQFKfoeo+DCgNpjATIlhIZNZxSue1oBi2can82Fa0+38nM446R8TUwN2pGgTJFqymvIKTZZEtutd8UW1+qCnlogRmyuAfK08QD7OuFFPcVUMiMsYjkS2baHEa9jczpjrBUPbm/DQnHbLkqarsuRqHJ86ZqxMPXMAAato6UsMgwgIeGHAgSWUj0x+e8oQCBm8TGbnIwxsGXlIutIfa9GooIUM1paz+\\\",\\\"ephemeralPublicKey\\\":\\\"BKxNuDGBs2YhCYpcZDWvw4nyo6w95pN2e+V3bfZm/cg8aN1wLHL1KkKceG7LrFkjOFbrO8RDQ3FQ+Yo+CMCtzk0\\\\u003d\\\",\\\"tag\\\":\\\"jbyoC/PCw4pJyK54vvZsL8eqzFOzUVd4hG4qCVHfKN4\\\\u003d\\\"}\"}"
                }
            }
        }
    },
    "billing": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "Dubai",
            "zip": "94122",
            "country": "AE",
            "first_name": "joseph",
            "last_name": "Doe"
        },
        "phone": {
            "number": "8056594427",
            "country_code": "+97"
        }
    },
    "shipping": {
        "address": {
            "line1": "1467",
            "line2": "Harrison Street",
            "line3": "Harrison Street",
            "city": "San Fransico",
            "state": "California",
            "zip": "94122",
            "country": "AE",
            "first_name": "joseph",
            "last_name": "Doe"
        },
        "phone": {
            "number": "8056594427",
            "country_code": "+91"
        }
    },
    "metadata": {
        "count_tickets": 1,
        "transaction_number": "5590043"
    },
    "customer_acceptance": {
        "acceptance_type": "offline",
        "accepted_at": "1963-05-03T04:07:52.723Z",
        "online": {
            "ip_address": "13.232.74.226",
            "user_agent": "amet irure esse"
        }
    },
        "connector_metadata":{
        "noon":{
            "order_category": "pay"
        }
    }
}
'
Screenshot 2024-06-07 at 3 36 57 PM

Checklist

  • I formatted the code cargo +nightly fmt --all
  • I addressed lints thrown by cargo clippy
  • I reviewed the submitted code
  • I added unit tests for my changes where possible

sahkal and others added 30 commits May 13, 2024 16:50
SamraatBansal
SamraatBansal previously approved these changes Jun 24, 2024
Narayanbhat166
Narayanbhat166 previously approved these changes Jun 24, 2024
Sakilmostak
Sakilmostak previously approved these changes Jun 24, 2024
crates/router/src/connector/bluesnap.rs Outdated Show resolved Hide resolved
SamraatBansal
SamraatBansal previously approved these changes Jun 25, 2024
@ThisIsMani ThisIsMani removed the request for review from a team June 26, 2024 09:00
@likhinbopanna likhinbopanna added this pull request to the merge queue Jun 26, 2024
Merged via the queue into main with commit e69a7bd Jun 26, 2024
11 checks passed
@likhinbopanna likhinbopanna deleted the 5179-amount-conversion-do-amount-conversion-for-payme branch June 26, 2024 09:30
pixincreate added a commit that referenced this pull request Jun 28, 2024
…ay/hyperswitch into iatapay-through-hyperswitch-cypress

* 'iatapay-through-hyperswitch-cypress' of github.com:juspay/hyperswitch:
  feat(router): skip apple pay session call if the browser is not Safari (#5136)
  fix(opensearch): show search results only if user has access permission to the index  (#5097)
  chore(version): 2024.06.27.0
  feat(users): add endpoint for terminate auth select (#5135)
  feat(users): implemented openidconnect (#5124)
  feat(router): add payments manual-update api (#5045)
  fix(docs): open-api fix for payment response (#5103)
  refactor(connector): [AdyenPlatform]Throw 4xx instead of 5xx for source_balance_account (#4990)
  feat: realtime user analytics (#5098)
  refactor(connector): added amount conversion framework for cashtocode (#4857)
  feat(email): Add `auth_id` in email types and send `auth_id` in email URLs (#5120)
  refactor(connector): add amount framework to payme & Trustpay with googlePay, ApplePay for bluesnap, Noon & Trustpay (#4833)
  fix(connector): [BOA/CYBS] make risk information message optional (#5107)
  chore(version): 2024.06.25.1
  fix(router): skip serialize if none for assurance_details_required in googlepay session response (#5118)
  refactor: separate DB queries and HTML creation for payout links (#4967)
  feat(router): updated `last_used_at` field for apple pay and google pay for CITs (#5087)
  fix(payment_methods): use existing field value of `nick_name` in db if not sent during request (#5105)
  chore(version): 2024.06.25.0
pixincreate added a commit that referenced this pull request Jun 28, 2024
…ay/hyperswitch into refactor-error-handling-in-cypress

* 'iatapay-through-hyperswitch-cypress' of github.com:juspay/hyperswitch:
  chore: clean up
  feat(router): skip apple pay session call if the browser is not Safari (#5136)
  fix(opensearch): show search results only if user has access permission to the index  (#5097)
  chore(version): 2024.06.27.0
  feat(users): add endpoint for terminate auth select (#5135)
  feat(users): implemented openidconnect (#5124)
  feat(router): add payments manual-update api (#5045)
  fix(docs): open-api fix for payment response (#5103)
  refactor(connector): [AdyenPlatform]Throw 4xx instead of 5xx for source_balance_account (#4990)
  feat: realtime user analytics (#5098)
  refactor(connector): added amount conversion framework for cashtocode (#4857)
  feat(email): Add `auth_id` in email types and send `auth_id` in email URLs (#5120)
  refactor(connector): add amount framework to payme & Trustpay with googlePay, ApplePay for bluesnap, Noon & Trustpay (#4833)
  fix(connector): [BOA/CYBS] make risk information message optional (#5107)
  chore(version): 2024.06.25.1
  fix(router): skip serialize if none for assurance_details_required in googlepay session response (#5118)
  refactor: separate DB queries and HTML creation for payout links (#4967)
  feat(router): updated `last_used_at` field for apple pay and google pay for CITs (#5087)
  fix(payment_methods): use existing field value of `nick_name` in db if not sent during request (#5105)
  chore(version): 2024.06.25.0
@SanchithHegde SanchithHegde removed S-waiting-on-review Status: This PR has been implemented and needs to be reviewed high-risk labels Jun 30, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-connector-integration Area: Connector integration M-api-contract-changes Metadata: This PR involves API contract changes
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants