From e3d8f7e6d4d61d2dcba34cfd5998bc8411ec3011 Mon Sep 17 00:00:00 2001 From: Aetet Date: Thu, 25 Jul 2024 12:20:20 +0200 Subject: [PATCH 1/4] fix: initail version of sdk --- package.json | 2 +- packages/aptos-sdk/src/domain.ts | 24 ++++++ packages/aptos-sdk/src/order/index.ts | 76 ++++++++++++++++++- .../connectors/connector-aptos/package.json | 2 +- .../connectors/connector-helper/package.json | 2 +- .../connectors/connector-mattel/package.json | 2 +- packages/e2e-tests/package.json | 2 +- packages/example/package.json | 2 +- packages/sdk-common/package.json | 2 +- packages/sdk-examples/package.json | 2 +- packages/sdk/package.json | 4 +- packages/sdk/src/sdk-blockchains/aptos/bid.ts | 72 +++++++++++++----- packages/transaction/package.json | 2 +- packages/wallet/package.json | 2 +- yarn.lock | 39 ++++++++-- 15 files changed, 198 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index a32ad2e2a..c745e44d0 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "@commitlint/config-conventional": "^13.1.0", "@onflow/fcl": "^1.4.1", "@onflow/types": "^1.1.0", - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.2", "@rarible/eslint-config-react": "~0.10.0-alpha.37", "@rarible/eslint-config-ts": "~0.10.0-alpha.37", "@rarible/prettier": "~0.10.0-alpha.37", diff --git a/packages/aptos-sdk/src/domain.ts b/packages/aptos-sdk/src/domain.ts index a605c3d43..7113285e1 100644 --- a/packages/aptos-sdk/src/domain.ts +++ b/packages/aptos-sdk/src/domain.ts @@ -39,12 +39,36 @@ export interface AptosOrderSdk { price: string, ): Promise + collectionOfferV1( + creatorAddress: string | undefined, + collectionName: string, + feeObjectAddress: string, + price: string, + amount: number, + endTime: number, + ): Promise + acceptCollectionOffer(offer: string, token: string): Promise + acceptCollectionOfferV1( + offer: string, + tokenName: string | undefined, + propertyVersion: string, + ): Promise cancelCollectionOffer(offer: string): Promise tokenOffer(tokenAddress: string, feeObjectAddress: string, endTime: number, price: string): Promise + tokenOfferV1( + creatorAddress: string, + collectionName: string, + tokenName: string, + propertyVersion: string, + feeObjectAddress: string, + price: string, + endTime: number, + ): Promise + acceptTokenOffer(offer: string): Promise cancelTokenOffer(offer: string): Promise diff --git a/packages/aptos-sdk/src/order/index.ts b/packages/aptos-sdk/src/order/index.ts index bacb66264..1b4e307c0 100644 --- a/packages/aptos-sdk/src/order/index.ts +++ b/packages/aptos-sdk/src/order/index.ts @@ -6,8 +6,9 @@ import type { AptosTransaction } from "@rarible/aptos-wallet" import { normalizeAptosAddress } from "@rarible/sdk-common" import { APT_TOKEN_TYPE, getListingTokenType, getRequiredWallet, isChangeBelongsToType } from "../common" import type { AddressConfig } from "../config" +import type { AptosOrderSdk } from "../domain" -export class AptosOrder { +export class AptosOrder implements AptosOrderSdk { constructor( readonly aptos: Aptos, readonly wallet: Maybe, @@ -21,9 +22,12 @@ export class AptosOrder { this.buy = this.buy.bind(this) this.cancel = this.cancel.bind(this) this.collectionOffer = this.collectionOffer.bind(this) + this.collectionOfferV1 = this.collectionOfferV1.bind(this) this.cancelCollectionOffer = this.cancelCollectionOffer.bind(this) this.acceptCollectionOffer = this.acceptCollectionOffer.bind(this) + this.acceptCollectionOfferV1 = this.acceptCollectionOfferV1.bind(this) this.tokenOffer = this.tokenOffer.bind(this) + this.tokenOfferV1 = this.tokenOfferV1.bind(this) this.cancelTokenOffer = this.cancelTokenOffer.bind(this) this.acceptTokenOffer = this.acceptTokenOffer.bind(this) } @@ -129,6 +133,30 @@ export class AptosOrder { return normalizeAptosAddress(change.address) } + collectionOfferV1 = async ( + creatorAddress: string | undefined, + collectionName: string, + feeObjectAddress: string, + price: string, + amount: number, + endTime: number, + ) => { + const rawTx = { + function: `${this.config.marketplaceAddress}::collection_offer::init_for_tokenv2_entry`, + typeArguments: [APT_TOKEN_TYPE], + arguments: [creatorAddress, collectionName, feeObjectAddress, price, amount, endTime], + } + + const tx = await this.sendAndWaitTx(rawTx) + const change = tx.changes.find(change => + isChangeBelongsToType(change, type => type.includes("collection_offer::CollectionOffer")), + ) + if (!change || !("address" in change)) { + throw new Error("Address has not been found") + } + return normalizeAptosAddress(change.address) + } + cancelCollectionOffer = async (offer: string) => { const rawTx = { function: `${this.config.marketplaceAddress}::collection_offer::cancel`, @@ -149,6 +177,16 @@ export class AptosOrder { return this.sendAndWaitTx(rawTx) } + async acceptCollectionOfferV1(offer: string, tokenName: string, propertyVersion: string) { + const rawTx = { + function: `${this.config.marketplaceAddress}::collection_offer::sell_tokenv1`, + typeArguments: [APT_TOKEN_TYPE], + arguments: [offer, tokenName, propertyVersion], + } + + return this.sendAndWaitTx(rawTx) + } + tokenOffer = async (tokenAddress: string, feeObjectAddress: string, endTime: number, price: string) => { const rawTx = { function: `${this.config.marketplaceAddress}::token_offer::init_for_tokenv2_entry`, @@ -167,6 +205,32 @@ export class AptosOrder { return normalizeAptosAddress(event.data.token_offer) } + tokenOfferV1 = async ( + creatorAddress: string, + collectionName: string, + tokenName: string, + propertyVersion: string, + feeObjectAddress: string, + price: string, + endTime: number, + ) => { + const rawTx = { + function: `${this.config.marketplaceAddress}::token_offer::init_for_tokenv1_entry`, + typeArguments: [APT_TOKEN_TYPE], + arguments: [creatorAddress, collectionName, tokenName, propertyVersion, feeObjectAddress, price, endTime], + } + + const tx = await this.sendAndWaitTx(rawTx) + if (!("events" in tx)) { + throw new Error("Events field in tx object was expected") + } + const event = tx.events.find(e => e.type.includes("events::TokenOfferPlaced")) + if (!event || !("token_offer" in event.data)) { + throw new Error("Offer has not been found") + } + return normalizeAptosAddress(event.data.token_offer) + } + cancelTokenOffer = async (offer: string) => { const rawTx = { function: `${this.config.marketplaceAddress}::token_offer::cancel`, @@ -187,6 +251,16 @@ export class AptosOrder { return this.sendAndWaitTx(rawTx) } + async acceptTokenOfferV1(offer: string, tokenName: String, propertyVersion: string) { + const rawTx = { + function: `${this.config.marketplaceAddress}::token_offer::sell_tokenv1`, + typeArguments: [APT_TOKEN_TYPE], + arguments: [offer, tokenName, propertyVersion], + } + + return this.sendAndWaitTx(rawTx) + } + async createFeeSchedule({ value, receiveAddress }: { value: number; receiveAddress?: string }): Promise { const commissionDenominator = "10000" const commissionNumerator = value.toString() diff --git a/packages/connectors/connector-aptos/package.json b/packages/connectors/connector-aptos/package.json index 5fc14ddf6..7957f43b5 100644 --- a/packages/connectors/connector-aptos/package.json +++ b/packages/connectors/connector-aptos/package.json @@ -16,7 +16,7 @@ "verify": "tsc --noEmit --project tsconfig-build.json" }, "dependencies": { - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.2", "@rarible/connector": "^0.13.68-fix.39", "@rarible/types": "~0.9.29" }, diff --git a/packages/connectors/connector-helper/package.json b/packages/connectors/connector-helper/package.json index d6466d9bb..c44e70f94 100644 --- a/packages/connectors/connector-helper/package.json +++ b/packages/connectors/connector-helper/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "@imtbl/imx-sdk": "^2.1.1", - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.2", "@rarible/connector": "^0.13.68-fix.39", "@rarible/connector-beacon": "^0.13.68-fix.39", "@rarible/connector-fcl": "^0.13.68-fix.39", diff --git a/packages/connectors/connector-mattel/package.json b/packages/connectors/connector-mattel/package.json index 06c515c9a..a35a92668 100644 --- a/packages/connectors/connector-mattel/package.json +++ b/packages/connectors/connector-mattel/package.json @@ -19,7 +19,7 @@ "@auth0/auth0-spa-js": "~2.1.1", "@magic-ext/flow": "~13.5.0", "@magic-ext/oidc": "~1.3.0", - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.2", "@rarible/connector": "^0.13.68-fix.39", "@rarible/types": "~0.9.29" }, diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json index c962b3733..8b029ddc3 100644 --- a/packages/e2e-tests/package.json +++ b/packages/e2e-tests/package.json @@ -16,7 +16,7 @@ "verify": "tsc --noEmit" }, "dependencies": { - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.2", "@rarible/ethereum-sdk-test-common": "^0.13.68-fix.39", "@rarible/flow-test-common": "~0.5.75-fix.1", "@rarible/sdk-wallet": "^0.13.68-fix.39", diff --git a/packages/example/package.json b/packages/example/package.json index 50456aa04..20a744dff 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -25,7 +25,7 @@ "@mui/material": "^5.15.17", "@nfid/embed": "0.0.5-alpha.0", "@nfid/wallet": "^1.1.0", - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.2", "@rarible/connector": "^0.13.68-fix.39", "@rarible/connector-beacon": "^0.13.68-fix.39", "@rarible/connector-fcl": "^0.13.68-fix.39", diff --git a/packages/sdk-common/package.json b/packages/sdk-common/package.json index 29bc29221..dc33f42c0 100644 --- a/packages/sdk-common/package.json +++ b/packages/sdk-common/package.json @@ -18,7 +18,7 @@ "verify": "tsc --noEmit --project tsconfig-build.json" }, "dependencies": { - "@rarible/api-client": "0.16.5-alpha.13" + "@rarible/api-client": "0.18.0-alpha.2" }, "peerDependencies": { "tslib": "^2.3.1" diff --git a/packages/sdk-examples/package.json b/packages/sdk-examples/package.json index 18495e225..a45671864 100644 --- a/packages/sdk-examples/package.json +++ b/packages/sdk-examples/package.json @@ -19,7 +19,7 @@ "verify": "tsc --noEmit --project tsconfig-build.json" }, "dependencies": { - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.2", "@rarible/estimate-middleware": "~0.9.6", "@rarible/ethers-ethereum": "^0.13.68-fix.39", "@rarible/sdk": "^0.13.68-fix.39", diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 358c9b6bc..7d852540e 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -31,7 +31,7 @@ "dependencies": { "@ethersproject/keccak256": "^5.6.0", "@rarible/action": "~0.9.1", - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.2", "@rarible/aptos-sdk": "^0.13.68-fix.39", "@rarible/flow-sdk": "~0.5.78-fix.3", "@rarible/immutable-sdk": "^0.13.68-fix.39", @@ -87,7 +87,7 @@ "yargs": "^17.2.1" }, "peerDependencies": { - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.2", "axios": "^0.26.1", "tslib": "^2.3.1" } diff --git a/packages/sdk/src/sdk-blockchains/aptos/bid.ts b/packages/sdk/src/sdk-blockchains/aptos/bid.ts index 0064aaa9c..4100a2ed4 100644 --- a/packages/sdk/src/sdk-blockchains/aptos/bid.ts +++ b/packages/sdk/src/sdk-blockchains/aptos/bid.ts @@ -52,22 +52,48 @@ export class AptosBid { : getDefaultExpirationDateTimestamp() if ("itemId" in prepare) { - const orderId = await this.sdk.order.tokenOffer( - extractId(prepare.itemId), - feeObject, - expirationDate, - toBn(request.price.toString()).multipliedBy(APT_DIVIDER).toFixed(), - ) - return convertAptosToUnionOrderId(orderId) + if (item?.extra?.propertyVersionV1 !== undefined) { + const orderId = await this.sdk.order.tokenOfferV1( + item.creators[0].account, + item.itemCollection!.name, + item.meta!.name, + item.extra["propertyVersionV1"], + feeObject, + toBn(request.price.toString()).multipliedBy(APT_DIVIDER).toFixed(), + expirationDate, + ) + return convertAptosToUnionOrderId(orderId) + } else { + const orderId = await this.sdk.order.tokenOffer( + extractId(prepare.itemId), + feeObject, + expirationDate, + toBn(request.price.toString()).multipliedBy(APT_DIVIDER).toFixed(), + ) + return convertAptosToUnionOrderId(orderId) + } } else if ("collectionId" in prepare) { - const orderId = await this.sdk.order.collectionOffer( - extractId(prepare["collectionId"]), - request.amount || 1, - feeObject, - expirationDate, - toBn(request.price.toString()).multipliedBy(APT_DIVIDER).toFixed(), - ) - return convertAptosToUnionOrderId(orderId) + const collection = await this.apis.collection.getCollectionById({ collection: prepare.collectionId }) + if (collection.extra?.propertyVersionV1 !== undefined) { + const orderId = await this.sdk.order.collectionOfferV1( + collection.owner, + collection.name, + feeObject, + toBn(request.price.toString()).multipliedBy(APT_DIVIDER).toFixed(), + request.amount || 1, + expirationDate, + ) + return convertAptosToUnionOrderId(orderId) + } else { + const orderId = await this.sdk.order.collectionOffer( + extractId(prepare["collectionId"]), + request.amount || 1, + feeObject, + expirationDate, + toBn(request.price.toString()).multipliedBy(APT_DIVIDER).toFixed(), + ) + return convertAptosToUnionOrderId(orderId) + } } else { throw new Error("ItemID or CollectionID was expected") } @@ -115,8 +141,20 @@ export class AptosBid { if (!buyRequest.itemId) { throw new Error("ItemId property mustn't be empty") } - const tx = await this.sdk.order.acceptCollectionOffer(extractId(orderId), extractId(buyRequest.itemId)) - return new BlockchainAptosTransaction(tx, this.network, this.sdk) + const itemId = buyRequest.itemId + // @todo not sure about this + const item = await this.apis.item.getItemById({ itemId }) + if (item.extra?.propertyVersionV1 !== undefined) { + const tx = await this.sdk.order.acceptCollectionOfferV1( + extractId(orderId), + item.meta?.name, + item.extra?.propertyVersionV1, + ) + return new BlockchainAptosTransaction(tx, this.network, this.sdk) + } else { + const tx = await this.sdk.order.acceptCollectionOffer(extractId(orderId), extractId(buyRequest.itemId)) + return new BlockchainAptosTransaction(tx, this.network, this.sdk) + } } if (order.take.type["@type"] === "NFT") { const tx = await this.sdk.order.acceptTokenOffer(extractId(orderId)) diff --git a/packages/transaction/package.json b/packages/transaction/package.json index 2479e5054..f81dbf89e 100644 --- a/packages/transaction/package.json +++ b/packages/transaction/package.json @@ -26,7 +26,7 @@ "@rarible/types": "~0.9.29" }, "peerDependencies": { - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.2", "tslib": "^2.3.1" }, "publishConfig": { diff --git a/packages/wallet/package.json b/packages/wallet/package.json index 1b7f7954b..83b6c57e5 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -68,7 +68,7 @@ "stream-browserify": "^3.0.0" }, "peerDependencies": { - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.2", "tslib": "^2.3.1" }, "publishConfig": { diff --git a/yarn.lock b/yarn.lock index 69f634537..f652c42bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7177,10 +7177,10 @@ dependencies: callable-instance "^2.0.0" -"@rarible/api-client@0.16.5-alpha.13": - version "0.16.5-alpha.13" - resolved "https://registry.yarnpkg.com/@rarible/api-client/-/api-client-0.16.5-alpha.13.tgz#67333551811f8535fcf9da54e6e061c94109584f" - integrity sha512-7pmHKunl4yVw5nehOBPA5FZ8QD//PpOFMHAegRAjmvl/QDMdy+1UvfJxGwCU1yx/VaEx9eInAMqiF97f2ggFJw== +"@rarible/api-client@0.18.0-alpha.2": + version "0.18.0-alpha.2" + resolved "https://registry.yarnpkg.com/@rarible/api-client/-/api-client-0.18.0-alpha.2.tgz#c47cfa2d3aba0f205d2d164e035cbbda821c1f72" + integrity sha512-vBlZZr81DFPRQFjpX37xp8l9y6vbJPa1O7QiQk4HnPHPC1UIm/tJVhhkOaPcwuYgOOErkLWvgJIHfBoCtsGN9Q== "@rarible/eslint-config-react@~0.10.0-alpha.37": version "0.10.0-alpha.37" @@ -23950,7 +23950,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -23968,6 +23968,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -24103,7 +24112,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -24124,6 +24133,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -26567,7 +26583,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -26585,6 +26601,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 6aa7b4b8f9517357a11362eed61e3cf7870b566d Mon Sep 17 00:00:00 2001 From: Eugene Nacu Date: Tue, 30 Jul 2024 10:32:09 +0100 Subject: [PATCH 2/4] Support for v3 orders (#639) * fix: support for v3 orders * fix: tests for sell/buy in ethereum SDK (data v3) * fix: do not use order v3 when no origin fees specified --------- Co-authored-by: Aleksandr Sozinov --- package.json | 2 +- .../connectors/connector-aptos/package.json | 2 +- .../connectors/connector-helper/package.json | 2 +- .../connectors/connector-mattel/package.json | 2 +- packages/e2e-tests/package.json | 2 +- packages/ethereum/sdk/package.json | 2 +- .../sdk/src/common/get-base-fee.test.ts | 7 +- .../ethereum/sdk/src/common/get-base-fee.ts | 3 +- packages/ethereum/sdk/src/index.ts | 25 +-- .../sdk/src/order/bid-collection.test.ts | 6 +- packages/ethereum/sdk/src/order/bid.test.ts | 12 +- .../ethereum/sdk/src/order/cancel.test.ts | 24 +-- .../src/order/encode-rarible-v2-order-data.ts | 86 ++++----- .../sdk/src/order/fill-order/index.ts | 12 +- .../src/order/fill-order/rarible-v2.test.ts | 22 ++- .../sdk/src/order/fill-order/rarible-v2.ts | 174 ++++++------------ .../sdk/src/order/fill-order/types.ts | 23 +-- packages/ethereum/sdk/src/order/sell.test.ts | 15 +- .../sdk/src/order/upsert-order.test.ts | 52 +----- .../ethereum/sdk/src/order/upsert-order.ts | 49 +---- .../src/contracts/test-exchange-v2.ts | 168 ++++++++++------- packages/example/package.json | 2 +- packages/imx-sdk/package.json | 2 +- packages/sdk-common/package.json | 2 +- packages/sdk-examples/package.json | 2 +- packages/sdk/package.json | 4 +- .../sdk/src/sdk-blockchains/ethereum/bid.ts | 106 ++--------- .../sdk-blockchains/ethereum/common/index.ts | 39 +--- .../ethereum/common/validators.ts | 29 --- .../sdk/src/sdk-blockchains/ethereum/fill.ts | 40 +--- .../sdk/src/sdk-blockchains/ethereum/index.ts | 6 +- .../sdk/src/sdk-blockchains/ethereum/sell.ts | 25 +-- packages/transaction/package.json | 2 +- packages/wallet/package.json | 2 +- yarn.lock | 47 +++-- 35 files changed, 369 insertions(+), 629 deletions(-) delete mode 100644 packages/sdk/src/sdk-blockchains/ethereum/common/validators.ts diff --git a/package.json b/package.json index a32ad2e2a..4c147e514 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,7 @@ "@commitlint/config-conventional": "^13.1.0", "@onflow/fcl": "^1.4.1", "@onflow/types": "^1.1.0", - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.1", "@rarible/eslint-config-react": "~0.10.0-alpha.37", "@rarible/eslint-config-ts": "~0.10.0-alpha.37", "@rarible/prettier": "~0.10.0-alpha.37", diff --git a/packages/connectors/connector-aptos/package.json b/packages/connectors/connector-aptos/package.json index 764b62d30..c3181a174 100644 --- a/packages/connectors/connector-aptos/package.json +++ b/packages/connectors/connector-aptos/package.json @@ -16,7 +16,7 @@ "verify": "tsc --noEmit --project tsconfig-build.json" }, "dependencies": { - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.1", "@rarible/connector": "^0.13.68-fix.42", "@rarible/types": "~0.9.30" }, diff --git a/packages/connectors/connector-helper/package.json b/packages/connectors/connector-helper/package.json index fc302f7c8..71f7d3fb9 100644 --- a/packages/connectors/connector-helper/package.json +++ b/packages/connectors/connector-helper/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "@imtbl/imx-sdk": "^2.1.1", - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.1", "@rarible/connector": "^0.13.68-fix.42", "@rarible/connector-beacon": "^0.13.68-fix.42", "@rarible/connector-fcl": "^0.13.68-fix.42", diff --git a/packages/connectors/connector-mattel/package.json b/packages/connectors/connector-mattel/package.json index 477f68ae4..b9fed27b6 100644 --- a/packages/connectors/connector-mattel/package.json +++ b/packages/connectors/connector-mattel/package.json @@ -19,7 +19,7 @@ "@auth0/auth0-spa-js": "~2.1.1", "@magic-ext/flow": "~13.5.0", "@magic-ext/oidc": "~1.3.0", - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.1", "@rarible/connector": "^0.13.68-fix.42", "@rarible/types": "~0.9.30" }, diff --git a/packages/e2e-tests/package.json b/packages/e2e-tests/package.json index 28a46c4ff..5e340917b 100644 --- a/packages/e2e-tests/package.json +++ b/packages/e2e-tests/package.json @@ -16,7 +16,7 @@ "verify": "tsc --noEmit" }, "dependencies": { - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.1", "@rarible/ethereum-sdk-test-common": "^0.13.68-fix.42", "@rarible/flow-test-common": "~0.5.75-fix.1", "@rarible/sdk-wallet": "^0.13.68-fix.42", diff --git a/packages/ethereum/sdk/package.json b/packages/ethereum/sdk/package.json index fda23d4ab..3ec9cd350 100644 --- a/packages/ethereum/sdk/package.json +++ b/packages/ethereum/sdk/package.json @@ -31,7 +31,7 @@ }, "dependencies": { "@rarible/action": "~0.9.1", - "@rarible/ethereum-api-client": "^0.1.26-beta3", + "@rarible/ethereum-api-client": "^0.2.0-alpha.1", "@rarible/ethereum-provider": "^0.13.68-fix.42", "@rarible/logger": "^0.9.12", "@rarible/sdk-common": "^0.13.68-fix.42", diff --git a/packages/ethereum/sdk/src/common/get-base-fee.test.ts b/packages/ethereum/sdk/src/common/get-base-fee.test.ts index dd0aa8b84..9e26e793f 100644 --- a/packages/ethereum/sdk/src/common/get-base-fee.test.ts +++ b/packages/ethereum/sdk/src/common/get-base-fee.test.ts @@ -3,6 +3,7 @@ import { ethereumNetworks } from "../types" import { getBaseFee } from "./get-base-fee" import { createEthereumApis, getApis as getApisTemplate } from "./apis" import { getTestAPIKey } from "./test/test-credentials" +import { CURRENT_ORDER_TYPE_VERSION } from "./order" /** * @group type/common @@ -11,7 +12,7 @@ describe("get base fee", () => { test("get base fee from mainnet", async () => { const env: EthereumNetwork = "mainnet" const getApis = getApisTemplate.bind(null, undefined, env, { apiKey: getTestAPIKey(env) }) - const fee = await getBaseFee(env, getApis) + const fee = await getBaseFee(env, getApis, CURRENT_ORDER_TYPE_VERSION) expect(fee).not.toBeNaN() }) @@ -24,7 +25,7 @@ describe("get base fee", () => { return apis } - await expect(() => getBaseFee(env, getApis)).rejects.toBeTruthy() + await expect(() => getBaseFee(env, getApis, CURRENT_ORDER_TYPE_VERSION)).rejects.toBeTruthy() }) test("check fees.json config", async () => { @@ -37,7 +38,7 @@ describe.each(ethereumNetworks)("get base fee each of environments", (env: Ether const getApis = async () => createEthereumApis(env, { apiKey: getTestAPIKey(env) }) test(`get base fee from ${env}`, async () => { - const fee = await getBaseFee(env, getApis) + const fee = await getBaseFee(env, getApis, CURRENT_ORDER_TYPE_VERSION) expect(fee).not.toBeNaN() }) }) diff --git a/packages/ethereum/sdk/src/common/get-base-fee.ts b/packages/ethereum/sdk/src/common/get-base-fee.ts index fb4a755f0..387e22542 100644 --- a/packages/ethereum/sdk/src/common/get-base-fee.ts +++ b/packages/ethereum/sdk/src/common/get-base-fee.ts @@ -1,14 +1,13 @@ import { getStringifiedData } from "@rarible/sdk-common" import type { EthereumNetwork } from "../types" import type { SimpleOrder } from "../order/types" -import { CURRENT_ORDER_TYPE_VERSION } from "./order" import type { RaribleEthereumApis } from "./apis" import { retry } from "./retry" export async function getBaseFee( env: EthereumNetwork, getApis: () => Promise, - type: EnvFeeType = CURRENT_ORDER_TYPE_VERSION, + type: EnvFeeType, ): Promise { const apis = await getApis() let envFeeConfig: Record diff --git a/packages/ethereum/sdk/src/index.ts b/packages/ethereum/sdk/src/index.ts index 735d2d417..84f135b4a 100644 --- a/packages/ethereum/sdk/src/index.ts +++ b/packages/ethereum/sdk/src/index.ts @@ -5,7 +5,6 @@ import type { Maybe } from "@rarible/types/build/maybe" import type { BigNumberValue } from "@rarible/utils/build/bn" import type { AmmTradeInfo } from "@rarible/ethereum-api-client/build/models" import type { GetAmmBuyInfoRequest } from "@rarible/ethereum-api-client/build/apis/OrderControllerApi" -import { toWord } from "@rarible/types" import { getNetworkConfigByChainId } from "./config" import type { UpsertOrderAction } from "./order/upsert-order" import { UpsertOrder } from "./order/upsert-order" @@ -58,8 +57,8 @@ import { getAuctionHash } from "./auction/common" import type { CryptoPunksWrapper } from "./common/crypto-punks" import { approveForWrapper, unwrapPunk, wrapPunk } from "./nft/cryptopunk-wrapper" import { BatchOrderFiller } from "./order/fill-order/batch-purchase/batch-purchase" -import { getUpdatedCalldata } from "./order/fill-order/common/get-updated-call" import { getRequiredWallet } from "./common/get-required-wallet" +import { CURRENT_ORDER_TYPE_VERSION } from "./common/order" export interface RaribleOrderSdk { /** @@ -86,42 +85,42 @@ export interface RaribleOrderSdk { * Fill order (buy or accept bid - depending on the order type) * * @deprecated Use {@link buy} or {@link acceptBid} instead - * @param request order and parameters (amount to fill, fees etc) + * @param request order and parameters (amount to fill, fees etc.) */ fill: FillOrderAction /** * Buy order * - * @param request order and parameters (amount to fill, fees etc) + * @param request order and parameters (amount to fill, fees etc.) */ buy: FillOrderAction /** * Accept bid order * - * @param request order and parameters (amount to fill, fees etc) + * @param request order and parameters (amount to fill, fees etc.) */ acceptBid: FillOrderAction /** * Purchase batch * - * @param request array of order and parameters (amount to fill, fees etc) + * @param request array of order and parameters (amount to fill, fees etc.) */ buyBatch: FillBatchOrderAction /** * Get fill transaction data (for external sending) * - * @param request order and parameters (amount to fill, fees etc) + * @param request order and parameters (amount to fill, fees etc.) */ getFillTxData: GetOrderFillTxData /** * Get buy transaction data (for external sending) * - * @param request order and parameters (amount to fill, fees etc) + * @param request order and parameters (amount to fill, fees etc.) */ getBuyTxData: GetOrderBuyTxData @@ -320,9 +319,12 @@ export function createRaribleSdk( const checkLazyOrder = order.checkLazyOrder.bind(null, checkLazyAsset) const checkAssetType = partialCall(checkAssetTypeTemplate, getApis) - const getBaseOrderFee = getBaseFee.bind(null, env, getApis) - const filler = new OrderFiller(ethereum, send, getConfig, getApis, getBaseOrderFee, env, sdkConfig) - const buyBatchService = new BatchOrderFiller(ethereum, send, getConfig, getApis, getBaseOrderFee, env, sdkConfig) + const getBaseOrderFeeOld = getBaseFee.bind(null, env, getApis) + const getBaseOrderFee = (type?: OrderForm["type"]) => { + return getBaseFee(env, getApis, type || CURRENT_ORDER_TYPE_VERSION) + } + const filler = new OrderFiller(ethereum, send, getConfig, getApis, getBaseOrderFeeOld, env, sdkConfig) + const buyBatchService = new BatchOrderFiller(ethereum, send, getConfig, getApis, getBaseOrderFeeOld, env, sdkConfig) const approveFn = partialCall(approveTemplate, ethereum, send, getConfig) @@ -335,7 +337,6 @@ export function createRaribleSdk( partialCall(signOrderTemplate, ethereum, getConfig), getApis, ethereum, - toWord(getUpdatedCalldata(sdkConfig)), ) const sellService = new OrderSell(upsertService, checkAssetType) diff --git a/packages/ethereum/sdk/src/order/bid-collection.test.ts b/packages/ethereum/sdk/src/order/bid-collection.test.ts index fc27857ae..2f7098755 100644 --- a/packages/ethereum/sdk/src/order/bid-collection.test.ts +++ b/packages/ethereum/sdk/src/order/bid-collection.test.ts @@ -1,11 +1,10 @@ -import { toAddress, ZERO_WORD } from "@rarible/types" +import { toAddress, toBigNumber } from "@rarible/types" import { awaitAll, createE2eProvider, deployTestErc721 } from "@rarible/ethereum-sdk-test-common" import { toBn } from "@rarible/utils" import Web3 from "web3" import { Web3Ethereum } from "@rarible/web3-ethereum" -import { toBigNumber } from "@rarible/types" import { getEthereumConfig } from "../config" -import { sentTx, getSimpleSendWithInjects, getSendWithInjects } from "../common/send-transaction" +import { getSendWithInjects, getSimpleSendWithInjects, sentTx } from "../common/send-transaction" import { delay } from "../common/retry" import { getApis as getApisTemplate } from "../common/apis" import { createErc721V3Collection } from "../common/mint" @@ -57,7 +56,6 @@ describe("bid", () => { signOrder2, getApis2, ethereum2, - ZERO_WORD, ) const orderBid = new OrderBid(upserter, checkAssetType) diff --git a/packages/ethereum/sdk/src/order/bid.test.ts b/packages/ethereum/sdk/src/order/bid.test.ts index abbd5a4ff..9a2be9005 100644 --- a/packages/ethereum/sdk/src/order/bid.test.ts +++ b/packages/ethereum/sdk/src/order/bid.test.ts @@ -54,17 +54,7 @@ describe.each(providers)("bid", ethereum => { const checkLazyAsset = checkLazyAssetTemplate.bind(null, checkLazyAssetType) const checkLazyOrder = checkLazyOrderTemplate.bind(null, checkLazyAsset) - const upserter = new UpsertOrder( - orderService, - send, - getConfig, - checkLazyOrder, - approve, - signOrder, - getApis, - ethereum, - ZERO_WORD, - ) + const upserter = new UpsertOrder(orderService, send, getConfig, checkLazyOrder, approve, signOrder, getApis, ethereum) const orderSell = new OrderBid(upserter, checkAssetType) const e2eErc721V3ContractAddress = getTestContract(env, "erc721V3") const treasury = createE2eWallet() diff --git a/packages/ethereum/sdk/src/order/cancel.test.ts b/packages/ethereum/sdk/src/order/cancel.test.ts index bd67f1f0a..714877725 100644 --- a/packages/ethereum/sdk/src/order/cancel.test.ts +++ b/packages/ethereum/sdk/src/order/cancel.test.ts @@ -1,10 +1,14 @@ -import { awaitAll, createE2eProvider, deployTestErc1155 } from "@rarible/ethereum-sdk-test-common" +import { + awaitAll, + createE2eProvider, + deployTestErc1155, + deployTestErc20, + deployTestErc721 +} from "@rarible/ethereum-sdk-test-common" import Web3 from "web3" import { Web3Ethereum } from "@rarible/web3-ethereum" -import { toAddress, toBigNumber, toBinary, ZERO_WORD } from "@rarible/types" +import { toAddress, toBigNumber, toBinary } from "@rarible/types" import type { Address, OrderForm } from "@rarible/ethereum-api-client" -import { deployTestErc20 } from "@rarible/ethereum-sdk-test-common" -import { deployTestErc721 } from "@rarible/ethereum-sdk-test-common" import { getEthereumConfig } from "../config" import { delay, retry } from "../common/retry" import { getSimpleSendWithInjects, sentTxConfirm } from "../common/send-transaction" @@ -93,17 +97,7 @@ describe("cancel order", () => { async function testOrder(form: OrderForm) { const checkLazyOrder = (form: T) => Promise.resolve(form) - const upserter = new UpsertOrder( - orderService, - send, - getConfig, - checkLazyOrder, - approve, - sign, - getApis, - ethereum, - ZERO_WORD, - ) + const upserter = new UpsertOrder(orderService, send, getConfig, checkLazyOrder, approve, sign, getApis, ethereum) const order = await upserter.upsert({ order: form }) const tx = await cancel(checkLazyOrder, ethereum, send, getConfig, getApis, order) diff --git a/packages/ethereum/sdk/src/order/encode-rarible-v2-order-data.ts b/packages/ethereum/sdk/src/order/encode-rarible-v2-order-data.ts index 5f3390389..0f0132d2e 100644 --- a/packages/ethereum/sdk/src/order/encode-rarible-v2-order-data.ts +++ b/packages/ethereum/sdk/src/order/encode-rarible-v2-order-data.ts @@ -28,24 +28,13 @@ export function encodeRaribleV2OrderData( wrongEncode: Boolean = false, ): [string, string] { switch (data.dataType) { - case "RARIBLE_V2_DATA_V3_BUY": { - const encoded = ethereum.encodeParameter(DATA_V3_BUY_TYPE, { - payouts: encodePartToBuffer(data.payout), - originFeeFirst: encodePartToBuffer(data.originFeeFirst), - originFeeSecond: encodePartToBuffer(data.originFeeSecond), - marketplaceMarker: data.marketplaceMarker || ZERO_WORD, - }) - return ["0x1b18cdf6", encoded] - } - case "RARIBLE_V2_DATA_V3_SELL": { - const encoded = ethereum.encodeParameter(DATA_V3_SELL_TYPE, { - payouts: encodePartToBuffer(data.payout), - originFeeFirst: encodePartToBuffer(data.originFeeFirst), - originFeeSecond: encodePartToBuffer(data.originFeeSecond), - maxFeesBasePoint: data.maxFeesBasePoint, - marketplaceMarker: data.marketplaceMarker || ZERO_WORD, + case "RARIBLE_V2_DATA_V3": { + const encoded = ethereum.encodeParameter(DATA_V3_TYPE, { + payouts: data.payouts, + originFees: data.originFees, + isMakeFill: data.isMakeFill, }) - return ["0x2fa3cfd3", encoded] + return ["0x4ade54ca", encoded] } case "RARIBLE_V2_DATA_V2": { const encoded = ethereum.encodeParameter(DATA_V2_TYPE, { @@ -145,50 +134,39 @@ const DATA_V2_TYPE = { type: "tuple", } -const DATA_V3_BUY_TYPE = { - components: [ - { - name: "payouts", - type: "uint256", - }, - { - name: "originFeeFirst", - type: "uint256", - }, - { - name: "originFeeSecond", - type: "uint256", - }, - { - name: "marketplaceMarker", - type: "bytes32", - }, - ], - name: "data", - type: "tuple", -} - -const DATA_V3_SELL_TYPE = { +const DATA_V3_TYPE = { components: [ { + components: [ + { + name: "account", + type: "address", + }, + { + name: "value", + type: "uint96", + }, + ], name: "payouts", - type: "uint256", - }, - { - name: "originFeeFirst", - type: "uint256", - }, - { - name: "originFeeSecond", - type: "uint256", + type: "tuple[]", }, { - name: "maxFeesBasePoint", - type: "uint256", + components: [ + { + name: "account", + type: "address", + }, + { + name: "value", + type: "uint96", + }, + ], + name: "originFees", + type: "tuple[]", }, { - name: "marketplaceMarker", - type: "bytes32", + name: "isMakeFill", + type: "bool", }, ], name: "data", diff --git a/packages/ethereum/sdk/src/order/fill-order/index.ts b/packages/ethereum/sdk/src/order/fill-order/index.ts index bb3f32fb9..d297032a5 100644 --- a/packages/ethereum/sdk/src/order/fill-order/index.ts +++ b/packages/ethereum/sdk/src/order/fill-order/index.ts @@ -63,24 +63,24 @@ export class OrderFiller { looksrareV2Handler: LooksrareV2OrderHandler x2y2Handler: X2Y2OrderHandler ammHandler: AmmOrderHandler - private checkAssetType: CheckAssetTypeFunction + private readonly checkAssetType: CheckAssetTypeFunction // eslint-disable-next-line @typescript-eslint/no-unused-vars private checkLazyAssetType: (type: AssetType) => Promise constructor( private readonly ethereum: Maybe, private readonly send: SendFunction, - private readonly getConfig: GetConfigByChainId, + getConfig: GetConfigByChainId, private readonly getApis: () => Promise, - private readonly getBaseOrderFee: (type: SimpleOrder["type"]) => Promise, - private readonly env: EthereumNetwork, + getBaseOrderFee: (type: SimpleOrder["type"]) => Promise, + env: EthereumNetwork, private readonly sdkConfig?: IRaribleEthereumSdkConfig, ) { this.getBaseOrderFillFee = this.getBaseOrderFillFee.bind(this) this.getTransactionData = this.getTransactionData.bind(this) this.getBuyTx = this.getBuyTx.bind(this) this.v1Handler = new RaribleV1OrderHandler(ethereum, getApis, send, getConfig, getBaseOrderFee, sdkConfig) - this.v2Handler = new RaribleV2OrderHandler(ethereum, send, getConfig, getBaseOrderFee, sdkConfig) + this.v2Handler = new RaribleV2OrderHandler(ethereum, send, getConfig, getBaseOrderFee) this.openSeaHandler = new OpenSeaOrderHandler(ethereum, send, getConfig, getApis, getBaseOrderFee, sdkConfig) this.punkHandler = new CryptoPunksOrderHandler(ethereum, send, getConfig, getBaseOrderFee, sdkConfig) this.seaportHandler = new SeaportOrderHandler(ethereum, send, getConfig, getApis, getBaseOrderFee, env, sdkConfig) @@ -306,7 +306,7 @@ export class OrderFiller { case "RARIBLE_V1": return this.v1Handler.getBaseOrderFee() case "RARIBLE_V2": - return this.v2Handler.getBaseOrderFee() + return this.v2Handler.getBaseOrderFee(order) case "OPEN_SEA_V1": return this.openSeaHandler.getBaseOrderFee() case "SEAPORT_V1": diff --git a/packages/ethereum/sdk/src/order/fill-order/rarible-v2.test.ts b/packages/ethereum/sdk/src/order/fill-order/rarible-v2.test.ts index 6ac21a001..73d038491 100644 --- a/packages/ethereum/sdk/src/order/fill-order/rarible-v2.test.ts +++ b/packages/ethereum/sdk/src/order/fill-order/rarible-v2.test.ts @@ -343,7 +343,23 @@ describe("buy & acceptBid orders", () => { ) }) + test("should match order(buy erc1155 for eth) with dataType=V3", async () => { + await testMatchV2OrHigher("RARIBLE_V2_DATA_V3", true) + }) + test("should match order(buy erc1155 for eth) with dataType=V2", async () => { + await testMatchV2OrHigher("RARIBLE_V2_DATA_V2", true) + }) + + test("should match order(buy erc1155 for eth) with dataType=V3 and no origin fees", async () => { + await testMatchV2OrHigher("RARIBLE_V2_DATA_V3", false) + }) + + test("should match order(buy erc1155 for eth) with dataType=V2 and no origin fees", async () => { + await testMatchV2OrHigher("RARIBLE_V2_DATA_V2", false) + }) + + async function testMatchV2OrHigher(dataType: "RARIBLE_V2_DATA_V2" | "RARIBLE_V2_DATA_V3", includeFees: boolean) { await sentTx(it.testErc1155.methods.mint(sellerAddress, 4, 10, "0x"), { from: buyerAddress }) const left: SimpleOrder = { @@ -365,7 +381,7 @@ describe("buy & acceptBid orders", () => { salt: randomWord(), type: "RARIBLE_V2", data: { - dataType: "RARIBLE_V2_DATA_V2", + dataType, payouts: [], originFees: [], isMakeFill: true, @@ -388,7 +404,7 @@ describe("buy & acceptBid orders", () => { value: 100, }, ] - const tx = await filler.buy({ order: finalOrder, amount: 2, originFees }) + const tx = await filler.buy({ order: finalOrder, amount: 2, originFees: includeFees ? originFees : [] }) await tx.wait() expect(toBn(await it.testErc1155.methods.balanceOf(sellerAddress, 1).call()).toString()).toBe( @@ -397,7 +413,7 @@ describe("buy & acceptBid orders", () => { expect(toBn(await it.testErc1155.methods.balanceOf(buyerAddress, 1).call()).toString()).toBe( before1.plus(2).toFixed(), ) - }) + } test("should fill order (buy) with crypto punks asset", async () => { const punkId = 43 diff --git a/packages/ethereum/sdk/src/order/fill-order/rarible-v2.ts b/packages/ethereum/sdk/src/order/fill-order/rarible-v2.ts index 928385e19..d5b569403 100644 --- a/packages/ethereum/sdk/src/order/fill-order/rarible-v2.ts +++ b/packages/ethereum/sdk/src/order/fill-order/rarible-v2.ts @@ -1,6 +1,6 @@ import type { Address } from "@rarible/ethereum-api-client" -import type { Ethereum, EthereumFunctionCall, EthereumSendOptions } from "@rarible/ethereum-provider" -import { ZERO_ADDRESS, ZERO_WORD } from "@rarible/types" +import type { Ethereum, EthereumSendOptions } from "@rarible/ethereum-provider" +import { ZERO_WORD } from "@rarible/types" import type { Maybe } from "@rarible/types/build/maybe" import { hashToSign, orderToStruct, signOrder } from "../sign-order" import { getAssetWithFee } from "../get-asset-with-fee" @@ -11,12 +11,10 @@ import { waitTx } from "../../common/wait-tx" import type { SimpleOrder, SimpleRaribleV2Order } from "../types" import { isSigner } from "../../common/is-signer" import { fixSignature } from "../../common/fix-signature" -import type { IRaribleEthereumSdkConfig } from "../../types" -import { assetTypeToStruct } from "../asset-type-to-struct" -import { encodeRaribleV2OrderData } from "../encode-rarible-v2-order-data" import { isETH, isWeth } from "../../nft/common" import type { GetConfigByChainId } from "../../config" import { getNetworkConfigByChainId } from "../../config" +import { CURRENT_ORDER_TYPE_VERSION } from "../../common/order" import { encodeRaribleV2OrderPurchaseStruct } from "./rarible-v2/encode-rarible-v2-order" import { invertOrder } from "./invert-order" import type { @@ -25,8 +23,7 @@ import type { PreparedOrderRequestDataForExchangeWrapper, RaribleV2OrderFillRequest, RaribleV2OrderFillRequestV2, - RaribleV2OrderFillRequestV3Buy, - RaribleV2OrderFillRequestV3Sell, + RaribleV2OrderFillRequestV3, } from "./types" import { ExchangeWrapperOrderType } from "./types" import { setFeesCurrency, ZERO_FEE_VALUE } from "./common/origin-fees-utils" @@ -36,11 +33,10 @@ export class RaribleV2OrderHandler implements OrderHandler, private readonly send: SendFunction, private readonly getConfig: GetConfigByChainId, - private readonly getBaseOrderFeeConfig: (type: SimpleOrder["type"]) => Promise, - private readonly sdkConfig?: IRaribleEthereumSdkConfig, + private readonly getBaseFee: (type: SimpleOrder["type"]) => Promise, ) {} - invert(request: RaribleV2OrderFillRequest, maker: Address): SimpleRaribleV2Order { + async invert(request: RaribleV2OrderFillRequest, maker: Address): Promise { const inverted = invertOrder(request.order, request.amount, maker) switch (request.order.data.dataType) { case "RARIBLE_V2_DATA_V1": { @@ -52,32 +48,22 @@ export class RaribleV2OrderHandler implements OrderHandler { + const originFees = (request.originFees || []).reduce((sum, prev) => sum + prev.value, 0) + //should not use v3 as order doesn't have fees, so protocol also should not take any fees + if (originFees === 0) { + return false + } + const baseFee = await this.getBaseFee(CURRENT_ORDER_TYPE_VERSION) + //if base fee is non-zero, then use v3 (with protocol fees), otherwise use v2 (without fees) + return baseFee !== 0 + } + getAssetToApprove(inverted: SimpleRaribleV2Order) { return this.getMakeAssetWithFee(inverted) } @@ -105,73 +102,19 @@ export class RaribleV2OrderHandler implements OrderHandler f.value).reduce((v, acc) => v + acc, 0) + (await this.getBaseOrderFee()) - case "RARIBLE_V2_DATA_V3_BUY": - case "RARIBLE_V2_DATA_V3_SELL": + case "RARIBLE_V2_DATA_V3": return ( - (order.data.originFeeFirst?.value ?? 0) + - (order.data.originFeeSecond?.value ?? 0) + - (await this.getBaseOrderFee()) + order.data.originFees.map(f => f.value).reduce((v, acc) => v + acc, 0) + + (await this.getBaseFeeByData(order.data)) ) default: throw new Error("Unsupported order dataType") } } - async getBaseOrderFee(): Promise { - return this.getBaseOrderFeeConfig("RARIBLE_V2") + getBaseOrderFee(order: RaribleV2OrderFillRequest["order"]): Promise | number { + return this.getBaseFeeByData(order.data) } -} - -/** - * Check if order selling something for currency - */ -function isSellOrder(order: SimpleOrder): boolean { - return order.take.assetType.assetClass === "ETH" || order.take.assetType.assetClass === "ERC20" -} -function isCollectionOrder(order: SimpleOrder): boolean { - return order.take.assetType.assetClass === "COLLECTION" + async getBaseFeeByData(data: RaribleV2OrderFillRequest["order"]["data"]): Promise { + if (data.dataType === "RARIBLE_V2_DATA_V3") { + return this.getBaseFee("RARIBLE_V2") + } + return 0 + } } diff --git a/packages/ethereum/sdk/src/order/fill-order/types.ts b/packages/ethereum/sdk/src/order/fill-order/types.ts index 114636227..a79e0242b 100644 --- a/packages/ethereum/sdk/src/order/fill-order/types.ts +++ b/packages/ethereum/sdk/src/order/fill-order/types.ts @@ -1,5 +1,4 @@ import type { Address, BigNumber } from "@rarible/types" -import type { Word } from "@rarible/types/build/word" import type { CryptoPunksAssetType, Erc1155AssetType, Erc721AssetType, Part } from "@rarible/ethereum-api-client" import type { Action } from "@rarible/action" import type { EthereumFunctionCall, EthereumSendOptions, EthereumTransaction } from "@rarible/ethereum-provider" @@ -34,25 +33,13 @@ export type CommonFillRequest = { export type LegacyOrderFillRequest = CommonFillRequest & { payout?: Address; originFee: number } -export type RaribleV2OrderFillRequest = - | RaribleV2OrderFillRequestV2 - | RaribleV2OrderFillRequestV3Sell - | RaribleV2OrderFillRequestV3Buy +export type RaribleV2OrderFillRequest = RaribleV2OrderFillRequestV2 | RaribleV2OrderFillRequestV3 export type RaribleV2OrderFillRequestV2 = CommonFillRequest & OrderV2FillDataV2 -export type RaribleV2OrderFillRequestV3Sell = CommonFillRequest & OrderV2FillDataV3Sell -export type RaribleV2OrderFillRequestV3Buy = CommonFillRequest & OrderV2FillDataV3Buy +export type RaribleV2OrderFillRequestV3 = CommonFillRequest & OrderV2FillDataV3 export type OrderV2FillDataV2 = { payouts?: Part[]; originFees?: Part[] } -export type OrderV2FillDataV3Buy = { - payout?: Part - originFeeFirst?: Part - originFeeSecond?: Part - marketplaceMarker?: Word -} -export type OrderV2FillDataV3Sell = OrderV2FillDataV3Buy & { - maxFeesBasePoint: number -} +export type OrderV2FillDataV3 = { payouts?: Part[]; originFees?: Part[] } export type OpenSeaV1OrderFillRequest = Omit, "amount"> & { payouts?: Part[] @@ -83,7 +70,7 @@ export type CryptoPunksOrderFillRequest = CommonFillRequest { signOrder, getApis, ethereum, - ZERO_WORD, ) const orderSell = new OrderSell(upserter, checkAssetType) const e2eErc721V3ContractAddress = getTestContract(env, "erc721V3") const treasury = createE2eWallet() const treasuryAddress = toAddress(treasury.getAddressString()) + test("create and update of v3 works", async () => { + await testV2OrHigher("DATA_V3") + }) + test("create and update of v2 works", async () => { + await testV2OrHigher("DATA_V2") + }) + + async function testV2OrHigher(dataType: "DATA_V2" | "DATA_V3") { const makerAddress = toAddress(wallet.getAddressString()) const minted = await mint({ collection: createErc721V3Collection(e2eErc721V3ContractAddress), @@ -76,7 +83,7 @@ describe.each(providers)("sell", ethereum => { } const order = await orderSell.sell({ - type: "DATA_V2", + type: dataType, maker: toAddress(wallet.getAddressString()), makeAssetType: { assetClass: "ERC721", @@ -112,7 +119,7 @@ describe.each(providers)("sell", ethereum => { }) expect(updatedOrder.take.value.toString()).toBe(nextPrice.toString()) }) - }) + } test("create and update of v1 works", async () => { const makerAddress = toAddress(wallet.getAddressString()) diff --git a/packages/ethereum/sdk/src/order/upsert-order.test.ts b/packages/ethereum/sdk/src/order/upsert-order.test.ts index 2835181a6..a8a11b3c9 100644 --- a/packages/ethereum/sdk/src/order/upsert-order.test.ts +++ b/packages/ethereum/sdk/src/order/upsert-order.test.ts @@ -1,6 +1,6 @@ -import { toAddress, toBigNumber, toBinary, ZERO_WORD } from "@rarible/types" +import { toAddress, toBigNumber, toBinary } from "@rarible/types" import type { OrderForm } from "@rarible/ethereum-api-client" -import { createE2eProvider, awaitAll, deployTestErc20 } from "@rarible/ethereum-sdk-test-common" +import { awaitAll, createE2eProvider, deployTestErc20 } from "@rarible/ethereum-sdk-test-common" import { toBn } from "@rarible/utils" import { getEthereumConfig } from "../config" import { createTestProviders } from "../common/test/create-test-providers" @@ -49,17 +49,7 @@ describe.each(providers)("upsertOrder", ethereum => { signature: toBinary("0x"), end: Date.now() + 1000 * 60 * 60 * 24 * 30, } - const upserter = new UpsertOrder( - orderService, - send, - getConfig, - checkLazyOrder, - approve, - sign, - getApis, - ethereum, - ZERO_WORD, - ) + const upserter = new UpsertOrder(orderService, send, getConfig, checkLazyOrder, approve, sign, getApis, ethereum) const result = await upserter.upsert({ order }) expect(result.hash).toBeTruthy() @@ -81,17 +71,7 @@ describe.each(providers)("upsertOrder", ethereum => { payouts: [], originFees: [], } - const upserter = new UpsertOrder( - orderService, - send, - getConfig, - checkLazyOrder, - approve, - sign, - getApis, - ethereum, - ZERO_WORD, - ) + const upserter = new UpsertOrder(orderService, send, getConfig, checkLazyOrder, approve, sign, getApis, ethereum) const price = await upserter.getPrice(request, request.takeAssetType) expect(price.valueOf()).toBe(MIN_PAYMENT_VALUE.toFixed()) @@ -114,17 +94,7 @@ describe.each(providers)("upsertOrder", ethereum => { payouts: [], originFees: [], } - const upserter = new UpsertOrder( - orderService, - send, - getConfig, - checkLazyOrder, - approve, - sign, - getApis, - ethereum, - ZERO_WORD, - ) + const upserter = new UpsertOrder(orderService, send, getConfig, checkLazyOrder, approve, sign, getApis, ethereum) const price = await upserter.getPrice(request, request.takeAssetType) expect(price.valueOf()).toBe(MIN_PAYMENT_VALUE.toFixed()) @@ -137,17 +107,7 @@ describe.each(providers)("upsertOrder", ethereum => { return apis } - const upserter = new UpsertOrder( - orderService, - send, - getConfig, - checkLazyOrder, - approve, - sign, - getApis, - ethereum, - ZERO_WORD, - ) + const upserter = new UpsertOrder(orderService, send, getConfig, checkLazyOrder, approve, sign, getApis, ethereum) const request = { maker: toAddress(wallet.getAddressString()), make: { diff --git a/packages/ethereum/sdk/src/order/upsert-order.ts b/packages/ethereum/sdk/src/order/upsert-order.ts index c66809107..eb1e7f902 100644 --- a/packages/ethereum/sdk/src/order/upsert-order.ts +++ b/packages/ethereum/sdk/src/order/upsert-order.ts @@ -47,8 +47,8 @@ export type UpsertOrderAction = Action Promise, private readonly getApis: () => Promise, private readonly ethereum: Maybe, - private readonly marketplaceMarker: Word | undefined, ) {} readonly upsert = Action.create({ @@ -168,23 +144,12 @@ export class UpsertOrder { isMakeFill, } break - case "DATA_V3_BUY": - data = { - dataType: "RARIBLE_V2_DATA_V3_BUY", - payout: request.payout, - originFeeFirst: request.originFeeFirst, - originFeeSecond: request.originFeeSecond, - marketplaceMarker: this.marketplaceMarker, - } - break - case "DATA_V3_SELL": + case "DATA_V3": data = { - dataType: "RARIBLE_V2_DATA_V3_SELL", - payout: request.payout, - originFeeFirst: request.originFeeFirst, - originFeeSecond: request.originFeeSecond, - marketplaceMarker: this.marketplaceMarker, - maxFeesBasePoint: request.maxFeesBasePoint, + dataType: "RARIBLE_V2_DATA_V3", + payouts: request.payouts, + originFees: request.originFees, + isMakeFill, } break default: diff --git a/packages/ethereum/test-common/src/contracts/test-exchange-v2.ts b/packages/ethereum/test-common/src/contracts/test-exchange-v2.ts index b37e5fb04..ed25ac2cc 100644 --- a/packages/ethereum/test-common/src/contracts/test-exchange-v2.ts +++ b/packages/ethereum/test-common/src/contracts/test-exchange-v2.ts @@ -13,9 +13,28 @@ export async function deployTestExchangeV2(web3: Web3) { } export const exchangeV2Bytecode = - "0x608060405234801561001057600080fd5b506152e1806100206000396000f3fe6080604052600436106101095760003560e01c8063b0e21e8a11610095578063d6ca6ab711610064578063d6ca6ab71461029c578063e2864fe3146102bc578063e99a3f80146102dc578063eae3ad6f146102ef578063f2fde38b1461030f57610109565b8063b0e21e8a14610218578063b39deb461461023c578063b74c8e9a1461025c578063bc158c2d1461027c57610109565b80633be89922116100dc5780633be899221461019957806367d49a3b146101b95780636d8f0694146101cc578063715018a6146101ee5780638da5cb5b1461020357610109565b80630d5f7d351461010e5780631372a6251461012357806320158c441461014357806330c642f114610179575b600080fd5b61012161011c366004614876565b61032f565b005b34801561012f57600080fd5b5061012161013e366004614713565b61064c565b34801561014f57600080fd5b5061016361015e36600461480a565b610720565b6040516101709190614c73565b60405180910390f35b34801561018557600080fd5b5061012161019436600461483e565b610733565b3480156101a557600080fd5b506101216101b43660046144be565b610803565b6101216101c7366004614876565b610888565b3480156101d857600080fd5b506101e1610b68565b6040516101709190614ba7565b3480156101fa57600080fd5b50610121610b78565b34801561020f57600080fd5b506101e1610c24565b34801561022457600080fd5b5061022d610c33565b60405161017093929190614c4a565b34801561024857600080fd5b5061012161025736600461483e565b610c5e565b34801561026857600080fd5b5061012161027736600461477a565b610d22565b34801561028857600080fd5b506101216102973660046144be565b610da4565b3480156102a857600080fd5b506101216102b7366004614b44565b610e71565b3480156102c857600080fd5b506101216102d7366004614a6b565b610f4b565b6101216102ea366004614a9d565b61100c565b3480156102fb57600080fd5b5061012161030a366004614b44565b611022565b34801561031b57600080fd5b5061012161032a3660046144be565b6110f9565b600061034961034460c0840160a085016144be565b6111fc565b6040805161012081019091529091506000908061036960208601866144be565b6001600160a01b03168152602001604051806040016040528060405180604001604052808860400160208101906103a09190614822565b6001600160e01b03191681526020016103bc60608a018a615089565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050918352506020888101359281019290925291835282810191909152604080518082018252868152608080890135938201939093529083015260c080870135606084015260e08701359183019190915261010086013560a08301520161045f61014086016101208701614822565b6001600160e01b031916815260200161047c610140860186615089565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250506040805161012081018252828152815180830183528781526101808901356020828101919091528201528082018390528151608081018352949550919391925060608084019291829182820191829161051091908c01908c01614822565b6001600160e01b031916815260200161052c60608b018b615089565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050918352506101a0890135602092830152918352820181905260408201819052606082015260800161059b61014087016101208801614822565b6001600160e01b03191681526020016105b86101c0870187615089565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050915250905061063c82610602610160870187615089565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061126292505050565b6106468282611279565b50505050565b600054610100900460ff168061066557506106656114cb565b80610673575060005460ff16155b6106ae5760405162461bcd60e51b815260040180806020018281038252602e81526020018061521b602e913960400191505060405180910390fd5b600054610100900460ff161580156106d9576000805460ff1961ff0019909116610100171660011790555b6106e16114dc565b6106e961157e565b6106f38686611677565b6106fe848484611721565b6107066117e1565b8015610718576000805461ff00191690555b505050505050565b61012f6020526000908152604090205481565b61073b6118b1565b6001600160a01b031661074c610c24565b6001600160a01b031614610795576040805162461bcd60e51b8152602060048201819052602482015260008051602061528c833981519152604482015290519081900360640190fd5b6001600160e01b031982166000818152609760205260409081902080546001600160a01b0319166001600160a01b038516179055517f4b5aced933c0c9a88aeac3f0b3b72c5aaf75df8ebaf53225773248c4c3153593906107f7908490614ba7565b60405180910390a25050565b61080b6118b1565b6001600160a01b031661081c610c24565b6001600160a01b031614610865576040805162461bcd60e51b8152602060048201819052602482015260008051602061528c833981519152604482015290519081900360640190fd5b61016280546001600160a01b0319166001600160a01b0392909216919091179055565b600061089d61034460c0840160a085016144be565b604080516101208101909152909150600090806108bd60208601866144be565b6001600160a01b0316815260200160405180604001604052808581526020018660800135815250815260200160006001600160a01b03168152602001604051806040016040528060405180604001604052808860400160208101906109229190614822565b6001600160e01b031916815260200161093e60608a018a615089565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505091525081526020878101359181019190915290825260c08601359082015260e0850135604082015261010085013560608201526080016109b961014086016101208701614822565b6001600160e01b03191681526020016109d6610140860186615089565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250506040805161012081018252828152815160808101835294955091939192506020830191908190818101908190610a489060608c01908c01614822565b6001600160e01b0319168152602001610a6460608b018b615089565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050918352506101a08901356020928301529183528281018290526040805180820182528881526101808a013592810192909252830152606082018190526080820181905260a082015260c001610af761014087016101208801614822565b6001600160e01b0319168152602001610b146101c0870187615089565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152509050610b5e82610602610160870187615089565b6106468183611279565b610162546001600160a01b031681565b610b806118b1565b6001600160a01b0316610b91610c24565b6001600160a01b031614610bda576040805162461bcd60e51b8152602060048201819052602482015260008051602061528c833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b031690565b610161546001600160a01b0381169065ffffffffffff600160a01b8204811691600160d01b90041683565b610c666118b1565b6001600160a01b0316610c77610c24565b6001600160a01b031614610cc0576040805162461bcd60e51b8152602060048201819052602482015260008051602061528c833981519152604482015290519081900360640190fd5b6001600160e01b031982166000818152606560205260409081902080546001600160a01b0319166001600160a01b038516179055517fd2bf91075f105d0fd80328da28e20ebdad1c1261839711183bc29a44cbe6c72f906107f7908490614ba7565b610d2a6118b1565b6001600160a01b0316610d3b610c24565b6001600160a01b031614610d84576040805162461bcd60e51b8152602060048201819052602482015260008051602061528c833981519152604482015290519081900360640190fd5b610d8d83610da4565b610d9682610e71565b610d9f81611022565b505050565b610dac6118b1565b6001600160a01b0316610dbd610c24565b6001600160a01b031614610e06576040805162461bcd60e51b8152602060048201819052602482015260008051602061528c833981519152604482015290519081900360640190fd5b610161546040517fa4b009cc442411b602eaf94bc0579b6abdb8fd90b4ef5b9426e270038906bd0391610e46916001600160a01b03909116908490614bbb565b60405180910390a161016180546001600160a01b0319166001600160a01b0392909216919091179055565b610e796118b1565b6001600160a01b0316610e8a610c24565b6001600160a01b031614610ed3576040805162461bcd60e51b8152602060048201819052602482015260008051602061528c833981519152604482015290519081900360640190fd5b610161546040517f70bba4f904a93ba5c1af3a1bb602bc9c058551dbe963dfe0b6cb5bc11c5fea9e91610f1891600160a01b90910465ffffffffffff16908490615070565b60405180910390a1610161805465ffffffffffff909216600160a01b0265ffffffffffff60a01b19909216919091179055565b80516001600160a01b0316610f5e6118b1565b6001600160a01b031614610f8d5760405162461bcd60e51b8152600401610f8490614fe0565b60405180910390fd5b6080810151610fae5760405162461bcd60e51b8152600401610f8490614d72565b6000610fb9826118b5565b600081815261012f6020526040908190206000199055519091507fe8d9861dbc9c663ed3accd261bbe2fe01e0d3d9e5f51fa38523b265c7757a93a90611000908390614c73565b60405180910390a15050565b61101884848484611a3d565b6106468483611279565b61102a6118b1565b6001600160a01b031661103b610c24565b6001600160a01b031614611084576040805162461bcd60e51b8152602060048201819052602482015260008051602061528c833981519152604482015290519081900360640190fd5b610161546040517fa8af9093caa9beb61d20432227c66258ceef926f21879b80f3adf22a4d19f131916110c991600160d01b90910465ffffffffffff16908490615070565b60405180910390a1610161805465ffffffffffff909216600160d01b026001600160d01b03909216919091179055565b6111016118b1565b6001600160a01b0316611112610c24565b6001600160a01b03161461115b576040805162461bcd60e51b8152602060048201819052602482015260008051602061528c833981519152604482015290519081900360640190fd5b6001600160a01b0381166111a05760405162461bcd60e51b81526004018080602001828103825260268152602001806151866026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6112046140b3565b61120c6140b3565b6001600160a01b038316611229576355575f5d60e11b815261125a565b6322ba176160e21b8152604051611244908490602001614ba7565b60408051601f1981840301815291905260208201525b90505b919050565b61126b82611b09565b6112758282611bd3565b5050565b6000806112868484611e82565b9150915060008060006112998787611f1b565b9250925092506000806113f26040518060a0016040528060405180604001604052808b8152602001876000015181525081526020018760000151815260200187602001518152602001609760008b600001516001600160e01b0319166001600160e01b031916815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031681526020018b600001516001600160a01b03168152506040518060a0016040528060405180604001604052808b8152602001886020015181525081526020018760000151815260200187602001518152602001609760008b600001516001600160e01b0319166001600160e01b031916815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031681526020018b600001516001600160a01b03168152506113ed8a600001518a60000151611fca565b61209c565b885191935091506001600160e01b0319166355575f5d60e11b14156114715785516001600160e01b0319166355575f5d60e11b141561143057600080fd5b813410156114505760405162461bcd60e51b8152600401610f8490614fb8565b8134111561146c5761146c6114653484612213565b3390612270565b6114c0565b85516001600160e01b0319166355575f5d60e11b14156114c057803410156114ab5760405162461bcd60e51b8152600401610f8490614fb8565b803411156114c0576114c06114653483612213565b505050505050505050565b60006114d630612308565b15905090565b600054610100900460ff16806114f557506114f56114cb565b80611503575060005460ff16155b61153e5760405162461bcd60e51b815260040180806020018281038252602e81526020018061521b602e913960400191505060405180910390fd5b600054610100900460ff16158015611569576000805460ff1961ff0019909116610100171660011790555b801561157b576000805461ff00191690555b50565b600054610100900460ff168061159757506115976114cb565b806115a5575060005460ff16155b6115e05760405162461bcd60e51b815260040180806020018281038252602e81526020018061521b602e913960400191505060405180910390fd5b600054610100900460ff1615801561160b576000805460ff1961ff0019909116610100171660011790555b60006116156118b1565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561157b576000805461ff001916905550565b60976020527f4532fa16f071d6234e30e1a1e69b9806f04095edf37a1ca7a25c8d6af7861cc080546001600160a01b039283166001600160a01b0319918216179091557f30a684095c937b5aa064dcf94f9903a7d808e3efb22d8389dbd43080ad4ed3d5805493909216928116831790915563025ceed960e61b6000527f4b5822151ea34b7c8d9e37c3e466bcecb631efe6a9f26a4a4054110a93dd316f80549091169091179055565b600054610100900460ff168061173a575061173a6114cb565b80611748575060005460ff16155b6117835760405162461bcd60e51b815260040180806020018281038252602e81526020018061521b602e913960400191505060405180910390fd5b600054610100900460ff161580156117ae576000805460ff1961ff0019909116610100171660011790555b61016280546001600160a01b0319166001600160a01b0384161790558015610646576000805461ff001916905550505050565b600054610100900460ff16806117fa57506117fa6114cb565b80611808575060005460ff16155b6118435760405162461bcd60e51b815260040180806020018281038252602e81526020018061521b602e913960400191505060405180910390fd5b600054610100900460ff1615801561186e576000805460ff1961ff0019909116610100171660011790555b6115696040518060400160405280600881526020016745786368616e676560c01b815250604051806040016040528060018152602001601960f91b81525061230e565b3390565b60e08101516000906001600160e01b031916632611a13360e11b14806118e9575060e08201516001600160e01b0319908116145b1561195e5781516020830151516118ff906123ce565b60608401515161190e906123ce565b846080015160405160200180856001600160a01b0316815260200184815260200183815260200182815260200194505050505060405160208183030381529060405280519060200120905061125d565b815160208301515161196f906123ce565b60608401515161197e906123ce565b846080015185610100015160405160200180866001600160a01b0316815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156119ea5781810151838201526020016119d2565b50505050905090810190601f168015611a175780820380516001836020036101000a031916815260200191505b50965050505050505060405160208183030381529060405280519060200120905061125d565b611a478484611262565b611a518282611262565b60408401516001600160a01b031615611aad5781516001600160a01b031615611aad5783604001516001600160a01b031682600001516001600160a01b031614611aad5760405162461bcd60e51b8152600401610f8490614f75565b60408201516001600160a01b0316156106465783516001600160a01b0316156106465783600001516001600160a01b031682604001516001600160a01b0316146106465760405162461bcd60e51b8152600401610f8490614de4565b60a08101511580611b1d5750428160a00151105b611b6e576040805162461bcd60e51b815260206004820152601d60248201527f4f726465722073746172742076616c69646174696f6e206661696c6564000000604482015290519081900360640190fd5b60c08101511580611b825750428160c00151115b61157b576040805162461bcd60e51b815260206004820152601b60248201527f4f7264657220656e642076616c69646174696f6e206661696c65640000000000604482015290519081900360640190fd5b6080820151611c585781516001600160a01b031615611c535781516001600160a01b0316611bff6118b1565b6001600160a01b031614611c53576040805162461bcd60e51b815260206004820152601660248201527536b0b5b2b91034b9903737ba103a3c1039b2b73232b960511b604482015290519081900360640190fd5b611275565b81516001600160a01b0316611c6b6118b1565b6001600160a01b031614611275576000611c8483612438565b9050611c9c83600001516001600160a01b0316612308565b15611dd8578251630b135d3f60e11b906001600160a01b0316631626ba7e611cc384612528565b856040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611d16578181015183820152602001611cfe565b50505050905090810190601f168015611d435780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015611d6157600080fd5b505afa158015611d75573d6000803e3d6000fd5b505050506040513d6020811015611d8b57600080fd5b50516001600160e01b03191614611dd35760405162461bcd60e51b815260040180806020018281038252602b8152602001806151f0602b913960400191505060405180910390fd5b610d9f565b82516001600160a01b0316611df683611df084612528565b90612574565b6001600160a01b031614611e3b5760405162461bcd60e51b81526004018080602001828103825260228152602001806151ce6022913960400191505060405180910390fd5b82516001600160a01b0316610d9f576040805162461bcd60e51b815260206004820152600860248201526737379036b0b5b2b960c11b604482015290519081900360640190fd5b611e8a6140b3565b611e926140b3565b602084015151606084015151611ea891906125f4565b80519092506001600160e01b031916611ed35760405162461bcd60e51b8152600401610f8490614f49565b606084015151602084015151611ee991906125f4565b80519091506001600160e01b031916611f145760405162461bcd60e51b8152600401610f8490614f49565b9250929050565b611f236140cb565b611f2b6140cb565b611f336140ee565b6000611f3e866118b5565b90506000611f4b866118b5565b90506000611f576118b1565b88519091506001600160a01b0316611f76576001600160a01b03811688525b86516001600160a01b0316611f92576001600160a01b03811687525b611f9b88612634565b9550611fa687612634565b9450611fbe888885858a604001518a6040015161272d565b93505050509250925092565b60006001600160e01b031983166355575f5d60e11b1415611fed57506001612096565b6001600160e01b031982166355575f5d60e11b141561200e57506002612096565b6001600160e01b031983166322ba176160e21b141561202f57506001612096565b6001600160e01b031982166322ba176160e21b141561205057506002612096565b6001600160e01b0319831663025ceed960e61b141561207157506001612096565b6001600160e01b0319821663025ceed960e61b141561209257506002612096565b5060005b92915050565b825160209081015183519091015160018360028111156120b857fe5b141561213a5760408051606081018252610161546001600160a01b038116825265ffffffffffff600160a01b820481166020840152600160d01b909104169181019190915261210a90869086906128e8565b9150612135846000015160000151856000015160200151866080015188602001518860600151612b62565b61220b565b600283600281111561214857fe5b14156121c55760408051606081018252610161546001600160a01b038116825265ffffffffffff600160a01b820481166020840152600160d01b909104169181019190915261219a90859087906128e8565b9050612135856000015160000151866000015160200151876080015187602001518960600151612b62565b8451805160209182015160808801519287015160608901516121e8949190612b62565b83518051602091820151608087015192880151606088015161220b949190612b62565b935093915050565b60008282111561226a576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146122bb576040519150601f19603f3d011682016040523d82523d6000602084013e6122c0565b606091505b5050905080610d9f576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b3b151590565b600054610100900460ff168061232757506123276114cb565b80612335575060005460ff16155b6123705760405162461bcd60e51b815260040180806020018281038252602e81526020018061521b602e913960400191505060405180910390fd5b600054610100900460ff1615801561239b576000805460ff1961ff0019909116610100171660011790555b825160208085019190912083519184019190912060c99190915560ca558015610d9f576000805461ff0019169055505050565b8051602091820151805190830120604080517f452a0dc408cb0d27ffc3b3caff933a5208040a53a9dbecd8d89cad2c0d40e00c818601526001600160e01b031990931683820152606080840192909252805180840390920182526080909201909152805191012090565b60007f477ed43b8020849b755512278536c3766a3b4ab547519949a75f483372493f8d826000015161246d8460200151612ce6565b846040015161247f8660600151612ce6565b86608001518760a001518860c001518960e001518a610100015180519060200120604051602001808b81526020018a6001600160a01b03168152602001898152602001886001600160a01b03168152602001878152602001868152602001858152602001848152602001836001600160e01b03191681526020018281526020019a5050505050505050505050604051602081830303815290604052805190602001209050919050565b6000612532612d56565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b600081516041146125cc576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a6125ea86828585612d96565b9695505050505050565b6125fc6140b3565b60006126088484612fec565b80519091506001600160e01b03191661262d576126258385612fec565b915050612096565b9050612096565b61263c6140cb565b60e08201516001600160e01b031916632611a13360e11b14156126885760008261010001518060200190518101906126749190614933565b805183526020908101519083015250612714565b60e08201516001600160e01b0319166323d235ef60e01b14156126e05760008261010001518060200190518101906126c091906149bf565b805183526020808201519084015260409081015115159083015250612714565b60e08201516001600160e01b031990811614156126fc57612714565b60405162461bcd60e51b8152600401610f8490614edb565b80515161125d57815161272690613208565b8152919050565b6127356140ee565b60006127458860800151876132a3565b905060006127578860800151876132a3565b905060006127698a8a85858a8a6132c8565b9050896020015160200151600014158061278a575060608901516020015115155b156127ad5780516127ad5760405162461bcd60e51b8152600401610f8490614e54565b60608a0151602001511515806127c957506020808a0151015115155b156127f25760008160200151116127f25760405162461bcd60e51b8152600401610f8490614e54565b60808a01511561284557851561282457805161280f908490613361565b600089815261012f6020526040902055612845565b6020810151612834908490613361565b600089815261012f60205260409020555b60808901511561289857841561287a576020810151612865908390613361565b600088815261012f6020526040902055612898565b8051612887908390613361565b600088815261012f60205260409020555b602081015181516040517f956cd63ee4cdcd81fda5f0ec7c6c36dceda99e1b412f4a650a5d26055dc3c450926128d3928c928c929190614c7c565b60405180910390a19998505050505050505050565b60006129018460000151602001518386604001516133c2565b9050600061292b828660000151602001518760800151868960000151600001518a60600151613464565b8551805186515160208089015193015160808a015160608b01519596506129599593949293879291906134c1565b9050846040015151600114801561297557508360400151516001145b80156129ca5750846040015160008151811061298d57fe5b6020026020010151600001516001600160a01b031684604001516000815181106129b357fe5b6020026020010151600001516001600160a01b0316145b15612ae057604080516001808252818301909252600091816020015b6129ee614108565b8152602001906001900390816129e65790505090508460400151600081518110612a1457fe5b60200260200101516000015181600081518110612a2d57fe5b60209081029190910101516001600160a01b03909116905260408601518051600090612a5557fe5b6020026020010151602001518560400151600081518110612a7257fe5b6020026020010151602001510181600081518110612a8c57fe5b6020026020010151602001906001600160601b031690816001600160601b031681525050612ad686600001516000015183886000015160200151848a608001518b606001516135c6565b509150612b399050565b612b0a85600001516000015182876000015160200151886040015189608001518a606001516135c6565b50855180516020909101516040870151608089015160608a0151949550612b359486939291906135c6565b5090505b612b5a85600001516000015182876080015187602001518960600151612b62565b509392505050565b6000825111612b835760405162461bcd60e51b8152600401610f8490614da0565b600084815b6001855103811015612c52576000612bc9868381518110612ba557fe5b6020026020010151602001516001600160601b03168961367b90919063ffffffff16565b9050612bfe868381518110612bda57fe5b6020026020010151602001516001600160601b03168561336190919063ffffffff16565b93508015612c4957612c108382612213565b9250612c4960405180604001604052808b81526020018381525088888581518110612c3757fe5b60200260200101516000015188613693565b50600101612b88565b50600084600186510381518110612c6557fe5b60200260200101519050612c8f81602001516001600160601b03168461336190919063ffffffff16565b92508261271014612cb25760405162461bcd60e51b8152600401610f8490614f12565b8115612cdc57612cdc60405180604001604052808a81526020018481525087836000015187613693565b5050505050505050565b60007fdb6f72e915676cfc289da13bc4ece054fd17b1df6d77ffc4a60510718c236b08612d1683600001516123ce565b8360200151604051602001808481526020018381526020018281526020019350505050604051602081830303815290604052805190602001209050919050565b6000612d917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612d84613a9b565b612d8c613aa1565b613aa7565b905090565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612df75760405162461bcd60e51b81526004018080602001828103825260228152602001806151ac6022913960400191505060405180910390fd5b6000601e8560ff161115612ed1576004850360ff16601b1480612e2057506004850360ff16601c145b612e5b5760405162461bcd60e51b81526004018080602001828103825260228152602001806152496022913960400191505060405180910390fd5b6001612e6687613b09565b60048703868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612ec0573d6000803e3d6000fd5b505050602060405103519050612f88565b8460ff16601b1480612ee657508460ff16601c145b612f215760405162461bcd60e51b81526004018080602001828103825260228152602001806152496022913960400191505060405180910390fd5b60018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612f7b573d6000803e3d6000fd5b5050506020604051035190505b6001600160a01b038116612fe3576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b612ff46140b3565b825182516001600160e01b031982166355575f5d60e11b141561305f576001600160e01b031981166355575f5d60e11b1415613034578492505050612096565b5050604080518082018252600080825282516020818101909452908152918101919091529050612096565b6001600160e01b031982166322ba176160e21b14156130a4576001600160e01b031981166322ba176160e21b14156130345761309b8585613b5a565b92505050612096565b6001600160e01b031982166339d690a360e11b14156130e0576001600160e01b031981166339d690a360e11b14156130345761309b8585613b5a565b6001600160e01b0319821663025ceed960e61b141561311c576001600160e01b0319811663025ceed960e61b14156130345761309b8585613b5a565b6001600160e01b031982166000908152606560205260409020546001600160a01b031680156131d1576040516306d3f7cb60e41b81526001600160a01b03821690636d3f7cb0906131739089908990600401615005565b60006040518083038186803b15801561318b57600080fd5b505afa15801561319f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131c791908101906148a8565b9350505050612096565b6001600160e01b031983811690831614156131f0576131c78686613b5a565b60405162461bcd60e51b8152600401610f8490614d04565b60408051600180825281830190925260609160009190816020015b61322b614108565b815260200190600190039081613223579050509050828160008151811061324e57fe5b6020026020010151600001906001600160a01b031690816001600160a01b0316815250506127108160008151811061328257fe5b6020908102919091018101516001600160601b039092169101529050919050565b6000826132b257506000612096565b50600090815261012f6020526040902054919050565b6132d06140ee565b6000806132de898887613bb7565b915091506000806132f08a8988613bb7565b915091508381118061330a5750838114801561330a575083155b156133365761332b84848c60200151602001518d6060015160200151613c30565b9450505050506125ea565b6133528b60200151602001518c60600151602001518484613cb5565b9b9a5050505050505050505050565b6000828201838110156133bb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b602082015160009065ffffffffffff16815b835181101561344f576127108482815181106133ec57fe5b6020026020010151602001516001600160601b0316111561341f5760405162461bcd60e51b8152600401610f8490614eac565b83818151811061342b57fe5b6020026020010151602001516001600160601b0316820191508060010190506133d4565b50612fe361345d868361367b565b8690613361565b60008060006134868989886040015189602001510165ffffffffffff16613d3b565b909250905080156134b5576134b560405180604001604052808781526020018381525088886000015187613693565b50979650505050505050565b6000806134cd88613d5d565b9050805160011480156134e1575086516001145b801561352e5750866000815181106134f557fe5b6020026020010151600001516001600160a01b03168160008151811061351757fe5b6020026020010151600001516001600160a01b0316145b1561357f576113888160008151811061354357fe5b6020026020010151602001516001600160601b031611156135765760405162461bcd60e51b8152600401610f8490614d3b565b859150506135bb565b6000806135908b8989868a8a6135c6565b915091506113888111156135b65760405162461bcd60e51b8152600401610f8490614d3b565b509150505b979650505050505050565b846000805b855181101561366f576136078682815181106135e357fe5b6020026020010151602001516001600160601b03168361336190919063ffffffff16565b91506000613636848989858151811061361c57fe5b6020026020010151602001516001600160601b0316613d3b565b909450905080156136665761366660405180604001604052808c81526020018381525087898581518110612c3757fe5b506001016135cb565b50965096945050505050565b60006133bb61271061368d8585613ed2565b90613f2b565b8351516001600160e01b0319166339d690a360e11b14156137d9576000808560000151602001518060200190518101906136cd91906146e6565b9150915085602001516001146136f55760405162461bcd60e51b8152600401610f8490614e28565b6001600160a01b03851630141561376d57604051632142170760e11b81526001600160a01b038316906342842e0e9061373690309088908690600401614bd5565b600060405180830381600087803b15801561375057600080fd5b505af1158015613764573d6000803e3d6000fd5b505050506137d2565b604051637b84dc8360e11b81526001600160a01b0384169063f709b9069061379f908590899089908790600401614cda565b600060405180830381600087803b1580156137b957600080fd5b505af11580156137cd573d6000803e3d6000fd5b505050505b5050610646565b8351516001600160e01b0319166322ba176160e21b141561393757600084600001516020015180602001905181019061381291906144da565b90506001600160a01b0384163014156138c957602085015160405163a9059cbb60e01b81526001600160a01b0383169163a9059cbb91613856918791600401614c31565b602060405180830381600087803b15801561387057600080fd5b505af1158015613884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a891906147f0565b6138c45760405162461bcd60e51b8152600401610f8490614e7d565b613931565b602085015160405163776062c360e01b81526001600160a01b0384169163776062c3916138fe91859189918991600401614cda565b600060405180830381600087803b15801561391857600080fd5b505af115801561392c573d6000803e3d6000fd5b505050505b50610646565b8351516001600160e01b03191663025ceed960e61b14156139f45760008085600001516020015180602001905181019061397191906146e6565b90925090506001600160a01b0385163014156139bc576020860151604051637921219560e11b81526001600160a01b0384169163f242432a9161373691309189918791600401614bf9565b6020860151604051639c1c2ee960e01b81526001600160a01b03851691639c1c2ee99161379f9186918a918a91889190600401614c97565b8351516001600160e01b0319166355575f5d60e11b1415613a3d576001600160a01b0382163014613a38576020840151613a38906001600160a01b03841690612270565b610646565b6040516354bc0cf160e01b81526001600160a01b038216906354bc0cf190613a6d9087908790879060040161502a565b600060405180830381600087803b158015613a8757600080fd5b505af1158015612cdc573d6000803e3d6000fd5b60c95490565b60ca5490565b6000838383613ab4613f92565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b03168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b613b626140b3565b60208084015180519082012083820151805192019190912080821415613b8c578492505050612096565b5050604080518082018252600080825282516020808201909452908152918101919091529392505050565b6000808215613bf6576020808601510151613bd29085612213565b9150613bef85606001516020015186602001516020015184613f96565b905061220b565b606085015160200151613c099085612213565b9050613c2685602001516020015186606001516020015183613f96565b9150935093915050565b613c386140ee565b6000613c45858585613f96565b905085811115613c9c576040805162461bcd60e51b815260206004820152601860248201527f66696c6c4c6566743a20756e61626c6520746f2066696c6c0000000000000000604482015290519081900360640190fd5b5050604080518082019091529384525050602082015290565b613cbd6140ee565b6000613cca838787613f96565b905083811115613d21576040805162461bcd60e51b815260206004820152601960248201527f66696c6c52696768743a20756e61626c6520746f2066696c6c00000000000000604482015290519081900360640190fd5b604080518082019091529283526020830152509392505050565b600080613d5185613d4c868661367b565b613ffc565b91509150935093915050565b80516060906001600160e01b03191663025ceed960e61b1480613d91575081516001600160e01b0319166339d690a360e11b145b15613e47576000808360200151806020019051810190613db191906146e6565b61016254604051634e53ee3d60e11b81529294509092506001600160a01b031690639ca7dc7a90613de89085908590600401614c31565b600060405180830381600087803b158015613e0257600080fd5b505af1158015613e16573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613e3e91908101906147be565b9250505061125d565b81516001600160e01b03191662737ea960e61b1415613e885760008260200151806020019051810190613e7a91906144f6565b60800151925061125d915050565b81516001600160e01b03191663d8f960c160e01b1415613eca5760008260200151806020019051810190613ebc91906145f3565b60600151925061125d915050565b506060919050565b600082613ee157506000612096565b82820282848281613eee57fe5b04146133bb5760405162461bcd60e51b815260040180806020018281038252602181526020018061526b6021913960400191505060405180910390fd5b6000808211613f81576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613f8a57fe5b049392505050565b4690565b6000613fa3848484614024565b15613fe6576040805162461bcd60e51b815260206004820152600e60248201526d3937bab73234b7339032b93937b960911b604482015290519081900360640190fd5b613ff48361368d8685613ed2565b949350505050565b6000808284111561401b576140118484612213565b9150829050611f14565b50600093915050565b60008261406b576040805162461bcd60e51b815260206004820152601060248201526f6469766973696f6e206279207a65726f60801b604482015290519081900360640190fd5b811580614076575083155b15614083575060006133bb565b6000838061408d57fe5b858409905061409c8584613ed2565b6140a8826103e8613ed2565b101595945050505050565b60408051808201909152600081526060602082015290565b604051806060016040528060608152602001606081526020016000151581525090565b604051806040016040528060008152602001600081525090565b604080518082019091526000808252602082015290565b803561125d8161515a565b600082601f83011261413a578081fd5b8151602061414f61414a836150f0565b6150cd565b82815281810190858301855b8581101561418457614172898684518b01016142b3565b8452928401929084019060010161415b565b5090979650505050505050565b600082601f8301126141a1578081fd5b815160206141b161414a836150f0565b828152818101908583016040808602880185018910156141cf578687fd5b865b8681101561423e5781838b0312156141e7578788fd5b81518281018181106001600160401b038211171561420157fe5b8352835161420e8161515a565b8152838701516001600160601b038116811461422857898afd5b81880152855293850193918101916001016141d1565b509198975050505050505050565b8051801515811461125d57600080fd5b803561125d8161516f565b600082601f830112614277578081fd5b813561428561414a8261510d565b818152846020838601011115614299578283fd5b816020850160208301379081016020019190915292915050565b600082601f8301126142c3578081fd5b81516142d161414a8261510d565b8181528460208386010111156142e5578283fd5b613ff482602083016020870161512e565b60006101e08284031215614308578081fd5b50919050565b60006040808385031215614320578182fd5b80518181016001600160401b03828210818311171561433b57fe5b81845282945085358181111561435057600080fd5b860180880385131561436157600080fd5b60808401838110838211171561437357fe5b9094528335936143828561516f565b9382526020840135938185111561439857600080fd5b6143a488868301614267565b60608501525050815260209384013593019290925292915050565b60006101208083850312156143d2578182fd5b6143db816150cd565b9150506143e78261411f565b815260208201356001600160401b038082111561440357600080fd5b61440f8583860161430e565b60208401526144206040850161411f565b6040840152606084013591508082111561443957600080fd5b6144458583860161430e565b60608401526080840135608084015260a084013560a084015260c084013560c084015261447460e0850161425c565b60e08401526101009150818401358181111561448f57600080fd5b61449b86828701614267565b8385015250505092915050565b803565ffffffffffff8116811461125d57600080fd5b6000602082840312156144cf578081fd5b81356133bb8161515a565b6000602082840312156144eb578081fd5b81516133bb8161515a565b60008060408385031215614508578081fd5b82516145138161515a565b60208401519092506001600160401b038082111561452f578283fd5b9084019060c08287031215614542578283fd5b61454c60c06150cd565b82518152602083015182811115614561578485fd5b61456d888286016142b3565b6020830152506040830151604082015260608301518281111561458e578485fd5b61459a88828601614191565b6060830152506080830151828111156145b1578485fd5b6145bd88828601614191565b60808301525060a0830151828111156145d4578485fd5b6145e08882860161412a565b60a0830152508093505050509250929050565b60008060408385031215614605578182fd5b82516146108161515a565b60208401519092506001600160401b038082111561462c578283fd5b9084019060a0828703121561463f578283fd5b61464960a06150cd565b8251815260208301518281111561465e578485fd5b61466a888286016142b3565b602083015250604083015182811115614681578485fd5b61468d88828601614191565b6040830152506060830151828111156146a4578485fd5b6146b088828601614191565b6060830152506080830151828111156146c7578485fd5b6146d38882860161412a565b6080830152508093505050509250929050565b600080604083850312156146f8578182fd5b82516147038161515a565b6020939093015192949293505050565b600080600080600060a0868803121561472a578081fd5b85356147358161515a565b945060208601356147458161515a565b935060408601359250606086013561475c8161515a565b9150608086013561476c8161515a565b809150509295509295909350565b60008060006060848603121561478e578081fd5b83356147998161515a565b92506147a7602085016144a8565b91506147b5604085016144a8565b90509250925092565b6000602082840312156147cf578081fd5b81516001600160401b038111156147e4578182fd5b613ff484828501614191565b600060208284031215614801578081fd5b6133bb8261424c565b60006020828403121561481b578081fd5b5035919050565b600060208284031215614833578081fd5b81356133bb8161516f565b60008060408385031215614850578182fd5b823561485b8161516f565b9150602083013561486b8161515a565b809150509250929050565b600060208284031215614887578081fd5b81356001600160401b0381111561489c578182fd5b613ff4848285016142f6565b6000602082840312156148b9578081fd5b81516001600160401b03808211156148cf578283fd5b90830190604082860312156148e2578283fd5b6040516040810181811083821117156148f757fe5b60405282516149058161516f565b8152602083015182811115614918578485fd5b614924878286016142b3565b60208301525095945050505050565b600060208284031215614944578081fd5b81516001600160401b038082111561495a578283fd5b908301906040828603121561496d578283fd5b60405160408101818110838211171561498257fe5b604052825182811115614993578485fd5b61499f87828601614191565b8252506020830151828111156149b3578485fd5b61492487828601614191565b6000602082840312156149d0578081fd5b81516001600160401b03808211156149e6578283fd5b90830190606082860312156149f9578283fd5b604051606081018181108382111715614a0e57fe5b604052825182811115614a1f578485fd5b614a2b87828601614191565b825250602083015182811115614a3f578485fd5b614a4b87828601614191565b602083015250614a5d6040840161424c565b604082015295945050505050565b600060208284031215614a7c578081fd5b81356001600160401b03811115614a91578182fd5b613ff4848285016143bf565b60008060008060808587031215614ab2578182fd5b84356001600160401b0380821115614ac8578384fd5b614ad4888389016143bf565b95506020870135915080821115614ae9578384fd5b614af588838901614267565b94506040870135915080821115614b0a578384fd5b614b16888389016143bf565b93506060870135915080821115614b2b578283fd5b50614b3887828801614267565b91505092959194509250565b600060208284031215614b55578081fd5b6133bb826144a8565b600063ffffffff60e01b82511683526020820151604060208501528051806040860152614b9281606087016020850161512e565b601f01601f1916939093016060019392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835265ffffffffffff918216602084015216604082015260600190565b90815260200190565b93845260208401929092526040830152606082015260800190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260c060a0820181905260009082015260e00190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b60208082526017908201527f6e6f7420666f756e64204941737365744d617463686572000000000000000000604082015260600190565b6020808252601d908201527f526f79616c746965732061726520746f6f206869676820283e35302529000000604082015260600190565b6020808252601490820152730c081cd85b1d0818d85b89dd081899481d5cd95960621b604082015260600190565b60208082526024908201527f7472616e736665725061796f7574733a206e6f7468696e6720746f207472616e60408201526339b332b960e11b606082015260800190565b60208082526024908201527f72696768744f726465722e74616b657220766572696669636174696f6e2066616040820152631a5b195960e21b606082015260800190565b60208082526012908201527132b9319b9918903b30b63ab29032b93937b960711b604082015260600190565b6020808252600f908201526e1b9bdd1a1a5b99c81d1bc8199a5b1b608a1b604082015260600190565b602080825260159082015274195c98cc8c081d1c985b9cd9995c8819985a5b1959605a1b604082015260600190565b6020808252601590820152746f726967696e2066656520697320746f6f2062696760581b604082015260600190565b60208082526017908201527f556e6b6e6f776e204f7264657220646174612074797065000000000000000000604082015260600190565b6020808252601e908201527f53756d207061796f75747320427073206e6f7420657175616c20313030250000604082015260600190565b6020808252601290820152710c2e6e6cae8e640c8dedc4ee840dac2e8c6d60731b604082015260600190565b60208082526023908201527f6c6566744f726465722e74616b657220766572696669636174696f6e206661696040820152621b195960ea1b606082015260800190565b6020808252600e908201526d0dcdee840cadcdeeaced040cae8d60931b604082015260600190565b6020808252600b908201526a3737ba10309036b0b5b2b960a91b604082015260600190565b6000604082526150186040830185614b5e565b8281036020840152612fe38185614b5e565b60006060825284516040606084015261504660a0840182614b5e565b60209687015160808501526001600160a01b03958616968401969096525050911660409091015290565b65ffffffffffff92831681529116602082015260400190565b6000808335601e1984360301811261509f578283fd5b8301803591506001600160401b038211156150b8578283fd5b602001915036819003821315611f1457600080fd5b6040518181016001600160401b03811182821017156150e857fe5b604052919050565b60006001600160401b0382111561510357fe5b5060209081020190565b60006001600160401b0382111561512057fe5b50601f01601f191660200190565b60005b83811015615149578181015183820152602001615131565b838111156106465750506000910152565b6001600160a01b038116811461157b57600080fd5b6001600160e01b03198116811461157b57600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345434453413a20696e76616c6964207369676e6174757265202773272076616c75656f72646572207369676e617475726520766572696669636174696f6e206572726f72636f6e7472616374206f72646572207369676e617475726520766572696669636174696f6e206572726f72496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220afb45cb0b68502f6c2ce48c7b8d3e776771b70a03d2365b57f0f0085b66e5eae64736f6c63430007060033" + "0x608060405234801561001057600080fd5b506153a6806100206000396000f3fe6080604052600436106101095760003560e01c8063b0e21e8a11610095578063d6ca6ab711610064578063d6ca6ab71461029c578063e2864fe3146102bc578063e99a3f80146102dc578063eae3ad6f146102ef578063f2fde38b1461030f57610109565b8063b0e21e8a14610218578063b39deb461461023c578063b74c8e9a1461025c578063bc158c2d1461027c57610109565b80633be89922116100dc5780633be899221461019957806367d49a3b146101b95780636d8f0694146101cc578063715018a6146101ee5780638da5cb5b1461020357610109565b80630d5f7d351461010e5780631372a6251461012357806320158c441461014357806330c642f114610179575b600080fd5b61012161011c3660046149b5565b61032f565b005b34801561012f57600080fd5b5061012161013e366004614852565b61064c565b34801561014f57600080fd5b5061016361015e366004614949565b610720565b6040516101709190614d38565b60405180910390f35b34801561018557600080fd5b5061012161019436600461497d565b610733565b3480156101a557600080fd5b506101216101b43660046145fd565b610803565b6101216101c73660046149b5565b610888565b3480156101d857600080fd5b506101e1610b68565b6040516101709190614c6c565b3480156101fa57600080fd5b50610121610b78565b34801561020f57600080fd5b506101e1610c24565b34801561022457600080fd5b5061022d610c33565b60405161017093929190614d0f565b34801561024857600080fd5b5061012161025736600461497d565b610c5e565b34801561026857600080fd5b506101216102773660046148b9565b610d22565b34801561028857600080fd5b506101216102973660046145fd565b610da4565b3480156102a857600080fd5b506101216102b7366004614c09565b610e71565b3480156102c857600080fd5b506101216102d7366004614b30565b610f4b565b6101216102ea366004614b62565b61100c565b3480156102fb57600080fd5b5061012161030a366004614c09565b611022565b34801561031b57600080fd5b5061012161032a3660046145fd565b6110f9565b600061034961034460c0840160a085016145fd565b6111fc565b6040805161012081019091529091506000908061036960208601866145fd565b6001600160a01b03168152602001604051806040016040528060405180604001604052808860400160208101906103a09190614961565b6001600160e01b03191681526020016103bc60608a018a61514e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050918352506020888101359281019290925291835282810191909152604080518082018252868152608080890135938201939093529083015260c080870135606084015260e08701359183019190915261010086013560a08301520161045f61014086016101208701614961565b6001600160e01b031916815260200161047c61014086018661514e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250506040805161012081018252828152815180830183528781526101808901356020828101919091528201528082018390528151608081018352949550919391925060608084019291829182820191829161051091908c01908c01614961565b6001600160e01b031916815260200161052c60608b018b61514e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050918352506101a0890135602092830152918352820181905260408201819052606082015260800161059b61014087016101208801614961565b6001600160e01b03191681526020016105b86101c087018761514e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050915250905061063c8261060261016087018761514e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061126292505050565b6106468282611279565b50505050565b600054610100900460ff168061066557506106656114e3565b80610673575060005460ff16155b6106ae5760405162461bcd60e51b815260040180806020018281038252602e8152602001806152e0602e913960400191505060405180910390fd5b600054610100900460ff161580156106d9576000805460ff1961ff0019909116610100171660011790555b6106e16114f4565b6106e9611596565b6106f3868661168f565b6106fe848484611739565b6107066117f9565b8015610718576000805461ff00191690555b505050505050565b61012f6020526000908152604090205481565b61073b6118c9565b6001600160a01b031661074c610c24565b6001600160a01b031614610795576040805162461bcd60e51b81526020600482018190526024820152600080516020615351833981519152604482015290519081900360640190fd5b6001600160e01b031982166000818152609760205260409081902080546001600160a01b0319166001600160a01b038516179055517f4b5aced933c0c9a88aeac3f0b3b72c5aaf75df8ebaf53225773248c4c3153593906107f7908490614c6c565b60405180910390a25050565b61080b6118c9565b6001600160a01b031661081c610c24565b6001600160a01b031614610865576040805162461bcd60e51b81526020600482018190526024820152600080516020615351833981519152604482015290519081900360640190fd5b61016280546001600160a01b0319166001600160a01b0392909216919091179055565b600061089d61034460c0840160a085016145fd565b604080516101208101909152909150600090806108bd60208601866145fd565b6001600160a01b0316815260200160405180604001604052808581526020018660800135815250815260200160006001600160a01b03168152602001604051806040016040528060405180604001604052808860400160208101906109229190614961565b6001600160e01b031916815260200161093e60608a018a61514e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505091525081526020878101359181019190915290825260c08601359082015260e0850135604082015261010085013560608201526080016109b961014086016101208701614961565b6001600160e01b03191681526020016109d661014086018661514e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509390945250506040805161012081018252828152815160808101835294955091939192506020830191908190818101908190610a489060608c01908c01614961565b6001600160e01b0319168152602001610a6460608b018b61514e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050918352506101a08901356020928301529183528281018290526040805180820182528881526101808a013592810192909252830152606082018190526080820181905260a082015260c001610af761014087016101208801614961565b6001600160e01b0319168152602001610b146101c087018761514e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152509050610b5e8261060261016087018761514e565b6106468183611279565b610162546001600160a01b031681565b610b806118c9565b6001600160a01b0316610b91610c24565b6001600160a01b031614610bda576040805162461bcd60e51b81526020600482018190526024820152600080516020615351833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6033546001600160a01b031690565b610161546001600160a01b0381169065ffffffffffff600160a01b8204811691600160d01b90041683565b610c666118c9565b6001600160a01b0316610c77610c24565b6001600160a01b031614610cc0576040805162461bcd60e51b81526020600482018190526024820152600080516020615351833981519152604482015290519081900360640190fd5b6001600160e01b031982166000818152606560205260409081902080546001600160a01b0319166001600160a01b038516179055517fd2bf91075f105d0fd80328da28e20ebdad1c1261839711183bc29a44cbe6c72f906107f7908490614c6c565b610d2a6118c9565b6001600160a01b0316610d3b610c24565b6001600160a01b031614610d84576040805162461bcd60e51b81526020600482018190526024820152600080516020615351833981519152604482015290519081900360640190fd5b610d8d83610da4565b610d9682610e71565b610d9f81611022565b505050565b610dac6118c9565b6001600160a01b0316610dbd610c24565b6001600160a01b031614610e06576040805162461bcd60e51b81526020600482018190526024820152600080516020615351833981519152604482015290519081900360640190fd5b610161546040517fa4b009cc442411b602eaf94bc0579b6abdb8fd90b4ef5b9426e270038906bd0391610e46916001600160a01b03909116908490614c80565b60405180910390a161016180546001600160a01b0319166001600160a01b0392909216919091179055565b610e796118c9565b6001600160a01b0316610e8a610c24565b6001600160a01b031614610ed3576040805162461bcd60e51b81526020600482018190526024820152600080516020615351833981519152604482015290519081900360640190fd5b610161546040517f70bba4f904a93ba5c1af3a1bb602bc9c058551dbe963dfe0b6cb5bc11c5fea9e91610f1891600160a01b90910465ffffffffffff16908490615135565b60405180910390a1610161805465ffffffffffff909216600160a01b0265ffffffffffff60a01b19909216919091179055565b80516001600160a01b0316610f5e6118c9565b6001600160a01b031614610f8d5760405162461bcd60e51b8152600401610f84906150a5565b60405180910390fd5b6080810151610fae5760405162461bcd60e51b8152600401610f8490614e37565b6000610fb9826118cd565b600081815261012f6020526040908190206000199055519091507fe8d9861dbc9c663ed3accd261bbe2fe01e0d3d9e5f51fa38523b265c7757a93a90611000908390614d38565b60405180910390a15050565b61101884848484611a55565b6106468483611279565b61102a6118c9565b6001600160a01b031661103b610c24565b6001600160a01b031614611084576040805162461bcd60e51b81526020600482018190526024820152600080516020615351833981519152604482015290519081900360640190fd5b610161546040517fa8af9093caa9beb61d20432227c66258ceef926f21879b80f3adf22a4d19f131916110c991600160d01b90910465ffffffffffff16908490615135565b60405180910390a1610161805465ffffffffffff909216600160d01b026001600160d01b03909216919091179055565b6111016118c9565b6001600160a01b0316611112610c24565b6001600160a01b03161461115b576040805162461bcd60e51b81526020600482018190526024820152600080516020615351833981519152604482015290519081900360640190fd5b6001600160a01b0381166111a05760405162461bcd60e51b815260040180806020018281038252602681526020018061524b6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b611204614156565b61120c614156565b6001600160a01b038316611229576355575f5d60e11b815261125a565b6322ba176160e21b8152604051611244908490602001614c6c565b60408051601f1981840301815291905260208201525b90505b919050565b61126b82611b21565b6112758282611beb565b5050565b6000806112868484611e9a565b9150915060008060006112998787611f33565b92509250925060008061140a6040518060c0016040528060405180604001604052808b8152602001876000015181525081526020018760000151815260200187602001518152602001609760008b600001516001600160e01b0319166001600160e01b031916815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031681526020018b600001516001600160a01b03168152602001876060015115158152506040518060c0016040528060405180604001604052808b8152602001886020015181525081526020018760000151815260200187602001518152602001609760008b600001516001600160e01b0319166001600160e01b031916815260200190815260200160002060009054906101000a90046001600160a01b03166001600160a01b031681526020018b600001516001600160a01b03168152602001876060015115158152506114058a600001518a60000151611fe2565b6120b4565b885191935091506001600160e01b0319166355575f5d60e11b14156114895785516001600160e01b0319166355575f5d60e11b141561144857600080fd5b813410156114685760405162461bcd60e51b8152600401610f849061507d565b813411156114845761148461147d348461222b565b3390612288565b6114d8565b85516001600160e01b0319166355575f5d60e11b14156114d857803410156114c35760405162461bcd60e51b8152600401610f849061507d565b803411156114d8576114d861147d348361222b565b505050505050505050565b60006114ee30612320565b15905090565b600054610100900460ff168061150d575061150d6114e3565b8061151b575060005460ff16155b6115565760405162461bcd60e51b815260040180806020018281038252602e8152602001806152e0602e913960400191505060405180910390fd5b600054610100900460ff16158015611581576000805460ff1961ff0019909116610100171660011790555b8015611593576000805461ff00191690555b50565b600054610100900460ff16806115af57506115af6114e3565b806115bd575060005460ff16155b6115f85760405162461bcd60e51b815260040180806020018281038252602e8152602001806152e0602e913960400191505060405180910390fd5b600054610100900460ff16158015611623576000805460ff1961ff0019909116610100171660011790555b600061162d6118c9565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611593576000805461ff001916905550565b60976020527f4532fa16f071d6234e30e1a1e69b9806f04095edf37a1ca7a25c8d6af7861cc080546001600160a01b039283166001600160a01b0319918216179091557f30a684095c937b5aa064dcf94f9903a7d808e3efb22d8389dbd43080ad4ed3d5805493909216928116831790915563025ceed960e61b6000527f4b5822151ea34b7c8d9e37c3e466bcecb631efe6a9f26a4a4054110a93dd316f80549091169091179055565b600054610100900460ff168061175257506117526114e3565b80611760575060005460ff16155b61179b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806152e0602e913960400191505060405180910390fd5b600054610100900460ff161580156117c6576000805460ff1961ff0019909116610100171660011790555b61016280546001600160a01b0319166001600160a01b0384161790558015610646576000805461ff001916905550505050565b600054610100900460ff168061181257506118126114e3565b80611820575060005460ff16155b61185b5760405162461bcd60e51b815260040180806020018281038252602e8152602001806152e0602e913960400191505060405180910390fd5b600054610100900460ff16158015611886576000805460ff1961ff0019909116610100171660011790555b6115816040518060400160405280600881526020016745786368616e676560c01b815250604051806040016040528060018152602001601960f91b815250612326565b3390565b60e08101516000906001600160e01b031916632611a13360e11b1480611901575060e08201516001600160e01b0319908116145b15611976578151602083015151611917906123e6565b606084015151611926906123e6565b846080015160405160200180856001600160a01b0316815260200184815260200183815260200182815260200194505050505060405160208183030381529060405280519060200120905061125d565b8151602083015151611987906123e6565b606084015151611996906123e6565b846080015185610100015160405160200180866001600160a01b0316815260200185815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611a025781810151838201526020016119ea565b50505050905090810190601f168015611a2f5780820380516001836020036101000a031916815260200191505b50965050505050505060405160208183030381529060405280519060200120905061125d565b611a5f8484611262565b611a698282611262565b60408401516001600160a01b031615611ac55781516001600160a01b031615611ac55783604001516001600160a01b031682600001516001600160a01b031614611ac55760405162461bcd60e51b8152600401610f849061503a565b60408201516001600160a01b0316156106465783516001600160a01b0316156106465783600001516001600160a01b031682604001516001600160a01b0316146106465760405162461bcd60e51b8152600401610f8490614ea9565b60a08101511580611b355750428160a00151105b611b86576040805162461bcd60e51b815260206004820152601d60248201527f4f726465722073746172742076616c69646174696f6e206661696c6564000000604482015290519081900360640190fd5b60c08101511580611b9a5750428160c00151115b611593576040805162461bcd60e51b815260206004820152601b60248201527f4f7264657220656e642076616c69646174696f6e206661696c65640000000000604482015290519081900360640190fd5b6080820151611c705781516001600160a01b031615611c6b5781516001600160a01b0316611c176118c9565b6001600160a01b031614611c6b576040805162461bcd60e51b815260206004820152601660248201527536b0b5b2b91034b9903737ba103a3c1039b2b73232b960511b604482015290519081900360640190fd5b611275565b81516001600160a01b0316611c836118c9565b6001600160a01b031614611275576000611c9c83612450565b9050611cb483600001516001600160a01b0316612320565b15611df0578251630b135d3f60e11b906001600160a01b0316631626ba7e611cdb84612540565b856040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611d2e578181015183820152602001611d16565b50505050905090810190601f168015611d5b5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015611d7957600080fd5b505afa158015611d8d573d6000803e3d6000fd5b505050506040513d6020811015611da357600080fd5b50516001600160e01b03191614611deb5760405162461bcd60e51b815260040180806020018281038252602b8152602001806152b5602b913960400191505060405180910390fd5b610d9f565b82516001600160a01b0316611e0e83611e0884612540565b9061258c565b6001600160a01b031614611e535760405162461bcd60e51b81526004018080602001828103825260228152602001806152936022913960400191505060405180910390fd5b82516001600160a01b0316610d9f576040805162461bcd60e51b815260206004820152600860248201526737379036b0b5b2b960c11b604482015290519081900360640190fd5b611ea2614156565b611eaa614156565b602084015151606084015151611ec0919061260c565b80519092506001600160e01b031916611eeb5760405162461bcd60e51b8152600401610f849061500e565b606084015151602084015151611f01919061260c565b80519091506001600160e01b031916611f2c5760405162461bcd60e51b8152600401610f849061500e565b9250929050565b611f3b61416e565b611f4361416e565b611f4b61419a565b6000611f56866118cd565b90506000611f63866118cd565b90506000611f6f6118c9565b88519091506001600160a01b0316611f8e576001600160a01b03811688525b86516001600160a01b0316611faa576001600160a01b03811687525b611fb38861264c565b9550611fbe8761264c565b9450611fd6888885858a604001518a604001516127ab565b93505050509250925092565b60006001600160e01b031983166355575f5d60e11b1415612005575060016120ae565b6001600160e01b031982166355575f5d60e11b1415612026575060026120ae565b6001600160e01b031983166322ba176160e21b1415612047575060016120ae565b6001600160e01b031982166322ba176160e21b1415612068575060026120ae565b6001600160e01b0319831663025ceed960e61b1415612089575060016120ae565b6001600160e01b0319821663025ceed960e61b14156120aa575060026120ae565b5060005b92915050565b825160209081015183519091015160018360028111156120d057fe5b14156121525760408051606081018252610161546001600160a01b038116825265ffffffffffff600160a01b820481166020840152600160d01b90910416918101919091526121229086908690612966565b915061214d846000015160000151856000015160200151866080015188602001518860600151612c27565b612223565b600283600281111561216057fe5b14156121dd5760408051606081018252610161546001600160a01b038116825265ffffffffffff600160a01b820481166020840152600160d01b90910416918101919091526121b29085908790612966565b905061214d856000015160000151866000015160200151876080015187602001518960600151612c27565b845180516020918201516080880151928701516060890151612200949190612c27565b835180516020918201516080870151928801516060880151612223949190612c27565b935093915050565b600082821115612282576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146122d3576040519150601f19603f3d011682016040523d82523d6000602084013e6122d8565b606091505b5050905080610d9f576040805162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b3b151590565b600054610100900460ff168061233f575061233f6114e3565b8061234d575060005460ff16155b6123885760405162461bcd60e51b815260040180806020018281038252602e8152602001806152e0602e913960400191505060405180910390fd5b600054610100900460ff161580156123b3576000805460ff1961ff0019909116610100171660011790555b825160208085019190912083519184019190912060c99190915560ca558015610d9f576000805461ff0019169055505050565b8051602091820151805190830120604080517f452a0dc408cb0d27ffc3b3caff933a5208040a53a9dbecd8d89cad2c0d40e00c818601526001600160e01b031990931683820152606080840192909252805180840390920182526080909201909152805191012090565b60007f477ed43b8020849b755512278536c3766a3b4ab547519949a75f483372493f8d82600001516124858460200151612dab565b84604001516124978660600151612dab565b86608001518760a001518860c001518960e001518a610100015180519060200120604051602001808b81526020018a6001600160a01b03168152602001898152602001886001600160a01b03168152602001878152602001868152602001858152602001848152602001836001600160e01b03191681526020018281526020019a5050505050505050505050604051602081830303815290604052805190602001209050919050565b600061254a612e1b565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b600081516041146125e4576040805162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015290519081900360640190fd5b60208201516040830151606084015160001a61260286828585612e5b565b9695505050505050565b612614614156565b600061262084846130b1565b80519091506001600160e01b0319166126455761263d83856130b1565b9150506120ae565b90506120ae565b61265461416e565b6000606082015260e08201516001600160e01b031916632611a13360e11b14156126a75760008261010001518060200190518101906126939190614a72565b805183526020908101519083015250612792565b60e08201516001600160e01b0319166323d235ef60e01b14156126ff5760008261010001518060200190518101906126df9190614afe565b805183526020808201519084015260409081015115159083015250612792565b60e08201516001600160e01b03191663256f2a6560e11b141561275e5760008261010001518060200190518101906127379190614afe565b80518352602080820151908401526040908101511515908301525060016060820152612792565b60e08201516001600160e01b0319908116141561277a57612792565b60405162461bcd60e51b8152600401610f8490614fa0565b80515161125d5781516127a4906132cd565b8152919050565b6127b361419a565b60006127c3886080015187613368565b905060006127d5886080015187613368565b905060006127e78a8a85858a8a61338d565b90508960200151602001516000141580612808575060608901516020015115155b1561282b57805161282b5760405162461bcd60e51b8152600401610f8490614f19565b60608a01516020015115158061284757506020808a0151015115155b156128705760008160200151116128705760405162461bcd60e51b8152600401610f8490614f19565b60808a0151156128c35785156128a257805161288d908490613426565b600089815261012f60205260409020556128c3565b60208101516128b2908490613426565b600089815261012f60205260409020555b6080890151156129165784156128f85760208101516128e3908390613426565b600088815261012f6020526040902055612916565b8051612905908390613426565b600088815261012f60205260409020555b602081015181516040517f956cd63ee4cdcd81fda5f0ec7c6c36dceda99e1b412f4a650a5d26055dc3c45092612951928c928c929190614d41565b60405180910390a19998505050505050505050565b6000808460a0015161297957600061297f565b82602001515b65ffffffffffff16905060008460a0015161299b5760006129a1565b83604001515b65ffffffffffff1690506129c2866000015160200151838860400151613487565b8651602081015160808901518751925160608b01519497506000946129ee94899493928989019261351c565b875180518851516020808b015193015160808c015160608d0151959650612a1c959394929387929190613566565b90508660400151516001148015612a3857508560400151516001145b8015612a8d57508660400151600081518110612a5057fe5b6020026020010151600001516001600160a01b03168660400151600081518110612a7657fe5b6020026020010151600001516001600160a01b0316145b15612ba357604080516001808252818301909252600091816020015b612ab16141b4565b815260200190600190039081612aa95790505090508660400151600081518110612ad757fe5b60200260200101516000015181600081518110612af057fe5b60209081029190910101516001600160a01b03909116905260408801518051600090612b1857fe5b6020026020010151602001518760400151600081518110612b3557fe5b6020026020010151602001510181600081518110612b4f57fe5b6020026020010151602001906001600160601b031690816001600160601b031681525050612b99886000015160000151838a6000015160200151848c608001518d60600151613669565b509150612bfc9050565b612bcd876000015160000151828960000151602001518a604001518b608001518c60600151613669565b5087518051602090910151604089015160808b015160608c0151949550612bf8948693929190613669565b5090505b612c1d87600001516000015182896080015189602001518b60600151612c27565b5050509392505050565b6000825111612c485760405162461bcd60e51b8152600401610f8490614e65565b600084815b6001855103811015612d17576000612c8e868381518110612c6a57fe5b6020026020010151602001516001600160601b03168961371e90919063ffffffff16565b9050612cc3868381518110612c9f57fe5b6020026020010151602001516001600160601b03168561342690919063ffffffff16565b93508015612d0e57612cd5838261222b565b9250612d0e60405180604001604052808b81526020018381525088888581518110612cfc57fe5b60200260200101516000015188613736565b50600101612c4d565b50600084600186510381518110612d2a57fe5b60200260200101519050612d5481602001516001600160601b03168461342690919063ffffffff16565b92508261271014612d775760405162461bcd60e51b8152600401610f8490614fd7565b8115612da157612da160405180604001604052808a81526020018481525087836000015187613736565b5050505050505050565b60007fdb6f72e915676cfc289da13bc4ece054fd17b1df6d77ffc4a60510718c236b08612ddb83600001516123e6565b8360200151604051602001808481526020018381526020018281526020019350505050604051602081830303815290604052805190602001209050919050565b6000612e567f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f612e49613b3e565b612e51613b44565b613b4a565b905090565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115612ebc5760405162461bcd60e51b81526004018080602001828103825260228152602001806152716022913960400191505060405180910390fd5b6000601e8560ff161115612f96576004850360ff16601b1480612ee557506004850360ff16601c145b612f205760405162461bcd60e51b815260040180806020018281038252602281526020018061530e6022913960400191505060405180910390fd5b6001612f2b87613bac565b60048703868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612f85573d6000803e3d6000fd5b50505060206040510351905061304d565b8460ff16601b1480612fab57508460ff16601c145b612fe65760405162461bcd60e51b815260040180806020018281038252602281526020018061530e6022913960400191505060405180910390fd5b60018686868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613040573d6000803e3d6000fd5b5050506020604051035190505b6001600160a01b0381166130a8576040805162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015290519081900360640190fd5b95945050505050565b6130b9614156565b825182516001600160e01b031982166355575f5d60e11b1415613124576001600160e01b031981166355575f5d60e11b14156130f95784925050506120ae565b50506040805180820182526000808252825160208181019094529081529181019190915290506120ae565b6001600160e01b031982166322ba176160e21b1415613169576001600160e01b031981166322ba176160e21b14156130f9576131608585613bfd565b925050506120ae565b6001600160e01b031982166339d690a360e11b14156131a5576001600160e01b031981166339d690a360e11b14156130f9576131608585613bfd565b6001600160e01b0319821663025ceed960e61b14156131e1576001600160e01b0319811663025ceed960e61b14156130f9576131608585613bfd565b6001600160e01b031982166000908152606560205260409020546001600160a01b03168015613296576040516306d3f7cb60e41b81526001600160a01b03821690636d3f7cb09061323890899089906004016150ca565b60006040518083038186803b15801561325057600080fd5b505afa158015613264573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261328c91908101906149e7565b93505050506120ae565b6001600160e01b031983811690831614156132b55761328c8686613bfd565b60405162461bcd60e51b8152600401610f8490614dc9565b60408051600180825281830190925260609160009190816020015b6132f06141b4565b8152602001906001900390816132e8579050509050828160008151811061331357fe5b6020026020010151600001906001600160a01b031690816001600160a01b0316815250506127108160008151811061334757fe5b6020908102919091018101516001600160601b039092169101529050919050565b600082613377575060006120ae565b50600090815261012f6020526040902054919050565b61339561419a565b6000806133a3898887613c5a565b915091506000806133b58a8988613c5a565b91509150838111806133cf575083811480156133cf575083155b156133fb576133f084848c60200151602001518d6060015160200151613cd3565b945050505050612602565b6134178b60200151602001518c60600151602001518484613d58565b9b9a5050505050505050505050565b600082820183811015613480576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b600082815b8351811015613507576127108482815181106134a457fe5b6020026020010151602001516001600160601b031611156134d75760405162461bcd60e51b8152600401610f8490614f71565b8381815181106134e357fe5b6020026020010151602001516001600160601b03168201915080600101905061348c565b506130a8613515868361371e565b8690613426565b600080600061352c8a8a89613dde565b9092509050801561355757613557604051806040016040528087815260200183815250898887613736565b5090505b979650505050505050565b60008061357288613e00565b905080516001148015613586575086516001145b80156135d357508660008151811061359a57fe5b6020026020010151600001516001600160a01b0316816000815181106135bc57fe5b6020026020010151600001516001600160a01b0316145b1561362457611388816000815181106135e857fe5b6020026020010151602001516001600160601b0316111561361b5760405162461bcd60e51b8152600401610f8490614e00565b8591505061355b565b6000806136358b8989868a8a613669565b9150915061138881111561365b5760405162461bcd60e51b8152600401610f8490614e00565b509998505050505050505050565b846000805b8551811015613712576136aa86828151811061368657fe5b6020026020010151602001516001600160601b03168361342690919063ffffffff16565b915060006136d984898985815181106136bf57fe5b6020026020010151602001516001600160601b0316613dde565b909450905080156137095761370960405180604001604052808c81526020018381525087898581518110612cfc57fe5b5060010161366e565b50965096945050505050565b60006134806127106137308585613f75565b90613fce565b8351516001600160e01b0319166339d690a360e11b141561387c576000808560000151602001518060200190518101906137709190614825565b9150915085602001516001146137985760405162461bcd60e51b8152600401610f8490614eed565b6001600160a01b03851630141561381057604051632142170760e11b81526001600160a01b038316906342842e0e906137d990309088908690600401614c9a565b600060405180830381600087803b1580156137f357600080fd5b505af1158015613807573d6000803e3d6000fd5b50505050613875565b604051637b84dc8360e11b81526001600160a01b0384169063f709b90690613842908590899089908790600401614d9f565b600060405180830381600087803b15801561385c57600080fd5b505af1158015613870573d6000803e3d6000fd5b505050505b5050610646565b8351516001600160e01b0319166322ba176160e21b14156139da5760008460000151602001518060200190518101906138b59190614619565b90506001600160a01b03841630141561396c57602085015160405163a9059cbb60e01b81526001600160a01b0383169163a9059cbb916138f9918791600401614cf6565b602060405180830381600087803b15801561391357600080fd5b505af1158015613927573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061394b919061492f565b6139675760405162461bcd60e51b8152600401610f8490614f42565b6139d4565b602085015160405163776062c360e01b81526001600160a01b0384169163776062c3916139a191859189918991600401614d9f565b600060405180830381600087803b1580156139bb57600080fd5b505af11580156139cf573d6000803e3d6000fd5b505050505b50610646565b8351516001600160e01b03191663025ceed960e61b1415613a9757600080856000015160200151806020019051810190613a149190614825565b90925090506001600160a01b038516301415613a5f576020860151604051637921219560e11b81526001600160a01b0384169163f242432a916137d991309189918791600401614cbe565b6020860151604051639c1c2ee960e01b81526001600160a01b03851691639c1c2ee9916138429186918a918a91889190600401614d5c565b8351516001600160e01b0319166355575f5d60e11b1415613ae0576001600160a01b0382163014613adb576020840151613adb906001600160a01b03841690612288565b610646565b6040516354bc0cf160e01b81526001600160a01b038216906354bc0cf190613b10908790879087906004016150ef565b600060405180830381600087803b158015613b2a57600080fd5b505af1158015612da1573d6000803e3d6000fd5b60c95490565b60ca5490565b6000838383613b57614035565b3060405160200180868152602001858152602001848152602001838152602001826001600160a01b03168152602001955050505050506040516020818303038152906040528051906020012090509392505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b613c05614156565b60208084015180519082012083820151805192019190912080821415613c2f5784925050506120ae565b5050604080518082018252600080825282516020808201909452908152918101919091529392505050565b6000808215613c99576020808601510151613c75908561222b565b9150613c9285606001516020015186602001516020015184614039565b9050612223565b606085015160200151613cac908561222b565b9050613cc985602001516020015186606001516020015183614039565b9150935093915050565b613cdb61419a565b6000613ce8858585614039565b905085811115613d3f576040805162461bcd60e51b815260206004820152601860248201527f66696c6c4c6566743a20756e61626c6520746f2066696c6c0000000000000000604482015290519081900360640190fd5b5050604080518082019091529384525050602082015290565b613d6061419a565b6000613d6d838787614039565b905083811115613dc4576040805162461bcd60e51b815260206004820152601960248201527f66696c6c52696768743a20756e61626c6520746f2066696c6c00000000000000604482015290519081900360640190fd5b604080518082019091529283526020830152509392505050565b600080613df485613def868661371e565b61409f565b91509150935093915050565b80516060906001600160e01b03191663025ceed960e61b1480613e34575081516001600160e01b0319166339d690a360e11b145b15613eea576000808360200151806020019051810190613e549190614825565b61016254604051634e53ee3d60e11b81529294509092506001600160a01b031690639ca7dc7a90613e8b9085908590600401614cf6565b600060405180830381600087803b158015613ea557600080fd5b505af1158015613eb9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ee191908101906148fd565b9250505061125d565b81516001600160e01b03191662737ea960e61b1415613f2b5760008260200151806020019051810190613f1d9190614635565b60800151925061125d915050565b81516001600160e01b03191663d8f960c160e01b1415613f6d5760008260200151806020019051810190613f5f9190614732565b60600151925061125d915050565b506060919050565b600082613f84575060006120ae565b82820282848281613f9157fe5b04146134805760405162461bcd60e51b81526004018080602001828103825260218152602001806153306021913960400191505060405180910390fd5b6000808211614024576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161402d57fe5b049392505050565b4690565b60006140468484846140c7565b15614089576040805162461bcd60e51b815260206004820152600e60248201526d3937bab73234b7339032b93937b960911b604482015290519081900360640190fd5b614097836137308685613f75565b949350505050565b600080828411156140be576140b4848461222b565b9150829050611f2c565b50600093915050565b60008261410e576040805162461bcd60e51b815260206004820152601060248201526f6469766973696f6e206279207a65726f60801b604482015290519081900360640190fd5b811580614119575083155b1561412657506000613480565b6000838061413057fe5b858409905061413f8584613f75565b61414b826103e8613f75565b101595945050505050565b60408051808201909152600081526060602082015290565b604051806080016040528060608152602001606081526020016000151581526020016000151581525090565b604051806040016040528060008152602001600081525090565b604080518082019091526000808252602082015290565b803561125d8161521f565b600082601f8301126141e6578081fd5b815160206141fb6141f6836151b5565b615192565b82815281810190858301855b858110156142305761421e898684518b010161435f565b84529284019290840190600101614207565b5090979650505050505050565b600082601f83011261424d578081fd5b8151602061425d6141f6836151b5565b8281528181019085830160408086028801850189101561427b578687fd5b865b868110156142ea5781838b031215614293578788fd5b81518281018181106001600160401b03821117156142ad57fe5b835283516142ba8161521f565b8152838701516001600160601b03811681146142d457898afd5b818801528552938501939181019160010161427d565b509198975050505050505050565b8051801515811461125d57600080fd5b803561125d81615234565b600082601f830112614323578081fd5b81356143316141f6826151d2565b818152846020838601011115614345578283fd5b816020850160208301379081016020019190915292915050565b600082601f83011261436f578081fd5b815161437d6141f6826151d2565b818152846020838601011115614391578283fd5b6140978260208301602087016151f3565b60006101e082840312156143b4578081fd5b50919050565b600060408083850312156143cc578182fd5b80518181016001600160401b0382821081831117156143e757fe5b8184528294508535818111156143fc57600080fd5b860180880385131561440d57600080fd5b60808401838110838211171561441f57fe5b90945283359361442e85615234565b9382526020840135938185111561444457600080fd5b61445088868301614313565b60608501525050815260209384013593019290925292915050565b60006060828403121561447c578081fd5b604051606081016001600160401b03828210818311171561449957fe5b8160405282935084519150808211156144b157600080fd5b6144bd8683870161423d565b835260208501519150808211156144d357600080fd5b506144e08582860161423d565b6020830152506144f2604084016142f8565b60408201525092915050565b6000610120808385031215614511578182fd5b61451a81615192565b915050614526826141cb565b815260208201356001600160401b038082111561454257600080fd5b61454e858386016143ba565b602084015261455f604085016141cb565b6040840152606084013591508082111561457857600080fd5b614584858386016143ba565b60608401526080840135608084015260a084013560a084015260c084013560c08401526145b360e08501614308565b60e0840152610100915081840135818111156145ce57600080fd5b6145da86828701614313565b8385015250505092915050565b803565ffffffffffff8116811461125d57600080fd5b60006020828403121561460e578081fd5b81356134808161521f565b60006020828403121561462a578081fd5b81516134808161521f565b60008060408385031215614647578081fd5b82516146528161521f565b60208401519092506001600160401b038082111561466e578283fd5b9084019060c08287031215614681578283fd5b61468b60c0615192565b825181526020830151828111156146a0578485fd5b6146ac8882860161435f565b602083015250604083015160408201526060830151828111156146cd578485fd5b6146d98882860161423d565b6060830152506080830151828111156146f0578485fd5b6146fc8882860161423d565b60808301525060a083015182811115614713578485fd5b61471f888286016141d6565b60a0830152508093505050509250929050565b60008060408385031215614744578182fd5b825161474f8161521f565b60208401519092506001600160401b038082111561476b578283fd5b9084019060a0828703121561477e578283fd5b61478860a0615192565b8251815260208301518281111561479d578485fd5b6147a98882860161435f565b6020830152506040830151828111156147c0578485fd5b6147cc8882860161423d565b6040830152506060830151828111156147e3578485fd5b6147ef8882860161423d565b606083015250608083015182811115614806578485fd5b614812888286016141d6565b6080830152508093505050509250929050565b60008060408385031215614837578182fd5b82516148428161521f565b6020939093015192949293505050565b600080600080600060a08688031215614869578081fd5b85356148748161521f565b945060208601356148848161521f565b935060408601359250606086013561489b8161521f565b915060808601356148ab8161521f565b809150509295509295909350565b6000806000606084860312156148cd578081fd5b83356148d88161521f565b92506148e6602085016145e7565b91506148f4604085016145e7565b90509250925092565b60006020828403121561490e578081fd5b81516001600160401b03811115614923578182fd5b6140978482850161423d565b600060208284031215614940578081fd5b613480826142f8565b60006020828403121561495a578081fd5b5035919050565b600060208284031215614972578081fd5b813561348081615234565b6000806040838503121561498f578182fd5b823561499a81615234565b915060208301356149aa8161521f565b809150509250929050565b6000602082840312156149c6578081fd5b81356001600160401b038111156149db578182fd5b614097848285016143a2565b6000602082840312156149f8578081fd5b81516001600160401b0380821115614a0e578283fd5b9083019060408286031215614a21578283fd5b604051604081018181108382111715614a3657fe5b6040528251614a4481615234565b8152602083015182811115614a57578485fd5b614a638782860161435f565b60208301525095945050505050565b600060208284031215614a83578081fd5b81516001600160401b0380821115614a99578283fd5b9083019060408286031215614aac578283fd5b604051604081018181108382111715614ac157fe5b604052825182811115614ad2578485fd5b614ade8782860161423d565b825250602083015182811115614af2578485fd5b614a638782860161423d565b600060208284031215614b0f578081fd5b81516001600160401b03811115614b24578182fd5b6140978482850161446b565b600060208284031215614b41578081fd5b81356001600160401b03811115614b56578182fd5b614097848285016144fe565b60008060008060808587031215614b77578182fd5b84356001600160401b0380821115614b8d578384fd5b614b99888389016144fe565b95506020870135915080821115614bae578384fd5b614bba88838901614313565b94506040870135915080821115614bcf578384fd5b614bdb888389016144fe565b93506060870135915080821115614bf0578283fd5b50614bfd87828801614313565b91505092959194509250565b600060208284031215614c1a578081fd5b613480826145e7565b600063ffffffff60e01b82511683526020820151604060208501528051806040860152614c578160608701602085016151f3565b601f01601f1916939093016060019392505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260a06080820181905260009082015260c00190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393909316835265ffffffffffff918216602084015216604082015260600190565b90815260200190565b93845260208401929092526040830152606082015260800190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260c060a0820181905260009082015260e00190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b60208082526017908201527f6e6f7420666f756e64204941737365744d617463686572000000000000000000604082015260600190565b6020808252601d908201527f526f79616c746965732061726520746f6f206869676820283e35302529000000604082015260600190565b6020808252601490820152730c081cd85b1d0818d85b89dd081899481d5cd95960621b604082015260600190565b60208082526024908201527f7472616e736665725061796f7574733a206e6f7468696e6720746f207472616e60408201526339b332b960e11b606082015260800190565b60208082526024908201527f72696768744f726465722e74616b657220766572696669636174696f6e2066616040820152631a5b195960e21b606082015260800190565b60208082526012908201527132b9319b9918903b30b63ab29032b93937b960711b604082015260600190565b6020808252600f908201526e1b9bdd1a1a5b99c81d1bc8199a5b1b608a1b604082015260600190565b602080825260159082015274195c98cc8c081d1c985b9cd9995c8819985a5b1959605a1b604082015260600190565b6020808252601590820152746f726967696e2066656520697320746f6f2062696760581b604082015260600190565b60208082526017908201527f556e6b6e6f776e204f7264657220646174612074797065000000000000000000604082015260600190565b6020808252601e908201527f53756d207061796f75747320427073206e6f7420657175616c20313030250000604082015260600190565b6020808252601290820152710c2e6e6cae8e640c8dedc4ee840dac2e8c6d60731b604082015260600190565b60208082526023908201527f6c6566744f726465722e74616b657220766572696669636174696f6e206661696040820152621b195960ea1b606082015260800190565b6020808252600e908201526d0dcdee840cadcdeeaced040cae8d60931b604082015260600190565b6020808252600b908201526a3737ba10309036b0b5b2b960a91b604082015260600190565b6000604082526150dd6040830185614c23565b82810360208401526130a88185614c23565b60006060825284516040606084015261510b60a0840182614c23565b60209687015160808501526001600160a01b03958616968401969096525050911660409091015290565b65ffffffffffff92831681529116602082015260400190565b6000808335601e19843603018112615164578283fd5b8301803591506001600160401b0382111561517d578283fd5b602001915036819003821315611f2c57600080fd5b6040518181016001600160401b03811182821017156151ad57fe5b604052919050565b60006001600160401b038211156151c857fe5b5060209081020190565b60006001600160401b038211156151e557fe5b50601f01601f191660200190565b60005b8381101561520e5781810151838201526020016151f6565b838111156106465750506000910152565b6001600160a01b038116811461159357600080fd5b6001600160e01b03198116811461159357600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345434453413a20696e76616c6964207369676e6174757265202773272076616c75656f72646572207369676e617475726520766572696669636174696f6e206572726f72636f6e7472616374206f72646572207369676e617475726520766572696669636174696f6e206572726f72496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656445434453413a20696e76616c6964207369676e6174757265202776272076616c7565536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220b9081ff8806ebd898506b6bce611dbe688dfdbd6f374f8a8954602525c15014864736f6c63430007060033" export const EXCHANGEV2_ABI: AbiItem[] = [ + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "oldValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newValue", + type: "uint256", + }, + ], + name: "BuyerFeeAmountChanged", + type: "event", + }, { anonymous: false, inputs: [ @@ -29,6 +48,25 @@ export const EXCHANGEV2_ABI: AbiItem[] = [ name: "Cancel", type: "event", }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "oldValue", + type: "address", + }, + { + indexed: false, + internalType: "address", + name: "newValue", + type: "address", + }, + ], + name: "FeeReceiverChanged", + type: "event", + }, { anonymous: false, inputs: [ @@ -102,38 +140,38 @@ export const EXCHANGEV2_ABI: AbiItem[] = [ anonymous: false, inputs: [ { - indexed: false, - internalType: "uint256", - name: "oldValue", - type: "uint256", + indexed: true, + internalType: "bytes4", + name: "assetType", + type: "bytes4", }, { indexed: false, - internalType: "uint256", - name: "newValue", - type: "uint256", + internalType: "address", + name: "proxy", + type: "address", }, ], - name: "ProtocolFeeChanged", + name: "ProxyChange", type: "event", }, { anonymous: false, inputs: [ { - indexed: true, - internalType: "bytes4", - name: "assetType", - type: "bytes4", + indexed: false, + internalType: "uint256", + name: "oldValue", + type: "uint256", }, { indexed: false, - internalType: "address", - name: "proxy", - type: "address", + internalType: "uint256", + name: "newValue", + type: "uint256", }, ], - name: "ProxyChange", + name: "SellerFeeAmountChanged", type: "event", }, { @@ -244,19 +282,6 @@ export const EXCHANGEV2_ABI: AbiItem[] = [ stateMutability: "nonpayable", type: "function", }, - { - inputs: [], - name: "defaultFeeReceiver", - outputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, { inputs: [ { @@ -437,25 +462,6 @@ export const EXCHANGEV2_ABI: AbiItem[] = [ stateMutability: "payable", type: "function", }, - { - inputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - name: "feeReceivers", - outputs: [ - { - internalType: "address", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, { inputs: [ { @@ -711,9 +717,19 @@ export const EXCHANGEV2_ABI: AbiItem[] = [ name: "protocolFee", outputs: [ { - internalType: "uint256", - name: "", - type: "uint256", + internalType: "address", + name: "receiver", + type: "address", + }, + { + internalType: "uint48", + name: "buyerAmount", + type: "uint48", + }, + { + internalType: "uint48", + name: "sellerAmount", + type: "uint48", }, ], stateMutability: "view", @@ -739,6 +755,29 @@ export const EXCHANGEV2_ABI: AbiItem[] = [ stateMutability: "view", type: "function", }, + { + inputs: [ + { + internalType: "address", + name: "_receiver", + type: "address", + }, + { + internalType: "uint48", + name: "_buyerAmount", + type: "uint48", + }, + { + internalType: "uint48", + name: "_sellerAmount", + type: "uint48", + }, + ], + name: "setAllProtocolFeeData", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, { inputs: [ { @@ -760,12 +799,12 @@ export const EXCHANGEV2_ABI: AbiItem[] = [ { inputs: [ { - internalType: "address payable", - name: "newDefaultFeeReceiver", - type: "address", + internalType: "uint48", + name: "_buyerAmount", + type: "uint48", }, ], - name: "setDefaultFeeReceiver", + name: "setPrtocolFeeBuyerAmount", outputs: [], stateMutability: "nonpayable", type: "function", @@ -774,16 +813,11 @@ export const EXCHANGEV2_ABI: AbiItem[] = [ inputs: [ { internalType: "address", - name: "token", - type: "address", - }, - { - internalType: "address", - name: "wallet", + name: "_receiver", type: "address", }, ], - name: "setFeeReceiver", + name: "setPrtocolFeeReceiver", outputs: [], stateMutability: "nonpayable", type: "function", @@ -791,12 +825,12 @@ export const EXCHANGEV2_ABI: AbiItem[] = [ { inputs: [ { - internalType: "uint64", - name: "_protocolFee", - type: "uint64", + internalType: "uint48", + name: "_sellerAmount", + type: "uint48", }, ], - name: "setProtocolFee", + name: "setPrtocolFeeSellerAmount", outputs: [], stateMutability: "nonpayable", type: "function", diff --git a/packages/example/package.json b/packages/example/package.json index dd5c146a7..9453d3006 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -25,7 +25,7 @@ "@mui/material": "^5.15.17", "@nfid/embed": "0.0.5-alpha.0", "@nfid/wallet": "^1.1.0", - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.1", "@rarible/connector": "^0.13.68-fix.42", "@rarible/connector-beacon": "^0.13.68-fix.42", "@rarible/connector-fcl": "^0.13.68-fix.42", diff --git a/packages/imx-sdk/package.json b/packages/imx-sdk/package.json index dafd46d65..fbbe1e696 100644 --- a/packages/imx-sdk/package.json +++ b/packages/imx-sdk/package.json @@ -21,7 +21,7 @@ "@ethersproject/providers": "~5.6.1", "@ethersproject/wallet": "~5.6.0", "@imtbl/imx-sdk": "^2.1.1", - "@rarible/ethereum-api-client": "^0.1.26-beta3", + "@rarible/ethereum-api-client": "^0.2.0-alpha.1", "@rarible/immutable-wallet": "^0.13.68-fix.42" }, "devDependencies": { diff --git a/packages/sdk-common/package.json b/packages/sdk-common/package.json index 9a222e07c..7f73c6f55 100644 --- a/packages/sdk-common/package.json +++ b/packages/sdk-common/package.json @@ -18,7 +18,7 @@ "verify": "tsc --noEmit --project tsconfig-build.json" }, "dependencies": { - "@rarible/api-client": "0.16.5-alpha.13" + "@rarible/api-client": "0.18.0-alpha.1" }, "peerDependencies": { "tslib": "^2.3.1" diff --git a/packages/sdk-examples/package.json b/packages/sdk-examples/package.json index b012130af..1fc4abbba 100644 --- a/packages/sdk-examples/package.json +++ b/packages/sdk-examples/package.json @@ -19,7 +19,7 @@ "verify": "tsc --noEmit --project tsconfig-build.json" }, "dependencies": { - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.1", "@rarible/estimate-middleware": "~0.9.6", "@rarible/ethers-ethereum": "^0.13.68-fix.42", "@rarible/sdk": "^0.13.68-fix.42", diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 649253536..f41325f82 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -31,7 +31,7 @@ "dependencies": { "@ethersproject/keccak256": "^5.6.0", "@rarible/action": "~0.9.1", - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.1", "@rarible/aptos-sdk": "^0.13.68-fix.42", "@rarible/flow-sdk": "~0.5.78-fix.3", "@rarible/immutable-sdk": "^0.13.68-fix.42", @@ -87,7 +87,7 @@ "yargs": "^17.2.1" }, "peerDependencies": { - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.1", "axios": "^0.26.1", "tslib": "^2.3.1" } diff --git a/packages/sdk/src/sdk-blockchains/ethereum/bid.ts b/packages/sdk/src/sdk-blockchains/ethereum/bid.ts index cf69a326a..a38e285e9 100644 --- a/packages/sdk/src/sdk-blockchains/ethereum/bid.ts +++ b/packages/sdk/src/sdk-blockchains/ethereum/bid.ts @@ -1,11 +1,10 @@ import type { RaribleSdk } from "@rarible/protocol-ethereum-sdk" import type { ContractAddress } from "@rarible/types" -import { toAddress, toBinary, toContractAddress, toUnionAddress, toWord } from "@rarible/types" +import { toAddress, toContractAddress, toWord } from "@rarible/types" import { toBigNumber } from "@rarible/types/build/big-number" import type * as ApiClient from "@rarible/api-client" import type { AssetType, OrderId } from "@rarible/api-client" import { Blockchain } from "@rarible/api-client" -import type { AssetType as EthereumAssetType } from "@rarible/ethereum-api-client/build/models/AssetType" import type { Maybe } from "@rarible/types/build/maybe" import type { EthereumWallet } from "@rarible/sdk-wallet" import type { AssetTypeRequest } from "@rarible/protocol-ethereum-sdk/build/order/check-asset-type" @@ -18,6 +17,7 @@ import type { BigNumberValue } from "@rarible/utils" import { toBn } from "@rarible/utils" import { Warning } from "@rarible/logger/build" import type { Item } from "@rarible/api-client/build/models" +import type { RequestCurrencyAssetType } from "../../common/domain" import type * as OrderCommon from "../../types/order/common" import { MaxFeesBasePointSupport, OriginFeeSupport, PayoutsSupport } from "../../types/order/fill/domain" import type { @@ -29,7 +29,6 @@ import type { } from "../../types/order/bid/domain" import { getCommonConvertableValue } from "../../common/get-convertable-value" import { getCurrencyAssetType } from "../../common/get-currency-asset-type" -import type { RequestCurrencyAssetType } from "../../common/domain" import type { BidSimplifiedRequest, BidUpdateSimplifiedRequest } from "../../types/order/bid/simplified" import { convertDateToTimestamp, getDefaultExpirationDateTimestamp } from "../../common/get-expiration-date" import type { IApisSdk } from "../../domain" @@ -54,7 +53,6 @@ import { isWETH, } from "./common" import type { EthereumBalance } from "./balance" -import type { IEthereumSdkConfig } from "./domain" export class EthereumBid { constructor( @@ -62,7 +60,6 @@ export class EthereumBid { private wallet: Maybe, private apis: IApisSdk, private balanceService: EthereumBalance, - private config?: IEthereumSdkConfig, ) { this.bid = this.bid.bind(this) this.update = this.update.bind(this) @@ -72,80 +69,6 @@ export class EthereumBid { this.bidUpdateBasic = this.bidUpdateBasic.bind(this) } - convertAssetType(assetType: EthereumAssetType, blockchain: EVMBlockchain): ApiClient.AssetType { - switch (assetType.assetClass) { - case "ETH": { - return { - "@type": "ETH", - } - } - case "ERC20": { - return { - "@type": "ERC20", - contract: convertEthereumContractAddress(assetType.contract, blockchain), - } - } - case "ERC721": { - return { - "@type": "ERC721", - contract: convertEthereumContractAddress(assetType.contract, blockchain), - tokenId: assetType.tokenId, - } - } - case "ERC721_LAZY": { - return { - "@type": "ERC721_Lazy", - contract: convertEthereumContractAddress(assetType.contract, blockchain), - tokenId: assetType.tokenId, - uri: assetType.uri, - creators: assetType.creators.map(c => ({ - account: toUnionAddress(c.account), - value: c.value, - })), - royalties: assetType.royalties.map(r => ({ - account: toUnionAddress(r.account), - value: r.value, - })), - signatures: assetType.signatures.map(str => toBinary(str)), - } - } - case "ERC1155": { - return { - "@type": "ERC1155", - contract: convertEthereumContractAddress(assetType.contract, blockchain), - tokenId: assetType.tokenId, - } - } - case "ERC1155_LAZY": { - return { - "@type": "ERC1155_Lazy", - contract: convertEthereumContractAddress(assetType.contract, blockchain), - tokenId: assetType.tokenId, - uri: assetType.uri, - supply: assetType.supply !== undefined ? toBigNumber(assetType.supply) : toBigNumber("1"), - creators: assetType.creators.map(c => ({ - account: toUnionAddress(c.account), - value: c.value, - })), - royalties: assetType.royalties.map(r => ({ - account: toUnionAddress(r.account), - value: r.value, - })), - signatures: assetType.signatures.map(toBinary), - } - } - case "GEN_ART": { - return { - "@type": "GEN_ART", - contract: convertEthereumContractAddress(assetType.contract, blockchain), - } - } - default: { - throw new Error(`Unsupported asset type ${assetType.assetClass}`) - } - } - } - async bidBasic(request: BidSimplifiedRequest): Promise { const prepare = await this.bid(request) return prepare.submit(request) @@ -178,15 +101,16 @@ export class EthereumBid { collection: contract, }) - const bidAction = this.sdk.order.bid - .before(async (request: OrderCommon.OrderRequest) => { + const bidAction = this.sdk.order.bid.around( + async (request: OrderCommon.OrderRequest) => { await checkWalletBlockchain(this.wallet, blockchain) const expirationDate = request.expirationDate ? convertDateToTimestamp(request.expirationDate) : getDefaultExpirationDateTimestamp() const currencyAssetType = getCurrencyAssetType(request.currency) + const baseFee = await this.sdk.order.getBaseOrderFee("RARIBLE_V2") return { - type: "DATA_V2", + type: baseFee === 0 ? "DATA_V2" : "DATA_V3", makeAssetType: common.getEthTakeAssetType(currencyAssetType), takeAssetType: ethAssetType, amount: getOrderAmount(request.amount, collection), @@ -195,11 +119,12 @@ export class EthereumBid { originFees: common.toEthereumParts(request.originFees), end: expirationDate, } - }) - .after(async res => { + }, + async res => { await res.approveTx?.wait() return common.convertEthereumOrderHash(res.order.hash, blockchain) - }) + }, + ) const submit = Action.create({ id: "convert" as const, @@ -325,18 +250,19 @@ export class EthereumBid { throw new UpdateBidNotSupportedForThidKindOfOrderError(order.data["@type"]) } - const bidUpdateAction = this.sdk.order.bidUpdate - .before(async (request: OrderCommon.OrderUpdateRequest) => { + const bidUpdateAction = this.sdk.order.bidUpdate.around( + async (request: OrderCommon.OrderUpdateRequest) => { await checkWalletBlockchain(this.wallet, blockchain) return { orderHash: toWord(hash), priceDecimal: request.price, } - }) - .after(async res => { + }, + async res => { await res.approveTx?.wait() return common.convertEthereumOrderHash(res.order.hash, blockchain) - }) + }, + ) const actionWithConvert = Action.create({ id: "convert" as const, diff --git a/packages/sdk/src/sdk-blockchains/ethereum/common/index.ts b/packages/sdk/src/sdk-blockchains/ethereum/common/index.ts index 12bf8764f..6e9192716 100644 --- a/packages/sdk/src/sdk-blockchains/ethereum/common/index.ts +++ b/packages/sdk/src/sdk-blockchains/ethereum/common/index.ts @@ -58,8 +58,7 @@ import type { OrderOpenSeaV1DataV1, OrderRaribleV2DataV1, OrderRaribleV2DataV2, - OrderRaribleV2DataV3Buy, - OrderRaribleV2DataV3Sell, + OrderRaribleV2DataV3, OrderSudoSwapAmmDataV1, OrderX2Y2Data, } from "@rarible/ethereum-api-client/build/models/OrderData" @@ -228,24 +227,13 @@ export function convertOrderDataToEth(data: OrderData): SimpleOrder["data"] { isMakeFill: data.isMakeFill, } as OrderRaribleV2DataV2 } - case "ETH_RARIBLE_V2_DATA_V3_SELL": { + case "ETH_RARIBLE_V2_3": { return { - dataType: "RARIBLE_V2_DATA_V3_SELL", - payout: data.payout && convertEthereumPart(data.payout), - originFeeFirst: data.originFeeFirst && convertEthereumPart(data.originFeeFirst), - originFeeSecond: data.originFeeSecond && convertEthereumPart(data.originFeeSecond), - maxFeesBasePoint: data.maxFeesBasePoint, - marketplaceMarker: data.marketplaceMarker, - } as OrderRaribleV2DataV3Sell - } - case "ETH_RARIBLE_V2_DATA_V3_BUY": { - return { - dataType: "RARIBLE_V2_DATA_V3_BUY", - payout: data.payout && convertEthereumPart(data.payout), - originFeeFirst: data.originFeeFirst && convertEthereumPart(data.originFeeFirst), - originFeeSecond: data.originFeeSecond && convertEthereumPart(data.originFeeSecond), - marketplaceMarker: data.marketplaceMarker && toWord(data.marketplaceMarker), - } as OrderRaribleV2DataV3Buy + dataType: "RARIBLE_V2_DATA_V3", + payouts: toEthereumParts(data.payouts), + originFees: toEthereumParts(data.originFees), + isMakeFill: data.isMakeFill, + } as OrderRaribleV2DataV3 } case "ETH_OPEN_SEA_V1": { return { @@ -355,8 +343,7 @@ export function getEthOrderType(data: OrderData): SimpleOrder["type"] { return "RARIBLE_V1" case "ETH_RARIBLE_V2": case "ETH_RARIBLE_V2_2": - case "ETH_RARIBLE_V2_DATA_V3_SELL": - case "ETH_RARIBLE_V2_DATA_V3_BUY": + case "ETH_RARIBLE_V2_3": return "RARIBLE_V2" case "ETH_OPEN_SEA_V1": return "OPEN_SEA_V1" @@ -414,10 +401,8 @@ export function getOrderFeesSum(order: Order): number { return order.data.fee case "ETH_RARIBLE_V2": case "ETH_RARIBLE_V2_2": + case "ETH_RARIBLE_V2_3": return getOriginFeesSum(order.data.originFees) - case "ETH_RARIBLE_V2_DATA_V3_SELL": - case "ETH_RARIBLE_V2_DATA_V3_BUY": - return (order.data.originFeeFirst?.value ?? 0) + (order.data.originFeeSecond?.value ?? 0) default: throw new Error("Unexpected order dataType") } @@ -428,10 +413,7 @@ export function isRaribleV1Data(data: OrderData): boolean { } export function isRaribleV2Data(data: OrderData): boolean { return ( - data["@type"] === "ETH_RARIBLE_V2" || - data["@type"] === "ETH_RARIBLE_V2_2" || - data["@type"] === "ETH_RARIBLE_V2_DATA_V3_SELL" || - data["@type"] === "ETH_RARIBLE_V2_DATA_V3_BUY" + data["@type"] === "ETH_RARIBLE_V2" || data["@type"] === "ETH_RARIBLE_V2_2" || data["@type"] === "ETH_RARIBLE_V2_3" ) } @@ -644,5 +626,4 @@ export function isWETH(assetType: AssetType, wethAddress: Address) { return assetType["@type"] === "ERC20" && convertToEthereumAddress(assetType.contract) === wethAddress } -export * from "./validators" export { EVMBlockchains, EVMBlockchain, isEVMBlockchain } diff --git a/packages/sdk/src/sdk-blockchains/ethereum/common/validators.ts b/packages/sdk/src/sdk-blockchains/ethereum/common/validators.ts deleted file mode 100644 index 51534abd5..000000000 --- a/packages/sdk/src/sdk-blockchains/ethereum/common/validators.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Warning } from "@rarible/logger/build" -import type * as OrderCommon from "../../../types/order/common" -import type { FillRequest } from "../../../types/order/fill/domain" -import { checkPayouts } from "../../../common/check-payouts" - -export function validateOrderDataV3Request( - request: OrderCommon.OrderRequest | FillRequest, - options?: { - shouldProvideMaxFeesBasePoint?: boolean - }, -) { - if ( - options?.shouldProvideMaxFeesBasePoint && - (!request.maxFeesBasePoint || request.maxFeesBasePoint <= 0 || request.maxFeesBasePoint > 1000) - ) { - throw new Warning( - "maxFeesBasePoint should be specified in request and should be more than 0% and can't be more than 10%", - ) - } - if (request.payouts && request.payouts.length > 1) { - throw new Warning("Only 1 payout account maximum supported") - } - if (request.originFees && request.originFees.length > 2) { - throw new Warning("Only 2 origin accounts maximum supported") - } - checkPayouts(request.payouts) -} - -export function validateBlockchainChainId() {} diff --git a/packages/sdk/src/sdk-blockchains/ethereum/fill.ts b/packages/sdk/src/sdk-blockchains/ethereum/fill.ts index 34dc5e619..b8631d4fd 100644 --- a/packages/sdk/src/sdk-blockchains/ethereum/fill.ts +++ b/packages/sdk/src/sdk-blockchains/ethereum/fill.ts @@ -6,7 +6,6 @@ import type { FillBatchSingleOrderRequest, FillOrderAction, FillOrderRequest, - RaribleV2OrderFillRequestV3Sell, } from "@rarible/protocol-ethereum-sdk/build/order/fill-order/types" import type { SimpleOrder } from "@rarible/protocol-ethereum-sdk/build/order/types" import { BigNumber as BigNumberClass } from "@rarible/utils/build/bn" @@ -47,9 +46,7 @@ import { isEVMBlockchain, isNft, toEthereumParts, - validateOrderDataV3Request, } from "./common" -import type { IEthereumSdkConfig } from "./domain" export type SupportFlagsResponse = { originFeeSupport: OriginFeeSupport @@ -58,14 +55,11 @@ export type SupportFlagsResponse = { supportsPartialFill: boolean } -export type SimplePreparedOrder = SimpleOrder & { makeStock: BigNumber } - export class EthereumFill { constructor( private sdk: RaribleSdk, private wallet: Maybe, private apis: IApisSdk, - private config?: IEthereumSdkConfig, ) { this.fill = this.fill.bind(this) this.buy = this.buy.bind(this) @@ -110,17 +104,6 @@ export class EthereumFill { payouts: toEthereumParts(fillRequest.payouts), originFees: toEthereumParts(fillRequest.originFees), } - - switch (order.data.dataType) { - case "RARIBLE_V2_DATA_V3_BUY": - validateOrderDataV3Request(fillRequest, { shouldProvideMaxFeesBasePoint: true }) - ;(request as RaribleV2OrderFillRequestV3Sell).maxFeesBasePoint = fillRequest.maxFeesBasePoint! - break - case "RARIBLE_V2_DATA_V3_SELL": - validateOrderDataV3Request(fillRequest, { shouldProvideMaxFeesBasePoint: false }) - break - default: - } break } case "OPEN_SEA_V1": { @@ -216,20 +199,13 @@ export class EthereumFill { supportsPartialFill: true, } } - case "ETH_RARIBLE_V2_DATA_V3_SELL": + case "ETH_RARIBLE_V2_3": return { originFeeSupport: OriginFeeSupport.FULL, - payoutsSupport: PayoutsSupport.SINGLE, + payoutsSupport: PayoutsSupport.MULTIPLE, maxFeesBasePointSupport: MaxFeesBasePointSupport.IGNORED, supportsPartialFill: true, } - case "ETH_RARIBLE_V2_DATA_V3_BUY": - return { - originFeeSupport: OriginFeeSupport.FULL, - payoutsSupport: PayoutsSupport.SINGLE, - maxFeesBasePointSupport: MaxFeesBasePointSupport.REQUIRED, - supportsPartialFill: true, - } case "ETH_OPEN_SEA_V1": { return { originFeeSupport: order.take.type["@type"] === "ETH" ? OriginFeeSupport.FULL : OriginFeeSupport.NONE, @@ -290,8 +266,7 @@ export class EthereumFill { case "ETH_RARIBLE_V1": case "ETH_RARIBLE_V2": case "ETH_RARIBLE_V2_2": - case "ETH_RARIBLE_V2_DATA_V3_BUY": - case "ETH_RARIBLE_V2_DATA_V3_SELL": + case "ETH_RARIBLE_V2_3": return Platform.RARIBLE case "ETH_OPEN_SEA_V1": case "ETH_BASIC_SEAPORT_DATA_V1": @@ -362,8 +337,8 @@ export class EthereumFill { const order = await this.apis.order.getValidatedOrderById({ id: orderId }) const ethOrder = await getEthOrder(assertWallet(this.wallet).ethereum, order) - const submit = action - .before(async (fillRequest: FillRequest) => { + const submit = action.around( + async (fillRequest: FillRequest) => { await checkWalletBlockchain(this.wallet, blockchain) checkPayouts(fillRequest.payouts) if (fillRequest.unwrap) { @@ -373,8 +348,9 @@ export class EthereumFill { throw new Warning("For collection order you should pass itemId") } return this.getFillOrderRequest(ethOrder, fillRequest) - }) - .after(async tx => new BlockchainEthereumTransaction(tx, await getWalletNetwork(this.wallet))) + }, + async tx => new BlockchainEthereumTransaction(tx, await getWalletNetwork(this.wallet)), + ) const nftAssetType = isBid ? order.take.type : order.make.type return { diff --git a/packages/sdk/src/sdk-blockchains/ethereum/index.ts b/packages/sdk/src/sdk-blockchains/ethereum/index.ts index 12bd343ce..a2b47e9a9 100644 --- a/packages/sdk/src/sdk-blockchains/ethereum/index.ts +++ b/packages/sdk/src/sdk-blockchains/ethereum/index.ts @@ -59,11 +59,11 @@ export function createEthereumSdk( } const sdk = createRaribleSdk(wallet?.ethereum, network, sdkConfig) - const sellService = new EthereumSell(sdk, wallet, apis, config) + const sellService = new EthereumSell(sdk, wallet, apis) const balanceService = new EthereumBalance(sdk, wallet, apis) - const bidService = new EthereumBid(sdk, wallet, apis, balanceService, config) + const bidService = new EthereumBid(sdk, wallet, apis, balanceService) const mintService = new EthereumMint(sdk, wallet, apis) - const fillService = new EthereumFill(sdk, wallet, apis, config) + const fillService = new EthereumFill(sdk, wallet, apis) const { createCollectionSimplified } = new EthereumCreateCollection(sdk, wallet) const cryptopunkService = new EthereumCryptopunk(sdk, wallet) const transferService = new EthereumTransfer(sdk, wallet, apis) diff --git a/packages/sdk/src/sdk-blockchains/ethereum/sell.ts b/packages/sdk/src/sdk-blockchains/ethereum/sell.ts index 6ccce87a7..8a635aa18 100644 --- a/packages/sdk/src/sdk-blockchains/ethereum/sell.ts +++ b/packages/sdk/src/sdk-blockchains/ethereum/sell.ts @@ -25,14 +25,12 @@ import { isRaribleV1Data, isRaribleV2Data, } from "./common" -import type { IEthereumSdkConfig } from "./domain" export class EthereumSell { constructor( private sdk: RaribleSdk, private wallet: Maybe, private apis: IApisSdk, - private config?: IEthereumSdkConfig, ) { this.sell = this.sell.bind(this) this.update = this.update.bind(this) @@ -62,8 +60,8 @@ export class EthereumSell { } private async sellDataV2(): Promise { - const sellAction = this.sdk.order.sell - .before(async (sellFormRequest: OrderCommon.OrderInternalRequest) => { + const sellAction = this.sdk.order.sell.around( + async (sellFormRequest: OrderCommon.OrderInternalRequest) => { await checkWalletBlockchain(this.wallet, extractBlockchain(sellFormRequest.itemId)) checkPayouts(sellFormRequest.payouts) const { tokenId, contract } = getEthereumItemId(sellFormRequest.itemId) @@ -71,8 +69,9 @@ export class EthereumSell { ? convertDateToTimestamp(sellFormRequest.expirationDate) : getDefaultExpirationDateTimestamp() const currencyAssetType = getCurrencyAssetType(sellFormRequest.currency) + const baseFee = await this.sdk.order.getBaseOrderFee("RARIBLE_V2") return { - type: "DATA_V2", + type: baseFee === 0 ? "DATA_V2" : "DATA_V3", makeAssetType: { tokenId: tokenId, contract: toAddress(contract), @@ -84,12 +83,13 @@ export class EthereumSell { originFees: common.toEthereumParts(sellFormRequest.originFees), end: expirationDate, } - }) - .after(async order => { + }, + async order => { //todo replace with returned chainId/blockchain const blockchain = await getWalletBlockchain(this.wallet) return common.convertEthereumOrderHash(order.hash, blockchain) - }) + }, + ) return { originFeeSupport: OriginFeeSupport.FULL, @@ -119,15 +119,16 @@ export class EthereumSell { throw new Error(`You can't update non-Rarible orders. Unable to update sell ${JSON.stringify(order)}`) } - const sellUpdateAction = this.sdk.order.sellUpdate - .before(async (request: OrderCommon.OrderUpdateRequest) => { + const sellUpdateAction = this.sdk.order.sellUpdate.around( + async (request: OrderCommon.OrderUpdateRequest) => { await checkWalletBlockchain(this.wallet, blockchain) return { orderHash: toWord(hash), priceDecimal: request.price, } - }) - .after(order => common.convertEthereumOrderHash(order.hash, blockchain)) + }, + order => common.convertEthereumOrderHash(order.hash, blockchain), + ) const { ethereum } = common.assertWallet(this.wallet) const ethOrder = await getEthOrder(ethereum, order) diff --git a/packages/transaction/package.json b/packages/transaction/package.json index 45fc31798..82209abca 100644 --- a/packages/transaction/package.json +++ b/packages/transaction/package.json @@ -26,7 +26,7 @@ "@rarible/types": "~0.9.30" }, "peerDependencies": { - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.1", "tslib": "^2.3.1" }, "publishConfig": { diff --git a/packages/wallet/package.json b/packages/wallet/package.json index a025a196b..0390a72e6 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -68,7 +68,7 @@ "stream-browserify": "^3.0.0" }, "peerDependencies": { - "@rarible/api-client": "0.16.5-alpha.13", + "@rarible/api-client": "0.18.0-alpha.1", "tslib": "^2.3.1" }, "publishConfig": { diff --git a/yarn.lock b/yarn.lock index 71ddf82f1..69f64d0f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7177,10 +7177,10 @@ dependencies: callable-instance "^2.0.0" -"@rarible/api-client@0.16.5-alpha.13": - version "0.16.5-alpha.13" - resolved "https://registry.yarnpkg.com/@rarible/api-client/-/api-client-0.16.5-alpha.13.tgz#67333551811f8535fcf9da54e6e061c94109584f" - integrity sha512-7pmHKunl4yVw5nehOBPA5FZ8QD//PpOFMHAegRAjmvl/QDMdy+1UvfJxGwCU1yx/VaEx9eInAMqiF97f2ggFJw== +"@rarible/api-client@0.18.0-alpha.1": + version "0.18.0-alpha.1" + resolved "https://registry.yarnpkg.com/@rarible/api-client/-/api-client-0.18.0-alpha.1.tgz#144c36383feafa3b34bb3b1402a150dfc9d0655f" + integrity sha512-N3lK7GOydbQHEEJHFbXI4hWfTw3Wq0n4aO7MEiI4XFIkn9cGwaKC2teOcrrSDKQr9neyA7V8Gj8iJ5emZZMcUg== "@rarible/eslint-config-react@~0.10.0-alpha.37": version "0.10.0-alpha.37" @@ -7203,10 +7203,10 @@ eth-json-rpc-middleware "^8.0.1" json-rpc-engine "^6.1.0" -"@rarible/ethereum-api-client@^0.1.26-beta3": - version "0.1.26-beta3" - resolved "https://registry.yarnpkg.com/@rarible/ethereum-api-client/-/ethereum-api-client-0.1.26-beta3.tgz#a3413288d7a5297d02a7b8f254ac28fb7d65cdfc" - integrity sha512-q56uTLieb6utlCV12zRpx08RI/fhP5Tj2VeYxKPUmJcg2VQPr4eH4LTqtZzQj3FMWWsEN9o4MWoUKKUDde9RTQ== +"@rarible/ethereum-api-client@^0.2.0-alpha.1": + version "0.2.0-alpha.1" + resolved "https://registry.yarnpkg.com/@rarible/ethereum-api-client/-/ethereum-api-client-0.2.0-alpha.1.tgz#67b2f0f22935f9bfe719678535e0a0294e22971f" + integrity sha512-w6VFl3uD7cDihL3SnIW6fRAXOSydRPoRaTi+5TXnkoUI7Og3QTd94RqQ7ydvVxHjyPEK6Vq1UOrr2GHoxn1o1A== dependencies: "@rarible/types" "~0.9.2" @@ -23950,7 +23950,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -23968,6 +23968,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -24103,7 +24112,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -24124,6 +24133,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -26567,7 +26583,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -26585,6 +26601,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From 9a653c50af37a7ca0a518669f2eb846d11673ae0 Mon Sep 17 00:00:00 2001 From: "i.yugfeld" Date: Fri, 2 Aug 2024 17:06:29 +0300 Subject: [PATCH 3/4] feat: introduce sellV1 method --- packages/aptos-sdk/src/domain.ts | 9 ++++ packages/aptos-sdk/src/order/index.ts | 22 ++++++++++ .../sdk/src/sdk-blockchains/aptos/listing.ts | 42 ++++++++++++++----- 3 files changed, 62 insertions(+), 11 deletions(-) diff --git a/packages/aptos-sdk/src/domain.ts b/packages/aptos-sdk/src/domain.ts index 7113285e1..4c6a78670 100644 --- a/packages/aptos-sdk/src/domain.ts +++ b/packages/aptos-sdk/src/domain.ts @@ -26,6 +26,15 @@ export interface AptosBalanceSdk { export interface AptosOrderSdk { sell(tokenAddress: string, feeObjectAddress: string, startTime: number, price: string): Promise + sellV1( + feeObjectAddress: string, + creatorAddress: string | undefined, + collectionName: string, + tokenName: string, + propertyVersion: string, + startTime: number, + price: string, + ): Promise buy(listing: string): Promise diff --git a/packages/aptos-sdk/src/order/index.ts b/packages/aptos-sdk/src/order/index.ts index 1b4e307c0..9bf770346 100644 --- a/packages/aptos-sdk/src/order/index.ts +++ b/packages/aptos-sdk/src/order/index.ts @@ -53,6 +53,28 @@ export class AptosOrder implements AptosOrderSdk { return normalizeAptosAddress(change.address) } + sellV1 = async ( + feeObjectAddress: string, + creatorAddress: string | undefined, + collectionName: string, + tokenName: string, + propertyVersion: string, + startTime: number, + price: string, + ) => { + const rawTx = { + function: `${this.config.marketplaceAddress}::coin_listing::init_fixed_price_for_tokenv1`, + typeArguments: [APT_TOKEN_TYPE], + arguments: [creatorAddress, collectionName, tokenName, propertyVersion, feeObjectAddress, startTime, price], + } + const tx = await this.sendAndWaitTx(rawTx) + const change = tx.changes.find(change => isChangeBelongsToType(change, type => type.includes("listing::Listing"))) + if (!change || !("address" in change)) { + throw new Error("Address has not been found") + } + return normalizeAptosAddress(change.address) + } + getListingTokenType = async (listing: string) => { const listingObject = await this.aptos.getAccountResources({ accountAddress: listing, diff --git a/packages/sdk/src/sdk-blockchains/aptos/listing.ts b/packages/sdk/src/sdk-blockchains/aptos/listing.ts index 00e471210..56509ab12 100644 --- a/packages/sdk/src/sdk-blockchains/aptos/listing.ts +++ b/packages/sdk/src/sdk-blockchains/aptos/listing.ts @@ -1,6 +1,6 @@ import type { AptosSdk, SupportedNetwork as SupportedAptosNetwork } from "@rarible/aptos-sdk" import type { IBlockchainTransaction } from "@rarible/sdk-transaction" -import type { OrderId } from "@rarible/api-client" +import { Blockchain, OrderId } from "@rarible/api-client" import { Action } from "@rarible/action" import { extractId } from "@rarible/sdk-common" import { BlockchainAptosTransaction } from "@rarible/sdk-transaction" @@ -34,6 +34,8 @@ export class AptosListing { id: "send-tx" as const, run: async (request: OrderCommon.OrderInternalRequest) => { const aptosItemId = extractId(request.itemId) + const aptosItem = await this.apis.item.getItemById({ itemId: `${Blockchain.APTOS}:${aptosItemId}` }) + if (request.originFees && request.originFees.length > 1) { throw new Error("Origin fees should consist only 1 item") } @@ -42,16 +44,34 @@ export class AptosListing { throw new Error("Only native token currency is available for sell operation") } const startTime = Math.floor(Date.now() / 1000) - const objectAddress = await this.sdk.order.sell( - aptosItemId, - await getFeeObject({ - originFees: request.originFees || [], - defaultFeeAddress: this.sdk.order.getFeeScheduleAddress(), - createFeeSchedule: this.sdk.order.createFeeSchedule, - }), - startTime, - toBn(request.price.toString()).multipliedBy(APT_DIVIDER).toFixed(), - ) + + let objectAddress + if (aptosItem?.extra?.propertyVersionV1 !== undefined) { + objectAddress = await this.sdk.order.sellV1( + await getFeeObject({ + originFees: request.originFees || [], + defaultFeeAddress: this.sdk.order.getFeeScheduleAddress(), + createFeeSchedule: this.sdk.order.createFeeSchedule, + }), + aptosItem.creators[0].account.replace("APTOS:", ""), // todo Irina prettify + aptosItem.itemCollection?.name ?? "", + "Crypto Cats N2", // todo Irina get from item + aptosItem.extra["propertyVersionV1"], + startTime, + toBn(request.price.toString()).multipliedBy(APT_DIVIDER).toFixed(), + ) + } else { + objectAddress = await this.sdk.order.sell( + aptosItemId, + await getFeeObject({ + originFees: request.originFees || [], + defaultFeeAddress: this.sdk.order.getFeeScheduleAddress(), + createFeeSchedule: this.sdk.order.createFeeSchedule, + }), + startTime, + toBn(request.price.toString()).multipliedBy(APT_DIVIDER).toFixed(), + ) + } return convertAptosToUnionOrderId(objectAddress) }, }) From 1a1a67a1ce7e14a4f56277f1c4ec24fd22544c60 Mon Sep 17 00:00:00 2001 From: "i.yugfeld" Date: Fri, 2 Aug 2024 17:53:15 +0300 Subject: [PATCH 4/4] feat: add todo --- packages/sdk/src/sdk-blockchains/aptos/listing.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sdk/src/sdk-blockchains/aptos/listing.ts b/packages/sdk/src/sdk-blockchains/aptos/listing.ts index 56509ab12..eb7287202 100644 --- a/packages/sdk/src/sdk-blockchains/aptos/listing.ts +++ b/packages/sdk/src/sdk-blockchains/aptos/listing.ts @@ -54,8 +54,8 @@ export class AptosListing { createFeeSchedule: this.sdk.order.createFeeSchedule, }), aptosItem.creators[0].account.replace("APTOS:", ""), // todo Irina prettify - aptosItem.itemCollection?.name ?? "", - "Crypto Cats N2", // todo Irina get from item + aptosItem.itemCollection?.name ?? "", // todo Irina aptosItem.extra["onChainCollectionName"] + "Crypto Cats N2", // todo Irina aptosItem.extra["onChainTokenName"] aptosItem.extra["propertyVersionV1"], startTime, toBn(request.price.toString()).multipliedBy(APT_DIVIDER).toFixed(),