aiia-vault-sdk 1.2.10 → 1.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -162,6 +162,12 @@ export declare class MultiLevelReferralNFTSDK {
162
162
  * @returns Populated transaction
163
163
  */
164
164
  buildSetMaxReferralLevelsTx(maxLevels: number): Promise<ethers.ContractTransaction>;
165
+ /**
166
+ * Builds a transaction to set the share percentage for referrals
167
+ * @param sharePercent - The new share percentage (must be between 0 and 100)
168
+ * @returns Populated transaction
169
+ */
170
+ buildSetSharePercentTx(sharePercent: number): Promise<ethers.ContractTransaction>;
165
171
  /**
166
172
  * Builds a transaction to buy an NFT with a referral code
167
173
  * @param referralCode - The referral code to use
@@ -1 +1 @@
1
- "use strict";var e=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.MultiLevelReferralNFTSDK=void 0;const t=require("ethers"),r=e(require("./abis/NFTTicket.json")),a=e(require("./contracts.json")),s=require("./utils");exports.MultiLevelReferralNFTSDK=class{constructor(e,o){this.name="NFTTicket",this.isBootstrapped=!1,this.formatEventArgs=e=>{const{eventName:r,args:a}=e;switch(r){case"NFTMinted":return{...e,args:{...a,owner:a.owner.toLowerCase(),tokenId:Number(a.tokenId)}};case"ReferrerSet":return{...e,args:{...a,referrer:a.referrer.toLowerCase(),referee:a.referee.toLowerCase()}};case"ReferralPaid":return{...e,args:{...a,receiver:a.receiver.toLowerCase(),buyer:a.buyer.toLowerCase(),amount:Number(t.ethers.formatEther(a.amount)),level:Number(a.level),originalAmount:Number(t.ethers.formatEther(a.originalAmount)),tokenId:Number(a.tokenId)}};case"ReferralCodeSet":return{...e,args:{...a,user:a.user.toLowerCase(),referralCode:a.referralCode}};case"MaxReferralLevelsUpdated":return{...e,args:{...a,oldValue:Number(a.oldValue),newValue:Number(a.newValue)}};case"Transfer":return{...e,args:{...a,from:a.from.toLowerCase(),to:a.to.toLowerCase(),tokenId:Number(a.tokenId)}};default:return e}};const n=Array.isArray(e)?e:[e];this.providers=n.map((e=>new t.ethers.JsonRpcProvider(e)));const i=(0,s.getRandomProvider)(this.providers);this.contractAddress=(0,s.resolveContractAddress)(n[0],this.name,a.default,o),this.contract=new t.ethers.Contract(this.contractAddress,r.default.abi,i)}getRandomProvider(){return(0,s.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new t.ethers.Contract(this.contractAddress,r.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const e=await Promise.all(this.providers.map(((e,t)=>(0,s.checkRpcHealth)(e,t))));if(this.providers=this.providers.filter(((t,r)=>e[r])),0===this.providers.length)throw new Error("No active RPC providers available");this.isBootstrapped=!0}async signAndSendTransaction(e,t,r={}){return(0,s.signAndSendTransaction)(e,t,(()=>this.getRandomProvider()),r,this.contract)}async getPrice(){const e=await this.contract.price();return Number(t.ethers.formatEther(e))}async getSharePercent(){const e=await this.contract.sharePercent();return Number(e)}async getMaxReferralLevels(){const e=await this.contract.maxReferralLevels();return Number(e)}async getReferrer(e){return await this.contract.referrers(e)}async getReferralCodeOwner(e){return await this.contract.referralCodes(e)}async getUserReferralCode(e){return await this.contract.userReferralCodes(e)}async buildGenerateReferralCodeTx(){return await this.contract.generateReferralCode.populateTransaction()}async buildGenerateReferralCodeForUserTx(e){return await this.contract.generateReferralCodeForUser.populateTransaction(e)}async buildSetPriceTx(e){const r=t.ethers.parseEther(e.toString());return await this.contract.setPrice.populateTransaction(r)}async buildSetMaxReferralLevelsTx(e){if(await this.bootstrap(),e<1||e>10)throw new Error("Maximum referral levels must be between 1 and 10");return await this.contract.setMaxReferralLevels.populateTransaction(e)}async buildBuyNFTTx(e){const r=await this.getPrice(),a=await this.contract.buy.populateTransaction(e);return a.value=t.ethers.parseEther(r.toString()),a}async buildBatchBuyNFTTx(e,r){if(await this.bootstrap(),r<=0)throw new Error("Amount must be greater than 0");const a=await this.getPrice()*r,s=await this.contract.batchBuy.populateTransaction(e,r);return s.value=t.ethers.parseEther(a.toString()),s}async buildWithdrawTx(e){const r=t.ethers.parseEther(e.toString());return await this.contract.withdraw.populateTransaction(r)}async buildMintToTx(e){return await this.bootstrap(),this.contract.mintTo.populateTransaction(e)}async buildBatchMintTx(e,t){return await this.bootstrap(),this.contract.batchMint.populateTransaction(e,t)}async getOwner(){return await this.contract.owner()}getContractAddress(){return this.contractAddress}async getAllEvents(e,t,r){return await this.bootstrap(),(0,s.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),e,t,r)}async streamEvents(e,t,r,a=1e3,o=5e3,n){return await this.bootstrap(),(0,s.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(e,t)=>this.getAllEvents(e,t),formatEvent:e=>this.formatEventArgs(e),onEvent:t,saveLatestBlock:r,fromBlock:e,batchSize:a,sleepTime:o,whitelistEvents:void 0,shouldContinue:n})}};
1
+ "use strict";var e=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.MultiLevelReferralNFTSDK=void 0;const t=require("ethers"),r=e(require("./abis/NFTTicket.json")),a=e(require("./contracts.json")),s=require("./utils");exports.MultiLevelReferralNFTSDK=class{constructor(e,n){this.name="NFTTicket",this.isBootstrapped=!1,this.formatEventArgs=e=>{const{eventName:r,args:a}=e;switch(r){case"NFTMinted":return{...e,args:{...a,owner:a.owner.toLowerCase(),tokenId:Number(a.tokenId)}};case"ReferrerSet":return{...e,args:{...a,referrer:a.referrer.toLowerCase(),referee:a.referee.toLowerCase()}};case"ReferralPaid":return{...e,args:{...a,receiver:a.receiver.toLowerCase(),buyer:a.buyer.toLowerCase(),amount:Number(t.ethers.formatEther(a.amount)),level:Number(a.level),originalAmount:Number(t.ethers.formatEther(a.originalAmount)),tokenId:Number(a.tokenId)}};case"ReferralCodeSet":return{...e,args:{...a,user:a.user.toLowerCase(),referralCode:a.referralCode}};case"MaxReferralLevelsUpdated":return{...e,args:{...a,oldValue:Number(a.oldValue),newValue:Number(a.newValue)}};case"Transfer":return{...e,args:{...a,from:a.from.toLowerCase(),to:a.to.toLowerCase(),tokenId:Number(a.tokenId)}};default:return e}};const o=Array.isArray(e)?e:[e];this.providers=o.map((e=>new t.ethers.JsonRpcProvider(e)));const i=(0,s.getRandomProvider)(this.providers);this.contractAddress=(0,s.resolveContractAddress)(o[0],this.name,a.default,n),this.contract=new t.ethers.Contract(this.contractAddress,r.default.abi,i)}getRandomProvider(){return(0,s.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new t.ethers.Contract(this.contractAddress,r.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const e=await Promise.all(this.providers.map(((e,t)=>(0,s.checkRpcHealth)(e,t))));if(this.providers=this.providers.filter(((t,r)=>e[r])),0===this.providers.length)throw new Error("No active RPC providers available");this.isBootstrapped=!0}async signAndSendTransaction(e,t,r={}){return(0,s.signAndSendTransaction)(e,t,(()=>this.getRandomProvider()),r,this.contract)}async getPrice(){const e=await this.contract.price();return Number(t.ethers.formatEther(e))}async getSharePercent(){const e=await this.contract.sharePercent();return Number(e)}async getMaxReferralLevels(){const e=await this.contract.maxReferralLevels();return Number(e)}async getReferrer(e){return await this.contract.referrers(e)}async getReferralCodeOwner(e){return await this.contract.referralCodes(e)}async getUserReferralCode(e){return await this.contract.userReferralCodes(e)}async buildGenerateReferralCodeTx(){return await this.contract.generateReferralCode.populateTransaction()}async buildGenerateReferralCodeForUserTx(e){return await this.contract.generateReferralCodeForUser.populateTransaction(e)}async buildSetPriceTx(e){const r=t.ethers.parseEther(e.toString());return await this.contract.setPrice.populateTransaction(r)}async buildSetMaxReferralLevelsTx(e){if(await this.bootstrap(),e<1||e>10)throw new Error("Maximum referral levels must be between 1 and 10");return await this.contract.setMaxReferralLevels.populateTransaction(e)}async buildSetSharePercentTx(e){if(await this.bootstrap(),e<0||e>100)throw new Error("Share percentage must be between 0 and 100");return await this.contract.setSharePercent.populateTransaction(e)}async buildBuyNFTTx(e){const r=await this.getPrice(),a=await this.contract.buy.populateTransaction(e);return a.value=t.ethers.parseEther(r.toString()),a}async buildBatchBuyNFTTx(e,r){if(await this.bootstrap(),r<=0)throw new Error("Amount must be greater than 0");const a=await this.getPrice()*r,s=await this.contract.batchBuy.populateTransaction(e,r);return s.value=t.ethers.parseEther(a.toString()),s}async buildWithdrawTx(e){const r=t.ethers.parseEther(e.toString());return await this.contract.withdraw.populateTransaction(r)}async buildMintToTx(e){return await this.bootstrap(),this.contract.mintTo.populateTransaction(e)}async buildBatchMintTx(e,t){return await this.bootstrap(),this.contract.batchMint.populateTransaction(e,t)}async getOwner(){return await this.contract.owner()}getContractAddress(){return this.contractAddress}async getAllEvents(e,t,r){return await this.bootstrap(),(0,s.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),e,t,r)}async streamEvents(e,t,r,a=1e3,n=5e3,o){return await this.bootstrap(),(0,s.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(e,t)=>this.getAllEvents(e,t),formatEvent:e=>this.formatEventArgs(e),onEvent:t,saveLatestBlock:r,fromBlock:e,batchSize:a,sleepTime:n,whitelistEvents:void 0,shouldContinue:o})}};
@@ -42,7 +42,7 @@ export declare class TradingVaultSDK {
42
42
  attempts: number;
43
43
  };
44
44
  }>;
45
- buildCreatePositionTx(amount: number, recipient: string): Promise<ethers.ContractTransaction>;
45
+ buildCreatePositionTx(amount: number, recipient: string, expiredAt?: number): Promise<ethers.ContractTransaction>;
46
46
  buildReducePositionTx(tokenId: bigint, amount: number): Promise<ethers.ContractTransaction>;
47
47
  buildReducePositionsTx(tokenIds: bigint[], amounts: number[]): Promise<ethers.ContractTransaction>;
48
48
  buildBorrowCurrencyTx(amount: number): Promise<ethers.ContractTransaction>;
@@ -78,7 +78,7 @@ export declare class TradingVaultSDK {
78
78
  timestamp: bigint;
79
79
  }>): Promise<ethers.ContractTransaction>;
80
80
  buildClaimERC20Tx(token: string, amount: number): Promise<ethers.ContractTransaction>;
81
- buildCreatePositionTxRaw(amount: bigint, recipient: string): Promise<ethers.ContractTransaction>;
81
+ buildCreatePositionTxRaw(amount: bigint, recipient: string, expiredAt?: bigint): Promise<ethers.ContractTransaction>;
82
82
  buildReducePositionTxRaw(tokenId: bigint, amount: bigint): Promise<ethers.ContractTransaction>;
83
83
  buildReducePositionsTxRaw(tokenIds: bigint[], amounts: bigint[]): Promise<ethers.ContractTransaction>;
84
84
  buildBorrowCurrencyTxRaw(amount: bigint): Promise<ethers.ContractTransaction>;
@@ -219,8 +219,9 @@ export declare class TradingVaultSDK {
219
219
  rewardedAmount: number;
220
220
  lossAmount: number;
221
221
  initAmount: number;
222
+ expiredAt: number;
222
223
  }>;
223
- getPositionRaw(tokenId: bigint): Promise<[bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, string] & {
224
+ getPositionRaw(tokenId: bigint): Promise<[bigint, bigint, bigint, bigint, bigint, bigint, bigint, bigint, string, bigint] & {
224
225
  entryPrice: bigint;
225
226
  outPrice: bigint;
226
227
  remainingAmount: bigint;
@@ -230,6 +231,7 @@ export declare class TradingVaultSDK {
230
231
  rewardedAmount: bigint;
231
232
  lossAmount: bigint;
232
233
  token: string;
234
+ expiredAt: bigint;
233
235
  }>;
234
236
  getRewardConfig(index: number): Promise<[bigint, bigint] & {
235
237
  weight: bigint;
@@ -238,6 +240,30 @@ export declare class TradingVaultSDK {
238
240
  getRewardConfigsLength(): Promise<bigint>;
239
241
  getCurrencyDecimals(): Promise<number>;
240
242
  getRewardTokenDecimals(): Promise<number>;
243
+ /**
244
+ * Gets the ERC721 balance of an owner address
245
+ *
246
+ * @param owner - The address to check the balance of
247
+ * @returns The number of NFTs owned by the address
248
+ *
249
+ * @example
250
+ * ```typescript
251
+ * const balance = await sdk.getERC721BalanceOf("0x...");
252
+ * ```
253
+ */
254
+ getERC721BalanceOf(owner: string): Promise<number>;
255
+ /**
256
+ * Gets the raw ERC721 balance of an owner address
257
+ *
258
+ * @param owner - The address to check the balance of
259
+ * @returns The balance as a bigint
260
+ *
261
+ * @example
262
+ * ```typescript
263
+ * const balanceRaw = await sdk.getERC721BalanceOfRaw("0x...");
264
+ * ```
265
+ */
266
+ getERC721BalanceOfRaw(owner: string): Promise<bigint>;
241
267
  getContractAddress(): string;
242
268
  getConfigs(): Array<{
243
269
  weight: number;
@@ -307,4 +333,95 @@ export declare class TradingVaultSDK {
307
333
  };
308
334
  buildAddReward(amount: number): Promise<ethers.ContractTransaction>;
309
335
  buildAddRewardTxRaw(amount: bigint): Promise<ethers.ContractTransaction>;
336
+ /**
337
+ * Gets the owner address of a specific token ID
338
+ *
339
+ * @param tokenId - The token ID to check ownership
340
+ * @returns The address of the token owner
341
+ *
342
+ * @example
343
+ * ```typescript
344
+ * const owner = await sdk.ownerOf(128);
345
+ * ```
346
+ */
347
+ ownerOf(tokenId: bigint | number): Promise<string>;
348
+ /**
349
+ * Checks if an address is the owner of a specific token ID
350
+ *
351
+ * @param tokenId - The token ID to check
352
+ * @param address - The address to verify ownership
353
+ * @returns Boolean indicating if the address is the owner
354
+ *
355
+ * @example
356
+ * ```typescript
357
+ * const isOwner = await sdk.isOwnerOf(128, "0x...");
358
+ * ```
359
+ */
360
+ isOwnerOf(tokenId: bigint | number, address: string): Promise<boolean>;
361
+ /**
362
+ * Builds a transaction to set expiration time for a position
363
+ *
364
+ * @param tokenId - ID of the position
365
+ * @param expiredAt - New expiration timestamp (in seconds)
366
+ * @returns Populated transaction
367
+ *
368
+ * @example
369
+ * ```typescript
370
+ * const tx = await sdk.buildSetPositionExpirationTx(128, Math.floor(Date.now() / 1000) + 86400); // Expire in 1 day
371
+ * ```
372
+ */
373
+ buildSetPositionExpirationTx(tokenId: number, expiredAt: number): Promise<ethers.ContractTransaction>;
374
+ /**
375
+ * Builds a raw transaction to set expiration time for a position
376
+ *
377
+ * @param tokenId - ID of the position as bigint
378
+ * @param expiredAt - New expiration timestamp as bigint
379
+ * @returns Populated transaction
380
+ */
381
+ buildSetPositionExpirationTxRaw(tokenId: bigint, expiredAt: bigint): Promise<ethers.ContractTransaction>;
382
+ /**
383
+ * Builds a transaction to batch set expiration times for multiple positions
384
+ *
385
+ * @param tokenIds - Array of position IDs
386
+ * @param expiredAts - Array of expiration timestamps (in seconds)
387
+ * @returns Populated transaction
388
+ *
389
+ * @example
390
+ * ```typescript
391
+ * const tokenIds = [128, 129, 130];
392
+ * const now = Math.floor(Date.now() / 1000);
393
+ * const expiredAts = [now + 86400, now + 172800, now + 259200]; // 1, 2, and 3 days
394
+ * const tx = await sdk.buildBatchSetPositionExpirationTx(tokenIds, expiredAts);
395
+ * ```
396
+ */
397
+ buildBatchSetPositionExpirationTx(tokenIds: number[], expiredAts: number[]): Promise<ethers.ContractTransaction>;
398
+ /**
399
+ * Builds a raw transaction to batch set expiration times for multiple positions
400
+ *
401
+ * @param tokenIds - Array of position IDs as bigint
402
+ * @param expiredAts - Array of expiration timestamps as bigint
403
+ * @returns Populated transaction
404
+ */
405
+ buildBatchSetPositionExpirationTxRaw(tokenIds: bigint[], expiredAts: bigint[]): Promise<ethers.ContractTransaction>;
406
+ /**
407
+ * Builds a transaction to close an expired position with a provided price
408
+ *
409
+ * @param tokenId - ID of the expired position to close
410
+ * @param providedPrice - Price to use for calculations (should be price at expiry time)
411
+ * @returns Populated transaction
412
+ *
413
+ * @example
414
+ * ```typescript
415
+ * const tx = await sdk.buildCloseExpiredPositionTx(128, 105); // Close with price 105
416
+ * ```
417
+ */
418
+ buildCloseExpiredPositionTx(tokenId: number, providedPrice: number): Promise<ethers.ContractTransaction>;
419
+ /**
420
+ * Builds a raw transaction to close an expired position with a provided price
421
+ *
422
+ * @param tokenId - ID of the expired position as bigint
423
+ * @param providedPrice - Price to use for calculations as bigint
424
+ * @returns Populated transaction
425
+ */
426
+ buildCloseExpiredPositionTxRaw(tokenId: bigint, providedPrice: bigint): Promise<ethers.ContractTransaction>;
310
427
  }
@@ -1 +1 @@
1
- "use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.TradingVaultSDK=void 0;const e=require("ethers"),r=t(require("./abis/TradingVault.json")),a=t(require("./contracts.json")),n=require("./utils");exports.TradingVaultSDK=class{constructor(t,i){this.name="TradingVault",this._currency=null,this._rewardToken=null,this._currencyDecimals=null,this._rewardTokenDecimals=null,this.priceDecimals=6,this.isBootstrapped=!1,this.configs=[],this.BASE_WEIGHT=1e4,this.BASE_PRICE=100,this.formatEventArgs=t=>{const e=this._currencyDecimals,r=this._rewardTokenDecimals,{eventName:a,args:n}=t;switch(a){case"PositionCreated":return{...t,args:{...n,user:n.user.toLowerCase(),amount:Number(n.amount)/Math.pow(10,e),entryPrice:Number(n.entryPrice)/Math.pow(10,this.priceDecimals),tokenId:Number(n.tokenId),openedAt:Number(n.openedAt)}};case"PositionReduced":return{...t,args:{...n,user:n.user.toLowerCase(),reducedAmount:Number(n.reducedAmount)/Math.pow(10,e),remainingAmount:Number(n.remainingAmount)/Math.pow(10,e),totalReward:Number(n.totalReward)/Math.pow(10,r),userReward:Number(n.userReward)/Math.pow(10,r),treasuryReward:Number(n.treasuryReward)/Math.pow(10,r),rewardedAmount:Number(n.rewardedAmount)/Math.pow(10,r),weight:Number(n.weight),tokenId:Number(n.tokenId),lossAmount:Number(n.lossAmount)/Math.pow(10,e),price:Number(n.price)/Math.pow(10,this.priceDecimals),loss:Number(n.loss)/Math.pow(10,e)}};case"CurrencyBorrowed":case"CurrencyRepaid":return{...t,args:{...n,amount:Number(n.amount)/Math.pow(10,e),borrower:n.borrower.toLowerCase()}};case"PriceUpdated":return{...t,args:{...n,oldPrice:Number(n.oldPrice)/Math.pow(10,this.priceDecimals),newPrice:Number(n.newPrice)/Math.pow(10,this.priceDecimals),requiredReward:Number(n.requiredReward)/Math.pow(10,r),timestamp:Number(n.timestamp)}};case"TotalAmountUpdated":return{...t,args:{...n,newTotalAmount:Number(n.newTotalAmount)/Math.pow(10,e)}};case"CurrencyUpdated":return{...t,args:{...n,oldCurrency:n.oldCurrency.toLowerCase(),newCurrency:n.newCurrency.toLowerCase()}};case"RewardTokenUpdated":return{...t,args:{...n,oldRewardToken:n.oldRewardToken.toLowerCase(),newRewardToken:n.newRewardToken.toLowerCase()}};case"ReduceEnabledUpdated":return{...t,args:{...n,enabled:n.enabled}};case"TreasuryUpdated":return{...t,args:{...n,oldTreasury:n.oldTreasury.toLowerCase(),newTreasury:n.newTreasury.toLowerCase()}};case"RewardConfigsUpdated":return{...t,args:{...n}};case"TotalRewardsUpdated":case"TotalRewardsHarvestedUpdated":return{...t,args:{...n,oldAmount:Number(n.oldAmount)/Math.pow(10,r),newAmount:Number(n.newAmount)/Math.pow(10,r)}};case"Transfer":return{...t,args:{...n,from:n.from.toLowerCase(),to:n.to.toLowerCase(),value:Number(n.value)}};default:return t}};const o=Array.isArray(t)?t:[t];this.providers=o.map((t=>new e.ethers.JsonRpcProvider(t)));const s=(0,n.getRandomProvider)(this.providers);this.contractAddress=(0,n.resolveContractAddress)(o[0],this.name,a.default,i),this.contract=new e.ethers.Contract(this.contractAddress,r.default.abi,s)}getRandomProvider(){return(0,n.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,r.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,n.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,r)=>t[r])),0===this.providers.length)throw new Error("No active RPC providers available");await Promise.all([this.getCurrencyDecimals(),this.getRewardTokenDecimals(),(async()=>{const t=await this.getRewardConfigsLength(),e=[];for(let r=0;r<t;r++)e.push(this.getRewardConfig(r));const r=await Promise.all(e);this.configs=r.map((t=>({weight:Number(t.weight)/this.BASE_WEIGHT,duration:Number(t.duration)})))})()]),this.isBootstrapped=!0}async signAndSendTransaction(t,e,r={}){return(0,n.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),r,this.contract)}async buildCreatePositionTx(t,e){const r=await this.getCurrencyDecimals(),a=BigInt(Math.floor(t*Math.pow(10,r)));return this.buildCreatePositionTxRaw(a,e)}async buildReducePositionTx(t,e){const r=await this.getCurrencyDecimals(),a=BigInt(Math.floor(e*Math.pow(10,r)));return this.buildReducePositionTxRaw(t,a)}async buildReducePositionsTx(t,e){const r=await this.getCurrencyDecimals(),a=e.map((t=>BigInt(Math.floor(t*Math.pow(10,r)))));return this.buildReducePositionsTxRaw(t,a)}async buildBorrowCurrencyTx(t){const e=await this.getCurrencyDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildBorrowCurrencyTxRaw(r)}async buildRepayCurrencyTx(t){const e=await this.getCurrencyDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildRepayCurrencyTxRaw(r)}async buildSetPriceTx(t){const e=BigInt(Math.round(t*Math.pow(10,this.priceDecimals)));return await this.buildSetPriceTxRaw(e)}async buildBatchEmitPriceUpdatedTx(t){const e=t.map((t=>({price:BigInt(Math.round(t.price*Math.pow(10,this.priceDecimals))),timestamp:BigInt(t.timestamp)})));return await this.buildBatchEmitPriceUpdatedTxRaw(e)}async buildBatchEmitPriceUpdatedTxRaw(t){return await this.contract.batchEmitPriceUpdated.populateTransaction(t)}async buildClaimERC20Tx(t,r){const a=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider()),n=await a.decimals(),i=BigInt(Math.floor(r*Math.pow(10,n)));return this.buildClaimERC20TxRaw(t,i)}async buildCreatePositionTxRaw(t,e){return await this.contract.createPosition.populateTransaction(t,e)}async buildReducePositionTxRaw(t,e){return await this.contract.reducePosition.populateTransaction(t,e)}async buildReducePositionsTxRaw(t,e){return await this.contract.reducePositions.populateTransaction(t,e)}async buildBorrowCurrencyTxRaw(t){return await this.contract.borrowCurrency.populateTransaction(t)}async buildRepayCurrencyTxRaw(t){return await this.contract.repayCurrency.populateTransaction(t)}async buildSetPriceTxRaw(t){return await this.contract.setPrice.populateTransaction(t)}async buildSetCurrencyTxRaw(t){this._currency=null;return await this.contract.setCurrency.populateTransaction(t)}async buildSetRewardTokenTxRaw(t){this._rewardToken=null;return await this.contract.setRewardToken.populateTransaction(t)}async buildSetTreasuryTxRaw(t){return await this.contract.setTreasury.populateTransaction(t)}async buildUpdateRewardConfigsTxRaw(t){return await this.contract.updateRewardConfigs.populateTransaction(t)}async buildSetReduceEnabledTxRaw(t){return await this.contract.setReduceEnabled.populateTransaction(t)}async buildClaimERC20TxRaw(t,e){return await this.contract.claimERC20.populateTransaction(t,e)}async buildApproveERC20Tx(t,r,a){const n=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider()),i=await n.decimals(),o=BigInt(Math.floor(a*Math.pow(10,Number(i))));return this.buildApproveERC20TxRaw(t,r,o)}async buildApproveERC20TxRaw(t,e,r){return await(0,n.buildApproveERC20Tx)(t,e,r,this.getRandomProvider())}async getAllowanceRaw(t,e,r){return await(0,n.getTokenAllowance)(t,e,r,this.getRandomProvider())}async getAllowance(t,e,r){const[a,i]=await Promise.all([this.getAllowanceRaw(t,e,r),(0,n.getTokenDecimals)(t,this.getRandomProvider())]);return Number(a)/Math.pow(10,i)}async buildGrantOperatorRoleTxRaw(t){return await this.contract.grantOperatorRole.populateTransaction(t)}async getOperatorRoleHash(){return await this.contract.OPERATOR_ROLE()}async hasOperatorRole(t){const e=await this.contract.OPERATOR_ROLE();return await this.contract.hasRole(e,t)}async buildGrantOperatorRoleTx(t){return await this.contract.grantOperatorRole.populateTransaction(t)}async getPriceSetterRoleHash(){return await this.contract.PRICE_SETTER_ROLE()}async hasPriceSetterRole(t){const e=await this.contract.PRICE_SETTER_ROLE();return await this.contract.hasRole(e,t)}async buildGrantPriceSetterRoleTx(t){return await this.contract.grantPriceSetterRole.populateTransaction(t)}async getAdminRoleHash(){return await this.contract.DEFAULT_ADMIN_ROLE()}async hasAdminRole(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.hasRole(e,t)}async buildGrantAdminRoleTx(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.grantRole.populateTransaction(e,t)}async getPrice(){const t=await this.getPriceRaw(),e=this.priceDecimals;return Number(t)/Math.pow(10,e)}async getPriceRaw(){return await this.contract.price()}async getCurrency(){return this._currency||(this._currency=await this.contract.currency()),this._currency}async getRewardToken(){return this._rewardToken||(this._rewardToken=await this.contract.rewardToken()),this._rewardToken}async getTreasury(){return await this.contract.treasury()}async getTotalAmount(){const t=await this.getTotalAmountRaw(),e=await this.getCurrencyDecimals();return Number(t)/Math.pow(10,e)}async getTotalAmountRaw(){return await this.contract.totalAmount()}async getTotalBorrowed(){const t=await this.getTotalBorrowedRaw(),e=await this.getCurrencyDecimals();return Number(t)/Math.pow(10,e)}async getTotalBorrowedRaw(){return await this.contract.totalBorrowed()}async isReduceEnabled(){return await this.contract.isReduceEnabled()}async getPosition(t){const e=await this.getPositionRaw(t),r=await this.getCurrencyDecimals(),a=await this.getRewardTokenDecimals(),n=this.priceDecimals;return{remainingAmount:Number(e.remainingAmount)/Math.pow(10,r),entryPrice:Number(e.entryPrice)/Math.pow(10,n),outPrice:Number(e.outPrice)/Math.pow(10,n),openedAt:Number(e.openedAt),closedAt:Number(e.closedAt),rewardedAmount:Number(e.rewardedAmount)/Math.pow(10,a),lossAmount:Number(e.lossAmount)/Math.pow(10,r),initAmount:Number(e.initAmount)/Math.pow(10,r)}}async getPositionRaw(t){return await this.contract.positions(t)}async getRewardConfig(t){return await this.contract.rewardConfigs(t)}async getRewardConfigsLength(){return await this.contract.getRewardConfigsLength()}async getCurrencyDecimals(){if(null===this._currencyDecimals){const t=await this.getCurrency(),r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider());this._currencyDecimals=Number(await r.decimals())}return this._currencyDecimals}async getRewardTokenDecimals(){if(null===this._rewardTokenDecimals){const t=await this.getRewardToken(),r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider());this._rewardTokenDecimals=Number(await r.decimals())}return this._rewardTokenDecimals}getContractAddress(){return this.contractAddress}getConfigs(){return[...this.configs]}async getAllEvents(t,e,r){return await this.bootstrap(),(0,n.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e,r)}async streamEvents(t,e,r,a=1e3,i=5e3){const o=["CurrencyBorrowed","CurrencyRepaid","CurrencyUpdated","PositionCreated","PositionReduced","PriceUpdated","ReduceEnabledUpdated","RewardConfigsUpdated","RewardTokenUpdated","TotalAmountUpdated","TotalRewardsHarvestedUpdated","TotalRewardsUpdated","Transfer","TreasuryUpdated"];return await this.bootstrap(),(0,n.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e,o),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:r,fromBlock:t,batchSize:a,sleepTime:i})}estimateUnrealizedPnl({price:t,entryPrice:e,initAmount:r,remainingAmount:a}){const n=a*(t-e)/this.BASE_PRICE;return{pnl:n,pnlPercentage:n/r*100}}estReducePosition({amount:t,price:e,entryPrice:r,openedAt:a,configs:n=[]}){const i=this.BASE_PRICE;this.BASE_WEIGHT;let o=t,s=0,c=0,u=0,d=0;if(e<r){return o=t-t*(r-e)/100,{amount:o,totalReward:0,userReward:0,treasuryReward:0,weight:0}}if(e>=r){s=t*(e-r)/i;const o=Math.floor(Date.now()/1e3)-a;d=this.getRewardWeight(o,n),c=s*d,u=s-c}return{amount:o,totalReward:s,userReward:c,treasuryReward:u,weight:d}}estReducePositions({positions:t,price:e,configs:r=[]}){return t.map((t=>this.estReducePosition({amount:t.amount,price:e,entryPrice:t.entryPrice,openedAt:t.openedAt,configs:r}))).reduce(((t,e)=>({amount:t.amount+e.amount,totalReward:t.totalReward+e.totalReward,userReward:t.userReward+e.userReward,treasuryReward:t.treasuryReward+e.treasuryReward})),{amount:0,totalReward:0,userReward:0,treasuryReward:0})}getRewardWeight(t,e){return(0,n.getRewardWeight)(t,e)}estimateUnrealizedPnls({price:t,positions:e}){return e.reduce(((e,r)=>{const{pnl:a}=this.estimateUnrealizedPnl({price:t,...r});return{totalInitAmount:e.totalInitAmount+r.initAmount,totalRemainingAmount:e.totalRemainingAmount+r.remainingAmount,totalRewardedAmount:e.totalRewardedAmount+r.rewardedAmount,totalLossAmount:e.totalLossAmount+r.lossAmount,totalPnl:e.totalPnl+a}}),{totalInitAmount:0,totalRemainingAmount:0,totalRewardedAmount:0,totalLossAmount:0,totalPnl:0})}async buildAddReward(t){const e=await this.getRewardTokenDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildAddRewardTxRaw(r)}async buildAddRewardTxRaw(t){return await this.contract.addReward.populateTransaction(t)}};
1
+ "use strict";var t=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.TradingVaultSDK=void 0;const e=require("ethers"),r=t(require("./abis/TradingVault.json")),a=t(require("./contracts.json")),n=require("./utils");exports.TradingVaultSDK=class{constructor(t,i){this.name="TradingVault",this._currency=null,this._rewardToken=null,this._currencyDecimals=null,this._rewardTokenDecimals=null,this.priceDecimals=6,this.isBootstrapped=!1,this.configs=[],this.BASE_WEIGHT=1e4,this.BASE_PRICE=100,this.formatEventArgs=t=>{const e=this._currencyDecimals,r=this._rewardTokenDecimals,{eventName:a,args:n}=t;switch(a){case"PositionCreated":return{...t,args:{...n,user:n.user.toLowerCase(),amount:Number(n.amount)/Math.pow(10,e),entryPrice:Number(n.entryPrice)/Math.pow(10,this.priceDecimals),tokenId:Number(n.tokenId),openedAt:Number(n.openedAt),expiredAt:Number(n.expiredAt),currency:n.currency.toLowerCase()}};case"PositionReduced":return{...t,args:{...n,user:n.user.toLowerCase(),reducedAmount:Number(n.reducedAmount)/Math.pow(10,e),remainingAmount:Number(n.remainingAmount)/Math.pow(10,e),totalReward:Number(n.totalReward)/Math.pow(10,r),userReward:Number(n.userReward)/Math.pow(10,r),treasuryReward:Number(n.treasuryReward)/Math.pow(10,r),rewardedAmount:Number(n.rewardedAmount)/Math.pow(10,r),weight:Number(n.weight),tokenId:Number(n.tokenId),lossAmount:Number(n.lossAmount)/Math.pow(10,e),price:Number(n.price)/Math.pow(10,this.priceDecimals),loss:Number(n.loss)/Math.pow(10,e)}};case"CurrencyBorrowed":case"CurrencyRepaid":return{...t,args:{...n,amount:Number(n.amount)/Math.pow(10,e),borrower:n.borrower.toLowerCase()}};case"PriceUpdated":return{...t,args:{...n,oldPrice:Number(n.oldPrice)/Math.pow(10,this.priceDecimals),newPrice:Number(n.newPrice)/Math.pow(10,this.priceDecimals),requiredReward:Number(n.requiredReward)/Math.pow(10,r),timestamp:Number(n.timestamp)}};case"TotalAmountUpdated":return{...t,args:{...n,newTotalAmount:Number(n.newTotalAmount)/Math.pow(10,e)}};case"CurrencyUpdated":return{...t,args:{...n,oldCurrency:n.oldCurrency.toLowerCase(),newCurrency:n.newCurrency.toLowerCase()}};case"RewardTokenUpdated":return{...t,args:{...n,oldRewardToken:n.oldRewardToken.toLowerCase(),newRewardToken:n.newRewardToken.toLowerCase()}};case"ReduceEnabledUpdated":return{...t,args:{...n,enabled:n.enabled}};case"TreasuryUpdated":return{...t,args:{...n,oldTreasury:n.oldTreasury.toLowerCase(),newTreasury:n.newTreasury.toLowerCase()}};case"RewardConfigsUpdated":return{...t,args:{...n}};case"TotalRewardsUpdated":case"TotalRewardsHarvestedUpdated":return{...t,args:{...n,oldAmount:Number(n.oldAmount)/Math.pow(10,r),newAmount:Number(n.newAmount)/Math.pow(10,r)}};case"Transfer":return{...t,args:{...n,from:n.from.toLowerCase(),to:n.to.toLowerCase(),value:Number(n.value)}};default:return t}};const o=Array.isArray(t)?t:[t];this.providers=o.map((t=>new e.ethers.JsonRpcProvider(t,void 0,{staticNetwork:!0})));const s=(0,n.getRandomProvider)(this.providers);this.contractAddress=(0,n.resolveContractAddress)(o[0],this.name,a.default,i),this.contract=new e.ethers.Contract(this.contractAddress,r.default.abi,s)}getRandomProvider(){return(0,n.getRandomProvider)(this.providers)}getContractWithRandomProvider(){return new e.ethers.Contract(this.contractAddress,r.default.abi,this.getRandomProvider())}async bootstrap(){if(this.isBootstrapped)return;const t=await Promise.all(this.providers.map(((t,e)=>(0,n.checkRpcHealth)(t,e))));if(this.providers=this.providers.filter(((e,r)=>t[r])),0===this.providers.length)throw new Error("No active RPC providers available");await Promise.all([this.getCurrencyDecimals(),this.getRewardTokenDecimals(),(async()=>{const t=await this.getRewardConfigsLength(),e=[];for(let r=0;r<t;r++)e.push(this.getRewardConfig(r));const r=await Promise.all(e);this.configs=r.map((t=>({weight:Number(t.weight)/this.BASE_WEIGHT,duration:Number(t.duration)})))})()]),this.isBootstrapped=!0}async signAndSendTransaction(t,e,r={}){return(0,n.signAndSendTransaction)(t,e,(()=>this.getRandomProvider()),r,this.contract)}async buildCreatePositionTx(t,e,r=0){const a=await this.getCurrencyDecimals(),n=BigInt(Math.floor(t*Math.pow(10,a)));return this.buildCreatePositionTxRaw(n,e,BigInt(r))}async buildReducePositionTx(t,e){const r=await this.getCurrencyDecimals(),a=BigInt(Math.floor(e*Math.pow(10,r)));return this.buildReducePositionTxRaw(t,a)}async buildReducePositionsTx(t,e){const r=await this.getCurrencyDecimals(),a=e.map((t=>BigInt(Math.floor(t*Math.pow(10,r)))));return this.buildReducePositionsTxRaw(t,a)}async buildBorrowCurrencyTx(t){const e=await this.getCurrencyDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildBorrowCurrencyTxRaw(r)}async buildRepayCurrencyTx(t){const e=await this.getCurrencyDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildRepayCurrencyTxRaw(r)}async buildSetPriceTx(t){const e=BigInt(Math.round(t*Math.pow(10,this.priceDecimals)));return await this.buildSetPriceTxRaw(e)}async buildBatchEmitPriceUpdatedTx(t){const e=t.map((t=>({price:BigInt(Math.round(t.price*Math.pow(10,this.priceDecimals))),timestamp:BigInt(t.timestamp)})));return await this.buildBatchEmitPriceUpdatedTxRaw(e)}async buildBatchEmitPriceUpdatedTxRaw(t){return await this.contract.batchEmitPriceUpdated.populateTransaction(t)}async buildClaimERC20Tx(t,r){const a=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider()),n=await a.decimals(),i=BigInt(Math.floor(r*Math.pow(10,n)));return this.buildClaimERC20TxRaw(t,i)}async buildCreatePositionTxRaw(t,e,r=0n){return await this.contract.createPosition.populateTransaction(t,e,r)}async buildReducePositionTxRaw(t,e){return await this.contract.reducePosition.populateTransaction(t,e)}async buildReducePositionsTxRaw(t,e){return await this.contract.reducePositions.populateTransaction(t,e)}async buildBorrowCurrencyTxRaw(t){return await this.contract.borrowCurrency.populateTransaction(t)}async buildRepayCurrencyTxRaw(t){return await this.contract.repayCurrency.populateTransaction(t)}async buildSetPriceTxRaw(t){return await this.contract.setPrice.populateTransaction(t)}async buildSetCurrencyTxRaw(t){this._currency=null;return await this.contract.setCurrency.populateTransaction(t)}async buildSetRewardTokenTxRaw(t){this._rewardToken=null;return await this.contract.setRewardToken.populateTransaction(t)}async buildSetTreasuryTxRaw(t){return await this.contract.setTreasury.populateTransaction(t)}async buildUpdateRewardConfigsTxRaw(t){return await this.contract.updateRewardConfigs.populateTransaction(t)}async buildSetReduceEnabledTxRaw(t){return await this.contract.setReduceEnabled.populateTransaction(t)}async buildClaimERC20TxRaw(t,e){return await this.contract.claimERC20.populateTransaction(t,e)}async buildApproveERC20Tx(t,r,a){const n=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider()),i=await n.decimals(),o=BigInt(Math.floor(a*Math.pow(10,Number(i))));return this.buildApproveERC20TxRaw(t,r,o)}async buildApproveERC20TxRaw(t,e,r){return await(0,n.buildApproveERC20Tx)(t,e,r,this.getRandomProvider())}async getAllowanceRaw(t,e,r){return await(0,n.getTokenAllowance)(t,e,r,this.getRandomProvider())}async getAllowance(t,e,r){const[a,i]=await Promise.all([this.getAllowanceRaw(t,e,r),(0,n.getTokenDecimals)(t,this.getRandomProvider())]);return Number(a)/Math.pow(10,i)}async buildGrantOperatorRoleTxRaw(t){return await this.contract.grantOperatorRole.populateTransaction(t)}async getOperatorRoleHash(){return await this.contract.OPERATOR_ROLE()}async hasOperatorRole(t){const e=await this.contract.OPERATOR_ROLE();return await this.contract.hasRole(e,t)}async buildGrantOperatorRoleTx(t){return await this.contract.grantOperatorRole.populateTransaction(t)}async getPriceSetterRoleHash(){return await this.contract.PRICE_SETTER_ROLE()}async hasPriceSetterRole(t){const e=await this.contract.PRICE_SETTER_ROLE();return await this.contract.hasRole(e,t)}async buildGrantPriceSetterRoleTx(t){return await this.contract.grantPriceSetterRole.populateTransaction(t)}async getAdminRoleHash(){return await this.contract.DEFAULT_ADMIN_ROLE()}async hasAdminRole(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.hasRole(e,t)}async buildGrantAdminRoleTx(t){const e=await this.contract.DEFAULT_ADMIN_ROLE();return await this.contract.grantRole.populateTransaction(e,t)}async getPrice(){const t=await this.getPriceRaw(),e=this.priceDecimals;return Number(t)/Math.pow(10,e)}async getPriceRaw(){return await this.contract.price()}async getCurrency(){return this._currency||(this._currency=await this.contract.currency()),this._currency}async getRewardToken(){return this._rewardToken||(this._rewardToken=await this.contract.rewardToken()),this._rewardToken}async getTreasury(){return await this.contract.treasury()}async getTotalAmount(){const t=await this.getTotalAmountRaw(),e=await this.getCurrencyDecimals();return Number(t)/Math.pow(10,e)}async getTotalAmountRaw(){return await this.contract.totalAmount()}async getTotalBorrowed(){const t=await this.getTotalBorrowedRaw(),e=await this.getCurrencyDecimals();return Number(t)/Math.pow(10,e)}async getTotalBorrowedRaw(){return await this.contract.totalBorrowed()}async isReduceEnabled(){return await this.contract.isReduceEnabled()}async getPosition(t){const e=await this.getPositionRaw(t),r=await this.getCurrencyDecimals(),a=await this.getRewardTokenDecimals(),n=this.priceDecimals;return{remainingAmount:Number(e.remainingAmount)/Math.pow(10,r),entryPrice:Number(e.entryPrice)/Math.pow(10,n),outPrice:Number(e.outPrice)/Math.pow(10,n),openedAt:Number(e.openedAt),closedAt:Number(e.closedAt),rewardedAmount:Number(e.rewardedAmount)/Math.pow(10,a),lossAmount:Number(e.lossAmount)/Math.pow(10,r),initAmount:Number(e.initAmount)/Math.pow(10,r),expiredAt:Number(e.expiredAt)}}async getPositionRaw(t){return await this.contract.positions(t)}async getRewardConfig(t){return await this.contract.rewardConfigs(t)}async getRewardConfigsLength(){return await this.contract.getRewardConfigsLength()}async getCurrencyDecimals(){if(null===this._currencyDecimals){const t=await this.getCurrency(),r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider());this._currencyDecimals=Number(await r.decimals())}return this._currencyDecimals}async getRewardTokenDecimals(){if(null===this._rewardTokenDecimals){const t=await this.getRewardToken(),r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],this.getRandomProvider());this._rewardTokenDecimals=Number(await r.decimals())}return this._rewardTokenDecimals}async getERC721BalanceOf(t){const e=await this.getERC721BalanceOfRaw(t);return Number(e)}async getERC721BalanceOfRaw(t){return await this.contract.balanceOf(t)}getContractAddress(){return this.contractAddress}getConfigs(){return[...this.configs]}async getAllEvents(t,e,r){return await this.bootstrap(),(0,n.getAllEvents)(this.contract,(()=>this.getRandomProvider()),(()=>this.getContractWithRandomProvider()),t,e,r)}async streamEvents(t,e,r,a=1e3,i=5e3){const o=["CurrencyBorrowed","CurrencyRepaid","CurrencyUpdated","PositionCreated","PositionReduced","PriceUpdated","ReduceEnabledUpdated","RewardConfigsUpdated","RewardTokenUpdated","TotalAmountUpdated","TotalRewardsHarvestedUpdated","TotalRewardsUpdated","Transfer","TreasuryUpdated"];return await this.bootstrap(),(0,n.streamEvents)({getProvider:()=>this.getRandomProvider(),getAllEvents:(t,e)=>this.getAllEvents(t,e,o),formatEvent:t=>this.formatEventArgs(t),onEvent:e,saveLatestBlock:r,fromBlock:t,batchSize:a,sleepTime:i})}estimateUnrealizedPnl({price:t,entryPrice:e,initAmount:r,remainingAmount:a}){const n=a*(t-e)/this.BASE_PRICE;return{pnl:n,pnlPercentage:n/r*100}}estReducePosition({amount:t,price:e,entryPrice:r,openedAt:a,configs:n=[]}){const i=this.BASE_PRICE;this.BASE_WEIGHT;let o=t,s=0,c=0,u=0,d=0;if(e<r){return o=t-t*(r-e)/100,{amount:o,totalReward:0,userReward:0,treasuryReward:0,weight:0}}if(e>=r){s=t*(e-r)/i;const o=Math.floor(Date.now()/1e3)-a;d=this.getRewardWeight(o,n),c=s*d,u=s-c}return{amount:o,totalReward:s,userReward:c,treasuryReward:u,weight:d}}estReducePositions({positions:t,price:e,configs:r=[]}){return t.map((t=>this.estReducePosition({amount:t.amount,price:e,entryPrice:t.entryPrice,openedAt:t.openedAt,configs:r}))).reduce(((t,e)=>({amount:t.amount+e.amount,totalReward:t.totalReward+e.totalReward,userReward:t.userReward+e.userReward,treasuryReward:t.treasuryReward+e.treasuryReward})),{amount:0,totalReward:0,userReward:0,treasuryReward:0})}getRewardWeight(t,e){return(0,n.getRewardWeight)(t,e)}estimateUnrealizedPnls({price:t,positions:e}){return e.reduce(((e,r)=>{const{pnl:a}=this.estimateUnrealizedPnl({price:t,...r});return{totalInitAmount:e.totalInitAmount+r.initAmount,totalRemainingAmount:e.totalRemainingAmount+r.remainingAmount,totalRewardedAmount:e.totalRewardedAmount+r.rewardedAmount,totalLossAmount:e.totalLossAmount+r.lossAmount,totalPnl:e.totalPnl+a}}),{totalInitAmount:0,totalRemainingAmount:0,totalRewardedAmount:0,totalLossAmount:0,totalPnl:0})}async buildAddReward(t){const e=await this.getRewardTokenDecimals(),r=BigInt(Math.floor(t*Math.pow(10,e)));return this.buildAddRewardTxRaw(r)}async buildAddRewardTxRaw(t){return await this.contract.addReward.populateTransaction(t)}async ownerOf(t){const e="number"==typeof t?BigInt(t):t;return await this.contract.ownerOf(e)}async isOwnerOf(t,e){try{return(await this.ownerOf(t)).toLowerCase()===e.toLowerCase()}catch(t){return!1}}async buildSetPositionExpirationTx(t,e){return this.buildSetPositionExpirationTxRaw(BigInt(t),BigInt(e))}async buildSetPositionExpirationTxRaw(t,e){return await this.contract.setPositionExpiration.populateTransaction(t,e)}async buildBatchSetPositionExpirationTx(t,e){const r=t.map((t=>BigInt(t))),a=e.map((t=>BigInt(t)));return this.buildBatchSetPositionExpirationTxRaw(r,a)}async buildBatchSetPositionExpirationTxRaw(t,e){return await this.contract.batchSetPositionExpiration.populateTransaction(t,e)}async buildCloseExpiredPositionTx(t,e){const r=BigInt(Math.round(e*Math.pow(10,this.priceDecimals)));return this.buildCloseExpiredPositionTxRaw(BigInt(t),r)}async buildCloseExpiredPositionTxRaw(t,e){return await this.contract.closeExpiredPosition.populateTransaction(t,e)}};
@@ -159,6 +159,17 @@
159
159
  "name": "InvalidReferrer",
