diff --git a/packages/browserExtension/src/app/Content/components/App/App.tsx b/packages/browserExtension/src/app/Content/components/App/App.tsx index 47361dbb36..e41a3ce100 100644 --- a/packages/browserExtension/src/app/Content/components/App/App.tsx +++ b/packages/browserExtension/src/app/Content/components/App/App.tsx @@ -121,7 +121,7 @@ const App = () => { ResultUtils.combine([ coreGateway.getScamFilterSettings(), - coreGateway.checkURL(url as DomainName), + coreGateway.checkEntity(url as DomainName), ]).andThen(([scamSettings, scamStatus]) => { if (scamSettings.isScamFilterActive) { if (scamSettings.showMessageEveryTime) { diff --git a/packages/browserExtension/src/app/Content/components/ScamFilterComponent/ScamFilterComponent.tsx b/packages/browserExtension/src/app/Content/components/ScamFilterComponent/ScamFilterComponent.tsx index 3961010ca1..1a52608773 100644 --- a/packages/browserExtension/src/app/Content/components/ScamFilterComponent/ScamFilterComponent.tsx +++ b/packages/browserExtension/src/app/Content/components/ScamFilterComponent/ScamFilterComponent.tsx @@ -10,9 +10,9 @@ export interface IScamFilterComponentProps { } export enum EScamFilterStatus { + NOT_VERIFIED = "NOT VERIFIED", VERIFIED = "VERIFIED", MALICIOUS = "MALICIOUS", - NOT_VERIFIED = "NOT VERIFIED", } export interface IScamFilterPreferences { isScamFilterActive: boolean; diff --git a/packages/browserExtension/src/app/coreGateways/ExternalCoreGateway.ts b/packages/browserExtension/src/app/coreGateways/ExternalCoreGateway.ts index 161b974cb2..69af5f526e 100644 --- a/packages/browserExtension/src/app/coreGateways/ExternalCoreGateway.ts +++ b/packages/browserExtension/src/app/coreGateways/ExternalCoreGateway.ts @@ -30,6 +30,7 @@ import { SiteVisit, URLString, MarketplaceListing, + SiftEntity, } from "@snickerdoodlelabs/objects"; import { JsonRpcEngine, JsonRpcError } from "json-rpc-engine"; import { ResultAsync } from "neverthrow"; @@ -363,7 +364,7 @@ export class ExternalCoreGateway { > { return this._handler.call(EExternalActions.GET_DATA_WALLET_ADDRESS); } - public checkURL(domain: DomainName): ResultAsync { + public checkEntity(domain: DomainName): ResultAsync { return this._handler.call(EExternalActions.CHECK_URL, { domain, } as ICheckURLParams); diff --git a/packages/browserExtension/src/extensionCore/implementations/ExtensionCore.module.ts b/packages/browserExtension/src/extensionCore/implementations/ExtensionCore.module.ts index 997143565a..09f6354cbd 100644 --- a/packages/browserExtension/src/extensionCore/implementations/ExtensionCore.module.ts +++ b/packages/browserExtension/src/extensionCore/implementations/ExtensionCore.module.ts @@ -1,3 +1,18 @@ +import { + AxiosAjaxUtils, + CryptoUtils, + IAxiosAjaxUtils, + IAxiosAjaxUtilsType, + TimeUtils, + ITimeUtils, + ITimeUtilsType, + ICryptoUtils, + ICryptoUtilsType, +} from "@snickerdoodlelabs/common-utils"; +import { ContainerModule, interfaces } from "inversify"; + +import { ScamFilterSettingsUtils } from "./utilities/ScamFilterSettingsUtils"; + import { BrowserTabListener, CoreListener, @@ -59,26 +74,10 @@ import { IUserSiteInteractionService, IUserSiteInteractionServiceType, } from "@interfaces/business"; - -import { - AxiosAjaxUtils, - CryptoUtils, - IAxiosAjaxUtils, - IAxiosAjaxUtilsType, - TimeUtils, - ITimeUtils, - ITimeUtilsType, - ICryptoUtils, - ICryptoUtilsType, -} from "@snickerdoodlelabs/common-utils"; - import { IScamFilterService, IScamFilterServiceType, } from "@interfaces/business/IScamFilterService"; - -import { ContainerModule, interfaces } from "inversify"; - import { IAccountRepository, IAccountRepositoryType, @@ -119,9 +118,6 @@ import { IConfigProvider, IConfigProviderType, } from "@shared/interfaces/configProvider"; - -import { ScamFilterSettingsUtils } from "./utilities/ScamFilterSettingsUtils"; - import configProvider from "@shared/utils/ConfigProvider"; export const extensionCoreModule = new ContainerModule( diff --git a/packages/browserExtension/src/extensionCore/implementations/api/RpcCallHandler.ts b/packages/browserExtension/src/extensionCore/implementations/api/RpcCallHandler.ts index a6be807176..d2c9ab8e90 100644 --- a/packages/browserExtension/src/extensionCore/implementations/api/RpcCallHandler.ts +++ b/packages/browserExtension/src/extensionCore/implementations/api/RpcCallHandler.ts @@ -474,7 +474,7 @@ export class RpcCallHandler implements IRpcCallHandler { } case EExternalActions.CHECK_URL: { const { domain } = params as ICheckURLParams; - return new AsyncRpcResponseSender(this.checkURL(domain), res).call(); + return new AsyncRpcResponseSender(this.checkEntity(domain), res).call(); } case EExternalActions.CLOSE_TAB: { sender?.tab?.id && ExtensionUtils.closeTab(sender.tab.id); @@ -708,10 +708,10 @@ export class RpcCallHandler implements IRpcCallHandler { const invitation = this.contextProvider.getInvitation(id) as Invitation; return this.invitationService.rejectInvitation(invitation); } - private checkURL( + private checkEntity( domain: DomainName, ): ResultAsync { - return this.scamFilterService.checkURL(domain); + return this.scamFilterService.checkEntity(domain); } private unlock( diff --git a/packages/browserExtension/src/extensionCore/implementations/business/ScamFilterService.ts b/packages/browserExtension/src/extensionCore/implementations/business/ScamFilterService.ts index fbb185af04..8cc6155c84 100644 --- a/packages/browserExtension/src/extensionCore/implementations/business/ScamFilterService.ts +++ b/packages/browserExtension/src/extensionCore/implementations/business/ScamFilterService.ts @@ -16,9 +16,9 @@ export class ScamFilterService implements IScamFilterService { protected scamFilterRepository: IScamFilterRepository, ) {} - public checkURL( + public checkEntity( domain: DomainName, ): ResultAsync { - return this.scamFilterRepository.checkURL(domain); + return this.scamFilterRepository.checkEntity(domain); } } diff --git a/packages/browserExtension/src/extensionCore/implementations/data/ScamFilterRepository.ts b/packages/browserExtension/src/extensionCore/implementations/data/ScamFilterRepository.ts index f3adfd5458..9e82955e76 100644 --- a/packages/browserExtension/src/extensionCore/implementations/data/ScamFilterRepository.ts +++ b/packages/browserExtension/src/extensionCore/implementations/data/ScamFilterRepository.ts @@ -18,10 +18,10 @@ export class ScamFilterRepository implements IScamFilterRepository { @inject(IErrorUtilsType) protected errorUtils: IErrorUtils, ) {} - public checkURL( + public checkEntity( domain: DomainName, ): ResultAsync { - return this.core.checkURL(domain).mapErr((error) => { + return this.core.checkEntity(domain).mapErr((error) => { this.errorUtils.emit(error); return new SnickerDoodleCoreError((error as Error).message, error); }); diff --git a/packages/browserExtension/src/extensionCore/interfaces/business/IScamFilterService.ts b/packages/browserExtension/src/extensionCore/interfaces/business/IScamFilterService.ts index 245e736deb..845f5a1f93 100644 --- a/packages/browserExtension/src/extensionCore/interfaces/business/IScamFilterService.ts +++ b/packages/browserExtension/src/extensionCore/interfaces/business/IScamFilterService.ts @@ -4,7 +4,7 @@ import { ResultAsync } from "neverthrow"; import { SnickerDoodleCoreError } from "@shared/objects/errors"; export interface IScamFilterService { - checkURL( + checkEntity( domain: DomainName, ): ResultAsync; } diff --git a/packages/browserExtension/src/extensionCore/interfaces/data/IScamFilterRepository.ts b/packages/browserExtension/src/extensionCore/interfaces/data/IScamFilterRepository.ts index ed1afe9009..6148e89d20 100644 --- a/packages/browserExtension/src/extensionCore/interfaces/data/IScamFilterRepository.ts +++ b/packages/browserExtension/src/extensionCore/interfaces/data/IScamFilterRepository.ts @@ -4,7 +4,7 @@ import { ResultAsync } from "neverthrow"; import { SnickerDoodleCoreError } from "@shared/objects/errors"; export interface IScamFilterRepository { - checkURL( + checkEntity( domain: DomainName, ): ResultAsync; } diff --git a/packages/contracts-sdk/src/implementations/SiftContract.ts b/packages/contracts-sdk/src/implementations/SiftContract.ts index fec94815de..f2bbdc999c 100644 --- a/packages/contracts-sdk/src/implementations/SiftContract.ts +++ b/packages/contracts-sdk/src/implementations/SiftContract.ts @@ -8,6 +8,7 @@ import { HexString, BaseURI, DomainName, + SiftEntity, } from "@snickerdoodlelabs/objects"; import { ethers } from "ethers"; import { injectable } from "inversify"; @@ -33,18 +34,22 @@ export class SiftContract implements ISiftContract { ContractsAbis.SiftAbi.abi, providerOrSigner, ); + console.log("this.contract: ", this.contract); + console.log("contractAddress: ", contractAddress); + console.log("ContractsAbis.SiftAbi.abi: ", ContractsAbis.SiftAbi.abi); + console.log("providerOrSigner: ", providerOrSigner); } - public checkURL( + public checkEntity( domain: DomainName, - ): ResultAsync { + ): ResultAsync { // Returns the tokenURI or string // eg. 'www.sift.com/VERIFIED', 'www.sift.com/MALICIOUS' or 'NOT VERIFIED' return ResultAsync.fromPromise( - this.contract.checkURL(domain) as Promise, + this.contract.checkEntity(domain) as Promise, (e) => { return new SiftContractError( - "Unable to call checkURL()", + "Unable to call checkEntity()", (e as IBlockchainError).reason, e, ); @@ -52,15 +57,17 @@ export class SiftContract implements ISiftContract { ); } - public verifyURL(domain: DomainName): ResultAsync { + public verifyEntity( + domain: DomainName, + ): ResultAsync { return ResultAsync.fromPromise( - this.contract.verifyURL( + this.contract.verifyEntity( domain, ) as Promise, (e) => { // No error handling needed, any reverts from function call should return the reason return new SiftContractError( - "Unable to call verifyURL()", + "Unable to call verifyEntity()", (e as IBlockchainError).reason, e, ); @@ -69,7 +76,7 @@ export class SiftContract implements ISiftContract { .andThen((tx) => { return ResultAsync.fromPromise(tx.wait(), (e) => { return new SiftContractError( - "Wait for verifyURL() failed", + "Wait for verifyEntity() failed", "Unknown", e, ); @@ -78,17 +85,17 @@ export class SiftContract implements ISiftContract { .map(() => {}); } - public maliciousURL( + public maliciousEntity( domain: DomainName, ): ResultAsync { return ResultAsync.fromPromise( - this.contract.maliciousURL( + this.contract.maliciousEntity( domain, ) as Promise, (e) => { // No error handling needed, any reverts from function call should return the reason return new SiftContractError( - "Unable to call maliciousURL()", + "Unable to call maliciousEntity()", (e as IBlockchainError).reason, e, ); @@ -97,7 +104,7 @@ export class SiftContract implements ISiftContract { .andThen((tx) => { return ResultAsync.fromPromise(tx.wait(), (e) => { return new SiftContractError( - "Wait for maliciousURL() failed", + "Wait for maliciousEntity() failed", "Unknown", e, ); diff --git a/packages/contracts-sdk/src/interfaces/ISiftContract.ts b/packages/contracts-sdk/src/interfaces/ISiftContract.ts index 275c9bcb7d..3a8f932520 100644 --- a/packages/contracts-sdk/src/interfaces/ISiftContract.ts +++ b/packages/contracts-sdk/src/interfaces/ISiftContract.ts @@ -9,6 +9,7 @@ import { BlockNumber, DomainName, BaseURI, + SiftEntity, } from "@snickerdoodlelabs/objects"; import { EventFilter, Event } from "ethers"; import { ResultAsync } from "neverthrow"; @@ -21,14 +22,14 @@ export interface ISiftContract { * Marks the domain tokenURI value as VERIFIED * @param domain Domain name to verify */ - verifyURL(domain: DomainName): ResultAsync; + verifyEntity(domain: DomainName): ResultAsync; /** * Sets a URL as malicious * Marks the domain tokenURI value as MALICIOUS * @param domain Domain name to set as malicious */ - maliciousURL(domain: DomainName): ResultAsync; + maliciousEntity(domain: DomainName): ResultAsync; /** * Checks a URL @@ -36,7 +37,7 @@ export interface ISiftContract { * eg. 'www.sift.com/VERIFIED', 'www.sift.com/MALICIOUS' or 'NOT VERIFIED * @param domain Domain name to check */ - checkURL(domain: DomainName): ResultAsync; + checkEntity(domain: DomainName): ResultAsync; /** * Sets a new base uri for the contract diff --git a/packages/contracts-sdk/src/interfaces/objects/abi/SiftAbi.ts b/packages/contracts-sdk/src/interfaces/objects/abi/SiftAbi.ts index b62155560a..cb03c961ac 100644 --- a/packages/contracts-sdk/src/interfaces/objects/abi/SiftAbi.ts +++ b/packages/contracts-sdk/src/interfaces/objects/abi/SiftAbi.ts @@ -3,17 +3,6 @@ export default { contractName: "Sift", sourceName: "contracts/registry/Sift.sol", abi: [ - { - inputs: [ - { - internalType: "string", - name: "baseURInew", - type: "string", - }, - ], - stateMutability: "nonpayable", - type: "constructor", - }, { anonymous: false, inputs: [ @@ -270,16 +259,33 @@ export default { inputs: [ { internalType: "string", - name: "url", + name: "label", type: "string", }, ], - name: "checkURL", + name: "checkEntity", outputs: [ { - internalType: "string", + components: [ + { + internalType: "bytes32", + name: "label", + type: "bytes32", + }, + { + internalType: "string", + name: "metadata", + type: "string", + }, + { + internalType: "uint8", + name: "status", + type: "uint8", + }, + ], + internalType: "struct Sift.entityStruct", name: "result", - type: "string", + type: "tuple", }, ], stateMutability: "view", @@ -445,11 +451,30 @@ export default { stateMutability: "view", type: "function", }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "labelToTokenId", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { internalType: "string", - name: "url", + name: "label", type: "string", }, { @@ -457,8 +482,13 @@ export default { name: "owner", type: "address", }, + { + internalType: "string", + name: "metadata", + type: "string", + }, ], - name: "maliciousURL", + name: "maliciousEntity", outputs: [], stateMutability: "nonpayable", type: "function", @@ -645,6 +675,35 @@ export default { stateMutability: "view", type: "function", }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "tokenIDtoEntity", + outputs: [ + { + internalType: "bytes32", + name: "label", + type: "bytes32", + }, + { + internalType: "string", + name: "metadata", + type: "string", + }, + { + internalType: "uint8", + name: "status", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -700,30 +759,11 @@ export default { stateMutability: "nonpayable", type: "function", }, - { - inputs: [ - { - internalType: "bytes32", - name: "", - type: "bytes32", - }, - ], - name: "urlToTokenId", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, { inputs: [ { internalType: "string", - name: "url", + name: "label", type: "string", }, { @@ -731,17 +771,22 @@ export default { name: "owner", type: "address", }, + { + internalType: "string", + name: "metadata", + type: "string", + }, ], - name: "verifyURL", + name: "verifyEntity", outputs: [], stateMutability: "nonpayable", type: "function", }, ], bytecode: - "0x60806040523480156200001157600080fd5b506040516200327438038062003274833981016040819052620000349162000846565b6200003f8162000046565b5062000a6c565b600054610100900460ff1615808015620000675750600054600160ff909116105b8062000097575062000084306200021160201b62000d1d1760201c565b15801562000097575060005460ff166001145b620001005760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000124576000805461ff0019166101001790555b6200016e6040518060400160405280600481526020016314da599d60e21b8152506040518060400160405280600481526020016314d2519560e21b8152506200022060201b60201c565b6200017862000288565b6200018262000288565b6200018f600033620002e6565b620001bb7f0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea0933620002e6565b620001c6826200032a565b80156200020d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b600054610100900460ff166200027c5760405162461bcd60e51b815260206004820152602b60248201526000805160206200325483398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000f7565b6200020d82826200034d565b600054610100900460ff16620002e45760405162461bcd60e51b815260206004820152602b60248201526000805160206200325483398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000f7565b565b620002fd8282620003d460201b62000d2c1760201c565b600082815261012d602090815260409091206200032591839062000db262000478821b17901c565b505050565b6000620003378162000498565b8151620003259061016190602085019062000757565b600054610100900460ff16620003a95760405162461bcd60e51b815260206004820152602b60248201526000805160206200325483398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000f7565b8151620003be90606590602085019062000757565b5080516200032590606690602084019062000757565b600082815260fb602090815260408083206001600160a01b038516845290915290205460ff166200020d57600082815260fb602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620004343390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006200048f836001600160a01b038416620004a7565b90505b92915050565b620004a48133620004f9565b50565b6000818152600183016020526040812054620004f05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000492565b50600062000492565b600082815260fb602090815260408083206001600160a01b038516845290915290205460ff166200020d576200053a816200058b60201b62000dc71760201c565b6200055083602062000dd96200059e821b17811c565b60405160200162000563929190620008fe565b60408051601f198184030181529082905262461bcd60e51b8252620000f79160040162000977565b6060620004926001600160a01b03831660145b60606000620005af836002620009c2565b620005bc906002620009e4565b6001600160401b03811115620005d657620005d6620007fd565b6040519080825280601f01601f19166020018201604052801562000601576020820181803683370190505b509050600360fc1b816000815181106200061f576200061f620009ff565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110620006515762000651620009ff565b60200101906001600160f81b031916908160001a905350600062000677846002620009c2565b62000684906001620009e4565b90505b600181111562000706576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110620006bc57620006bc620009ff565b1a60f81b828281518110620006d557620006d5620009ff565b60200101906001600160f81b031916908160001a90535060049490941c93620006fe8162000a15565b905062000687565b5083156200048f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620000f7565b828054620007659062000a2f565b90600052602060002090601f016020900481019282620007895760008555620007d4565b82601f10620007a457805160ff1916838001178555620007d4565b82800160010185558215620007d4579182015b82811115620007d4578251825591602001919060010190620007b7565b50620007e2929150620007e6565b5090565b5b80821115620007e25760008155600101620007e7565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200083057818101518382015260200162000816565b8381111562000840576000848401525b50505050565b6000602082840312156200085957600080fd5b81516001600160401b03808211156200087157600080fd5b818401915084601f8301126200088657600080fd5b8151818111156200089b576200089b620007fd565b604051601f8201601f19908116603f01168101908382118183101715620008c657620008c6620007fd565b81604052828152876020848701011115620008e057600080fd5b620008f383602083016020880162000813565b979650505050505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516200093881601785016020880162000813565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516200096b81602884016020880162000813565b01602801949350505050565b60208152600082518060208401526200099881604085016020870162000813565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620009df57620009df620009ac565b500290565b60008219821115620009fa57620009fa620009ac565b500190565b634e487b7160e01b600052603260045260246000fd5b60008162000a275762000a27620009ac565b506000190190565b600181811c9082168062000a4457607f821691505b6020821081141562000a6657634e487b7160e01b600052602260045260246000fd5b50919050565b6127d88062000a7c6000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063b88d4fde116100a2578063d547741f11610071578063d547741f1461041e578063e7705db614610431578063e985e9c514610458578063f62d18881461049457600080fd5b8063b88d4fde146103c4578063c87b56dd146103d7578063ca15c873146103ea578063ca3da15f146103fd57600080fd5b806391d14854116100de57806391d148541461038e57806395d89b41146103a1578063a217fddf146103a9578063a22cb465146103b157600080fd5b806370a08231146103425780637ec9a6f0146103555780638719a3b1146103685780639010d07c1461037b57600080fd5b80632f2ff15d1161018757806355f804b31161015657806355f804b3146103015780635c962100146103145780636352211e146103275780636c0360eb1461033a57600080fd5b80632f2ff15d146102b557806336568abe146102c857806342842e0e146102db57806342966c68146102ee57600080fd5b8063095ea7b3116101c3578063095ea7b31461025257806318160ddd1461026757806323b872dd1461027f578063248a9ca31461029257600080fd5b806301ffc9a7146101ea57806306fdde0314610212578063081812fc14610227575b600080fd5b6101fd6101f83660046120c8565b6104a7565b60405190151581526020015b60405180910390f35b61021a6104b8565b604051610209919061213d565b61023a610235366004612150565b61054a565b6040516001600160a01b039091168152602001610209565b610265610260366004612185565b610571565b005b6102716101625481565b604051908152602001610209565b61026561028d3660046121af565b61068c565b6102716102a0366004612150565b600090815260fb602052604090206001015490565b6102656102c33660046121eb565b6106be565b6102656102d63660046121eb565b6106e3565b6102656102e93660046121af565b610761565b6102656102fc366004612150565b61077c565b61026561030f3660046122c3565b6107ad565b6102656103223660046122f8565b6107cc565b61023a610335366004612150565b6107f8565b61021a610858565b61027161035036600461233d565b6108e7565b6102656103633660046122f8565b61096d565b61021a6103763660046122c3565b610a22565b61023a610389366004612358565b610aa6565b6101fd61039c3660046121eb565b610abf565b61021a610aea565b610271600081565b6102656103bf36600461237a565b610af9565b6102656103d23660046123b6565b610b04565b61021a6103e5366004612150565b610b3c565b6102716103f8366004612150565b610b47565b61027161040b366004612150565b6101606020526000908152604090205481565b61026561042c3660046121eb565b610b5f565b6102717f0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea0981565b6101fd610466366004612432565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b6102656104a23660046122c3565b610b84565b60006104b282610f75565b92915050565b6060606580546104c79061245c565b80601f01602080910402602001604051908101604052809291908181526020018280546104f39061245c565b80156105405780601f1061051557610100808354040283529160200191610540565b820191906000526020600020905b81548152906001019060200180831161052357829003601f168201915b5050505050905090565b600061055582610f9a565b506000908152606960205260409020546001600160a01b031690565b600061057c826107f8565b9050806001600160a01b0316836001600160a01b031614156105ef5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061060b575061060b8133610466565b61067d5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016105e6565b6106878383610ff9565b505050565b610697335b82611067565b6106b35760405162461bcd60e51b81526004016105e690612497565b6106878383836110e6565b600082815260fb60205260409020600101546106d981611257565b6106878383611261565b6001600160a01b03811633146107535760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105e6565b61075d8282611284565b5050565b61068783838360405180602001604052806000815250610b04565b61078533610691565b6107a15760405162461bcd60e51b81526004016105e690612497565b6107aa816112a7565b50565b60006107b881611257565b815161068790610161906020850190611fe3565b61075d81604051806040016040528060098152602001684d414c4943494f555360b81b815250846112c9565b6000818152606760205260408120546001600160a01b0316806104b25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105e6565b61016180546108669061245c565b80601f01602080910402602001604051908101604052809291908181526020018280546108929061245c565b80156108df5780601f106108b4576101008083540402835291602001916108df565b820191906000526020600020905b8154815290600101906020018083116108c257829003601f168201915b505050505081565b60006001600160a01b0382166109515760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105e6565b506001600160a01b031660009081526068602052604090205490565b61016060008360405160200161098391906124e4565b604051602081830303815290604052805190602001208152602001908152602001600020546000146109f75760405162461bcd60e51b815260206004820152601d60248201527f436f6e73656e743a2055524c20616c726561647920766572696669656400000060448201526064016105e6565b61075d8160405180604001604052806008815260200167159154925192515160c21b815250846112c9565b60606000610160600084604051602001610a3c91906124e4565b6040516020818303038152906040528051906020012081526020019081526020016000205490508060001415610a9657505060408051808201909152600c81526b1393d508159154925192515160a21b6020820152919050565b610a9f81610b3c565b9392505050565b600082815261012d60205260408120610a9f908361138e565b600091825260fb602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060606680546104c79061245c565b61075d33838361139a565b610b0e3383611067565b610b2a5760405162461bcd60e51b81526004016105e690612497565b610b3684848484611469565b50505050565b60606104b28261149c565b600081815261012d602052604081206104b290611598565b600082815260fb6020526040902060010154610b7a81611257565b6106878383611284565b600054610100900460ff1615808015610ba45750600054600160ff909116105b80610bbe5750303b158015610bbe575060005460ff166001145b610c215760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016105e6565b6000805460ff191660011790558015610c44576000805461ff0019166101001790555b610c866040518060400160405280600481526020016314da599d60e21b8152506040518060400160405280600481526020016314d2519560e21b8152506115a2565b610c8e6115d3565b610c966115d3565b610ca1600033611261565b610ccb7f0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea0933611261565b610cd4826107ad565b801561075d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6001600160a01b03163b151590565b610d368282610abf565b61075d57600082815260fb602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610d6e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610a9f836001600160a01b0384166115fc565b60606104b26001600160a01b03831660145b60606000610de8836002612516565b610df3906002612535565b67ffffffffffffffff811115610e0b57610e0b612217565b6040519080825280601f01601f191660200182016040528015610e35576020820181803683370190505b509050600360fc1b81600081518110610e5057610e5061254d565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610e7f57610e7f61254d565b60200101906001600160f81b031916908160001a9053506000610ea3846002612516565b610eae906001612535565b90505b6001811115610f26576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610ee257610ee261254d565b1a60f81b828281518110610ef857610ef861254d565b60200101906001600160f81b031916908160001a90535060049490941c93610f1f81612563565b9050610eb1565b508315610a9f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105e6565b60006001600160e01b03198216635a05180f60e01b14806104b257506104b28261164b565b6000818152606760205260409020546001600160a01b03166107aa5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105e6565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061102e826107f8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611073836107f8565b9050806001600160a01b0316846001600160a01b031614806110ba57506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b806110de5750836001600160a01b03166110d38461054a565b6001600160a01b0316145b949350505050565b826001600160a01b03166110f9826107f8565b6001600160a01b03161461111f5760405162461bcd60e51b81526004016105e69061257a565b6001600160a01b0382166111815760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105e6565b61118e8383836001611670565b826001600160a01b03166111a1826107f8565b6001600160a01b0316146111c75760405162461bcd60e51b81526004016105e69061257a565b600081815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260688552838620805460001901905590871680865283862080546001019055868652606790945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6107aa81336116f8565b61126b8282610d2c565b600082815261012d602052604090206106879082610db2565b61128e8282611751565b600082815261012d6020526040902061068790826117b8565b6112b0816117cd565b61016280549060006112c183612563565b919050555050565b7f0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea096112f381611257565b60006112ff61015f5490565b61130a906001612535565b905061131b61015f80546001019055565b611325858261180d565b61132f8185611827565b8061016060008560405160200161134691906124e4565b604051602081830303815290604052805190602001208152602001908152602001600020819055506101626000815480929190611382906125bf565b91905055505050505050565b6000610a9f83836118c1565b816001600160a01b0316836001600160a01b031614156113fc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105e6565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114748484846110e6565b611480848484846118eb565b610b365760405162461bcd60e51b81526004016105e6906125da565b60606114a782610f9a565b600082815260976020526040812080546114c09061245c565b80601f01602080910402602001604051908101604052809291908181526020018280546114ec9061245c565b80156115395780601f1061150e57610100808354040283529160200191611539565b820191906000526020600020905b81548152906001019060200180831161151c57829003601f168201915b50505050509050600061154a6119f8565b905080516000141561155d575092915050565b81511561158f57808260405160200161157792919061262c565b60405160208183030381529060405292505050919050565b6110de84611a08565b60006104b2825490565b600054610100900460ff166115c95760405162461bcd60e51b81526004016105e69061265b565b61075d8282611a6e565b600054610100900460ff166115fa5760405162461bcd60e51b81526004016105e69061265b565b565b6000818152600183016020526040812054611643575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104b2565b5060006104b2565b60006001600160e01b03198216637965db0b60e01b14806104b257506104b282611abc565b6001811115610b36576001600160a01b038416156116b6576001600160a01b038416600090815260686020526040812080548392906116b09084906126a6565b90915550505b6001600160a01b03831615610b36576001600160a01b038316600090815260686020526040812080548392906116ed908490612535565b909155505050505050565b6117028282610abf565b61075d5761170f81610dc7565b61171a836020610dd9565b60405160200161172b9291906126bd565b60408051601f198184030181529082905262461bcd60e51b82526105e69160040161213d565b61175b8282610abf565b1561075d57600082815260fb602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610a9f836001600160a01b038416611b0c565b6117d681611bff565b600081815260976020526040902080546117ef9061245c565b1590506107aa5760008181526097602052604081206107aa91612067565b61075d828260405180602001604052806000815250611ca2565b6000828152606760205260409020546001600160a01b03166118a25760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016105e6565b6000828152609760209081526040909120825161068792840190611fe3565b60008260000182815481106118d8576118d861254d565b9060005260206000200154905092915050565b60006001600160a01b0384163b156119ed57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061192f903390899088908890600401612732565b602060405180830381600087803b15801561194957600080fd5b505af1925050508015611979575060408051601f3d908101601f191682019092526119769181019061276f565b60015b6119d3573d8080156119a7576040519150601f19603f3d011682016040523d82523d6000602084013e6119ac565b606091505b5080516119cb5760405162461bcd60e51b81526004016105e6906125da565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110de565b506001949350505050565b606061016180546104c79061245c565b6060611a1382610f9a565b6000611a1d6119f8565b90506000815111611a3d5760405180602001604052806000815250610a9f565b80611a4784611cd5565b604051602001611a5892919061262c565b6040516020818303038152906040529392505050565b600054610100900460ff16611a955760405162461bcd60e51b81526004016105e69061265b565b8151611aa8906065906020850190611fe3565b508051610687906066906020840190611fe3565b60006001600160e01b031982166380ac58cd60e01b1480611aed57506001600160e01b03198216635b5e139f60e01b145b806104b257506301ffc9a760e01b6001600160e01b03198316146104b2565b60008181526001830160205260408120548015611bf5576000611b306001836126a6565b8554909150600090611b44906001906126a6565b9050818114611ba9576000866000018281548110611b6457611b6461254d565b9060005260206000200154905080876000018481548110611b8757611b8761254d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611bba57611bba61278c565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104b2565b60009150506104b2565b6000611c0a826107f8565b9050611c1a816000846001611670565b611c23826107f8565b600083815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526068845282852080546000190190558785526067909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611cac8383611d72565b611cb960008484846118eb565b6106875760405162461bcd60e51b81526004016105e6906125da565b60606000611ce283611f0b565b600101905060008167ffffffffffffffff811115611d0257611d02612217565b6040519080825280601f01601f191660200182016040528015611d2c576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611d6557611d6a565b611d36565b509392505050565b6001600160a01b038216611dc85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105e6565b6000818152606760205260409020546001600160a01b031615611e2d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105e6565b611e3b600083836001611670565b6000818152606760205260409020546001600160a01b031615611ea05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105e6565b6001600160a01b038216600081815260686020908152604080832080546001019055848352606790915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611f4a5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611f76576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611f9457662386f26fc10000830492506010015b6305f5e1008310611fac576305f5e100830492506008015b6127108310611fc057612710830492506004015b60648310611fd2576064830492506002015b600a83106104b25760010192915050565b828054611fef9061245c565b90600052602060002090601f0160209004810192826120115760008555612057565b82601f1061202a57805160ff1916838001178555612057565b82800160010185558215612057579182015b8281111561205757825182559160200191906001019061203c565b5061206392915061209d565b5090565b5080546120739061245c565b6000825580601f10612083575050565b601f0160209004906000526020600020908101906107aa91905b5b80821115612063576000815560010161209e565b6001600160e01b0319811681146107aa57600080fd5b6000602082840312156120da57600080fd5b8135610a9f816120b2565b60005b838110156121005781810151838201526020016120e8565b83811115610b365750506000910152565b600081518084526121298160208601602086016120e5565b601f01601f19169290920160200192915050565b602081526000610a9f6020830184612111565b60006020828403121561216257600080fd5b5035919050565b80356001600160a01b038116811461218057600080fd5b919050565b6000806040838503121561219857600080fd5b6121a183612169565b946020939093013593505050565b6000806000606084860312156121c457600080fd5b6121cd84612169565b92506121db60208501612169565b9150604084013590509250925092565b600080604083850312156121fe57600080fd5b8235915061220e60208401612169565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561224857612248612217565b604051601f8501601f19908116603f0116810190828211818310171561227057612270612217565b8160405280935085815286868601111561228957600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126122b457600080fd5b610a9f8383356020850161222d565b6000602082840312156122d557600080fd5b813567ffffffffffffffff8111156122ec57600080fd5b6110de848285016122a3565b6000806040838503121561230b57600080fd5b823567ffffffffffffffff81111561232257600080fd5b61232e858286016122a3565b92505061220e60208401612169565b60006020828403121561234f57600080fd5b610a9f82612169565b6000806040838503121561236b57600080fd5b50508035926020909101359150565b6000806040838503121561238d57600080fd5b61239683612169565b9150602083013580151581146123ab57600080fd5b809150509250929050565b600080600080608085870312156123cc57600080fd5b6123d585612169565b93506123e360208601612169565b925060408501359150606085013567ffffffffffffffff81111561240657600080fd5b8501601f8101871361241757600080fd5b6124268782356020840161222d565b91505092959194509250565b6000806040838503121561244557600080fd5b61244e83612169565b915061220e60208401612169565b600181811c9082168061247057607f821691505b6020821081141561249157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b600082516124f68184602087016120e5565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561253057612530612500565b500290565b6000821982111561254857612548612500565b500190565b634e487b7160e01b600052603260045260246000fd5b60008161257257612572612500565b506000190190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60006000198214156125d3576125d3612500565b5060010190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000835161263e8184602088016120e5565b8351908301906126528183602088016120e5565b01949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000828210156126b8576126b8612500565b500390565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516126f58160178501602088016120e5565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516127268160288401602088016120e5565b01602801949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061276590830184612111565b9695505050505050565b60006020828403121561278157600080fd5b8151610a9f816120b2565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220ec3f7d3d699ccf326ddfe95da6527af858ee2666b3fcb8acdad189bbd2534f2464736f6c63430008090033496e697469616c697a61626c653a20636f6e7472616374206973206e6f742069", + "0x608060405234801561001057600080fd5b50612a19806100206000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063b88d4fde116100a2578063d547741f11610071578063d547741f14610458578063e7705db61461046b578063e985e9c514610492578063f62d1888146104ce57600080fd5b8063b88d4fde146103fe578063bd2c89a714610411578063c87b56dd14610432578063ca15c8731461044557600080fd5b806395d89b41116100de57806395d89b41146103b9578063a217fddf146103c1578063a22cb465146103c9578063aa94919b146103dc57600080fd5b806370a082311461036d578063890e901c146103805780639010d07c1461039357806391d14854146103a657600080fd5b80632f2ff15d1161018757806342966c681161015657806342966c681461032c57806355f804b31461033f5780636352211e146103525780636c0360eb1461036557600080fd5b80632f2ff15d146102d357806336568abe146102e65780634246e1d5146102f957806342842e0e1461031957600080fd5b806318160ddd116101c357806318160ddd1461027257806323b872dd1461028a578063241238451461029d578063248a9ca3146102b057600080fd5b806301ffc9a7146101f557806306fdde031461021d578063081812fc14610232578063095ea7b31461025d575b600080fd5b61020861020336600461226f565b6104e1565b60405190151581526020015b60405180910390f35b6102256104f2565b60405161021491906122e4565b6102456102403660046122f7565b610584565b6040516001600160a01b039091168152602001610214565b61027061026b36600461232c565b6105ab565b005b61027c6101305481565b604051908152602001610214565b610270610298366004612356565b6106c6565b6102706102ab36600461243e565b6106f8565b61027c6102be3660046122f7565b600090815260c9602052604090206001015490565b6102706102e13660046124b2565b61078f565b6102706102f43660046124b2565b6107b4565b61030c6103073660046124de565b610832565b6040516102149190612513565b610270610327366004612356565b6109c3565b61027061033a3660046122f7565b6109de565b61027061034d3660046124de565b610a0f565b6102456103603660046122f7565b610a2e565b610225610a8e565b61027c61037b366004612552565b610b1d565b61027061038e36600461243e565b610ba3565b6102456103a136600461256d565b610c3a565b6102086103b43660046124b2565b610c59565b610225610c84565b61027c600081565b6102706103d736600461258f565b610c93565b6103ef6103ea3660046122f7565b610c9e565b604051610214939291906125cb565b61027061040c3660046125f7565b610d4d565b61027c61041f3660046122f7565b61012e6020526000908152604090205481565b6102256104403660046122f7565b610d85565b61027c6104533660046122f7565b610deb565b6102706104663660046124b2565b610e02565b61027c7f0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea0981565b6102086104a0366004612673565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b6102706104dc3660046124de565b610e27565b60006104ec82610fb8565b92915050565b6060606580546105019061269d565b80601f016020809104026020016040519081016040528092919081815260200182805461052d9061269d565b801561057a5780601f1061054f5761010080835404028352916020019161057a565b820191906000526020600020905b81548152906001019060200180831161055d57829003601f168201915b5050505050905090565b600061058f82610fdd565b506000908152606960205260409020546001600160a01b031690565b60006105b682610a2e565b9050806001600160a01b0316836001600160a01b031614156106295760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610645575061064581336104a0565b6106b75760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610620565b6106c1838361103c565b505050565b6106d1335b826110aa565b6106ed5760405162461bcd60e51b8152600401610620906126d8565b6106c1838383611129565b61012e60008460405160200161070e9190612725565b604051602081830303815290604052805190602001208152602001908152602001600020546000146107825760405162461bcd60e51b815260206004820181905260248201527f436f6e73656e743a20456e7469747920616c72656164792076657269666965646044820152606401610620565b6106c1826002858461129a565b600082815260c960205260409020600101546107aa816113ac565b6106c183836113b6565b6001600160a01b03811633146108245760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610620565b61082e82826113d8565b5050565b604080516060808201835260008083526020830191909152918101919091526000826040516020016108649190612725565b604051602081830303815290604052805190602001209050600061012e6000856040516020016108949190612725565b60405160208183030381529060405280519060200120815260200190815260200160002054905080600014156108f15750604080516060810182529182528051602081810183526000808352908401919091529082015292915050565b61013160008281526020019081526020016000206040518060600160405290816000820154815260200160018201805461092a9061269d565b80601f01602080910402602001604051908101604052809291908181526020018280546109569061269d565b80156109a35780601f10610978576101008083540402835291602001916109a3565b820191906000526020600020905b81548152906001019060200180831161098657829003601f168201915b50505091835250506002919091015460ff16602090910152949350505050565b6106c183838360405180602001604052806000815250610d4d565b6109e7336106cb565b610a035760405162461bcd60e51b8152600401610620906126d8565b610a0c816113fa565b50565b6000610a1a816113ac565b81516106c19061012f90602085019061218a565b6000818152606760205260408120546001600160a01b0316806104ec5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610620565b61012f8054610a9c9061269d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac89061269d565b8015610b155780601f10610aea57610100808354040283529160200191610b15565b820191906000526020600020905b815481529060010190602001808311610af857829003601f168201915b505050505081565b60006001600160a01b038216610b875760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610620565b506001600160a01b031660009081526068602052604090205490565b61012e600084604051602001610bb99190612725565b60405160208183030381529060405280519060200120815260200190815260200160002054600014610c2d5760405162461bcd60e51b815260206004820181905260248201527f436f6e73656e743a20456e7469747920616c72656164792076657269666965646044820152606401610620565b6106c1826001858461129a565b600082815260fb60205260408120610c529083611528565b9392505050565b600091825260c9602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060606680546105019061269d565b61082e338383611534565b6101316020526000908152604090208054600182018054919291610cc19061269d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ced9061269d565b8015610d3a5780601f10610d0f57610100808354040283529160200191610d3a565b820191906000526020600020905b815481529060010190602001808311610d1d57829003601f168201915b5050506002909301549192505060ff1683565b610d5733836110aa565b610d735760405162461bcd60e51b8152600401610620906126d8565b610d7f84848484611603565b50505050565b6060610d9082610fdd565b6000610d9a611636565b90506000815111610dba5760405180602001604052806000815250610c52565b80610dc484611646565b604051602001610dd5929190612741565b6040516020818303038152906040529392505050565b600081815260fb602052604081206104ec906116e3565b600082815260c96020526040902060010154610e1d816113ac565b6106c183836113d8565b600054610100900460ff1615808015610e475750600054600160ff909116105b80610e615750303b158015610e61575060005460ff166001145b610ec45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610620565b6000805460ff191660011790558015610ee7576000805461ff0019166101001790555b610f296040518060400160405280600481526020016314da599d60e21b8152506040518060400160405280600481526020016314d2519560e21b8152506116ed565b610f3161171e565b610f3c6000336113b6565b610f667f0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea09336113b6565b610f6f82610a0f565b801561082e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b60006001600160e01b03198216635a05180f60e01b14806104ec57506104ec82611747565b6000818152606760205260409020546001600160a01b0316610a0c5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610620565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061107182610a2e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806110b683610a2e565b9050806001600160a01b0316846001600160a01b031614806110fd57506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b806111215750836001600160a01b031661111684610584565b6001600160a01b0316145b949350505050565b826001600160a01b031661113c82610a2e565b6001600160a01b0316146111625760405162461bcd60e51b815260040161062090612770565b6001600160a01b0382166111c45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610620565b6111d1838383600161176c565b826001600160a01b03166111e482610a2e565b6001600160a01b03161461120a5760405162461bcd60e51b815260040161062090612770565b600081815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260688552838620805460001901905590871680865283862080546001019055868652606790945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b7f0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea096112c4816113ac565b60006112d061012d5490565b6112db9060016127cb565b90506112ec61012d80546001019055565b6112f686826117f4565b6000846040516020016113099190612725565b60408051601f198184030181528282528051602091820120600081815261012e835283812087905560608501845281855284830189815260ff8c16868601528782526101318452939020845181559251805191955061136f92600185019291019061218a565b50604091909101516002909101805460ff191660ff909216919091179055610130805490600061139e836127e3565b919050555050505050505050565b610a0c813361180e565b6113c08282611867565b600082815260fb602052604090206106c190826118ed565b6113e28282611902565b600082815260fb602052604090206106c19082611969565b60006101316000838152602001908152602001600020604051806060016040529081600082015481526020016001820180546114359061269d565b80601f01602080910402602001604051908101604052809291908181526020018280546114619061269d565b80156114ae5780601f10611483576101008083540402835291602001916114ae565b820191906000526020600020905b81548152906001019060200180831161149157829003601f168201915b50505091835250506002919091015460ff166020918201528151600090815261012e825260408082208290558582526101319092529081208181559192506114f9600183018261220e565b50600201805460ff1916905561150e8261197e565b610130805490600061151f836127fe565b91905055505050565b6000610c528383611a21565b816001600160a01b0316836001600160a01b031614156115965760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610620565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61160e848484611129565b61161a84848484611a4b565b610d7f5760405162461bcd60e51b815260040161062090612815565b606061012f80546105019061269d565b6060600061165383611b58565b600101905060008167ffffffffffffffff81111561167357611673612392565b6040519080825280601f01601f19166020018201604052801561169d576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846116d6576116db565b6116a7565b509392505050565b60006104ec825490565b600054610100900460ff166117145760405162461bcd60e51b815260040161062090612867565b61082e8282611c30565b600054610100900460ff166117455760405162461bcd60e51b815260040161062090612867565b565b60006001600160e01b03198216637965db0b60e01b14806104ec57506104ec82611c7e565b6001811115610d7f576001600160a01b038416156117b2576001600160a01b038416600090815260686020526040812080548392906117ac9084906128b2565b90915550505b6001600160a01b03831615610d7f576001600160a01b038316600090815260686020526040812080548392906117e99084906127cb565b909155505050505050565b61082e828260405180602001604052806000815250611cce565b6118188282610c59565b61082e5761182581611d01565b611830836020611d13565b6040516020016118419291906128c9565b60408051601f198184030181529082905262461bcd60e51b8252610620916004016122e4565b6118718282610c59565b61082e57600082815260c9602090815260408083206001600160a01b03851684529091529020805460ff191660011790556118a93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610c52836001600160a01b038416611eaf565b61190c8282610c59565b1561082e57600082815260c9602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610c52836001600160a01b038416611efe565b600061198982610a2e565b905061199981600084600161176c565b6119a282610a2e565b600083815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526068845282852080546000190190558785526067909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000826000018281548110611a3857611a3861293e565b9060005260206000200154905092915050565b60006001600160a01b0384163b15611b4d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a8f903390899088908890600401612954565b602060405180830381600087803b158015611aa957600080fd5b505af1925050508015611ad9575060408051601f3d908101601f19168201909252611ad691810190612991565b60015b611b33573d808015611b07576040519150601f19603f3d011682016040523d82523d6000602084013e611b0c565b606091505b508051611b2b5760405162461bcd60e51b815260040161062090612815565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611121565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611b975772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611bc3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611be157662386f26fc10000830492506010015b6305f5e1008310611bf9576305f5e100830492506008015b6127108310611c0d57612710830492506004015b60648310611c1f576064830492506002015b600a83106104ec5760010192915050565b600054610100900460ff16611c575760405162461bcd60e51b815260040161062090612867565b8151611c6a90606590602085019061218a565b5080516106c190606690602084019061218a565b60006001600160e01b031982166380ac58cd60e01b1480611caf57506001600160e01b03198216635b5e139f60e01b145b806104ec57506301ffc9a760e01b6001600160e01b03198316146104ec565b611cd88383611ff1565b611ce56000848484611a4b565b6106c15760405162461bcd60e51b815260040161062090612815565b60606104ec6001600160a01b03831660145b60606000611d228360026129ae565b611d2d9060026127cb565b67ffffffffffffffff811115611d4557611d45612392565b6040519080825280601f01601f191660200182016040528015611d6f576020820181803683370190505b509050600360fc1b81600081518110611d8a57611d8a61293e565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611db957611db961293e565b60200101906001600160f81b031916908160001a9053506000611ddd8460026129ae565b611de89060016127cb565b90505b6001811115611e60576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611e1c57611e1c61293e565b1a60f81b828281518110611e3257611e3261293e565b60200101906001600160f81b031916908160001a90535060049490941c93611e59816127fe565b9050611deb565b508315610c525760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610620565b6000818152600183016020526040812054611ef6575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104ec565b5060006104ec565b60008181526001830160205260408120548015611fe7576000611f226001836128b2565b8554909150600090611f36906001906128b2565b9050818114611f9b576000866000018281548110611f5657611f5661293e565b9060005260206000200154905080876000018481548110611f7957611f7961293e565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611fac57611fac6129cd565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104ec565b60009150506104ec565b6001600160a01b0382166120475760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610620565b6000818152606760205260409020546001600160a01b0316156120ac5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610620565b6120ba60008383600161176c565b6000818152606760205260409020546001600160a01b03161561211f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610620565b6001600160a01b038216600081815260686020908152604080832080546001019055848352606790915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121969061269d565b90600052602060002090601f0160209004810192826121b857600085556121fe565b82601f106121d157805160ff19168380011785556121fe565b828001600101855582156121fe579182015b828111156121fe5782518255916020019190600101906121e3565b5061220a929150612244565b5090565b50805461221a9061269d565b6000825580601f1061222a575050565b601f016020900490600052602060002090810190610a0c91905b5b8082111561220a5760008155600101612245565b6001600160e01b031981168114610a0c57600080fd5b60006020828403121561228157600080fd5b8135610c5281612259565b60005b838110156122a757818101518382015260200161228f565b83811115610d7f5750506000910152565b600081518084526122d081602086016020860161228c565b601f01601f19169290920160200192915050565b602081526000610c5260208301846122b8565b60006020828403121561230957600080fd5b5035919050565b80356001600160a01b038116811461232757600080fd5b919050565b6000806040838503121561233f57600080fd5b61234883612310565b946020939093013593505050565b60008060006060848603121561236b57600080fd5b61237484612310565b925061238260208501612310565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156123c3576123c3612392565b604051601f8501601f19908116603f011681019082821181831017156123eb576123eb612392565b8160405280935085815286868601111561240457600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261242f57600080fd5b610c52838335602085016123a8565b60008060006060848603121561245357600080fd5b833567ffffffffffffffff8082111561246b57600080fd5b6124778783880161241e565b945061248560208701612310565b9350604086013591508082111561249b57600080fd5b506124a88682870161241e565b9150509250925092565b600080604083850312156124c557600080fd5b823591506124d560208401612310565b90509250929050565b6000602082840312156124f057600080fd5b813567ffffffffffffffff81111561250757600080fd5b6111218482850161241e565b6020815281516020820152600060208301516060604084015261253960808401826122b8565b905060ff60408501511660608401528091505092915050565b60006020828403121561256457600080fd5b610c5282612310565b6000806040838503121561258057600080fd5b50508035926020909101359150565b600080604083850312156125a257600080fd5b6125ab83612310565b9150602083013580151581146125c057600080fd5b809150509250929050565b8381526060602082015260006125e460608301856122b8565b905060ff83166040830152949350505050565b6000806000806080858703121561260d57600080fd5b61261685612310565b935061262460208601612310565b925060408501359150606085013567ffffffffffffffff81111561264757600080fd5b8501601f8101871361265857600080fd5b612667878235602084016123a8565b91505092959194509250565b6000806040838503121561268657600080fd5b61268f83612310565b91506124d560208401612310565b600181811c908216806126b157607f821691505b602082108114156126d257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6000825161273781846020870161228c565b9190910192915050565b6000835161275381846020880161228c565b83519083019061276781836020880161228c565b01949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156127de576127de6127b5565b500190565b60006000198214156127f7576127f76127b5565b5060010190565b60008161280d5761280d6127b5565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000828210156128c4576128c46127b5565b500390565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161290181601785016020880161228c565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161293281602884016020880161228c565b01602801949350505050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612987908301846122b8565b9695505050505050565b6000602082840312156129a357600080fd5b8151610c5281612259565b60008160001904831182151516156129c8576129c86127b5565b500290565b634e487b7160e01b600052603160045260246000fdfea264697066735822122085a9aae4933277c936f5247c2672673eb114695cac17f870112bd12e85a2a07a64736f6c63430008090033", deployedBytecode: - "0x608060405234801561001057600080fd5b50600436106101e55760003560e01c806370a082311161010f578063b88d4fde116100a2578063d547741f11610071578063d547741f1461041e578063e7705db614610431578063e985e9c514610458578063f62d18881461049457600080fd5b8063b88d4fde146103c4578063c87b56dd146103d7578063ca15c873146103ea578063ca3da15f146103fd57600080fd5b806391d14854116100de57806391d148541461038e57806395d89b41146103a1578063a217fddf146103a9578063a22cb465146103b157600080fd5b806370a08231146103425780637ec9a6f0146103555780638719a3b1146103685780639010d07c1461037b57600080fd5b80632f2ff15d1161018757806355f804b31161015657806355f804b3146103015780635c962100146103145780636352211e146103275780636c0360eb1461033a57600080fd5b80632f2ff15d146102b557806336568abe146102c857806342842e0e146102db57806342966c68146102ee57600080fd5b8063095ea7b3116101c3578063095ea7b31461025257806318160ddd1461026757806323b872dd1461027f578063248a9ca31461029257600080fd5b806301ffc9a7146101ea57806306fdde0314610212578063081812fc14610227575b600080fd5b6101fd6101f83660046120c8565b6104a7565b60405190151581526020015b60405180910390f35b61021a6104b8565b604051610209919061213d565b61023a610235366004612150565b61054a565b6040516001600160a01b039091168152602001610209565b610265610260366004612185565b610571565b005b6102716101625481565b604051908152602001610209565b61026561028d3660046121af565b61068c565b6102716102a0366004612150565b600090815260fb602052604090206001015490565b6102656102c33660046121eb565b6106be565b6102656102d63660046121eb565b6106e3565b6102656102e93660046121af565b610761565b6102656102fc366004612150565b61077c565b61026561030f3660046122c3565b6107ad565b6102656103223660046122f8565b6107cc565b61023a610335366004612150565b6107f8565b61021a610858565b61027161035036600461233d565b6108e7565b6102656103633660046122f8565b61096d565b61021a6103763660046122c3565b610a22565b61023a610389366004612358565b610aa6565b6101fd61039c3660046121eb565b610abf565b61021a610aea565b610271600081565b6102656103bf36600461237a565b610af9565b6102656103d23660046123b6565b610b04565b61021a6103e5366004612150565b610b3c565b6102716103f8366004612150565b610b47565b61027161040b366004612150565b6101606020526000908152604090205481565b61026561042c3660046121eb565b610b5f565b6102717f0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea0981565b6101fd610466366004612432565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b6102656104a23660046122c3565b610b84565b60006104b282610f75565b92915050565b6060606580546104c79061245c565b80601f01602080910402602001604051908101604052809291908181526020018280546104f39061245c565b80156105405780601f1061051557610100808354040283529160200191610540565b820191906000526020600020905b81548152906001019060200180831161052357829003601f168201915b5050505050905090565b600061055582610f9a565b506000908152606960205260409020546001600160a01b031690565b600061057c826107f8565b9050806001600160a01b0316836001600160a01b031614156105ef5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061060b575061060b8133610466565b61067d5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016105e6565b6106878383610ff9565b505050565b610697335b82611067565b6106b35760405162461bcd60e51b81526004016105e690612497565b6106878383836110e6565b600082815260fb60205260409020600101546106d981611257565b6106878383611261565b6001600160a01b03811633146107535760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105e6565b61075d8282611284565b5050565b61068783838360405180602001604052806000815250610b04565b61078533610691565b6107a15760405162461bcd60e51b81526004016105e690612497565b6107aa816112a7565b50565b60006107b881611257565b815161068790610161906020850190611fe3565b61075d81604051806040016040528060098152602001684d414c4943494f555360b81b815250846112c9565b6000818152606760205260408120546001600160a01b0316806104b25760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105e6565b61016180546108669061245c565b80601f01602080910402602001604051908101604052809291908181526020018280546108929061245c565b80156108df5780601f106108b4576101008083540402835291602001916108df565b820191906000526020600020905b8154815290600101906020018083116108c257829003601f168201915b505050505081565b60006001600160a01b0382166109515760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016105e6565b506001600160a01b031660009081526068602052604090205490565b61016060008360405160200161098391906124e4565b604051602081830303815290604052805190602001208152602001908152602001600020546000146109f75760405162461bcd60e51b815260206004820152601d60248201527f436f6e73656e743a2055524c20616c726561647920766572696669656400000060448201526064016105e6565b61075d8160405180604001604052806008815260200167159154925192515160c21b815250846112c9565b60606000610160600084604051602001610a3c91906124e4565b6040516020818303038152906040528051906020012081526020019081526020016000205490508060001415610a9657505060408051808201909152600c81526b1393d508159154925192515160a21b6020820152919050565b610a9f81610b3c565b9392505050565b600082815261012d60205260408120610a9f908361138e565b600091825260fb602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060606680546104c79061245c565b61075d33838361139a565b610b0e3383611067565b610b2a5760405162461bcd60e51b81526004016105e690612497565b610b3684848484611469565b50505050565b60606104b28261149c565b600081815261012d602052604081206104b290611598565b600082815260fb6020526040902060010154610b7a81611257565b6106878383611284565b600054610100900460ff1615808015610ba45750600054600160ff909116105b80610bbe5750303b158015610bbe575060005460ff166001145b610c215760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016105e6565b6000805460ff191660011790558015610c44576000805461ff0019166101001790555b610c866040518060400160405280600481526020016314da599d60e21b8152506040518060400160405280600481526020016314d2519560e21b8152506115a2565b610c8e6115d3565b610c966115d3565b610ca1600033611261565b610ccb7f0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea0933611261565b610cd4826107ad565b801561075d576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6001600160a01b03163b151590565b610d368282610abf565b61075d57600082815260fb602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610d6e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610a9f836001600160a01b0384166115fc565b60606104b26001600160a01b03831660145b60606000610de8836002612516565b610df3906002612535565b67ffffffffffffffff811115610e0b57610e0b612217565b6040519080825280601f01601f191660200182016040528015610e35576020820181803683370190505b509050600360fc1b81600081518110610e5057610e5061254d565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610e7f57610e7f61254d565b60200101906001600160f81b031916908160001a9053506000610ea3846002612516565b610eae906001612535565b90505b6001811115610f26576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610ee257610ee261254d565b1a60f81b828281518110610ef857610ef861254d565b60200101906001600160f81b031916908160001a90535060049490941c93610f1f81612563565b9050610eb1565b508315610a9f5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105e6565b60006001600160e01b03198216635a05180f60e01b14806104b257506104b28261164b565b6000818152606760205260409020546001600160a01b03166107aa5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016105e6565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061102e826107f8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611073836107f8565b9050806001600160a01b0316846001600160a01b031614806110ba57506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b806110de5750836001600160a01b03166110d38461054a565b6001600160a01b0316145b949350505050565b826001600160a01b03166110f9826107f8565b6001600160a01b03161461111f5760405162461bcd60e51b81526004016105e69061257a565b6001600160a01b0382166111815760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016105e6565b61118e8383836001611670565b826001600160a01b03166111a1826107f8565b6001600160a01b0316146111c75760405162461bcd60e51b81526004016105e69061257a565b600081815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260688552838620805460001901905590871680865283862080546001019055868652606790945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6107aa81336116f8565b61126b8282610d2c565b600082815261012d602052604090206106879082610db2565b61128e8282611751565b600082815261012d6020526040902061068790826117b8565b6112b0816117cd565b61016280549060006112c183612563565b919050555050565b7f0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea096112f381611257565b60006112ff61015f5490565b61130a906001612535565b905061131b61015f80546001019055565b611325858261180d565b61132f8185611827565b8061016060008560405160200161134691906124e4565b604051602081830303815290604052805190602001208152602001908152602001600020819055506101626000815480929190611382906125bf565b91905055505050505050565b6000610a9f83836118c1565b816001600160a01b0316836001600160a01b031614156113fc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105e6565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6114748484846110e6565b611480848484846118eb565b610b365760405162461bcd60e51b81526004016105e6906125da565b60606114a782610f9a565b600082815260976020526040812080546114c09061245c565b80601f01602080910402602001604051908101604052809291908181526020018280546114ec9061245c565b80156115395780601f1061150e57610100808354040283529160200191611539565b820191906000526020600020905b81548152906001019060200180831161151c57829003601f168201915b50505050509050600061154a6119f8565b905080516000141561155d575092915050565b81511561158f57808260405160200161157792919061262c565b60405160208183030381529060405292505050919050565b6110de84611a08565b60006104b2825490565b600054610100900460ff166115c95760405162461bcd60e51b81526004016105e69061265b565b61075d8282611a6e565b600054610100900460ff166115fa5760405162461bcd60e51b81526004016105e69061265b565b565b6000818152600183016020526040812054611643575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104b2565b5060006104b2565b60006001600160e01b03198216637965db0b60e01b14806104b257506104b282611abc565b6001811115610b36576001600160a01b038416156116b6576001600160a01b038416600090815260686020526040812080548392906116b09084906126a6565b90915550505b6001600160a01b03831615610b36576001600160a01b038316600090815260686020526040812080548392906116ed908490612535565b909155505050505050565b6117028282610abf565b61075d5761170f81610dc7565b61171a836020610dd9565b60405160200161172b9291906126bd565b60408051601f198184030181529082905262461bcd60e51b82526105e69160040161213d565b61175b8282610abf565b1561075d57600082815260fb602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610a9f836001600160a01b038416611b0c565b6117d681611bff565b600081815260976020526040902080546117ef9061245c565b1590506107aa5760008181526097602052604081206107aa91612067565b61075d828260405180602001604052806000815250611ca2565b6000828152606760205260409020546001600160a01b03166118a25760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016105e6565b6000828152609760209081526040909120825161068792840190611fe3565b60008260000182815481106118d8576118d861254d565b9060005260206000200154905092915050565b60006001600160a01b0384163b156119ed57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061192f903390899088908890600401612732565b602060405180830381600087803b15801561194957600080fd5b505af1925050508015611979575060408051601f3d908101601f191682019092526119769181019061276f565b60015b6119d3573d8080156119a7576040519150601f19603f3d011682016040523d82523d6000602084013e6119ac565b606091505b5080516119cb5760405162461bcd60e51b81526004016105e6906125da565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110de565b506001949350505050565b606061016180546104c79061245c565b6060611a1382610f9a565b6000611a1d6119f8565b90506000815111611a3d5760405180602001604052806000815250610a9f565b80611a4784611cd5565b604051602001611a5892919061262c565b6040516020818303038152906040529392505050565b600054610100900460ff16611a955760405162461bcd60e51b81526004016105e69061265b565b8151611aa8906065906020850190611fe3565b508051610687906066906020840190611fe3565b60006001600160e01b031982166380ac58cd60e01b1480611aed57506001600160e01b03198216635b5e139f60e01b145b806104b257506301ffc9a760e01b6001600160e01b03198316146104b2565b60008181526001830160205260408120548015611bf5576000611b306001836126a6565b8554909150600090611b44906001906126a6565b9050818114611ba9576000866000018281548110611b6457611b6461254d565b9060005260206000200154905080876000018481548110611b8757611b8761254d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611bba57611bba61278c565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104b2565b60009150506104b2565b6000611c0a826107f8565b9050611c1a816000846001611670565b611c23826107f8565b600083815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526068845282852080546000190190558785526067909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611cac8383611d72565b611cb960008484846118eb565b6106875760405162461bcd60e51b81526004016105e6906125da565b60606000611ce283611f0b565b600101905060008167ffffffffffffffff811115611d0257611d02612217565b6040519080825280601f01601f191660200182016040528015611d2c576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611d6557611d6a565b611d36565b509392505050565b6001600160a01b038216611dc85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105e6565b6000818152606760205260409020546001600160a01b031615611e2d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105e6565b611e3b600083836001611670565b6000818152606760205260409020546001600160a01b031615611ea05760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105e6565b6001600160a01b038216600081815260686020908152604080832080546001019055848352606790915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611f4a5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611f76576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611f9457662386f26fc10000830492506010015b6305f5e1008310611fac576305f5e100830492506008015b6127108310611fc057612710830492506004015b60648310611fd2576064830492506002015b600a83106104b25760010192915050565b828054611fef9061245c565b90600052602060002090601f0160209004810192826120115760008555612057565b82601f1061202a57805160ff1916838001178555612057565b82800160010185558215612057579182015b8281111561205757825182559160200191906001019061203c565b5061206392915061209d565b5090565b5080546120739061245c565b6000825580601f10612083575050565b601f0160209004906000526020600020908101906107aa91905b5b80821115612063576000815560010161209e565b6001600160e01b0319811681146107aa57600080fd5b6000602082840312156120da57600080fd5b8135610a9f816120b2565b60005b838110156121005781810151838201526020016120e8565b83811115610b365750506000910152565b600081518084526121298160208601602086016120e5565b601f01601f19169290920160200192915050565b602081526000610a9f6020830184612111565b60006020828403121561216257600080fd5b5035919050565b80356001600160a01b038116811461218057600080fd5b919050565b6000806040838503121561219857600080fd5b6121a183612169565b946020939093013593505050565b6000806000606084860312156121c457600080fd5b6121cd84612169565b92506121db60208501612169565b9150604084013590509250925092565b600080604083850312156121fe57600080fd5b8235915061220e60208401612169565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561224857612248612217565b604051601f8501601f19908116603f0116810190828211818310171561227057612270612217565b8160405280935085815286868601111561228957600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126122b457600080fd5b610a9f8383356020850161222d565b6000602082840312156122d557600080fd5b813567ffffffffffffffff8111156122ec57600080fd5b6110de848285016122a3565b6000806040838503121561230b57600080fd5b823567ffffffffffffffff81111561232257600080fd5b61232e858286016122a3565b92505061220e60208401612169565b60006020828403121561234f57600080fd5b610a9f82612169565b6000806040838503121561236b57600080fd5b50508035926020909101359150565b6000806040838503121561238d57600080fd5b61239683612169565b9150602083013580151581146123ab57600080fd5b809150509250929050565b600080600080608085870312156123cc57600080fd5b6123d585612169565b93506123e360208601612169565b925060408501359150606085013567ffffffffffffffff81111561240657600080fd5b8501601f8101871361241757600080fd5b6124268782356020840161222d565b91505092959194509250565b6000806040838503121561244557600080fd5b61244e83612169565b915061220e60208401612169565b600181811c9082168061247057607f821691505b6020821081141561249157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b600082516124f68184602087016120e5565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561253057612530612500565b500290565b6000821982111561254857612548612500565b500190565b634e487b7160e01b600052603260045260246000fd5b60008161257257612572612500565b506000190190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60006000198214156125d3576125d3612500565b5060010190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000835161263e8184602088016120e5565b8351908301906126528183602088016120e5565b01949350505050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000828210156126b8576126b8612500565b500390565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516126f58160178501602088016120e5565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516127268160288401602088016120e5565b01602801949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061276590830184612111565b9695505050505050565b60006020828403121561278157600080fd5b8151610a9f816120b2565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220ec3f7d3d699ccf326ddfe95da6527af858ee2666b3fcb8acdad189bbd2534f2464736f6c63430008090033", + "0x608060405234801561001057600080fd5b50600436106101f05760003560e01c806370a082311161010f578063b88d4fde116100a2578063d547741f11610071578063d547741f14610458578063e7705db61461046b578063e985e9c514610492578063f62d1888146104ce57600080fd5b8063b88d4fde146103fe578063bd2c89a714610411578063c87b56dd14610432578063ca15c8731461044557600080fd5b806395d89b41116100de57806395d89b41146103b9578063a217fddf146103c1578063a22cb465146103c9578063aa94919b146103dc57600080fd5b806370a082311461036d578063890e901c146103805780639010d07c1461039357806391d14854146103a657600080fd5b80632f2ff15d1161018757806342966c681161015657806342966c681461032c57806355f804b31461033f5780636352211e146103525780636c0360eb1461036557600080fd5b80632f2ff15d146102d357806336568abe146102e65780634246e1d5146102f957806342842e0e1461031957600080fd5b806318160ddd116101c357806318160ddd1461027257806323b872dd1461028a578063241238451461029d578063248a9ca3146102b057600080fd5b806301ffc9a7146101f557806306fdde031461021d578063081812fc14610232578063095ea7b31461025d575b600080fd5b61020861020336600461226f565b6104e1565b60405190151581526020015b60405180910390f35b6102256104f2565b60405161021491906122e4565b6102456102403660046122f7565b610584565b6040516001600160a01b039091168152602001610214565b61027061026b36600461232c565b6105ab565b005b61027c6101305481565b604051908152602001610214565b610270610298366004612356565b6106c6565b6102706102ab36600461243e565b6106f8565b61027c6102be3660046122f7565b600090815260c9602052604090206001015490565b6102706102e13660046124b2565b61078f565b6102706102f43660046124b2565b6107b4565b61030c6103073660046124de565b610832565b6040516102149190612513565b610270610327366004612356565b6109c3565b61027061033a3660046122f7565b6109de565b61027061034d3660046124de565b610a0f565b6102456103603660046122f7565b610a2e565b610225610a8e565b61027c61037b366004612552565b610b1d565b61027061038e36600461243e565b610ba3565b6102456103a136600461256d565b610c3a565b6102086103b43660046124b2565b610c59565b610225610c84565b61027c600081565b6102706103d736600461258f565b610c93565b6103ef6103ea3660046122f7565b610c9e565b604051610214939291906125cb565b61027061040c3660046125f7565b610d4d565b61027c61041f3660046122f7565b61012e6020526000908152604090205481565b6102256104403660046122f7565b610d85565b61027c6104533660046122f7565b610deb565b6102706104663660046124b2565b610e02565b61027c7f0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea0981565b6102086104a0366004612673565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b6102706104dc3660046124de565b610e27565b60006104ec82610fb8565b92915050565b6060606580546105019061269d565b80601f016020809104026020016040519081016040528092919081815260200182805461052d9061269d565b801561057a5780601f1061054f5761010080835404028352916020019161057a565b820191906000526020600020905b81548152906001019060200180831161055d57829003601f168201915b5050505050905090565b600061058f82610fdd565b506000908152606960205260409020546001600160a01b031690565b60006105b682610a2e565b9050806001600160a01b0316836001600160a01b031614156106295760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610645575061064581336104a0565b6106b75760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610620565b6106c1838361103c565b505050565b6106d1335b826110aa565b6106ed5760405162461bcd60e51b8152600401610620906126d8565b6106c1838383611129565b61012e60008460405160200161070e9190612725565b604051602081830303815290604052805190602001208152602001908152602001600020546000146107825760405162461bcd60e51b815260206004820181905260248201527f436f6e73656e743a20456e7469747920616c72656164792076657269666965646044820152606401610620565b6106c1826002858461129a565b600082815260c960205260409020600101546107aa816113ac565b6106c183836113b6565b6001600160a01b03811633146108245760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610620565b61082e82826113d8565b5050565b604080516060808201835260008083526020830191909152918101919091526000826040516020016108649190612725565b604051602081830303815290604052805190602001209050600061012e6000856040516020016108949190612725565b60405160208183030381529060405280519060200120815260200190815260200160002054905080600014156108f15750604080516060810182529182528051602081810183526000808352908401919091529082015292915050565b61013160008281526020019081526020016000206040518060600160405290816000820154815260200160018201805461092a9061269d565b80601f01602080910402602001604051908101604052809291908181526020018280546109569061269d565b80156109a35780601f10610978576101008083540402835291602001916109a3565b820191906000526020600020905b81548152906001019060200180831161098657829003601f168201915b50505091835250506002919091015460ff16602090910152949350505050565b6106c183838360405180602001604052806000815250610d4d565b6109e7336106cb565b610a035760405162461bcd60e51b8152600401610620906126d8565b610a0c816113fa565b50565b6000610a1a816113ac565b81516106c19061012f90602085019061218a565b6000818152606760205260408120546001600160a01b0316806104ec5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610620565b61012f8054610a9c9061269d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ac89061269d565b8015610b155780601f10610aea57610100808354040283529160200191610b15565b820191906000526020600020905b815481529060010190602001808311610af857829003601f168201915b505050505081565b60006001600160a01b038216610b875760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610620565b506001600160a01b031660009081526068602052604090205490565b61012e600084604051602001610bb99190612725565b60405160208183030381529060405280519060200120815260200190815260200160002054600014610c2d5760405162461bcd60e51b815260206004820181905260248201527f436f6e73656e743a20456e7469747920616c72656164792076657269666965646044820152606401610620565b6106c1826001858461129a565b600082815260fb60205260408120610c529083611528565b9392505050565b600091825260c9602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060606680546105019061269d565b61082e338383611534565b6101316020526000908152604090208054600182018054919291610cc19061269d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ced9061269d565b8015610d3a5780601f10610d0f57610100808354040283529160200191610d3a565b820191906000526020600020905b815481529060010190602001808311610d1d57829003601f168201915b5050506002909301549192505060ff1683565b610d5733836110aa565b610d735760405162461bcd60e51b8152600401610620906126d8565b610d7f84848484611603565b50505050565b6060610d9082610fdd565b6000610d9a611636565b90506000815111610dba5760405180602001604052806000815250610c52565b80610dc484611646565b604051602001610dd5929190612741565b6040516020818303038152906040529392505050565b600081815260fb602052604081206104ec906116e3565b600082815260c96020526040902060010154610e1d816113ac565b6106c183836113d8565b600054610100900460ff1615808015610e475750600054600160ff909116105b80610e615750303b158015610e61575060005460ff166001145b610ec45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610620565b6000805460ff191660011790558015610ee7576000805461ff0019166101001790555b610f296040518060400160405280600481526020016314da599d60e21b8152506040518060400160405280600481526020016314d2519560e21b8152506116ed565b610f3161171e565b610f3c6000336113b6565b610f667f0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea09336113b6565b610f6f82610a0f565b801561082e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b60006001600160e01b03198216635a05180f60e01b14806104ec57506104ec82611747565b6000818152606760205260409020546001600160a01b0316610a0c5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610620565b600081815260696020526040902080546001600160a01b0319166001600160a01b038416908117909155819061107182610a2e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806110b683610a2e565b9050806001600160a01b0316846001600160a01b031614806110fd57506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b806111215750836001600160a01b031661111684610584565b6001600160a01b0316145b949350505050565b826001600160a01b031661113c82610a2e565b6001600160a01b0316146111625760405162461bcd60e51b815260040161062090612770565b6001600160a01b0382166111c45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610620565b6111d1838383600161176c565b826001600160a01b03166111e482610a2e565b6001600160a01b03161461120a5760405162461bcd60e51b815260040161062090612770565b600081815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260688552838620805460001901905590871680865283862080546001019055868652606790945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b7f0ce23c3e399818cfee81a7ab0880f714e53d7672b08df0fa62f2843416e1ea096112c4816113ac565b60006112d061012d5490565b6112db9060016127cb565b90506112ec61012d80546001019055565b6112f686826117f4565b6000846040516020016113099190612725565b60408051601f198184030181528282528051602091820120600081815261012e835283812087905560608501845281855284830189815260ff8c16868601528782526101318452939020845181559251805191955061136f92600185019291019061218a565b50604091909101516002909101805460ff191660ff909216919091179055610130805490600061139e836127e3565b919050555050505050505050565b610a0c813361180e565b6113c08282611867565b600082815260fb602052604090206106c190826118ed565b6113e28282611902565b600082815260fb602052604090206106c19082611969565b60006101316000838152602001908152602001600020604051806060016040529081600082015481526020016001820180546114359061269d565b80601f01602080910402602001604051908101604052809291908181526020018280546114619061269d565b80156114ae5780601f10611483576101008083540402835291602001916114ae565b820191906000526020600020905b81548152906001019060200180831161149157829003601f168201915b50505091835250506002919091015460ff166020918201528151600090815261012e825260408082208290558582526101319092529081208181559192506114f9600183018261220e565b50600201805460ff1916905561150e8261197e565b610130805490600061151f836127fe565b91905055505050565b6000610c528383611a21565b816001600160a01b0316836001600160a01b031614156115965760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610620565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61160e848484611129565b61161a84848484611a4b565b610d7f5760405162461bcd60e51b815260040161062090612815565b606061012f80546105019061269d565b6060600061165383611b58565b600101905060008167ffffffffffffffff81111561167357611673612392565b6040519080825280601f01601f19166020018201604052801561169d576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846116d6576116db565b6116a7565b509392505050565b60006104ec825490565b600054610100900460ff166117145760405162461bcd60e51b815260040161062090612867565b61082e8282611c30565b600054610100900460ff166117455760405162461bcd60e51b815260040161062090612867565b565b60006001600160e01b03198216637965db0b60e01b14806104ec57506104ec82611c7e565b6001811115610d7f576001600160a01b038416156117b2576001600160a01b038416600090815260686020526040812080548392906117ac9084906128b2565b90915550505b6001600160a01b03831615610d7f576001600160a01b038316600090815260686020526040812080548392906117e99084906127cb565b909155505050505050565b61082e828260405180602001604052806000815250611cce565b6118188282610c59565b61082e5761182581611d01565b611830836020611d13565b6040516020016118419291906128c9565b60408051601f198184030181529082905262461bcd60e51b8252610620916004016122e4565b6118718282610c59565b61082e57600082815260c9602090815260408083206001600160a01b03851684529091529020805460ff191660011790556118a93390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610c52836001600160a01b038416611eaf565b61190c8282610c59565b1561082e57600082815260c9602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610c52836001600160a01b038416611efe565b600061198982610a2e565b905061199981600084600161176c565b6119a282610a2e565b600083815260696020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526068845282852080546000190190558785526067909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000826000018281548110611a3857611a3861293e565b9060005260206000200154905092915050565b60006001600160a01b0384163b15611b4d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a8f903390899088908890600401612954565b602060405180830381600087803b158015611aa957600080fd5b505af1925050508015611ad9575060408051601f3d908101601f19168201909252611ad691810190612991565b60015b611b33573d808015611b07576040519150601f19603f3d011682016040523d82523d6000602084013e611b0c565b606091505b508051611b2b5760405162461bcd60e51b815260040161062090612815565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611121565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611b975772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611bc3576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611be157662386f26fc10000830492506010015b6305f5e1008310611bf9576305f5e100830492506008015b6127108310611c0d57612710830492506004015b60648310611c1f576064830492506002015b600a83106104ec5760010192915050565b600054610100900460ff16611c575760405162461bcd60e51b815260040161062090612867565b8151611c6a90606590602085019061218a565b5080516106c190606690602084019061218a565b60006001600160e01b031982166380ac58cd60e01b1480611caf57506001600160e01b03198216635b5e139f60e01b145b806104ec57506301ffc9a760e01b6001600160e01b03198316146104ec565b611cd88383611ff1565b611ce56000848484611a4b565b6106c15760405162461bcd60e51b815260040161062090612815565b60606104ec6001600160a01b03831660145b60606000611d228360026129ae565b611d2d9060026127cb565b67ffffffffffffffff811115611d4557611d45612392565b6040519080825280601f01601f191660200182016040528015611d6f576020820181803683370190505b509050600360fc1b81600081518110611d8a57611d8a61293e565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611db957611db961293e565b60200101906001600160f81b031916908160001a9053506000611ddd8460026129ae565b611de89060016127cb565b90505b6001811115611e60576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611e1c57611e1c61293e565b1a60f81b828281518110611e3257611e3261293e565b60200101906001600160f81b031916908160001a90535060049490941c93611e59816127fe565b9050611deb565b508315610c525760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610620565b6000818152600183016020526040812054611ef6575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556104ec565b5060006104ec565b60008181526001830160205260408120548015611fe7576000611f226001836128b2565b8554909150600090611f36906001906128b2565b9050818114611f9b576000866000018281548110611f5657611f5661293e565b9060005260206000200154905080876000018481548110611f7957611f7961293e565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611fac57611fac6129cd565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506104ec565b60009150506104ec565b6001600160a01b0382166120475760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610620565b6000818152606760205260409020546001600160a01b0316156120ac5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610620565b6120ba60008383600161176c565b6000818152606760205260409020546001600160a01b03161561211f5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610620565b6001600160a01b038216600081815260686020908152604080832080546001019055848352606790915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546121969061269d565b90600052602060002090601f0160209004810192826121b857600085556121fe565b82601f106121d157805160ff19168380011785556121fe565b828001600101855582156121fe579182015b828111156121fe5782518255916020019190600101906121e3565b5061220a929150612244565b5090565b50805461221a9061269d565b6000825580601f1061222a575050565b601f016020900490600052602060002090810190610a0c91905b5b8082111561220a5760008155600101612245565b6001600160e01b031981168114610a0c57600080fd5b60006020828403121561228157600080fd5b8135610c5281612259565b60005b838110156122a757818101518382015260200161228f565b83811115610d7f5750506000910152565b600081518084526122d081602086016020860161228c565b601f01601f19169290920160200192915050565b602081526000610c5260208301846122b8565b60006020828403121561230957600080fd5b5035919050565b80356001600160a01b038116811461232757600080fd5b919050565b6000806040838503121561233f57600080fd5b61234883612310565b946020939093013593505050565b60008060006060848603121561236b57600080fd5b61237484612310565b925061238260208501612310565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156123c3576123c3612392565b604051601f8501601f19908116603f011681019082821181831017156123eb576123eb612392565b8160405280935085815286868601111561240457600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261242f57600080fd5b610c52838335602085016123a8565b60008060006060848603121561245357600080fd5b833567ffffffffffffffff8082111561246b57600080fd5b6124778783880161241e565b945061248560208701612310565b9350604086013591508082111561249b57600080fd5b506124a88682870161241e565b9150509250925092565b600080604083850312156124c557600080fd5b823591506124d560208401612310565b90509250929050565b6000602082840312156124f057600080fd5b813567ffffffffffffffff81111561250757600080fd5b6111218482850161241e565b6020815281516020820152600060208301516060604084015261253960808401826122b8565b905060ff60408501511660608401528091505092915050565b60006020828403121561256457600080fd5b610c5282612310565b6000806040838503121561258057600080fd5b50508035926020909101359150565b600080604083850312156125a257600080fd5b6125ab83612310565b9150602083013580151581146125c057600080fd5b809150509250929050565b8381526060602082015260006125e460608301856122b8565b905060ff83166040830152949350505050565b6000806000806080858703121561260d57600080fd5b61261685612310565b935061262460208601612310565b925060408501359150606085013567ffffffffffffffff81111561264757600080fd5b8501601f8101871361265857600080fd5b612667878235602084016123a8565b91505092959194509250565b6000806040838503121561268657600080fd5b61268f83612310565b91506124d560208401612310565b600181811c908216806126b157607f821691505b602082108114156126d257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b6000825161273781846020870161228c565b9190910192915050565b6000835161275381846020880161228c565b83519083019061276781836020880161228c565b01949350505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156127de576127de6127b5565b500190565b60006000198214156127f7576127f76127b5565b5060010190565b60008161280d5761280d6127b5565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000828210156128c4576128c46127b5565b500390565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161290181601785016020880161228c565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161293281602884016020880161228c565b01602801949350505050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612987908301846122b8565b9695505050505050565b6000602082840312156129a357600080fd5b8151610c5281612259565b60008160001904831182151516156129c8576129c86127b5565b500290565b634e487b7160e01b600052603160045260246000fdfea264697066735822122085a9aae4933277c936f5247c2672673eb114695cac17f870112bd12e85a2a07a64736f6c63430008090033", linkReferences: {}, deployedLinkReferences: {}, }; diff --git a/packages/contracts/.openzeppelin/avalanche-fuji.json b/packages/contracts/.openzeppelin/avalanche-fuji.json index 489bb179ad..28e607b438 100644 --- a/packages/contracts/.openzeppelin/avalanche-fuji.json +++ b/packages/contracts/.openzeppelin/avalanche-fuji.json @@ -14,6 +14,46 @@ "address": "0x2231A160C7a7bba5a9dDbaF6a44A7EF76Ef74C77", "txHash": "0xa2b59020c60183e4500f6574d5aea79f81414e7d7728dc09850151ee65beac42", "kind": "transparent" + }, + { + "address": "0xf7450DF520C043354484357d42b06da15d2cE88b", + "txHash": "0xda12a8c0c1adc6e36a1ec08cb51c014df064de8dd4b4c40d3bb21b03afdf0054", + "kind": "transparent" + }, + { + "address": "0x71803278733640102e92E781f23Be984fbB02bff", + "txHash": "0x2504955aef7699e51870ba32be4848f61bffd2ff15e0b01c36d7a3fd3a6b0cf7", + "kind": "transparent" + }, + { + "address": "0x5FA9521bd3aCC51037F1aA2F8d91e464F5c39041", + "txHash": "0x318bebae991709a3952cd9490d541ea7a0d0e0e0f2f01e7ae017048acfb39efa", + "kind": "transparent" + }, + { + "address": "0xC9A9b31A4Ae07Aa44aB84FD995d73F5009BDa3b9", + "txHash": "0x5fc43cb9e9d54baae6f3a4810c43b2d38059038e23ff4496ae7e71eafa555d90", + "kind": "transparent" + }, + { + "address": "0xf1d66261486223d102745b1705Cb49eAA9F0E25b", + "txHash": "0x81d55e326b1d179778817948c3bfe0a567771929b8a82d92388d3acc0c9bb718", + "kind": "transparent" + }, + { + "address": "0x2296415Ac812d713E9Eedfa4D984Cf3bC929438a", + "txHash": "0x1aac505221a0829e3bf85414a2d49c94a4dc59ad13ccad5fe82e66f70737abd1", + "kind": "transparent" + }, + { + "address": "0x352EC444f0D2C09ad72eE3735341b45e577FCAE8", + "txHash": "0x5d5e56675f28113d03d07d65429d390d03f61d913d6641f3d593030683821bf0", + "kind": "transparent" + }, + { + "address": "0xE94397686E535c883E1019F7812bb33ABF5fb967", + "txHash": "0xc311641786ac6c53d1ed983d1218d4c942252b32293bf5b56173fff44013ad50", + "kind": "transparent" } ], "impls": { @@ -768,6 +808,678 @@ } } } + }, + "76d3d396ba324ab74e16da967697fdb8e23802e24a9e8c2c8400d08fa7156cfb": { + "address": "0x70D626F5e2941D729F26498a24227E14dEaC8443", + "txHash": "0x6dc923f531a3308c657e454ebf15c01068891b1eadb2a65366d1190b6b44309c", + "layout": { + "solcVersion": "0.8.9", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_name", + "offset": 0, + "slot": "101", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:25" + }, + { + "label": "_symbol", + "offset": 0, + "slot": "102", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:28" + }, + { + "label": "_owners", + "offset": 0, + "slot": "103", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:31" + }, + { + "label": "_balances", + "offset": 0, + "slot": "104", + "type": "t_mapping(t_address,t_uint256)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:34" + }, + { + "label": "_tokenApprovals", + "offset": 0, + "slot": "105", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:37" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "106", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:40" + }, + { + "label": "__gap", + "offset": 0, + "slot": "107", + "type": "t_array(t_uint256)44_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:514" + }, + { + "label": "__gap", + "offset": 0, + "slot": "151", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC721BurnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol:38" + }, + { + "label": "_roles", + "offset": 0, + "slot": "201", + "type": "t_mapping(t_bytes32,t_struct(RoleData)179_storage)", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)49_storage", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:259" + }, + { + "label": "_roleMembers", + "offset": 0, + "slot": "251", + "type": "t_mapping(t_bytes32,t_struct(AddressSet)3750_storage)", + "contract": "AccessControlEnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "252", + "type": "t_array(t_uint256)49_storage", + "contract": "AccessControlEnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol:76" + }, + { + "label": "_tokenIdCounter", + "offset": 0, + "slot": "301", + "type": "t_struct(Counter)2260_storage", + "contract": "Sift", + "src": "contracts/registry/Sift.sol:23" + }, + { + "label": "labelToTokenId", + "offset": 0, + "slot": "302", + "type": "t_mapping(t_bytes32,t_uint256)", + "contract": "Sift", + "src": "contracts/registry/Sift.sol:26" + }, + { + "label": "baseURI", + "offset": 0, + "slot": "303", + "type": "t_string_storage", + "contract": "Sift", + "src": "contracts/registry/Sift.sol:29" + }, + { + "label": "totalSupply", + "offset": 0, + "slot": "304", + "type": "t_uint256", + "contract": "Sift", + "src": "contracts/registry/Sift.sol:32" + }, + { + "label": "tokenIDtoEntity", + "offset": 0, + "slot": "305", + "type": "t_mapping(t_uint256,t_struct(entityStruct)4080_storage)", + "contract": "Sift", + "src": "contracts/registry/Sift.sol:41" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)44_storage": { + "label": "uint256[44]", + "numberOfBytes": "1408" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(AddressSet)3750_storage)": { + "label": "mapping(bytes32 => struct EnumerableSetUpgradeable.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)179_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(entityStruct)4080_storage)": { + "label": "mapping(uint256 => struct Sift.entityStruct)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3750_storage": { + "label": "struct EnumerableSetUpgradeable.AddressSet", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)3435_storage", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Counter)2260_storage": { + "label": "struct CountersUpgradeable.Counter", + "members": [ + { + "label": "_value", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)179_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "members", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Set)3435_storage": { + "label": "struct EnumerableSetUpgradeable.Set", + "members": [ + { + "label": "_values", + "type": "t_array(t_bytes32)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "_indexes", + "type": "t_mapping(t_bytes32,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(entityStruct)4080_storage": { + "label": "struct Sift.entityStruct", + "members": [ + { + "label": "label", + "type": "t_bytes32", + "offset": 0, + "slot": "0" + }, + { + "label": "metadata", + "type": "t_string_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "status", + "type": "t_uint8", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "44961c980e4a2aaf35a1016a1c69704a737351241f6bda512373c485ff0fdf66": { + "address": "0xE7c85cF12113Bf32DD7FcEed8D3E92034D2b58EF", + "txHash": "0x4b975466ae36fb92ce5d3f71094b2f3eb788cab036c2cdb1a83927213da978ec", + "layout": { + "solcVersion": "0.8.9", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_name", + "offset": 0, + "slot": "101", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:25" + }, + { + "label": "_symbol", + "offset": 0, + "slot": "102", + "type": "t_string_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:28" + }, + { + "label": "_owners", + "offset": 0, + "slot": "103", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:31" + }, + { + "label": "_balances", + "offset": 0, + "slot": "104", + "type": "t_mapping(t_address,t_uint256)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:34" + }, + { + "label": "_tokenApprovals", + "offset": 0, + "slot": "105", + "type": "t_mapping(t_uint256,t_address)", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:37" + }, + { + "label": "_operatorApprovals", + "offset": 0, + "slot": "106", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:40" + }, + { + "label": "__gap", + "offset": 0, + "slot": "107", + "type": "t_array(t_uint256)44_storage", + "contract": "ERC721Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol:514" + }, + { + "label": "__gap", + "offset": 0, + "slot": "151", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC721BurnableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol:38" + }, + { + "label": "_roles", + "offset": 0, + "slot": "201", + "type": "t_mapping(t_bytes32,t_struct(RoleData)179_storage)", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)49_storage", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:259" + }, + { + "label": "_roleMembers", + "offset": 0, + "slot": "251", + "type": "t_mapping(t_bytes32,t_struct(AddressSet)3750_storage)", + "contract": "AccessControlEnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol:22" + }, + { + "label": "__gap", + "offset": 0, + "slot": "252", + "type": "t_array(t_uint256)49_storage", + "contract": "AccessControlEnumerableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol:76" + }, + { + "label": "_tokenIdCounter", + "offset": 0, + "slot": "301", + "type": "t_struct(Counter)2260_storage", + "contract": "Sift", + "src": "contracts/registry/Sift.sol:23" + }, + { + "label": "labelToTokenId", + "offset": 0, + "slot": "302", + "type": "t_mapping(t_bytes32,t_uint256)", + "contract": "Sift", + "src": "contracts/registry/Sift.sol:26" + }, + { + "label": "baseURI", + "offset": 0, + "slot": "303", + "type": "t_string_storage", + "contract": "Sift", + "src": "contracts/registry/Sift.sol:29" + }, + { + "label": "totalSupply", + "offset": 0, + "slot": "304", + "type": "t_uint256", + "contract": "Sift", + "src": "contracts/registry/Sift.sol:32" + }, + { + "label": "tokenIDtoEntity", + "offset": 0, + "slot": "305", + "type": "t_mapping(t_uint256,t_struct(entityStruct)4080_storage)", + "contract": "Sift", + "src": "contracts/registry/Sift.sol:41" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)44_storage": { + "label": "uint256[44]", + "numberOfBytes": "1408" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(AddressSet)3750_storage)": { + "label": "mapping(bytes32 => struct EnumerableSetUpgradeable.AddressSet)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)179_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_address)": { + "label": "mapping(uint256 => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(entityStruct)4080_storage)": { + "label": "mapping(uint256 => struct Sift.entityStruct)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3750_storage": { + "label": "struct EnumerableSetUpgradeable.AddressSet", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)3435_storage", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Counter)2260_storage": { + "label": "struct CountersUpgradeable.Counter", + "members": [ + { + "label": "_value", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(RoleData)179_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "members", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Set)3435_storage": { + "label": "struct EnumerableSetUpgradeable.Set", + "members": [ + { + "label": "_values", + "type": "t_array(t_bytes32)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "_indexes", + "type": "t_mapping(t_bytes32,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(entityStruct)4080_storage": { + "label": "struct Sift.entityStruct", + "members": [ + { + "label": "label", + "type": "t_bytes32", + "offset": 0, + "slot": "0" + }, + { + "label": "metadata", + "type": "t_string_storage", + "offset": 0, + "slot": "1" + }, + { + "label": "status", + "type": "t_uint8", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } } } } diff --git a/packages/contracts/DEPLOYMENTS.md b/packages/contracts/DEPLOYMENTS.md index 4638382c32..65f987c11d 100644 --- a/packages/contracts/DEPLOYMENTS.md +++ b/packages/contracts/DEPLOYMENTS.md @@ -11,7 +11,7 @@ Local blockchain created by running the `snickerdoodlelabs/devchain` docker imag - Timelock Controller: `0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6` - Governor Contract: `0x8A791620dd6260079BF849Dc5567aDC3F2FdC318` - Crumbs: `0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e` -- Sift: `0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0` +- Sift: `0x352EC444f0D2C09ad72eE3735341b45e577FCAE8` - Test Rewards NFT: `0x0B306BF915C4d645ff596e518fAf3F9669b97016` ## Fuji Network diff --git a/packages/contracts/contracts/registry/Sift.sol b/packages/contracts/contracts/registry/Sift.sol index f0b813f374..4b44eaf682 100644 --- a/packages/contracts/contracts/registry/Sift.sol +++ b/packages/contracts/contracts/registry/Sift.sol @@ -2,29 +2,28 @@ pragma solidity ^0.8.4; import "@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol"; -import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721BurnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts-upgradeable/utils/CountersUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/AccessControlEnumerableUpgradeable.sol"; - + /// @title Sift /// @author Snickerdoodle Labs /// @notice Synamint Protocol Sift Contract -/// @dev The Sift contract is a simple registry that tracks verified or malicious urls -/// @dev If a url has been verified by the Snickerdoodle team, it is minted with a Sift ERC721 token with a 'VERIFIED' tokenURI -/// @dev If a url has been identified as malicious, it is minted a 'MALICIOUS' tokenURI -/// @dev SDL's data wallet browser extension will query the Sift contract with the url that its user is visiting -/// @dev Each url that enters the registry is mapped to a token id that has the corresponding tokenURI describe above -/// @dev If the url does not have a tokenId minted against it, the contract returns the 'NOT VERIFIED' status - -contract Sift is Initializable, ERC721Upgradeable, ERC721URIStorageUpgradeable, ERC721BurnableUpgradeable, AccessControlEnumerableUpgradeable { +/// @dev The Sift contract is a simple registry that tracks verified or malicious entities +/// @dev If an entity has been verified by the Snickerdoodle team, it is minted with a Sift ERC721 token with a 'VERIFIED' entity +/// @dev If an entity has been identified as malicious, it is minted a 'MALICIOUS' entity +/// @dev SDL's data wallet browser extension will query the Sift contract with the entity that its user is visiting +/// @dev Each entity that enters the registry is mapped to a token id that has the corresponding entity describe above +/// @dev If the entity does not have a tokenId minted against it, the contract returns the 'NOT VERIFIED' status + +contract Sift is Initializable, ERC721Upgradeable, ERC721BurnableUpgradeable, AccessControlEnumerableUpgradeable { using CountersUpgradeable for CountersUpgradeable.Counter; CountersUpgradeable.Counter private _tokenIdCounter; - /// @dev mapping of hashed url to tokenId - mapping(bytes32 => uint256) public urlToTokenId; + /// @dev mapping of hashed label to tokenId (i.e. a URL, Tokens, NFTs, Ad Agents, Ad Banners, etc.) + mapping(bytes32 => uint256) public labelToTokenId; /// @dev Base uri of Sift string public baseURI; @@ -32,19 +31,22 @@ contract Sift is Initializable, ERC721Upgradeable, ERC721URIStorageUpgradeable, /// @dev Total supply of Sift tokens uint256 public totalSupply; + /// @dev Order struct + struct entityStruct { + bytes32 label; /// this is your hashed label + string metadata; /// this can be JSON i.e. a string + uint8 status; /// i.e. Verified: 0, not_verified: 1, malicious: 2 + } + + mapping(uint256 => entityStruct) public tokenIDtoEntity; + /// @dev Role bytes bytes32 public constant VERIFIER_ROLE = keccak256("VERIFIER_ROLE"); - /// @dev Initializes the contract with the base URI, then disables any initializers as recommended by OpenZeppelin - constructor(string memory baseURInew) { - initialize(baseURInew); - } - /// @notice Initializes the contract /// @dev Uses the initializer modifier to to ensure the contract is only initialized once function initialize(string memory baseURI_) initializer public { __ERC721_init("Sift", "SIFT"); - __ERC721URIStorage_init(); __ERC721Burnable_init(); _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); @@ -53,42 +55,50 @@ contract Sift is Initializable, ERC721Upgradeable, ERC721URIStorageUpgradeable, setBaseURI(baseURI_); } - /// @notice Verifies a url - /// @dev Mints an NFT with the 'VERIFIED' tokenURI + /// @notice Verifies an entity + /// @dev Mints an NFT with the 'VERIFIED' entity /// @dev Only addresses with VERIFIER_ROLE can call it and is checked in _safeMintAndRegister() - /// @param url Site URL - /// @param owner Address receiving the url's NFT - function verifyURL(string memory url, address owner) external { - // check if the url has already been verified on the contract + /// @param label human-readable object label + /// @param owner Address receiving the entity's NFT + /// @param metadata stringified JSON object with useful keyvalue pairs + function verifyEntity(string memory label, address owner, string memory metadata) external { + // check if the entity has already been verified on the contract // if it has a token id mapped to it, it has been verified - require(urlToTokenId[keccak256(abi.encodePacked(url))] == 0, "Consent: URL already verified"); + require(labelToTokenId[keccak256(abi.encodePacked(label))] == 0, "Consent: Entity already verified"); - // mint token id and append to the token URI "VERIFIED" - _safeMintAndRegister(owner, "VERIFIED", url); + // mint token with the associated label and metadata for a status of 1 (which means its safe) + _safeMintAndRegister(owner, 1, label, metadata); } - /// @notice Marks a url as malicious - /// @dev Mints an NFT with the 'MALICIOUS' tokenURI + /// @notice Marks an entity as malicious + /// @dev Mints an NFT with the 'MALICIOUS' entity /// @dev Only addresses with VERIFIER_ROLE can call it and is checked in _safeMintAndRegister() - /// @param url Site URL - /// @param owner Address receiving the url's NFT - function maliciousURL(string memory url, address owner) external { + /// @param label human-readable object label + /// @param owner Address receiving the entity's NFT + /// @param metadata stringified JSON object with useful keyvalue pairs + function maliciousEntity(string memory label, address owner, string memory metadata) external { + // Label does not correspond to a token + require(labelToTokenId[keccak256(abi.encodePacked(label))] == 0, "Consent: Entity already verified"); + // mint token id and append to the token URI "MALICIOUS" - _safeMintAndRegister(owner, "MALICIOUS", url); + _safeMintAndRegister(owner, 2, label, metadata); } - /// @notice Checks the status of a url - /// @param url Site URL + /// @notice Checks the status of an entity + /// @dev Returns status of entities + /// @param label human-readable object labels /// @return result Returns the token uri of 'VERIFIED', 'MALICIOUS', or 'NOT VERIFIED' - function checkURL(string memory url) external view returns(string memory result) { - // get the url's token using its hashed value - uint256 tokenId = urlToTokenId[keccak256(abi.encodePacked(url))]; + function checkEntity(string memory label) external view returns(entityStruct memory result) { + // get the entity's token using its hashed value + bytes32 encodedLabel = keccak256(abi.encodePacked(label)); + uint256 tokenId = labelToTokenId[encodedLabel]; - // if token's id is 0, it has not been verified yet - if (tokenId == 0) return "NOT VERIFIED"; + // return unverified, empty-metadata entityStruct if tokenId not stored + if (tokenId == 0) { + return entityStruct(encodedLabel, "", 0); + } - // else, return token's URI - return tokenURI(tokenId); + return tokenIDtoEntity[tokenId]; } /// @notice Sets the Sift tokens base URI @@ -99,50 +109,50 @@ contract Sift is Initializable, ERC721Upgradeable, ERC721URIStorageUpgradeable, /// @notice Internal function to carry out token minting and mapping updates /// @param to Address receiving the token - /// @param uri Token uri containing status - /// @param url Site URL - function _safeMintAndRegister(address to, string memory uri, string memory url) internal onlyRole(VERIFIER_ROLE) { + /// @param verifiedStatus Status passed from the token + /// @param label Status passed from the token + /// @param metadata Token's metadata + function _safeMintAndRegister(address to, uint8 verifiedStatus, string memory label, string memory metadata) internal onlyRole(VERIFIER_ROLE) { // ensure that tokenIds start from 1 so that 0 can be kept as tokens that are not verified yet uint256 tokenId = _tokenIdCounter.current() + 1; _tokenIdCounter.increment(); _safeMint(to, tokenId); - _setTokenURI(tokenId, uri); - // register hashed url to token mapping - urlToTokenId[keccak256(abi.encodePacked(url))] = tokenId; + // register hashed entity to token mapping + bytes32 encodedLabel = keccak256(abi.encodePacked(label)); + labelToTokenId[encodedLabel] = tokenId; + + /// set the metadata + tokenIDtoEntity[tokenId] = entityStruct(encodedLabel, metadata, verifiedStatus); /// increase total supply count totalSupply++; } /* OVERRIDES */ - /// @notice Override _baseURI to return the Sift tokens base URI function _baseURI() internal view virtual override returns (string memory baseURI_) { return baseURI; } - + // The following functions are overrides required by Solidity. - function _burn(uint256 tokenId) internal - override(ERC721Upgradeable, ERC721URIStorageUpgradeable) + override(ERC721Upgradeable) { - super._burn(tokenId); + entityStruct memory entity = tokenIDtoEntity[tokenId]; + + // Zero out mapping to remove value, its better than delete call + delete labelToTokenId[entity.label]; + + // Zero out mapping to remove value, its better than delete call + delete tokenIDtoEntity[tokenId]; + super._burn(tokenId); /// decrease total supply count totalSupply--; } - function tokenURI(uint256 tokenId) - public - view - override(ERC721Upgradeable, ERC721URIStorageUpgradeable) - returns (string memory) - { - return super.tokenURI(tokenId); - } - function supportsInterface(bytes4 interfaceId) public view diff --git a/packages/contracts/docs/registry/Sift.md b/packages/contracts/docs/registry/Sift.md index dffe860a94..a30ea27880 100644 --- a/packages/contracts/docs/registry/Sift.md +++ b/packages/contracts/docs/registry/Sift.md @@ -65,13 +65,13 @@ Initializes the contract _Uses the initializer modifier to to ensure the contract is only initialized once_ -### verifyURL +### verifyEntity ```solidity -function verifyURL(string url, address owner) external +function verifyEntity(string label, address owner, string metadata) external ``` -Verifies a url +Verifies an entity _Mints an NFT with the 'VERIFIED' tokenURI Only addresses with VERIFIER_ROLE can call it and is checked in _safeMintAndRegister()_ @@ -81,10 +81,10 @@ Only addresses with VERIFIER_ROLE can call it and is checked in _safeMintAndRegi | url | string | Site URL | | owner | address | Address receiving the url's NFT | -### maliciousURL +### maliciousEntity ```solidity -function maliciousURL(string url, address owner) external +function maliciousEntity(string url, address owner) external ``` Marks a url as malicious @@ -97,10 +97,10 @@ Only addresses with VERIFIER_ROLE can call it and is checked in _safeMintAndRegi | url | string | Site URL | | owner | address | Address receiving the url's NFT | -### checkURL +### checkEntity ```solidity -function checkURL(string url) external view returns (string result) +function checkEntity(string url) external view returns (string result) ``` Checks the status of a url diff --git a/packages/contracts/scripts/deployment.js b/packages/contracts/scripts/deployment.js index 784cb0d159..375a6527b5 100644 --- a/packages/contracts/scripts/deployment.js +++ b/packages/contracts/scripts/deployment.js @@ -169,7 +169,7 @@ async function deploySift() { console.log("Sift Gas Fee:", sift_receipt.gasUsed.toString()); await sift - .verifyURL("snickerdoodle.com", accounts[0].address) + .verifyEntity("snickerdoodle.com", accounts[0].address, "metadata: ") .then((txResponse) => { return txResponse.wait(); }) @@ -178,7 +178,7 @@ async function deploySift() { }); await sift - .maliciousURL("webthree.love", accounts[0].address) + .maliciousEntity("webthree.love", accounts[0].address) .then((txResponse) => { return txResponse.wait(); }) diff --git a/packages/contracts/scripts/sift-deployment-only.js b/packages/contracts/scripts/sift-deployment-only.js new file mode 100644 index 0000000000..2da26e209c --- /dev/null +++ b/packages/contracts/scripts/sift-deployment-only.js @@ -0,0 +1,61 @@ +// We require the Hardhat Runtime Environment explicitly here. This is optional +// but useful for running the script in a standalone fashion through `node