160
160
  "type": "error"
161
161
  },
162
+ {
163
+ "inputs": [
164
+ {
165
+ "internalType": "uint256",
166
+ "name": "value",
167
+ "type": "uint256"
168
+ }
169
+ ],
170
+ "name": "InvalidSharePercent",
171
+ "type": "error"
172
+ },
162
173
  {
163
174
  "inputs": [],
164
175
  "name": "NotInitializing",
@@ -437,6 +448,25 @@
437
448
  "name": "ReferrerSet",
438
449
  "type": "event"
439
450
  },
451
+ {
452
+ "anonymous": false,
453
+ "inputs": [
454
+ {
455
+ "indexed": false,
456
+ "internalType": "uint256",
457
+ "name": "oldValue",
458
+ "type": "uint256"
459
+ },
460
+ {
461
+ "indexed": false,
462
+ "internalType": "uint256",
463
+ "name": "newValue",
464
+ "type": "uint256"
465
+ }
466
+ ],
467
+ "name": "SharePercentUpdated",
468
+ "type": "event"
469
+ },
440
470
  {
441
471
  "anonymous": false,
442
472
  "inputs": [
@@ -901,6 +931,19 @@
901
931
  "stateMutability": "nonpayable",
902
932
  "type": "function"
903
933
  },
934
+ {
935
+ "inputs": [
936
+ {
937
+ "internalType": "uint256",
938
+ "name": "_sharePercent",
939
+ "type": "uint256"
940
+ }
941
+ ],
942
+ "name": "setSharePercent",
943
+ "outputs": [],
944
+ "stateMutability": "nonpayable",
945
+ "type": "function"
946
+ },
904
947
  {
905
948
  "inputs": [],
906
949
  "name": "sharePercent",
@@ -1034,8 +1077,8 @@
1034
1077
  "type": "function"
1035
1078
  }
1036
1079
  ],
1037
- "bytecode": "0x608080604052346015576127ef908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146117895750806306fdde03146116d9578063081812fc1461168e578063095ea7b31461159c57806323b872dd146115855780632655e8401461151d5780632e1a7d4d146114bf57806342842e0e1461148f57806343508b0514611436578063492cc769146113115780634a3b68cc146112cf57806355f804b3146110fa5780635f1e6f6d14610ab657806363311f4914610a365780636352211e14610a065780636c0360eb146109e257806370a0823114610990578063715018a614610926578063755edd17146108d257806384d8ad13146108b45780638da5cb5b1461087e57806391b7f5ed1461085d57806395d89b41146107765780639b2c76d4146107325780639df375d714610696578063a035b1fe14610678578063a22cb465146105dc578063b0a2fc1b14610555578063b88d4fde146104ea578063c15edf5f146104cc578063c87b56dd14610413578063d6bfb04814610213578063e985e9c5146101c55763f2fde38b1461019557600080fd5b346101c05760203660031901126101c0576101be6101b161183c565b6101b9611e34565b611d8d565b005b600080fd5b346101c05760403660031901126101c0576101de61183c565b6101ef6101e9611852565b9161196c565b9060018060a01b0316600052602052602060ff604060002054166040519015158152f35b60403660031901126101c0576004356001600160401b0381116101c05761023e903690600401611915565b6024359081156103ce5761025482600054611d23565b8034036103b65750602061027160405192838151938492016117f4565b60059082019081528190036020019020546001600160a01b0316801580156103ad575b61039957336000908152600360205260409020546001600160a01b031615610344575b506102c1336120ca565b6102ca81611d4c565b906102d860405192836118a2565b808252601f196102e782611d4c565b0136602084013760005b81811061032757508034049160005b82811061030957005b8061032161031960019385611d63565b518633612386565b01610300565b60019061033333611e79565b61033d8286611d63565b52016102f1565b33600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790559091907f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a9080a3816102b7565b6316fb166f60e01b60005260045260246000fd5b50338114610294565b63ebbfb3bb60e01b6000523460045260245260446000fd5b60405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b346101c05760203660031901126101c0576001600160a01b03610437600435611e03565b161561046f5761046b60405161045781610450816119df565b03826118a2565b604051918291602083526020830190611817565b0390f35b60405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608490fd5b346101c05760003660031901126101c0576020600154604051908152f35b346101c05760803660031901126101c05761050361183c565b61050b611852565b90604435606435926001600160401b0384116101c057366023850112156101c0576105436101be9436906024816004013591016118de565b9261054f838383611af1565b3361255f565b346101c05760003660031901126101c05733600052600660205261057d6040600020546119a5565b6105ad5761058a336120ca565b33600052600660205261046b610450610457604060002060405192838092611a6e565b3360005260066020526105d86040600020604051918291638541228760e01b83523360048401611d01565b0390fd5b346101c05760403660031901126101c0576105f561183c565b602435908115158092036101c0576001600160a01b03169081156106635761061c3361196c565b82600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b50630b61174360e31b60005260045260246000fd5b346101c05760003660031901126101c0576020600054604051908152f35b346101c05760203660031901126101c0576106af61183c565b6106b7611e34565b60018060a01b038116908160005260066020526106d86040600020546119a5565b610707576106e5906120ca565b600052600660205261046b610450610457604060002060405192838092611a6e565b9060005260066020526040600020906105d8604051928392638541228760e01b845260048401611d01565b346101c05760203660031901126101c0576001600160a01b0361075361183c565b16600052600660205261046b610450610457604060002060405192838092611a6e565b346101c05760003660031901126101c057604051600060008051602061277a833981519152546107a5816119a5565b808452906001811690811561083957506001146107cd575b61046b83610457818503826118a2565b60008051602061277a83398151915260009081527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e939250905b80821061081f575090915081016020016104576107bd565b919260018160209254838588010152019101909291610807565b60ff191660208086019190915291151560051b8401909101915061045790506107bd565b346101c05760203660031901126101c057610876611e34565b600435600055005b346101c05760003660031901126101c0576000805160206126fa833981519152546040516001600160a01b039091168152602090f35b346101c05760003660031901126101c0576020600454604051908152f35b346101c05760203660031901126101c0576108eb61183c565b6108f3611e34565b6001600160a01b03811615610915578061090f6101be92611e79565b506120ca565b634e46966960e11b60005260046000fd5b346101c05760003660031901126101c05761093f611e34565b6000805160206126fa83398151915280546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101c05760203660031901126101c0576109a961183c565b6001600160a01b038116156109cc576109c3602091611933565b54604051908152f35b6322718ad960e21b600052600060045260246000fd5b346101c05760003660031901126101c05761046b60405161045781610450816119df565b346101c05760203660031901126101c0576020610a24600435611e03565b6040516001600160a01b039091168152f35b346101c05760203660031901126101c057600435610a52611e34565b80158015610aac575b610a985760407f624e69eaa446a6ee2f869d52cb1206e98cd8851850d0d84981da809ad702536f91600454908060045582519182526020820152a1005b6354ad071360e01b60005260045260246000fd5b50600a8111610a5b565b346101c05760803660031901126101c057610acf61183c565b6024356001600160401b0381116101c057610aee903690600401611915565b6044356001600160401b0381116101c057610b0d903690600401611915565b916064356001600160401b0381116101c057610b2d903690600401611915565b60008051602061275a833981519152549260ff8460401c1615936001600160401b038116801590816110f2575b60011490816110e8575b1590816110df575b506110ce5767ffffffffffffffff19811660011760008051602061275a83398151915255846110a1575b50610b9f6126ab565b610ba76126ab565b8051906001600160401b038211610e70578190610bd26000805160206126da833981519152546119a5565b601f811161101d575b50602090601f8311600114610f8f57600092610f84575b50508160011b916000199060031b1c1916176000805160206126da833981519152555b83516001600160401b038111610e7057610c3d60008051602061277a833981519152546119a5565b601f8111610f12575b50602094601f8211600114610e9157948192939495600092610e86575b50508160011b916000199060031b1c19161760008051602061277a833981519152555b610c8e6126ab565b610c966126ab565b610c9f82611d8d565b610ca7611e34565b610cb082611d8d565b66038d7ea4c680006000556014600155600480558051906001600160401b038211610e7057610ce06007546119a5565b601f8111610e03575b50602090601f8311600114610d8b57610d2193929160009183610d80575b50508160011b916000199060031b1c1916176007556120ca565b610d2757005b68ff00000000000000001960008051602061275a833981519152541660008051602061275a833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508580610d07565b90601f19831691600760005260008051602061271a8339815191529260005b818110610deb5750916001939185610d2197969410610dd2575b505050811b016007556120ca565b015160001960f88460031b161c19169055858080610dc4565b92936020600181928786015181550195019301610daa565b6007600052601f830160051c60008051602061271a833981519152019060208410610e5a575b601f0160051c60008051602061271a83398151915201905b818110610e4e5750610ce9565b60008155600101610e41565b60008051602061271a8339815191529150610e29565b634e487b7160e01b600052604160045260246000fd5b015190508580610c63565b601f1982169560008051602061277a833981519152600052806000209160005b888110610efa57508360019596979810610ee1575b505050811b0160008051602061277a83398151915255610c86565b015160001960f88460031b161c19169055858080610ec6565b91926020600181928685015181550194019201610eb1565b60008051602061277a8339815191526000527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e601f830160051c81019160208410610f7a575b601f0160051c01905b818110610f6e5750610c46565b60008155600101610f61565b9091508190610f58565b015190508680610bf2565b6000805160206126da833981519152600090815260008051602061279a8339815191529350601f198516905b8181106110055750908460019594939210610fec575b505050811b016000805160206126da83398151915255610c15565b015160001960f88460031b161c19169055868080610fd1565b92936020600181928786015181550195019301610fbb565b9091506000805160206126da833981519152600052601f830160051c60008051602061279a83398151915201906020841061108b575b90601f8493920160051c60008051602061279a83398151915201905b81811061107c5750610bdb565b6000815584935060010161106f565b60008051602061279a8339815191529150611053565b68ffffffffffffffffff1916680100000000000000011760008051602061275a8339815191525585610b96565b63f92ee8a960e01b60005260046000fd5b90501587610b6c565b303b159150610b64565b869150610b5a565b346101c05760203660031901126101c0576004356001600160401b0381116101c05761112a903690600401611915565b611132611e34565b80516001600160401b038111610e705761114d6007546119a5565b601f8111611262575b506020601f82116001146111cc5791816111bc927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6946000916111c1575b508160011b916000199060031b1c191617600755604051918291602083526020830190611817565b0390a1005b905082015185611194565b601f19821690600760005260008051602061271a8339815191529160005b81811061124a5750927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf69492600192826111bc9610611231575b5050811b01600755610457565b84015160001960f88460031b161c191690558580611224565b919260206001819286890151815501940192016111ea565b6007600052601f820160051c60008051602061271a8339815191520190602083106112b9575b601f0160051c60008051602061271a83398151915201905b8181106112ad5750611156565b600081556001016112a0565b60008051602061271a8339815191529150611288565b346101c05760203660031901126101c0576001600160a01b036112f061183c565b166000526003602052602060018060a01b0360406000205416604051908152f35b60203660031901126101c0576004356001600160401b0381116101c05761133c903690600401611915565b6000548034036103b6575061135033611e79565b9061135a336120ca565b602061136f60405192838151938492016117f4565b60059082019081528190036020019020546001600160a01b0316908115801561142d575b61141857336000908152600360205260409020546101be92906001600160a01b0316156113c3575b503433612386565b33600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790559091907f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a9080a3826113bb565b506316fb166f60e01b60005260045260246000fd5b50338214611393565b346101c05760403660031901126101c05761144f61183c565b60243561145a611e34565b6001600160a01b038216156109155760005b81811061147c576101be836120ca565b60019061148884611e79565b500161146c565b346101c0576101be6114a036611868565b90604051926114b06020856118a2565b6000845261054f838383611af1565b346101c05760203660031901126101c0576004356114db611e34565b47811161150c57600080808093335af16114f3611cd1565b50156114fb57005b63351dc55d60e21b60005260046000fd5b631e9acf1760e31b60005260046000fd5b346101c05760203660031901126101c0576004356001600160401b0381116101c05761154f6020913690600401611915565b8161156360405192838151938492016117f4565b600590820190815281900382019020546040516001600160a01b039091168152f35b346101c0576101be61159636611868565b91611af1565b346101c05760403660031901126101c0576115b561183c565b6024356115c181611e03565b3315158061167b575b80611657575b6116425781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4600090815260008051602061273a8339815191526020526040902080546001600160a01b0319166001600160a01b03909216919091179055005b63a9fbf51f60e01b6000523360045260246000fd5b506116618161196c565b336000908152602091909152604090205460ff16156115d0565b506001600160a01b0381163314156115ca565b346101c05760203660031901126101c0576020610a246004356116b081611e03565b50600090815260008051602061273a83398151915260205260409020546001600160a01b031690565b346101c05760003660031901126101c05760405160006000805160206126da83398151915254611708816119a5565b8084529060018116908115610839575060011461172f5761046b83610457818503826118a2565b6000805160206126da833981519152600090815260008051602061279a833981519152939250905b80821061176f575090915081016020016104576107bd565b919260018160209254838588010152019101909291611757565b346101c05760203660031901126101c0576004359063ffffffff60e01b82168092036101c0576020916380ac58cd60e01b81149081156117e3575b81156117d2575b5015158152f35b6301ffc9a760e01b149050836117cb565b635b5e139f60e01b811491506117c4565b60005b8381106118075750506000910152565b81810151838201526020016117f7565b90602091611830815180928185528580860191016117f4565b601f01601f1916010190565b600435906001600160a01b03821682036101c057565b602435906001600160a01b03821682036101c057565b60609060031901126101c0576004356001600160a01b03811681036101c057906024356001600160a01b03811681036101c0579060443590565b90601f801991011681019081106001600160401b03821117610e7057604052565b6001600160401b038111610e7057601f01601f191660200190565b9291926118ea826118c3565b916118f860405193846118a2565b8294818452818301116101c0578281602093846000960137010152565b9080601f830112156101c057816020611930933591016118de565b90565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020526040902090565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020526040902090565b90600182811c921680156119d5575b60208310146119bf57565b634e487b7160e01b600052602260045260246000fd5b91607f16916119b4565b600754600092916119ef826119a5565b8082529160018116908115611a525750600114611a0a575050565b6007600090815292935090919060008051602061271a8339815191525b838310611a38575060209250010190565b600181602092949394548385870101520191019190611a27565b9050602093945060ff929192191683830152151560051b010190565b60009291815491611a7e836119a5565b8083529260018116908115611ad45750600114611a9a57505050565b60009081526020812093945091925b838310611aba575060209250010190565b600181602092949394548385870101520191019190611aa9565b915050602093945060ff929192191683830152151560051b010190565b909291906001600160a01b0384168015611cbb57600094611b1184612660565b9533151580611c0f575b509184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611b5c97989460018060a01b03861698899384611bd057611933565b805460010190558481527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793026020526040812080546001600160a01b0319168517905580a4506001600160a01b0316808303611bb657505050565b6364283d7b60e01b60005260045260245260445260646000fd5b600087815260008051602061273a8339815191526020526040902080546001600160a01b0319169055611c0288611933565b8054600019019055611933565b80611c58575b15611c205738611b1b565b84906001600160a01b038816611c4257602491637e27328960e01b8252600452fd5b60449163177e802f60e01b825233600452602452fd5b506001600160a01b03871633148015611c9e575b80611c155750600085815260008051602061273a83398151915260205260409020546001600160a01b03163314611c15565b50611ca88761196c565b338252602052604081205460ff16611c6c565b633250574960e11b600052600060045260246000fd5b3d15611cfc573d90611ce2826118c3565b91611cf060405193846118a2565b82523d6000602084013e565b606090565b6001600160a01b03909116815260406020820181905261193092910190611a6e565b81810292918115918404141715611d3657565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038111610e705760051b60200190565b8051821015611d775760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03168015611ded576000805160206126fa83398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b611e0c81612660565b906001600160a01b03821615611e20575090565b637e27328960e01b60005260045260246000fd5b6000805160206126fa833981519152546001600160a01b03163303611e5557565b63118cdaa760e01b6000523360045260246000fd5b6000198114611d365760010190565b60025460405160209291611e8d84836118a2565b600082526001600160a01b038316928315611cbb57611eab82612660565b6001600160a01b0381168015159190849087908461208b575b611ecd86611933565b8054600101905560008381527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793028b526040812080546001600160a01b031916841790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9080a450612075573b611f7c575b50507f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804060025492604051848152a2611f7681611e6a565b60025590565b611fba9184916040969496519384928392630a85bd0160e11b8452336004850152600060248501526044840152608060648401526084830190611817565b03816000885af18091600091612030575b5090611ffb575050611fdb611cd1565b80519182611ff85783633250574960e11b60005260045260246000fd5b01fd5b9092906001600160e01b03191663757a42ff60e11b0161201c573880611f3f565b633250574960e11b60005260045260246000fd5b8481813d831161206e575b61204581836118a2565b8101031261206a5751906001600160e01b031982168203612067575038611fcb565b80fd5b5080fd5b503d61203b565b6339e3563760e11b600052600060045260246000fd5b600083815260008051602061273a8339815191526020526040902080546001600160a01b03191690556120bd84611933565b8054600019019055611ec4565b6001600160a01b03166000818152600660205260409020546120eb906119a5565b156120f35750565b604051606061210281836118a2565b602482527f6162636465666768696a6b6c6d6e6f707172737475767778797a3031323334356020830152633637383960e01b604083015260409081519261214983856118a2565b600684526020840191601f19840136843760005b6006811061231857505050602061217e9183518093819287519283916117f4565b81016005815203019020836bffffffffffffffffffffffff60a01b8254161790558260005260066020528060002082516001600160401b038111610e70576121c682546119a5565b601f81116122d0575b506020601f821160011461224557918161223594927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee6969460009161223a575b508160011b916000199060031b1c19161790555b51918291602083526020830190611817565b0390a2565b90508401513861220f565b601f1982169083600052806000209160005b8181106122b85750927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee69694926001928261223598961061229f575b5050811b019055612223565b86015160001960f88460031b161c191690553880612293565b9192602060018192868b015181550194019201612257565b826000526020600020601f830160051c8101916020841061230e575b601f0160051c01905b81811061230257506121cf565b600081556001016122f5565b90915081906122ec565b845160208101904282524487820152828482015283815261233a6080826118a2565b5190209083519182156123705761235a60019360ff60f81b92068661269a565b511660001a612369828961269a565b530161215d565b634e487b7160e01b600052601260045260246000fd5b91606461239560015484611d23565b6001600160a01b0394851660008181526003602052604081205491969094939092049291165b6001600160a01b03811680151580612554575b1561254b576000818152600360205260409020546001600160a01b03169081158015612534575b156124865750506001600160a01b031693600080808086895af1612417611cd1565b501561246d577f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d93929161246891604051948594859094939260609260808301968352602083015260408201520152565b0390a3565b8285633da906b960e01b60005260045260245260446000fd5b90915060019493945460640360648111611d36576124a660649187611d23565b04808603958611611d3657600080808084865af16124c2611cd1565b501561251c576040805191825260208201869052810187905260608101849052612516929188917f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d90608090a39392611e6a565b926123bb565b90633da906b960e01b60005260045260245260446000fd5b506004546000198101908111611d365786146123f5565b50505050505050565b5060045485106123ce565b823b61256d575b5050505050565b604051630a85bd0160e11b81526001600160a01b0391821660048201529181166024830152604482019390935260806064820152911691602090829081906125b9906084830190611817565b03816000865af1809160009161261d575b50906125fb57506125d9611cd1565b805190816125f65782633250574960e11b60005260045260246000fd5b602001fd5b6001600160e01b03191663757a42ff60e11b0161201c57503880808080612566565b6020813d602011612658575b81612636602093836118a2565b8101031261206a5751906001600160e01b0319821682036120675750386125ca565b3d9150612629565b60009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b908151811015611d77570160200190565b60ff60008051602061275a8339815191525460401c16156126c857565b631afcd79f60e31b60005260046000fdfe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793009016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68880bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079304f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930137c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf81a264697066735822122059bed89e2acd6194eef38afce0262cdd03e39c9c835333bc92f4e2c6844aacd364736f6c634300081c0033",
1038
- "deployedBytecode": "0x608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146117895750806306fdde03146116d9578063081812fc1461168e578063095ea7b31461159c57806323b872dd146115855780632655e8401461151d5780632e1a7d4d146114bf57806342842e0e1461148f57806343508b0514611436578063492cc769146113115780634a3b68cc146112cf57806355f804b3146110fa5780635f1e6f6d14610ab657806363311f4914610a365780636352211e14610a065780636c0360eb146109e257806370a0823114610990578063715018a614610926578063755edd17146108d257806384d8ad13146108b45780638da5cb5b1461087e57806391b7f5ed1461085d57806395d89b41146107765780639b2c76d4146107325780639df375d714610696578063a035b1fe14610678578063a22cb465146105dc578063b0a2fc1b14610555578063b88d4fde146104ea578063c15edf5f146104cc578063c87b56dd14610413578063d6bfb04814610213578063e985e9c5146101c55763f2fde38b1461019557600080fd5b346101c05760203660031901126101c0576101be6101b161183c565b6101b9611e34565b611d8d565b005b600080fd5b346101c05760403660031901126101c0576101de61183c565b6101ef6101e9611852565b9161196c565b9060018060a01b0316600052602052602060ff604060002054166040519015158152f35b60403660031901126101c0576004356001600160401b0381116101c05761023e903690600401611915565b6024359081156103ce5761025482600054611d23565b8034036103b65750602061027160405192838151938492016117f4565b60059082019081528190036020019020546001600160a01b0316801580156103ad575b61039957336000908152600360205260409020546001600160a01b031615610344575b506102c1336120ca565b6102ca81611d4c565b906102d860405192836118a2565b808252601f196102e782611d4c565b0136602084013760005b81811061032757508034049160005b82811061030957005b8061032161031960019385611d63565b518633612386565b01610300565b60019061033333611e79565b61033d8286611d63565b52016102f1565b33600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790559091907f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a9080a3816102b7565b6316fb166f60e01b60005260045260246000fd5b50338114610294565b63ebbfb3bb60e01b6000523460045260245260446000fd5b60405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b346101c05760203660031901126101c0576001600160a01b03610437600435611e03565b161561046f5761046b60405161045781610450816119df565b03826118a2565b604051918291602083526020830190611817565b0390f35b60405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608490fd5b346101c05760003660031901126101c0576020600154604051908152f35b346101c05760803660031901126101c05761050361183c565b61050b611852565b90604435606435926001600160401b0384116101c057366023850112156101c0576105436101be9436906024816004013591016118de565b9261054f838383611af1565b3361255f565b346101c05760003660031901126101c05733600052600660205261057d6040600020546119a5565b6105ad5761058a336120ca565b33600052600660205261046b610450610457604060002060405192838092611a6e565b3360005260066020526105d86040600020604051918291638541228760e01b83523360048401611d01565b0390fd5b346101c05760403660031901126101c0576105f561183c565b602435908115158092036101c0576001600160a01b03169081156106635761061c3361196c565b82600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b50630b61174360e31b60005260045260246000fd5b346101c05760003660031901126101c0576020600054604051908152f35b346101c05760203660031901126101c0576106af61183c565b6106b7611e34565b60018060a01b038116908160005260066020526106d86040600020546119a5565b610707576106e5906120ca565b600052600660205261046b610450610457604060002060405192838092611a6e565b9060005260066020526040600020906105d8604051928392638541228760e01b845260048401611d01565b346101c05760203660031901126101c0576001600160a01b0361075361183c565b16600052600660205261046b610450610457604060002060405192838092611a6e565b346101c05760003660031901126101c057604051600060008051602061277a833981519152546107a5816119a5565b808452906001811690811561083957506001146107cd575b61046b83610457818503826118a2565b60008051602061277a83398151915260009081527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e939250905b80821061081f575090915081016020016104576107bd565b919260018160209254838588010152019101909291610807565b60ff191660208086019190915291151560051b8401909101915061045790506107bd565b346101c05760203660031901126101c057610876611e34565b600435600055005b346101c05760003660031901126101c0576000805160206126fa833981519152546040516001600160a01b039091168152602090f35b346101c05760003660031901126101c0576020600454604051908152f35b346101c05760203660031901126101c0576108eb61183c565b6108f3611e34565b6001600160a01b03811615610915578061090f6101be92611e79565b506120ca565b634e46966960e11b60005260046000fd5b346101c05760003660031901126101c05761093f611e34565b6000805160206126fa83398151915280546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101c05760203660031901126101c0576109a961183c565b6001600160a01b038116156109cc576109c3602091611933565b54604051908152f35b6322718ad960e21b600052600060045260246000fd5b346101c05760003660031901126101c05761046b60405161045781610450816119df565b346101c05760203660031901126101c0576020610a24600435611e03565b6040516001600160a01b039091168152f35b346101c05760203660031901126101c057600435610a52611e34565b80158015610aac575b610a985760407f624e69eaa446a6ee2f869d52cb1206e98cd8851850d0d84981da809ad702536f91600454908060045582519182526020820152a1005b6354ad071360e01b60005260045260246000fd5b50600a8111610a5b565b346101c05760803660031901126101c057610acf61183c565b6024356001600160401b0381116101c057610aee903690600401611915565b6044356001600160401b0381116101c057610b0d903690600401611915565b916064356001600160401b0381116101c057610b2d903690600401611915565b60008051602061275a833981519152549260ff8460401c1615936001600160401b038116801590816110f2575b60011490816110e8575b1590816110df575b506110ce5767ffffffffffffffff19811660011760008051602061275a83398151915255846110a1575b50610b9f6126ab565b610ba76126ab565b8051906001600160401b038211610e70578190610bd26000805160206126da833981519152546119a5565b601f811161101d575b50602090601f8311600114610f8f57600092610f84575b50508160011b916000199060031b1c1916176000805160206126da833981519152555b83516001600160401b038111610e7057610c3d60008051602061277a833981519152546119a5565b601f8111610f12575b50602094601f8211600114610e9157948192939495600092610e86575b50508160011b916000199060031b1c19161760008051602061277a833981519152555b610c8e6126ab565b610c966126ab565b610c9f82611d8d565b610ca7611e34565b610cb082611d8d565b66038d7ea4c680006000556014600155600480558051906001600160401b038211610e7057610ce06007546119a5565b601f8111610e03575b50602090601f8311600114610d8b57610d2193929160009183610d80575b50508160011b916000199060031b1c1916176007556120ca565b610d2757005b68ff00000000000000001960008051602061275a833981519152541660008051602061275a833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508580610d07565b90601f19831691600760005260008051602061271a8339815191529260005b818110610deb5750916001939185610d2197969410610dd2575b505050811b016007556120ca565b015160001960f88460031b161c19169055858080610dc4565b92936020600181928786015181550195019301610daa565b6007600052601f830160051c60008051602061271a833981519152019060208410610e5a575b601f0160051c60008051602061271a83398151915201905b818110610e4e5750610ce9565b60008155600101610e41565b60008051602061271a8339815191529150610e29565b634e487b7160e01b600052604160045260246000fd5b015190508580610c63565b601f1982169560008051602061277a833981519152600052806000209160005b888110610efa57508360019596979810610ee1575b505050811b0160008051602061277a83398151915255610c86565b015160001960f88460031b161c19169055858080610ec6565b91926020600181928685015181550194019201610eb1565b60008051602061277a8339815191526000527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e601f830160051c81019160208410610f7a575b601f0160051c01905b818110610f6e5750610c46565b60008155600101610f61565b9091508190610f58565b015190508680610bf2565b6000805160206126da833981519152600090815260008051602061279a8339815191529350601f198516905b8181106110055750908460019594939210610fec575b505050811b016000805160206126da83398151915255610c15565b015160001960f88460031b161c19169055868080610fd1565b92936020600181928786015181550195019301610fbb565b9091506000805160206126da833981519152600052601f830160051c60008051602061279a83398151915201906020841061108b575b90601f8493920160051c60008051602061279a83398151915201905b81811061107c5750610bdb565b6000815584935060010161106f565b60008051602061279a8339815191529150611053565b68ffffffffffffffffff1916680100000000000000011760008051602061275a8339815191525585610b96565b63f92ee8a960e01b60005260046000fd5b90501587610b6c565b303b159150610b64565b869150610b5a565b346101c05760203660031901126101c0576004356001600160401b0381116101c05761112a903690600401611915565b611132611e34565b80516001600160401b038111610e705761114d6007546119a5565b601f8111611262575b506020601f82116001146111cc5791816111bc927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6946000916111c1575b508160011b916000199060031b1c191617600755604051918291602083526020830190611817565b0390a1005b905082015185611194565b601f19821690600760005260008051602061271a8339815191529160005b81811061124a5750927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf69492600192826111bc9610611231575b5050811b01600755610457565b84015160001960f88460031b161c191690558580611224565b919260206001819286890151815501940192016111ea565b6007600052601f820160051c60008051602061271a8339815191520190602083106112b9575b601f0160051c60008051602061271a83398151915201905b8181106112ad5750611156565b600081556001016112a0565b60008051602061271a8339815191529150611288565b346101c05760203660031901126101c0576001600160a01b036112f061183c565b166000526003602052602060018060a01b0360406000205416604051908152f35b60203660031901126101c0576004356001600160401b0381116101c05761133c903690600401611915565b6000548034036103b6575061135033611e79565b9061135a336120ca565b602061136f60405192838151938492016117f4565b60059082019081528190036020019020546001600160a01b0316908115801561142d575b61141857336000908152600360205260409020546101be92906001600160a01b0316156113c3575b503433612386565b33600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790559091907f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a9080a3826113bb565b506316fb166f60e01b60005260045260246000fd5b50338214611393565b346101c05760403660031901126101c05761144f61183c565b60243561145a611e34565b6001600160a01b038216156109155760005b81811061147c576101be836120ca565b60019061148884611e79565b500161146c565b346101c0576101be6114a036611868565b90604051926114b06020856118a2565b6000845261054f838383611af1565b346101c05760203660031901126101c0576004356114db611e34565b47811161150c57600080808093335af16114f3611cd1565b50156114fb57005b63351dc55d60e21b60005260046000fd5b631e9acf1760e31b60005260046000fd5b346101c05760203660031901126101c0576004356001600160401b0381116101c05761154f6020913690600401611915565b8161156360405192838151938492016117f4565b600590820190815281900382019020546040516001600160a01b039091168152f35b346101c0576101be61159636611868565b91611af1565b346101c05760403660031901126101c0576115b561183c565b6024356115c181611e03565b3315158061167b575b80611657575b6116425781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a4600090815260008051602061273a8339815191526020526040902080546001600160a01b0319166001600160a01b03909216919091179055005b63a9fbf51f60e01b6000523360045260246000fd5b506116618161196c565b336000908152602091909152604090205460ff16156115d0565b506001600160a01b0381163314156115ca565b346101c05760203660031901126101c0576020610a246004356116b081611e03565b50600090815260008051602061273a83398151915260205260409020546001600160a01b031690565b346101c05760003660031901126101c05760405160006000805160206126da83398151915254611708816119a5565b8084529060018116908115610839575060011461172f5761046b83610457818503826118a2565b6000805160206126da833981519152600090815260008051602061279a833981519152939250905b80821061176f575090915081016020016104576107bd565b919260018160209254838588010152019101909291611757565b346101c05760203660031901126101c0576004359063ffffffff60e01b82168092036101c0576020916380ac58cd60e01b81149081156117e3575b81156117d2575b5015158152f35b6301ffc9a760e01b149050836117cb565b635b5e139f60e01b811491506117c4565b60005b8381106118075750506000910152565b81810151838201526020016117f7565b90602091611830815180928185528580860191016117f4565b601f01601f1916010190565b600435906001600160a01b03821682036101c057565b602435906001600160a01b03821682036101c057565b60609060031901126101c0576004356001600160a01b03811681036101c057906024356001600160a01b03811681036101c0579060443590565b90601f801991011681019081106001600160401b03821117610e7057604052565b6001600160401b038111610e7057601f01601f191660200190565b9291926118ea826118c3565b916118f860405193846118a2565b8294818452818301116101c0578281602093846000960137010152565b9080601f830112156101c057816020611930933591016118de565b90565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020526040902090565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020526040902090565b90600182811c921680156119d5575b60208310146119bf57565b634e487b7160e01b600052602260045260246000fd5b91607f16916119b4565b600754600092916119ef826119a5565b8082529160018116908115611a525750600114611a0a575050565b6007600090815292935090919060008051602061271a8339815191525b838310611a38575060209250010190565b600181602092949394548385870101520191019190611a27565b9050602093945060ff929192191683830152151560051b010190565b60009291815491611a7e836119a5565b8083529260018116908115611ad45750600114611a9a57505050565b60009081526020812093945091925b838310611aba575060209250010190565b600181602092949394548385870101520191019190611aa9565b915050602093945060ff929192191683830152151560051b010190565b909291906001600160a01b0384168015611cbb57600094611b1184612660565b9533151580611c0f575b509184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611b5c97989460018060a01b03861698899384611bd057611933565b805460010190558481527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793026020526040812080546001600160a01b0319168517905580a4506001600160a01b0316808303611bb657505050565b6364283d7b60e01b60005260045260245260445260646000fd5b600087815260008051602061273a8339815191526020526040902080546001600160a01b0319169055611c0288611933565b8054600019019055611933565b80611c58575b15611c205738611b1b565b84906001600160a01b038816611c4257602491637e27328960e01b8252600452fd5b60449163177e802f60e01b825233600452602452fd5b506001600160a01b03871633148015611c9e575b80611c155750600085815260008051602061273a83398151915260205260409020546001600160a01b03163314611c15565b50611ca88761196c565b338252602052604081205460ff16611c6c565b633250574960e11b600052600060045260246000fd5b3d15611cfc573d90611ce2826118c3565b91611cf060405193846118a2565b82523d6000602084013e565b606090565b6001600160a01b03909116815260406020820181905261193092910190611a6e565b81810292918115918404141715611d3657565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038111610e705760051b60200190565b8051821015611d775760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03168015611ded576000805160206126fa83398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b611e0c81612660565b906001600160a01b03821615611e20575090565b637e27328960e01b60005260045260246000fd5b6000805160206126fa833981519152546001600160a01b03163303611e5557565b63118cdaa760e01b6000523360045260246000fd5b6000198114611d365760010190565b60025460405160209291611e8d84836118a2565b600082526001600160a01b038316928315611cbb57611eab82612660565b6001600160a01b0381168015159190849087908461208b575b611ecd86611933565b8054600101905560008381527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793028b526040812080546001600160a01b031916841790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9080a450612075573b611f7c575b50507f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804060025492604051848152a2611f7681611e6a565b60025590565b611fba9184916040969496519384928392630a85bd0160e11b8452336004850152600060248501526044840152608060648401526084830190611817565b03816000885af18091600091612030575b5090611ffb575050611fdb611cd1565b80519182611ff85783633250574960e11b60005260045260246000fd5b01fd5b9092906001600160e01b03191663757a42ff60e11b0161201c573880611f3f565b633250574960e11b60005260045260246000fd5b8481813d831161206e575b61204581836118a2565b8101031261206a5751906001600160e01b031982168203612067575038611fcb565b80fd5b5080fd5b503d61203b565b6339e3563760e11b600052600060045260246000fd5b600083815260008051602061273a8339815191526020526040902080546001600160a01b03191690556120bd84611933565b8054600019019055611ec4565b6001600160a01b03166000818152600660205260409020546120eb906119a5565b156120f35750565b604051606061210281836118a2565b602482527f6162636465666768696a6b6c6d6e6f707172737475767778797a3031323334356020830152633637383960e01b604083015260409081519261214983856118a2565b600684526020840191601f19840136843760005b6006811061231857505050602061217e9183518093819287519283916117f4565b81016005815203019020836bffffffffffffffffffffffff60a01b8254161790558260005260066020528060002082516001600160401b038111610e70576121c682546119a5565b601f81116122d0575b506020601f821160011461224557918161223594927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee6969460009161223a575b508160011b916000199060031b1c19161790555b51918291602083526020830190611817565b0390a2565b90508401513861220f565b601f1982169083600052806000209160005b8181106122b85750927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee69694926001928261223598961061229f575b5050811b019055612223565b86015160001960f88460031b161c191690553880612293565b9192602060018192868b015181550194019201612257565b826000526020600020601f830160051c8101916020841061230e575b601f0160051c01905b81811061230257506121cf565b600081556001016122f5565b90915081906122ec565b845160208101904282524487820152828482015283815261233a6080826118a2565b5190209083519182156123705761235a60019360ff60f81b92068661269a565b511660001a612369828961269a565b530161215d565b634e487b7160e01b600052601260045260246000fd5b91606461239560015484611d23565b6001600160a01b0394851660008181526003602052604081205491969094939092049291165b6001600160a01b03811680151580612554575b1561254b576000818152600360205260409020546001600160a01b03169081158015612534575b156124865750506001600160a01b031693600080808086895af1612417611cd1565b501561246d577f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d93929161246891604051948594859094939260609260808301968352602083015260408201520152565b0390a3565b8285633da906b960e01b60005260045260245260446000fd5b90915060019493945460640360648111611d36576124a660649187611d23565b04808603958611611d3657600080808084865af16124c2611cd1565b501561251c576040805191825260208201869052810187905260608101849052612516929188917f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d90608090a39392611e6a565b926123bb565b90633da906b960e01b60005260045260245260446000fd5b506004546000198101908111611d365786146123f5565b50505050505050565b5060045485106123ce565b823b61256d575b5050505050565b604051630a85bd0160e11b81526001600160a01b0391821660048201529181166024830152604482019390935260806064820152911691602090829081906125b9906084830190611817565b03816000865af1809160009161261d575b50906125fb57506125d9611cd1565b805190816125f65782633250574960e11b60005260045260246000fd5b602001fd5b6001600160e01b03191663757a42ff60e11b0161201c57503880808080612566565b6020813d602011612658575b81612636602093836118a2565b8101031261206a5751906001600160e01b0319821682036120675750386125ca565b3d9150612629565b60009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b908151811015611d77570160200190565b60ff60008051602061275a8339815191525460401c16156126c857565b631afcd79f60e31b60005260046000fdfe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793009016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68880bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079304f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930137c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf81a264697066735822122059bed89e2acd6194eef38afce0262cdd03e39c9c835333bc92f4e2c6844aacd364736f6c634300081c0033",
1080
+ "bytecode": "0x6080806040523460155761286b908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146118055750806306fdde0314611755578063081812fc1461170a578063095ea7b31461161857806323b872dd146116015780632655e840146115995780632e1a7d4d1461153b578063411e9ef2146114ca57806342842e0e1461149a57806343508b0514611441578063492cc7691461131c5780634a3b68cc146112da57806355f804b3146111055780635f1e6f6d14610ac157806363311f4914610a415780636352211e14610a115780636c0360eb146109ed57806370a082311461099b578063715018a614610931578063755edd17146108dd57806384d8ad13146108bf5780638da5cb5b1461088957806391b7f5ed1461086857806395d89b41146107815780639b2c76d41461073d5780639df375d7146106a1578063a035b1fe14610683578063a22cb465146105e7578063b0a2fc1b14610560578063b88d4fde146104f5578063c15edf5f146104d7578063c87b56dd1461041e578063d6bfb0481461021e578063e985e9c5146101d05763f2fde38b146101a057600080fd5b346101cb5760203660031901126101cb576101c96101bc6118b8565b6101c4611eb0565b611e09565b005b600080fd5b346101cb5760403660031901126101cb576101e96118b8565b6101fa6101f46118ce565b916119e8565b9060018060a01b0316600052602052602060ff604060002054166040519015158152f35b60403660031901126101cb576004356001600160401b0381116101cb57610249903690600401611991565b6024359081156103d95761025f82600054611d9f565b8034036103c15750602061027c6040519283815193849201611870565b60059082019081528190036020019020546001600160a01b0316801580156103b8575b6103a457336000908152600360205260409020546001600160a01b03161561034f575b506102cc33612146565b6102d581611dc8565b906102e3604051928361191e565b808252601f196102f282611dc8565b0136602084013760005b81811061033257508034049160005b82811061031457005b8061032c61032460019385611ddf565b518633612402565b0161030b565b60019061033e33611ef5565b6103488286611ddf565b52016102fc565b33600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790559091907f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a9080a3816102c2565b6316fb166f60e01b60005260045260246000fd5b5033811461029f565b63ebbfb3bb60e01b6000523460045260245260446000fd5b60405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b346101cb5760203660031901126101cb576001600160a01b03610442600435611e7f565b161561047a576104766040516104628161045b81611a5b565b038261191e565b604051918291602083526020830190611893565b0390f35b60405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608490fd5b346101cb5760003660031901126101cb576020600154604051908152f35b346101cb5760803660031901126101cb5761050e6118b8565b6105166118ce565b90604435606435926001600160401b0384116101cb57366023850112156101cb5761054e6101c994369060248160040135910161195a565b9261055a838383611b6d565b336125db565b346101cb5760003660031901126101cb57336000526006602052610588604060002054611a21565b6105b85761059533612146565b33600052600660205261047661045b610462604060002060405192838092611aea565b3360005260066020526105e36040600020604051918291638541228760e01b83523360048401611d7d565b0390fd5b346101cb5760403660031901126101cb576106006118b8565b602435908115158092036101cb576001600160a01b031690811561066e57610627336119e8565b82600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b50630b61174360e31b60005260045260246000fd5b346101cb5760003660031901126101cb576020600054604051908152f35b346101cb5760203660031901126101cb576106ba6118b8565b6106c2611eb0565b60018060a01b038116908160005260066020526106e3604060002054611a21565b610712576106f090612146565b600052600660205261047661045b610462604060002060405192838092611aea565b9060005260066020526040600020906105e3604051928392638541228760e01b845260048401611d7d565b346101cb5760203660031901126101cb576001600160a01b0361075e6118b8565b16600052600660205261047661045b610462604060002060405192838092611aea565b346101cb5760003660031901126101cb5760405160006000805160206127f6833981519152546107b081611a21565b808452906001811690811561084457506001146107d8575b610476836104628185038261191e565b6000805160206127f683398151915260009081527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e939250905b80821061082a575090915081016020016104626107c8565b919260018160209254838588010152019101909291610812565b60ff191660208086019190915291151560051b8401909101915061046290506107c8565b346101cb5760203660031901126101cb57610881611eb0565b600435600055005b346101cb5760003660031901126101cb57600080516020612776833981519152546040516001600160a01b039091168152602090f35b346101cb5760003660031901126101cb576020600454604051908152f35b346101cb5760203660031901126101cb576108f66118b8565b6108fe611eb0565b6001600160a01b03811615610920578061091a6101c992611ef5565b50612146565b634e46966960e11b60005260046000fd5b346101cb5760003660031901126101cb5761094a611eb0565b60008051602061277683398151915280546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101cb5760203660031901126101cb576109b46118b8565b6001600160a01b038116156109d7576109ce6020916119af565b54604051908152f35b6322718ad960e21b600052600060045260246000fd5b346101cb5760003660031901126101cb576104766040516104628161045b81611a5b565b346101cb5760203660031901126101cb576020610a2f600435611e7f565b6040516001600160a01b039091168152f35b346101cb5760203660031901126101cb57600435610a5d611eb0565b80158015610ab7575b610aa35760407f624e69eaa446a6ee2f869d52cb1206e98cd8851850d0d84981da809ad702536f91600454908060045582519182526020820152a1005b6354ad071360e01b60005260045260246000fd5b50600a8111610a66565b346101cb5760803660031901126101cb57610ada6118b8565b6024356001600160401b0381116101cb57610af9903690600401611991565b6044356001600160401b0381116101cb57610b18903690600401611991565b916064356001600160401b0381116101cb57610b38903690600401611991565b6000805160206127d6833981519152549260ff8460401c1615936001600160401b038116801590816110fd575b60011490816110f3575b1590816110ea575b506110d95767ffffffffffffffff1981166001176000805160206127d683398151915255846110ac575b50610baa612727565b610bb2612727565b8051906001600160401b038211610e7b578190610bdd60008051602061275683398151915254611a21565b601f8111611028575b50602090601f8311600114610f9a57600092610f8f575b50508160011b916000199060031b1c191617600080516020612756833981519152555b83516001600160401b038111610e7b57610c486000805160206127f683398151915254611a21565b601f8111610f1d575b50602094601f8211600114610e9c57948192939495600092610e91575b50508160011b916000199060031b1c1916176000805160206127f6833981519152555b610c99612727565b610ca1612727565b610caa82611e09565b610cb2611eb0565b610cbb82611e09565b66038d7ea4c680006000556014600155600480558051906001600160401b038211610e7b57610ceb600754611a21565b601f8111610e0e575b50602090601f8311600114610d9657610d2c93929160009183610d8b575b50508160011b916000199060031b1c191617600755612146565b610d3257005b68ff0000000000000000196000805160206127d683398151915254166000805160206127d6833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508580610d12565b90601f1983169160076000526000805160206127968339815191529260005b818110610df65750916001939185610d2c97969410610ddd575b505050811b01600755612146565b015160001960f88460031b161c19169055858080610dcf565b92936020600181928786015181550195019301610db5565b6007600052601f830160051c600080516020612796833981519152019060208410610e65575b601f0160051c60008051602061279683398151915201905b818110610e595750610cf4565b60008155600101610e4c565b6000805160206127968339815191529150610e34565b634e487b7160e01b600052604160045260246000fd5b015190508580610c6e565b601f198216956000805160206127f6833981519152600052806000209160005b888110610f0557508360019596979810610eec575b505050811b016000805160206127f683398151915255610c91565b015160001960f88460031b161c19169055858080610ed1565b91926020600181928685015181550194019201610ebc565b6000805160206127f68339815191526000527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e601f830160051c81019160208410610f85575b601f0160051c01905b818110610f795750610c51565b60008155600101610f6c565b9091508190610f63565b015190508680610bfd565b60008051602061275683398151915260009081526000805160206128168339815191529350601f198516905b8181106110105750908460019594939210610ff7575b505050811b0160008051602061275683398151915255610c20565b015160001960f88460031b161c19169055868080610fdc565b92936020600181928786015181550195019301610fc6565b909150600080516020612756833981519152600052601f830160051c600080516020612816833981519152019060208410611096575b90601f8493920160051c60008051602061281683398151915201905b8181106110875750610be6565b6000815584935060010161107a565b600080516020612816833981519152915061105e565b68ffffffffffffffffff191668010000000000000001176000805160206127d68339815191525585610ba1565b63f92ee8a960e01b60005260046000fd5b90501587610b77565b303b159150610b6f565b869150610b65565b346101cb5760203660031901126101cb576004356001600160401b0381116101cb57611135903690600401611991565b61113d611eb0565b80516001600160401b038111610e7b57611158600754611a21565b601f811161126d575b506020601f82116001146111d75791816111c7927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6946000916111cc575b508160011b916000199060031b1c191617600755604051918291602083526020830190611893565b0390a1005b90508201518561119f565b601f1982169060076000526000805160206127968339815191529160005b8181106112555750927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf69492600192826111c7961061123c575b5050811b01600755610462565b84015160001960f88460031b161c19169055858061122f565b919260206001819286890151815501940192016111f5565b6007600052601f820160051c6000805160206127968339815191520190602083106112c4575b601f0160051c60008051602061279683398151915201905b8181106112b85750611161565b600081556001016112ab565b6000805160206127968339815191529150611293565b346101cb5760203660031901126101cb576001600160a01b036112fb6118b8565b166000526003602052602060018060a01b0360406000205416604051908152f35b60203660031901126101cb576004356001600160401b0381116101cb57611347903690600401611991565b6000548034036103c1575061135b33611ef5565b9061136533612146565b602061137a6040519283815193849201611870565b60059082019081528190036020019020546001600160a01b03169081158015611438575b61142357336000908152600360205260409020546101c992906001600160a01b0316156113ce575b503433612402565b33600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790559091907f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a9080a3826113c6565b506316fb166f60e01b60005260045260246000fd5b5033821461139e565b346101cb5760403660031901126101cb5761145a6118b8565b602435611465611eb0565b6001600160a01b038216156109205760005b818110611487576101c983612146565b60019061149384611ef5565b5001611477565b346101cb576101c96114ab366118e4565b90604051926114bb60208561191e565b6000845261055a838383611b6d565b346101cb5760203660031901126101cb576004356114e6611eb0565b606481116115275760407fc48323e605e5bacb82da05ff295004ccbfc77d4d71742ee056a9320ce161e0fc91600154908060015582519182526020820152a1005b63b6135d9160e01b60005260045260246000fd5b346101cb5760203660031901126101cb57600435611557611eb0565b47811161158857600080808093335af161156f611d4d565b501561157757005b63351dc55d60e21b60005260046000fd5b631e9acf1760e31b60005260046000fd5b346101cb5760203660031901126101cb576004356001600160401b0381116101cb576115cb6020913690600401611991565b816115df6040519283815193849201611870565b600590820190815281900382019020546040516001600160a01b039091168152f35b346101cb576101c9611612366118e4565b91611b6d565b346101cb5760403660031901126101cb576116316118b8565b60243561163d81611e7f565b331515806116f7575b806116d3575b6116be5781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a460009081526000805160206127b68339815191526020526040902080546001600160a01b0319166001600160a01b03909216919091179055005b63a9fbf51f60e01b6000523360045260246000fd5b506116dd816119e8565b336000908152602091909152604090205460ff161561164c565b506001600160a01b038116331415611646565b346101cb5760203660031901126101cb576020610a2f60043561172c81611e7f565b5060009081526000805160206127b683398151915260205260409020546001600160a01b031690565b346101cb5760003660031901126101cb5760405160006000805160206127568339815191525461178481611a21565b808452906001811690811561084457506001146117ab57610476836104628185038261191e565b6000805160206127568339815191526000908152600080516020612816833981519152939250905b8082106117eb575090915081016020016104626107c8565b9192600181602092548385880101520191019092916117d3565b346101cb5760203660031901126101cb576004359063ffffffff60e01b82168092036101cb576020916380ac58cd60e01b811490811561185f575b811561184e575b5015158152f35b6301ffc9a760e01b14905083611847565b635b5e139f60e01b81149150611840565b60005b8381106118835750506000910152565b8181015183820152602001611873565b906020916118ac81518092818552858086019101611870565b601f01601f1916010190565b600435906001600160a01b03821682036101cb57565b602435906001600160a01b03821682036101cb57565b60609060031901126101cb576004356001600160a01b03811681036101cb57906024356001600160a01b03811681036101cb579060443590565b90601f801991011681019081106001600160401b03821117610e7b57604052565b6001600160401b038111610e7b57601f01601f191660200190565b9291926119668261193f565b91611974604051938461191e565b8294818452818301116101cb578281602093846000960137010152565b9080601f830112156101cb578160206119ac9335910161195a565b90565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020526040902090565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020526040902090565b90600182811c92168015611a51575b6020831014611a3b57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611a30565b60075460009291611a6b82611a21565b8082529160018116908115611ace5750600114611a86575050565b600760009081529293509091906000805160206127968339815191525b838310611ab4575060209250010190565b600181602092949394548385870101520191019190611aa3565b9050602093945060ff929192191683830152151560051b010190565b60009291815491611afa83611a21565b8083529260018116908115611b505750600114611b1657505050565b60009081526020812093945091925b838310611b36575060209250010190565b600181602092949394548385870101520191019190611b25565b915050602093945060ff929192191683830152151560051b010190565b909291906001600160a01b0384168015611d3757600094611b8d846126dc565b9533151580611c8b575b509184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611bd897989460018060a01b03861698899384611c4c576119af565b805460010190558481527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793026020526040812080546001600160a01b0319168517905580a4506001600160a01b0316808303611c3257505050565b6364283d7b60e01b60005260045260245260445260646000fd5b60008781526000805160206127b68339815191526020526040902080546001600160a01b0319169055611c7e886119af565b80546000190190556119af565b80611cd4575b15611c9c5738611b97565b84906001600160a01b038816611cbe57602491637e27328960e01b8252600452fd5b60449163177e802f60e01b825233600452602452fd5b506001600160a01b03871633148015611d1a575b80611c91575060008581526000805160206127b683398151915260205260409020546001600160a01b03163314611c91565b50611d24876119e8565b338252602052604081205460ff16611ce8565b633250574960e11b600052600060045260246000fd5b3d15611d78573d90611d5e8261193f565b91611d6c604051938461191e565b82523d6000602084013e565b606090565b6001600160a01b0390911681526040602082018190526119ac92910190611aea565b81810292918115918404141715611db257565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038111610e7b5760051b60200190565b8051821015611df35760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03168015611e695760008051602061277683398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b611e88816126dc565b906001600160a01b03821615611e9c575090565b637e27328960e01b60005260045260246000fd5b600080516020612776833981519152546001600160a01b03163303611ed157565b63118cdaa760e01b6000523360045260246000fd5b6000198114611db25760010190565b60025460405160209291611f09848361191e565b600082526001600160a01b038316928315611d3757611f27826126dc565b6001600160a01b03811680151591908490879084612107575b611f49866119af565b8054600101905560008381527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793028b526040812080546001600160a01b031916841790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9080a4506120f1573b611ff8575b50507f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804060025492604051848152a2611ff281611ee6565b60025590565b6120369184916040969496519384928392630a85bd0160e11b8452336004850152600060248501526044840152608060648401526084830190611893565b03816000885af180916000916120ac575b5090612077575050612057611d4d565b805191826120745783633250574960e11b60005260045260246000fd5b01fd5b9092906001600160e01b03191663757a42ff60e11b01612098573880611fbb565b633250574960e11b60005260045260246000fd5b8481813d83116120ea575b6120c1818361191e565b810103126120e65751906001600160e01b0319821682036120e3575038612047565b80fd5b5080fd5b503d6120b7565b6339e3563760e11b600052600060045260246000fd5b60008381526000805160206127b68339815191526020526040902080546001600160a01b0319169055612139846119af565b8054600019019055611f40565b6001600160a01b031660008181526006602052604090205461216790611a21565b1561216f5750565b604051606061217e818361191e565b602482527f6162636465666768696a6b6c6d6e6f707172737475767778797a3031323334356020830152633637383960e01b60408301526040908151926121c5838561191e565b600684526020840191601f19840136843760005b600681106123945750505060206121fa918351809381928751928391611870565b81016005815203019020836bffffffffffffffffffffffff60a01b8254161790558260005260066020528060002082516001600160401b038111610e7b576122428254611a21565b601f811161234c575b506020601f82116001146122c15791816122b194927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee696946000916122b6575b508160011b916000199060031b1c19161790555b51918291602083526020830190611893565b0390a2565b90508401513861228b565b601f1982169083600052806000209160005b8181106123345750927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee6969492600192826122b198961061231b575b5050811b01905561229f565b86015160001960f88460031b161c19169055388061230f565b9192602060018192868b0151815501940192016122d3565b826000526020600020601f830160051c8101916020841061238a575b601f0160051c01905b81811061237e575061224b565b60008155600101612371565b9091508190612368565b84516020810190428252448782015282848201528381526123b660808261191e565b5190209083519182156123ec576123d660019360ff60f81b920686612716565b511660001a6123e58289612716565b53016121d9565b634e487b7160e01b600052601260045260246000fd5b91606461241160015484611d9f565b6001600160a01b0394851660008181526003602052604081205491969094939092049291165b6001600160a01b038116801515806125d0575b156125c7576000818152600360205260409020546001600160a01b031690811580156125b0575b156125025750506001600160a01b031693600080808086895af1612493611d4d565b50156124e9577f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d9392916124e491604051948594859094939260609260808301968352602083015260408201520152565b0390a3565b8285633da906b960e01b60005260045260245260446000fd5b90915060019493945460640360648111611db25761252260649187611d9f565b04808603958611611db257600080808084865af161253e611d4d565b5015612598576040805191825260208201869052810187905260608101849052612592929188917f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d90608090a39392611ee6565b92612437565b90633da906b960e01b60005260045260245260446000fd5b506004546000198101908111611db2578614612471565b50505050505050565b50600454851061244a565b823b6125e9575b5050505050565b604051630a85bd0160e11b81526001600160a01b039182166004820152918116602483015260448201939093526080606482015291169160209082908190612635906084830190611893565b03816000865af18091600091612699575b50906126775750612655611d4d565b805190816126725782633250574960e11b60005260045260246000fd5b602001fd5b6001600160e01b03191663757a42ff60e11b01612098575038808080806125e2565b6020813d6020116126d4575b816126b26020938361191e565b810103126120e65751906001600160e01b0319821682036120e3575038612646565b3d91506126a5565b60009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b908151811015611df3570160200190565b60ff6000805160206127d68339815191525460401c161561274457565b631afcd79f60e31b60005260046000fdfe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793009016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68880bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079304f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930137c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf81a2646970667358221220b98cf3e2960af8eae7e76abb05c166d02f56113946c60f106473d3aa6f6c851b64736f6c634300081c0033",
1081
+ "deployedBytecode": "0x608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146118055750806306fdde0314611755578063081812fc1461170a578063095ea7b31461161857806323b872dd146116015780632655e840146115995780632e1a7d4d1461153b578063411e9ef2146114ca57806342842e0e1461149a57806343508b0514611441578063492cc7691461131c5780634a3b68cc146112da57806355f804b3146111055780635f1e6f6d14610ac157806363311f4914610a415780636352211e14610a115780636c0360eb146109ed57806370a082311461099b578063715018a614610931578063755edd17146108dd57806384d8ad13146108bf5780638da5cb5b1461088957806391b7f5ed1461086857806395d89b41146107815780639b2c76d41461073d5780639df375d7146106a1578063a035b1fe14610683578063a22cb465146105e7578063b0a2fc1b14610560578063b88d4fde146104f5578063c15edf5f146104d7578063c87b56dd1461041e578063d6bfb0481461021e578063e985e9c5146101d05763f2fde38b146101a057600080fd5b346101cb5760203660031901126101cb576101c96101bc6118b8565b6101c4611eb0565b611e09565b005b600080fd5b346101cb5760403660031901126101cb576101e96118b8565b6101fa6101f46118ce565b916119e8565b9060018060a01b0316600052602052602060ff604060002054166040519015158152f35b60403660031901126101cb576004356001600160401b0381116101cb57610249903690600401611991565b6024359081156103d95761025f82600054611d9f565b8034036103c15750602061027c6040519283815193849201611870565b60059082019081528190036020019020546001600160a01b0316801580156103b8575b6103a457336000908152600360205260409020546001600160a01b03161561034f575b506102cc33612146565b6102d581611dc8565b906102e3604051928361191e565b808252601f196102f282611dc8565b0136602084013760005b81811061033257508034049160005b82811061031457005b8061032c61032460019385611ddf565b518633612402565b0161030b565b60019061033e33611ef5565b6103488286611ddf565b52016102fc565b33600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790559091907f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a9080a3816102c2565b6316fb166f60e01b60005260045260246000fd5b5033811461029f565b63ebbfb3bb60e01b6000523460045260245260446000fd5b60405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b346101cb5760203660031901126101cb576001600160a01b03610442600435611e7f565b161561047a576104766040516104628161045b81611a5b565b038261191e565b604051918291602083526020830190611893565b0390f35b60405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608490fd5b346101cb5760003660031901126101cb576020600154604051908152f35b346101cb5760803660031901126101cb5761050e6118b8565b6105166118ce565b90604435606435926001600160401b0384116101cb57366023850112156101cb5761054e6101c994369060248160040135910161195a565b9261055a838383611b6d565b336125db565b346101cb5760003660031901126101cb57336000526006602052610588604060002054611a21565b6105b85761059533612146565b33600052600660205261047661045b610462604060002060405192838092611aea565b3360005260066020526105e36040600020604051918291638541228760e01b83523360048401611d7d565b0390fd5b346101cb5760403660031901126101cb576106006118b8565b602435908115158092036101cb576001600160a01b031690811561066e57610627336119e8565b82600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b50630b61174360e31b60005260045260246000fd5b346101cb5760003660031901126101cb576020600054604051908152f35b346101cb5760203660031901126101cb576106ba6118b8565b6106c2611eb0565b60018060a01b038116908160005260066020526106e3604060002054611a21565b610712576106f090612146565b600052600660205261047661045b610462604060002060405192838092611aea565b9060005260066020526040600020906105e3604051928392638541228760e01b845260048401611d7d565b346101cb5760203660031901126101cb576001600160a01b0361075e6118b8565b16600052600660205261047661045b610462604060002060405192838092611aea565b346101cb5760003660031901126101cb5760405160006000805160206127f6833981519152546107b081611a21565b808452906001811690811561084457506001146107d8575b610476836104628185038261191e565b6000805160206127f683398151915260009081527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e939250905b80821061082a575090915081016020016104626107c8565b919260018160209254838588010152019101909291610812565b60ff191660208086019190915291151560051b8401909101915061046290506107c8565b346101cb5760203660031901126101cb57610881611eb0565b600435600055005b346101cb5760003660031901126101cb57600080516020612776833981519152546040516001600160a01b039091168152602090f35b346101cb5760003660031901126101cb576020600454604051908152f35b346101cb5760203660031901126101cb576108f66118b8565b6108fe611eb0565b6001600160a01b03811615610920578061091a6101c992611ef5565b50612146565b634e46966960e11b60005260046000fd5b346101cb5760003660031901126101cb5761094a611eb0565b60008051602061277683398151915280546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101cb5760203660031901126101cb576109b46118b8565b6001600160a01b038116156109d7576109ce6020916119af565b54604051908152f35b6322718ad960e21b600052600060045260246000fd5b346101cb5760003660031901126101cb576104766040516104628161045b81611a5b565b346101cb5760203660031901126101cb576020610a2f600435611e7f565b6040516001600160a01b039091168152f35b346101cb5760203660031901126101cb57600435610a5d611eb0565b80158015610ab7575b610aa35760407f624e69eaa446a6ee2f869d52cb1206e98cd8851850d0d84981da809ad702536f91600454908060045582519182526020820152a1005b6354ad071360e01b60005260045260246000fd5b50600a8111610a66565b346101cb5760803660031901126101cb57610ada6118b8565b6024356001600160401b0381116101cb57610af9903690600401611991565b6044356001600160401b0381116101cb57610b18903690600401611991565b916064356001600160401b0381116101cb57610b38903690600401611991565b6000805160206127d6833981519152549260ff8460401c1615936001600160401b038116801590816110fd575b60011490816110f3575b1590816110ea575b506110d95767ffffffffffffffff1981166001176000805160206127d683398151915255846110ac575b50610baa612727565b610bb2612727565b8051906001600160401b038211610e7b578190610bdd60008051602061275683398151915254611a21565b601f8111611028575b50602090601f8311600114610f9a57600092610f8f575b50508160011b916000199060031b1c191617600080516020612756833981519152555b83516001600160401b038111610e7b57610c486000805160206127f683398151915254611a21565b601f8111610f1d575b50602094601f8211600114610e9c57948192939495600092610e91575b50508160011b916000199060031b1c1916176000805160206127f6833981519152555b610c99612727565b610ca1612727565b610caa82611e09565b610cb2611eb0565b610cbb82611e09565b66038d7ea4c680006000556014600155600480558051906001600160401b038211610e7b57610ceb600754611a21565b601f8111610e0e575b50602090601f8311600114610d9657610d2c93929160009183610d8b575b50508160011b916000199060031b1c191617600755612146565b610d3257005b68ff0000000000000000196000805160206127d683398151915254166000805160206127d6833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508580610d12565b90601f1983169160076000526000805160206127968339815191529260005b818110610df65750916001939185610d2c97969410610ddd575b505050811b01600755612146565b015160001960f88460031b161c19169055858080610dcf565b92936020600181928786015181550195019301610db5565b6007600052601f830160051c600080516020612796833981519152019060208410610e65575b601f0160051c60008051602061279683398151915201905b818110610e595750610cf4565b60008155600101610e4c565b6000805160206127968339815191529150610e34565b634e487b7160e01b600052604160045260246000fd5b015190508580610c6e565b601f198216956000805160206127f6833981519152600052806000209160005b888110610f0557508360019596979810610eec575b505050811b016000805160206127f683398151915255610c91565b015160001960f88460031b161c19169055858080610ed1565b91926020600181928685015181550194019201610ebc565b6000805160206127f68339815191526000527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e601f830160051c81019160208410610f85575b601f0160051c01905b818110610f795750610c51565b60008155600101610f6c565b9091508190610f63565b015190508680610bfd565b60008051602061275683398151915260009081526000805160206128168339815191529350601f198516905b8181106110105750908460019594939210610ff7575b505050811b0160008051602061275683398151915255610c20565b015160001960f88460031b161c19169055868080610fdc565b92936020600181928786015181550195019301610fc6565b909150600080516020612756833981519152600052601f830160051c600080516020612816833981519152019060208410611096575b90601f8493920160051c60008051602061281683398151915201905b8181106110875750610be6565b6000815584935060010161107a565b600080516020612816833981519152915061105e565b68ffffffffffffffffff191668010000000000000001176000805160206127d68339815191525585610ba1565b63f92ee8a960e01b60005260046000fd5b90501587610b77565b303b159150610b6f565b869150610b65565b346101cb5760203660031901126101cb576004356001600160401b0381116101cb57611135903690600401611991565b61113d611eb0565b80516001600160401b038111610e7b57611158600754611a21565b601f811161126d575b506020601f82116001146111d75791816111c7927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6946000916111cc575b508160011b916000199060031b1c191617600755604051918291602083526020830190611893565b0390a1005b90508201518561119f565b601f1982169060076000526000805160206127968339815191529160005b8181106112555750927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf69492600192826111c7961061123c575b5050811b01600755610462565b84015160001960f88460031b161c19169055858061122f565b919260206001819286890151815501940192016111f5565b6007600052601f820160051c6000805160206127968339815191520190602083106112c4575b601f0160051c60008051602061279683398151915201905b8181106112b85750611161565b600081556001016112ab565b6000805160206127968339815191529150611293565b346101cb5760203660031901126101cb576001600160a01b036112fb6118b8565b166000526003602052602060018060a01b0360406000205416604051908152f35b60203660031901126101cb576004356001600160401b0381116101cb57611347903690600401611991565b6000548034036103c1575061135b33611ef5565b9061136533612146565b602061137a6040519283815193849201611870565b60059082019081528190036020019020546001600160a01b03169081158015611438575b61142357336000908152600360205260409020546101c992906001600160a01b0316156113ce575b503433612402565b33600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790559091907f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a9080a3826113c6565b506316fb166f60e01b60005260045260246000fd5b5033821461139e565b346101cb5760403660031901126101cb5761145a6118b8565b602435611465611eb0565b6001600160a01b038216156109205760005b818110611487576101c983612146565b60019061149384611ef5565b5001611477565b346101cb576101c96114ab366118e4565b90604051926114bb60208561191e565b6000845261055a838383611b6d565b346101cb5760203660031901126101cb576004356114e6611eb0565b606481116115275760407fc48323e605e5bacb82da05ff295004ccbfc77d4d71742ee056a9320ce161e0fc91600154908060015582519182526020820152a1005b63b6135d9160e01b60005260045260246000fd5b346101cb5760203660031901126101cb57600435611557611eb0565b47811161158857600080808093335af161156f611d4d565b501561157757005b63351dc55d60e21b60005260046000fd5b631e9acf1760e31b60005260046000fd5b346101cb5760203660031901126101cb576004356001600160401b0381116101cb576115cb6020913690600401611991565b816115df6040519283815193849201611870565b600590820190815281900382019020546040516001600160a01b039091168152f35b346101cb576101c9611612366118e4565b91611b6d565b346101cb5760403660031901126101cb576116316118b8565b60243561163d81611e7f565b331515806116f7575b806116d3575b6116be5781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a460009081526000805160206127b68339815191526020526040902080546001600160a01b0319166001600160a01b03909216919091179055005b63a9fbf51f60e01b6000523360045260246000fd5b506116dd816119e8565b336000908152602091909152604090205460ff161561164c565b506001600160a01b038116331415611646565b346101cb5760203660031901126101cb576020610a2f60043561172c81611e7f565b5060009081526000805160206127b683398151915260205260409020546001600160a01b031690565b346101cb5760003660031901126101cb5760405160006000805160206127568339815191525461178481611a21565b808452906001811690811561084457506001146117ab57610476836104628185038261191e565b6000805160206127568339815191526000908152600080516020612816833981519152939250905b8082106117eb575090915081016020016104626107c8565b9192600181602092548385880101520191019092916117d3565b346101cb5760203660031901126101cb576004359063ffffffff60e01b82168092036101cb576020916380ac58cd60e01b811490811561185f575b811561184e575b5015158152f35b6301ffc9a760e01b14905083611847565b635b5e139f60e01b81149150611840565b60005b8381106118835750506000910152565b8181015183820152602001611873565b906020916118ac81518092818552858086019101611870565b601f01601f1916010190565b600435906001600160a01b03821682036101cb57565b602435906001600160a01b03821682036101cb57565b60609060031901126101cb576004356001600160a01b03811681036101cb57906024356001600160a01b03811681036101cb579060443590565b90601f801991011681019081106001600160401b03821117610e7b57604052565b6001600160401b038111610e7b57601f01601f191660200190565b9291926119668261193f565b91611974604051938461191e565b8294818452818301116101cb578281602093846000960137010152565b9080601f830112156101cb578160206119ac9335910161195a565b90565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020526040902090565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020526040902090565b90600182811c92168015611a51575b6020831014611a3b57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611a30565b60075460009291611a6b82611a21565b8082529160018116908115611ace5750600114611a86575050565b600760009081529293509091906000805160206127968339815191525b838310611ab4575060209250010190565b600181602092949394548385870101520191019190611aa3565b9050602093945060ff929192191683830152151560051b010190565b60009291815491611afa83611a21565b8083529260018116908115611b505750600114611b1657505050565b60009081526020812093945091925b838310611b36575060209250010190565b600181602092949394548385870101520191019190611b25565b915050602093945060ff929192191683830152151560051b010190565b909291906001600160a01b0384168015611d3757600094611b8d846126dc565b9533151580611c8b575b509184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611bd897989460018060a01b03861698899384611c4c576119af565b805460010190558481527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793026020526040812080546001600160a01b0319168517905580a4506001600160a01b0316808303611c3257505050565b6364283d7b60e01b60005260045260245260445260646000fd5b60008781526000805160206127b68339815191526020526040902080546001600160a01b0319169055611c7e886119af565b80546000190190556119af565b80611cd4575b15611c9c5738611b97565b84906001600160a01b038816611cbe57602491637e27328960e01b8252600452fd5b60449163177e802f60e01b825233600452602452fd5b506001600160a01b03871633148015611d1a575b80611c91575060008581526000805160206127b683398151915260205260409020546001600160a01b03163314611c91565b50611d24876119e8565b338252602052604081205460ff16611ce8565b633250574960e11b600052600060045260246000fd5b3d15611d78573d90611d5e8261193f565b91611d6c604051938461191e565b82523d6000602084013e565b606090565b6001600160a01b0390911681526040602082018190526119ac92910190611aea565b81810292918115918404141715611db257565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038111610e7b5760051b60200190565b8051821015611df35760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03168015611e695760008051602061277683398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b611e88816126dc565b906001600160a01b03821615611e9c575090565b637e27328960e01b60005260045260246000fd5b600080516020612776833981519152546001600160a01b03163303611ed157565b63118cdaa760e01b6000523360045260246000fd5b6000198114611db25760010190565b60025460405160209291611f09848361191e565b600082526001600160a01b038316928315611d3757611f27826126dc565b6001600160a01b03811680151591908490879084612107575b611f49866119af565b8054600101905560008381527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793028b526040812080546001600160a01b031916841790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9080a4506120f1573b611ff8575b50507f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804060025492604051848152a2611ff281611ee6565b60025590565b6120369184916040969496519384928392630a85bd0160e11b8452336004850152600060248501526044840152608060648401526084830190611893565b03816000885af180916000916120ac575b5090612077575050612057611d4d565b805191826120745783633250574960e11b60005260045260246000fd5b01fd5b9092906001600160e01b03191663757a42ff60e11b01612098573880611fbb565b633250574960e11b60005260045260246000fd5b8481813d83116120ea575b6120c1818361191e565b810103126120e65751906001600160e01b0319821682036120e3575038612047565b80fd5b5080fd5b503d6120b7565b6339e3563760e11b600052600060045260246000fd5b60008381526000805160206127b68339815191526020526040902080546001600160a01b0319169055612139846119af565b8054600019019055611f40565b6001600160a01b031660008181526006602052604090205461216790611a21565b1561216f5750565b604051606061217e818361191e565b602482527f6162636465666768696a6b6c6d6e6f707172737475767778797a3031323334356020830152633637383960e01b60408301526040908151926121c5838561191e565b600684526020840191601f19840136843760005b600681106123945750505060206121fa918351809381928751928391611870565b81016005815203019020836bffffffffffffffffffffffff60a01b8254161790558260005260066020528060002082516001600160401b038111610e7b576122428254611a21565b601f811161234c575b506020601f82116001146122c15791816122b194927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee696946000916122b6575b508160011b916000199060031b1c19161790555b51918291602083526020830190611893565b0390a2565b90508401513861228b565b601f1982169083600052806000209160005b8181106123345750927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee6969492600192826122b198961061231b575b5050811b01905561229f565b86015160001960f88460031b161c19169055388061230f565b9192602060018192868b0151815501940192016122d3565b826000526020600020601f830160051c8101916020841061238a575b601f0160051c01905b81811061237e575061224b565b60008155600101612371565b9091508190612368565b84516020810190428252448782015282848201528381526123b660808261191e565b5190209083519182156123ec576123d660019360ff60f81b920686612716565b511660001a6123e58289612716565b53016121d9565b634e487b7160e01b600052601260045260246000fd5b91606461241160015484611d9f565b6001600160a01b0394851660008181526003602052604081205491969094939092049291165b6001600160a01b038116801515806125d0575b156125c7576000818152600360205260409020546001600160a01b031690811580156125b0575b156125025750506001600160a01b031693600080808086895af1612493611d4d565b50156124e9577f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d9392916124e491604051948594859094939260609260808301968352602083015260408201520152565b0390a3565b8285633da906b960e01b60005260045260245260446000fd5b90915060019493945460640360648111611db25761252260649187611d9f565b04808603958611611db257600080808084865af161253e611d4d565b5015612598576040805191825260208201869052810187905260608101849052612592929188917f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d90608090a39392611ee6565b92612437565b90633da906b960e01b60005260045260245260446000fd5b506004546000198101908111611db2578614612471565b50505050505050565b50600454851061244a565b823b6125e9575b5050505050565b604051630a85bd0160e11b81526001600160a01b039182166004820152918116602483015260448201939093526080606482015291169160209082908190612635906084830190611893565b03816000865af18091600091612699575b50906126775750612655611d4d565b805190816126725782633250574960e11b60005260045260246000fd5b602001fd5b6001600160e01b03191663757a42ff60e11b01612098575038808080806125e2565b6020813d6020116126d4575b816126b26020938361191e565b810103126120e65751906001600160e01b0319821682036120e3575038612646565b3d91506126a5565b60009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b908151811015611df3570160200190565b60ff6000805160206127d68339815191525460401c161561274457565b631afcd79f60e31b60005260046000fdfe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793009016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68880bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079304f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930137c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf81a2646970667358221220b98cf3e2960af8eae7e76abb05c166d02f56113946c60f106473d3aa6f6c851b64736f6c634300081c0033",
1039
1082
  "linkReferences": {},
1040
1083
  "deployedLinkReferences": {}
1041
1084
  }