aiia-vault-sdk 1.2.5 → 1.2.7

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.
@@ -26,6 +26,10 @@ export interface ReferralCodeSetEvent {
26
26
  user: string;
27
27
  referralCode: string;
28
28
  }
29
+ export interface MaxReferralLevelsUpdatedEvent {
30
+ oldValue: number;
31
+ newValue: number;
32
+ }
29
33
  export interface TransferEvent {
30
34
  from: string;
31
35
  to: string;
@@ -152,6 +156,12 @@ export declare class MultiLevelReferralNFTSDK {
152
156
  * @returns Populated transaction
153
157
  */
154
158
  buildSetPriceTx(price: number): Promise<ethers.ContractTransaction>;
159
+ /**
160
+ * Builds a transaction to set the maximum number of referral levels
161
+ * @param maxLevels - The new maximum number of referral levels (must be between 1 and 10)
162
+ * @returns Populated transaction
163
+ */
164
+ buildSetMaxReferralLevelsTx(maxLevels: number): Promise<ethers.ContractTransaction>;
155
165
  /**
156
166
  * Builds a transaction to buy an NFT with a referral code
157
167
  * @param referralCode - The referral code to use
@@ -190,6 +200,6 @@ export declare class MultiLevelReferralNFTSDK {
190
200
  */
191
201
  getContractAddress(): string;
192
202
  getAllEvents(fromBlock: number, toBlock: number, whitelistEvents?: string[]): Promise<ParsedMultiLevelReferralNFTEventRaw[]>;
193
- streamEvents(fromBlock: number, onEvent: (event: ParsedMultiLevelReferralNFTEvent) => Promise<void>, saveLatestBlock: (blockNumber: number) => Promise<void>, batchSize?: number, sleepTime?: number): Promise<void>;
203
+ streamEvents(fromBlock: number, onEvent: (event: ParsedMultiLevelReferralNFTEvent) => Promise<void>, saveLatestBlock: (blockNumber: number) => Promise<void>, batchSize: number | undefined, sleepTime: number | undefined, shouldContinue: () => boolean): Promise<void>;
194
204
  formatEventArgs: (event: ParsedMultiLevelReferralNFTEventRaw) => ParsedMultiLevelReferralNFTEvent;
195
205
  }
@@ -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"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 buildBuyNFTTx(e){const r=await this.getPrice(),a=await this.contract.buy.populateTransaction(e);return a.value=t.ethers.parseEther(r.toString()),a}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){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})}};
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 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 +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)}};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)}};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)}};
@@ -132,6 +132,17 @@
132
132
  "name": "InvalidInitialization",
133
133
  "type": "error"
134
134
  },
135
+ {
136
+ "inputs": [
137
+ {
138
+ "internalType": "uint256",
139
+ "name": "value",
140
+ "type": "uint256"
141
+ }
142
+ ],
143
+ "name": "InvalidMaxReferralLevels",
144
+ "type": "error"
145
+ },
135
146
  {
136
147
  "inputs": [],
137
148
  "name": "InvalidRecipient",
@@ -288,6 +299,25 @@
288
299
  "name": "Initialized",
289
300
  "type": "event"
290
301
  },
302
+ {
303
+ "anonymous": false,
304
+ "inputs": [
305
+ {
306
+ "indexed": false,
307
+ "internalType": "uint256",
308
+ "name": "oldValue",
309
+ "type": "uint256"
310
+ },
311
+ {
312
+ "indexed": false,
313
+ "internalType": "uint256",
314
+ "name": "newValue",
315
+ "type": "uint256"
316
+ }
317
+ ],
318
+ "name": "MaxReferralLevelsUpdated",
319
+ "type": "event"
320
+ },
291
321
  {
292
322
  "anonymous": false,
293
323
  "inputs": [
@@ -827,6 +857,19 @@
827
857
  "stateMutability": "nonpayable",
828
858
  "type": "function"
829
859
  },
860
+ {
861
+ "inputs": [
862
+ {
863
+ "internalType": "uint256",
864
+ "name": "_maxReferralLevels",
865
+ "type": "uint256"
866
+ }
867
+ ],
868
+ "name": "setMaxReferralLevels",
869
+ "outputs": [],
870
+ "stateMutability": "nonpayable",
871
+ "type": "function"
872
+ },
830
873
  {
831
874
  "inputs": [
832
875
  {
@@ -973,8 +1016,8 @@
973
1016
  "type": "function"
974
1017
  }
975
1018
  ],
976
- "bytecode": "0x6080806040523460155761251b908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146116cf5750806306fdde031461161f578063081812fc146115d4578063095ea7b3146114e257806323b872dd146114cb5780632655e840146114635780632e1a7d4d1461140557806342842e0e146113d557806343508b051461137c578063492cc7691461107b5780634a3b68cc1461103957806355f804b314610e645780635f1e6f6d146108205780636352211e146107f05780636c0360eb146107cc57806370a082311461077a578063715018a614610710578063755edd17146106bc57806384d8ad131461069e5780638da5cb5b1461066857806391b7f5ed1461064757806395d89b41146105605780639b2c76d41461051c5780639df375d714610480578063a035b1fe14610462578063a22cb465146103c6578063b0a2fc1b1461033f578063b88d4fde146102d4578063c15edf5f146102b6578063c87b56dd146101fd578063e985e9c5146101af5763f2fde38b1461017f57600080fd5b346101aa5760203660031901126101aa576101a861019b611782565b6101a3611d10565b611c69565b005b600080fd5b346101aa5760403660031901126101aa576101c8611782565b6101d96101d3611798565b916118b2565b9060018060a01b0316600052602052602060ff604060002054166040519015158152f35b346101aa5760203660031901126101aa576001600160a01b03610221600435611cdf565b1615610259576102556040516102418161023a81611925565b03826117e8565b60405191829160208352602083019061175d565b0390f35b60405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608490fd5b346101aa5760003660031901126101aa576020600154604051908152f35b346101aa5760803660031901126101aa576102ed611782565b6102f5611798565b90604435606435926001600160401b0384116101aa57366023850112156101aa5761032d6101a8943690602481600401359101611824565b92610339838383611a37565b33612275565b346101aa5760003660031901126101aa573360005260066020526103676040600020546118eb565b6103975761037433611fa6565b33600052600660205261025561023a6102416040600020604051928380926119b4565b3360005260066020526103c26040600020604051918291638541228760e01b83523360048401611c47565b0390fd5b346101aa5760403660031901126101aa576103df611782565b602435908115158092036101aa576001600160a01b031690811561044d57610406336118b2565b82600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b50630b61174360e31b60005260045260246000fd5b346101aa5760003660031901126101aa576020600054604051908152f35b346101aa5760203660031901126101aa57610499611782565b6104a1611d10565b60018060a01b038116908160005260066020526104c26040600020546118eb565b6104f1576104cf90611fa6565b600052600660205261025561023a6102416040600020604051928380926119b4565b9060005260066020526040600020906103c2604051928392638541228760e01b845260048401611c47565b346101aa5760203660031901126101aa576001600160a01b0361053d611782565b16600052600660205261025561023a6102416040600020604051928380926119b4565b346101aa5760003660031901126101aa5760405160006000805160206124a68339815191525461058f816118eb565b808452906001811690811561062357506001146105b7575b61025583610241818503826117e8565b6000805160206124a683398151915260009081527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e939250905b808210610609575090915081016020016102416105a7565b9192600181602092548385880101520191019092916105f1565b60ff191660208086019190915291151560051b8401909101915061024190506105a7565b346101aa5760203660031901126101aa57610660611d10565b600435600055005b346101aa5760003660031901126101aa57600080516020612426833981519152546040516001600160a01b039091168152602090f35b346101aa5760003660031901126101aa576020600454604051908152f35b346101aa5760203660031901126101aa576106d5611782565b6106dd611d10565b6001600160a01b038116156106ff57806106f96101a892611d55565b50611fa6565b634e46966960e11b60005260046000fd5b346101aa5760003660031901126101aa57610729611d10565b60008051602061242683398151915280546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101aa5760203660031901126101aa57610793611782565b6001600160a01b038116156107b6576107ad602091611879565b54604051908152f35b6322718ad960e21b600052600060045260246000fd5b346101aa5760003660031901126101aa576102556040516102418161023a81611925565b346101aa5760203660031901126101aa57602061080e600435611cdf565b6040516001600160a01b039091168152f35b346101aa5760803660031901126101aa57610839611782565b6024356001600160401b0381116101aa5761085890369060040161185b565b6044356001600160401b0381116101aa5761087790369060040161185b565b916064356001600160401b0381116101aa5761089790369060040161185b565b600080516020612486833981519152549260ff8460401c1615936001600160401b03811680159081610e5c575b6001149081610e52575b159081610e49575b50610e385767ffffffffffffffff1981166001176000805160206124868339815191525584610e0b575b506109096123d7565b6109116123d7565b8051906001600160401b038211610bda57819061093c600080516020612406833981519152546118eb565b601f8111610d87575b50602090601f8311600114610cf957600092610cee575b50508160011b916000199060031b1c191617600080516020612406833981519152555b83516001600160401b038111610bda576109a76000805160206124a6833981519152546118eb565b601f8111610c7c575b50602094601f8211600114610bfb57948192939495600092610bf0575b50508160011b916000199060031b1c1916176000805160206124a6833981519152555b6109f86123d7565b610a006123d7565b610a0982611c69565b610a11611d10565b610a1a82611c69565b66038d7ea4c680006000556014600155600480558051906001600160401b038211610bda57610a4a6007546118eb565b601f8111610b6d575b50602090601f8311600114610af557610a8b93929160009183610aea575b50508160011b916000199060031b1c191617600755611fa6565b610a9157005b68ff0000000000000000196000805160206124868339815191525416600080516020612486833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508580610a71565b90601f1983169160076000526000805160206124468339815191529260005b818110610b555750916001939185610a8b97969410610b3c575b505050811b01600755611fa6565b015160001960f88460031b161c19169055858080610b2e565b92936020600181928786015181550195019301610b14565b6007600052601f830160051c600080516020612446833981519152019060208410610bc4575b601f0160051c60008051602061244683398151915201905b818110610bb85750610a53565b60008155600101610bab565b6000805160206124468339815191529150610b93565b634e487b7160e01b600052604160045260246000fd5b0151905085806109cd565b601f198216956000805160206124a6833981519152600052806000209160005b888110610c6457508360019596979810610c4b575b505050811b016000805160206124a6833981519152556109f0565b015160001960f88460031b161c19169055858080610c30565b91926020600181928685015181550194019201610c1b565b6000805160206124a68339815191526000527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e601f830160051c81019160208410610ce4575b601f0160051c01905b818110610cd857506109b0565b60008155600101610ccb565b9091508190610cc2565b01519050868061095c565b60008051602061240683398151915260009081526000805160206124c68339815191529350601f198516905b818110610d6f5750908460019594939210610d56575b505050811b016000805160206124068339815191525561097f565b015160001960f88460031b161c19169055868080610d3b565b92936020600181928786015181550195019301610d25565b909150600080516020612406833981519152600052601f830160051c6000805160206124c6833981519152019060208410610df5575b90601f8493920160051c6000805160206124c683398151915201905b818110610de65750610945565b60008155849350600101610dd9565b6000805160206124c68339815191529150610dbd565b68ffffffffffffffffff191668010000000000000001176000805160206124868339815191525585610900565b63f92ee8a960e01b60005260046000fd5b905015876108d6565b303b1591506108ce565b8691506108c4565b346101aa5760203660031901126101aa576004356001600160401b0381116101aa57610e9490369060040161185b565b610e9c611d10565b80516001600160401b038111610bda57610eb76007546118eb565b601f8111610fcc575b506020601f8211600114610f36579181610f26927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf694600091610f2b575b508160011b916000199060031b1c19161760075560405191829160208352602083019061175d565b0390a1005b905082015185610efe565b601f1982169060076000526000805160206124468339815191529160005b818110610fb45750927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6949260019282610f269610610f9b575b5050811b01600755610241565b84015160001960f88460031b161c191690558580610f8e565b91926020600181928689015181550194019201610f54565b6007600052601f820160051c600080516020612446833981519152019060208310611023575b601f0160051c60008051602061244683398151915201905b8181106110175750610ec0565b6000815560010161100a565b6000805160206124468339815191529150610ff2565b346101aa5760203660031901126101aa576001600160a01b0361105a611782565b166000526003602052602060018060a01b0360406000205416604051908152f35b60203660031901126101aa576004356001600160401b0381116101aa576110a690369060040161185b565b60005480340361136457506110ba33611d55565b906110c433611fa6565b60206110d9604051928381519384920161173a565b60059082019081528190036020019020546001600160a01b03168015801561135b575b61134757336000908152600360205260409020546001600160a01b0316156112f2575b50606461112e60015434612262565b0433600052600360205260018060a01b0360406000205416916000925b6001600160a01b038116801515806112e7575b156101a8576000818152600360205260409020546001600160a01b031690811580156112d0575b1561120b5750506001600160a01b031691600080808084875af16111a7611c17565b50156111f3576040805191825260208201949094523493810193909352606083015233917f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d90608090a3005b82633da906b960e01b60005260045260245260446000fd5b909150600194939454606403606481116112ba5761122b60649187612262565b04908186039586116112ba57600080808085855af1611248611c17565b50156112a357604080519283526020830186905234908301526060820184905261129d92913391907f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d90608090a39392611d46565b9261114b565b633da906b960e01b60005260045260245260446000fd5b634e487b7160e01b600052601160045260246000fd5b5060045460001981019081116112ba578614611185565b50600454851061115e565b33600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790559091907f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a9080a38161111f565b6316fb166f60e01b60005260045260246000fd5b503381146110fc565b63ebbfb3bb60e01b6000523460045260245260446000fd5b346101aa5760403660031901126101aa57611395611782565b6024356113a0611d10565b6001600160a01b038216156106ff5760005b8181106113c2576101a883611fa6565b6001906113ce84611d55565b50016113b2565b346101aa576101a86113e6366117ae565b90604051926113f66020856117e8565b60008452610339838383611a37565b346101aa5760203660031901126101aa57600435611421611d10565b47811161145257600080808093335af1611439611c17565b501561144157005b63351dc55d60e21b60005260046000fd5b631e9acf1760e31b60005260046000fd5b346101aa5760203660031901126101aa576004356001600160401b0381116101aa57611495602091369060040161185b565b816114a9604051928381519384920161173a565b600590820190815281900382019020546040516001600160a01b039091168152f35b346101aa576101a86114dc366117ae565b91611a37565b346101aa5760403660031901126101aa576114fb611782565b60243561150781611cdf565b331515806115c1575b8061159d575b6115885781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a460009081526000805160206124668339815191526020526040902080546001600160a01b0319166001600160a01b03909216919091179055005b63a9fbf51f60e01b6000523360045260246000fd5b506115a7816118b2565b336000908152602091909152604090205460ff1615611516565b506001600160a01b038116331415611510565b346101aa5760203660031901126101aa57602061080e6004356115f681611cdf565b50600090815260008051602061246683398151915260205260409020546001600160a01b031690565b346101aa5760003660031901126101aa5760405160006000805160206124068339815191525461164e816118eb565b808452906001811690811561062357506001146116755761025583610241818503826117e8565b60008051602061240683398151915260009081526000805160206124c6833981519152939250905b8082106116b5575090915081016020016102416105a7565b91926001816020925483858801015201910190929161169d565b346101aa5760203660031901126101aa576004359063ffffffff60e01b82168092036101aa576020916380ac58cd60e01b8114908115611729575b8115611718575b5015158152f35b6301ffc9a760e01b14905083611711565b635b5e139f60e01b8114915061170a565b60005b83811061174d5750506000910152565b818101518382015260200161173d565b906020916117768151809281855285808601910161173a565b601f01601f1916010190565b600435906001600160a01b03821682036101aa57565b602435906001600160a01b03821682036101aa57565b60609060031901126101aa576004356001600160a01b03811681036101aa57906024356001600160a01b03811681036101aa579060443590565b90601f801991011681019081106001600160401b03821117610bda57604052565b6001600160401b038111610bda57601f01601f191660200190565b92919261183082611809565b9161183e60405193846117e8565b8294818452818301116101aa578281602093846000960137010152565b9080601f830112156101aa5781602061187693359101611824565b90565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020526040902090565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020526040902090565b90600182811c9216801561191b575b602083101461190557565b634e487b7160e01b600052602260045260246000fd5b91607f16916118fa565b60075460009291611935826118eb565b80825291600181169081156119985750600114611950575050565b600760009081529293509091906000805160206124468339815191525b83831061197e575060209250010190565b60018160209294939454838587010152019101919061196d565b9050602093945060ff929192191683830152151560051b010190565b600092918154916119c4836118eb565b8083529260018116908115611a1a57506001146119e057505050565b60009081526020812093945091925b838310611a00575060209250010190565b6001816020929493945483858701015201910191906119ef565b915050602093945060ff929192191683830152151560051b010190565b909291906001600160a01b0384168015611c0157600094611a5784612376565b9533151580611b55575b509184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611aa297989460018060a01b03861698899384611b1657611879565b805460010190558481527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793026020526040812080546001600160a01b0319168517905580a4506001600160a01b0316808303611afc57505050565b6364283d7b60e01b60005260045260245260445260646000fd5b60008781526000805160206124668339815191526020526040902080546001600160a01b0319169055611b4888611879565b8054600019019055611879565b80611b9e575b15611b665738611a61565b84906001600160a01b038816611b8857602491637e27328960e01b8252600452fd5b60449163177e802f60e01b825233600452602452fd5b506001600160a01b03871633148015611be4575b80611b5b5750600085815260008051602061246683398151915260205260409020546001600160a01b03163314611b5b565b50611bee876118b2565b338252602052604081205460ff16611bb2565b633250574960e11b600052600060045260246000fd5b3d15611c42573d90611c2882611809565b91611c3660405193846117e8565b82523d6000602084013e565b606090565b6001600160a01b039091168152604060208201819052611876929101906119b4565b6001600160a01b03168015611cc95760008051602061242683398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b611ce881612376565b906001600160a01b03821615611cfc575090565b637e27328960e01b60005260045260246000fd5b600080516020612426833981519152546001600160a01b03163303611d3157565b63118cdaa760e01b6000523360045260246000fd5b60001981146112ba5760010190565b60025460405160209291611d6984836117e8565b600082526001600160a01b038316928315611c0157611d8782612376565b6001600160a01b03811680151591908490879084611f67575b611da986611879565b8054600101905560008381527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793028b526040812080546001600160a01b031916841790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9080a450611f51573b611e58575b50507f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804060025492604051848152a2611e5281611d46565b60025590565b611e969184916040969496519384928392630a85bd0160e11b845233600485015260006024850152604484015260806064840152608483019061175d565b03816000885af18091600091611f0c575b5090611ed7575050611eb7611c17565b80519182611ed45783633250574960e11b60005260045260246000fd5b01fd5b9092906001600160e01b03191663757a42ff60e11b01611ef8573880611e1b565b633250574960e11b60005260045260246000fd5b8481813d8311611f4a575b611f2181836117e8565b81010312611f465751906001600160e01b031982168203611f43575038611ea7565b80fd5b5080fd5b503d611f17565b6339e3563760e11b600052600060045260246000fd5b60008381526000805160206124668339815191526020526040902080546001600160a01b0319169055611f9984611879565b8054600019019055611da0565b6001600160a01b0316600081815260066020526040902054611fc7906118eb565b15611fcf5750565b6040516060611fde81836117e8565b602482527f6162636465666768696a6b6c6d6e6f707172737475767778797a3031323334356020830152633637383960e01b604083015260409081519261202583856117e8565b600684526020840191601f19840136843760005b600681106121f457505050602061205a91835180938192875192839161173a565b81016005815203019020836bffffffffffffffffffffffff60a01b8254161790558260005260066020528060002082516001600160401b038111610bda576120a282546118eb565b601f81116121ac575b506020601f821160011461212157918161211194927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee69694600091612116575b508160011b916000199060031b1c19161790555b5191829160208352602083019061175d565b0390a2565b9050840151386120eb565b601f1982169083600052806000209160005b8181106121945750927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee69694926001928261211198961061217b575b5050811b0190556120ff565b86015160001960f88460031b161c19169055388061216f565b9192602060018192868b015181550194019201612133565b826000526020600020601f830160051c810191602084106121ea575b601f0160051c01905b8181106121de57506120ab565b600081556001016121d1565b90915081906121c8565b84516020810190428252448782015282848201528381526122166080826117e8565b51902090835191821561224c5761223660019360ff60f81b9206866123b0565b511660001a61224582896123b0565b5301612039565b634e487b7160e01b600052601260045260246000fd5b818102929181159184041417156112ba57565b823b612283575b5050505050565b604051630a85bd0160e11b81526001600160a01b0391821660048201529181166024830152604482019390935260806064820152911691602090829081906122cf90608483019061175d565b03816000865af18091600091612333575b509061231157506122ef611c17565b8051908161230c5782633250574960e11b60005260045260246000fd5b602001fd5b6001600160e01b03191663757a42ff60e11b01611ef85750388080808061227c565b6020813d60201161236e575b8161234c602093836117e8565b81010312611f465751906001600160e01b031982168203611f435750386122e0565b3d915061233f565b60009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b9081518110156123c1570160200190565b634e487b7160e01b600052603260045260246000fd5b60ff6000805160206124868339815191525460401c16156123f457565b631afcd79f60e31b60005260046000fdfe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793009016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68880bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079304f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930137c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf81a2646970667358221220431b73f291457cdaaa91d2d35460c99924b092646ad3f4526ccf4d6d05c6fba364736f6c634300081c0033",
977
- "deployedBytecode": "0x608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146116cf5750806306fdde031461161f578063081812fc146115d4578063095ea7b3146114e257806323b872dd146114cb5780632655e840146114635780632e1a7d4d1461140557806342842e0e146113d557806343508b051461137c578063492cc7691461107b5780634a3b68cc1461103957806355f804b314610e645780635f1e6f6d146108205780636352211e146107f05780636c0360eb146107cc57806370a082311461077a578063715018a614610710578063755edd17146106bc57806384d8ad131461069e5780638da5cb5b1461066857806391b7f5ed1461064757806395d89b41146105605780639b2c76d41461051c5780639df375d714610480578063a035b1fe14610462578063a22cb465146103c6578063b0a2fc1b1461033f578063b88d4fde146102d4578063c15edf5f146102b6578063c87b56dd146101fd578063e985e9c5146101af5763f2fde38b1461017f57600080fd5b346101aa5760203660031901126101aa576101a861019b611782565b6101a3611d10565b611c69565b005b600080fd5b346101aa5760403660031901126101aa576101c8611782565b6101d96101d3611798565b916118b2565b9060018060a01b0316600052602052602060ff604060002054166040519015158152f35b346101aa5760203660031901126101aa576001600160a01b03610221600435611cdf565b1615610259576102556040516102418161023a81611925565b03826117e8565b60405191829160208352602083019061175d565b0390f35b60405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608490fd5b346101aa5760003660031901126101aa576020600154604051908152f35b346101aa5760803660031901126101aa576102ed611782565b6102f5611798565b90604435606435926001600160401b0384116101aa57366023850112156101aa5761032d6101a8943690602481600401359101611824565b92610339838383611a37565b33612275565b346101aa5760003660031901126101aa573360005260066020526103676040600020546118eb565b6103975761037433611fa6565b33600052600660205261025561023a6102416040600020604051928380926119b4565b3360005260066020526103c26040600020604051918291638541228760e01b83523360048401611c47565b0390fd5b346101aa5760403660031901126101aa576103df611782565b602435908115158092036101aa576001600160a01b031690811561044d57610406336118b2565b82600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b50630b61174360e31b60005260045260246000fd5b346101aa5760003660031901126101aa576020600054604051908152f35b346101aa5760203660031901126101aa57610499611782565b6104a1611d10565b60018060a01b038116908160005260066020526104c26040600020546118eb565b6104f1576104cf90611fa6565b600052600660205261025561023a6102416040600020604051928380926119b4565b9060005260066020526040600020906103c2604051928392638541228760e01b845260048401611c47565b346101aa5760203660031901126101aa576001600160a01b0361053d611782565b16600052600660205261025561023a6102416040600020604051928380926119b4565b346101aa5760003660031901126101aa5760405160006000805160206124a68339815191525461058f816118eb565b808452906001811690811561062357506001146105b7575b61025583610241818503826117e8565b6000805160206124a683398151915260009081527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e939250905b808210610609575090915081016020016102416105a7565b9192600181602092548385880101520191019092916105f1565b60ff191660208086019190915291151560051b8401909101915061024190506105a7565b346101aa5760203660031901126101aa57610660611d10565b600435600055005b346101aa5760003660031901126101aa57600080516020612426833981519152546040516001600160a01b039091168152602090f35b346101aa5760003660031901126101aa576020600454604051908152f35b346101aa5760203660031901126101aa576106d5611782565b6106dd611d10565b6001600160a01b038116156106ff57806106f96101a892611d55565b50611fa6565b634e46966960e11b60005260046000fd5b346101aa5760003660031901126101aa57610729611d10565b60008051602061242683398151915280546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101aa5760203660031901126101aa57610793611782565b6001600160a01b038116156107b6576107ad602091611879565b54604051908152f35b6322718ad960e21b600052600060045260246000fd5b346101aa5760003660031901126101aa576102556040516102418161023a81611925565b346101aa5760203660031901126101aa57602061080e600435611cdf565b6040516001600160a01b039091168152f35b346101aa5760803660031901126101aa57610839611782565b6024356001600160401b0381116101aa5761085890369060040161185b565b6044356001600160401b0381116101aa5761087790369060040161185b565b916064356001600160401b0381116101aa5761089790369060040161185b565b600080516020612486833981519152549260ff8460401c1615936001600160401b03811680159081610e5c575b6001149081610e52575b159081610e49575b50610e385767ffffffffffffffff1981166001176000805160206124868339815191525584610e0b575b506109096123d7565b6109116123d7565b8051906001600160401b038211610bda57819061093c600080516020612406833981519152546118eb565b601f8111610d87575b50602090601f8311600114610cf957600092610cee575b50508160011b916000199060031b1c191617600080516020612406833981519152555b83516001600160401b038111610bda576109a76000805160206124a6833981519152546118eb565b601f8111610c7c575b50602094601f8211600114610bfb57948192939495600092610bf0575b50508160011b916000199060031b1c1916176000805160206124a6833981519152555b6109f86123d7565b610a006123d7565b610a0982611c69565b610a11611d10565b610a1a82611c69565b66038d7ea4c680006000556014600155600480558051906001600160401b038211610bda57610a4a6007546118eb565b601f8111610b6d575b50602090601f8311600114610af557610a8b93929160009183610aea575b50508160011b916000199060031b1c191617600755611fa6565b610a9157005b68ff0000000000000000196000805160206124868339815191525416600080516020612486833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508580610a71565b90601f1983169160076000526000805160206124468339815191529260005b818110610b555750916001939185610a8b97969410610b3c575b505050811b01600755611fa6565b015160001960f88460031b161c19169055858080610b2e565b92936020600181928786015181550195019301610b14565b6007600052601f830160051c600080516020612446833981519152019060208410610bc4575b601f0160051c60008051602061244683398151915201905b818110610bb85750610a53565b60008155600101610bab565b6000805160206124468339815191529150610b93565b634e487b7160e01b600052604160045260246000fd5b0151905085806109cd565b601f198216956000805160206124a6833981519152600052806000209160005b888110610c6457508360019596979810610c4b575b505050811b016000805160206124a6833981519152556109f0565b015160001960f88460031b161c19169055858080610c30565b91926020600181928685015181550194019201610c1b565b6000805160206124a68339815191526000527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e601f830160051c81019160208410610ce4575b601f0160051c01905b818110610cd857506109b0565b60008155600101610ccb565b9091508190610cc2565b01519050868061095c565b60008051602061240683398151915260009081526000805160206124c68339815191529350601f198516905b818110610d6f5750908460019594939210610d56575b505050811b016000805160206124068339815191525561097f565b015160001960f88460031b161c19169055868080610d3b565b92936020600181928786015181550195019301610d25565b909150600080516020612406833981519152600052601f830160051c6000805160206124c6833981519152019060208410610df5575b90601f8493920160051c6000805160206124c683398151915201905b818110610de65750610945565b60008155849350600101610dd9565b6000805160206124c68339815191529150610dbd565b68ffffffffffffffffff191668010000000000000001176000805160206124868339815191525585610900565b63f92ee8a960e01b60005260046000fd5b905015876108d6565b303b1591506108ce565b8691506108c4565b346101aa5760203660031901126101aa576004356001600160401b0381116101aa57610e9490369060040161185b565b610e9c611d10565b80516001600160401b038111610bda57610eb76007546118eb565b601f8111610fcc575b506020601f8211600114610f36579181610f26927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf694600091610f2b575b508160011b916000199060031b1c19161760075560405191829160208352602083019061175d565b0390a1005b905082015185610efe565b601f1982169060076000526000805160206124468339815191529160005b818110610fb45750927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6949260019282610f269610610f9b575b5050811b01600755610241565b84015160001960f88460031b161c191690558580610f8e565b91926020600181928689015181550194019201610f54565b6007600052601f820160051c600080516020612446833981519152019060208310611023575b601f0160051c60008051602061244683398151915201905b8181106110175750610ec0565b6000815560010161100a565b6000805160206124468339815191529150610ff2565b346101aa5760203660031901126101aa576001600160a01b0361105a611782565b166000526003602052602060018060a01b0360406000205416604051908152f35b60203660031901126101aa576004356001600160401b0381116101aa576110a690369060040161185b565b60005480340361136457506110ba33611d55565b906110c433611fa6565b60206110d9604051928381519384920161173a565b60059082019081528190036020019020546001600160a01b03168015801561135b575b61134757336000908152600360205260409020546001600160a01b0316156112f2575b50606461112e60015434612262565b0433600052600360205260018060a01b0360406000205416916000925b6001600160a01b038116801515806112e7575b156101a8576000818152600360205260409020546001600160a01b031690811580156112d0575b1561120b5750506001600160a01b031691600080808084875af16111a7611c17565b50156111f3576040805191825260208201949094523493810193909352606083015233917f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d90608090a3005b82633da906b960e01b60005260045260245260446000fd5b909150600194939454606403606481116112ba5761122b60649187612262565b04908186039586116112ba57600080808085855af1611248611c17565b50156112a357604080519283526020830186905234908301526060820184905261129d92913391907f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d90608090a39392611d46565b9261114b565b633da906b960e01b60005260045260245260446000fd5b634e487b7160e01b600052601160045260246000fd5b5060045460001981019081116112ba578614611185565b50600454851061115e565b33600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790559091907f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a9080a38161111f565b6316fb166f60e01b60005260045260246000fd5b503381146110fc565b63ebbfb3bb60e01b6000523460045260245260446000fd5b346101aa5760403660031901126101aa57611395611782565b6024356113a0611d10565b6001600160a01b038216156106ff5760005b8181106113c2576101a883611fa6565b6001906113ce84611d55565b50016113b2565b346101aa576101a86113e6366117ae565b90604051926113f66020856117e8565b60008452610339838383611a37565b346101aa5760203660031901126101aa57600435611421611d10565b47811161145257600080808093335af1611439611c17565b501561144157005b63351dc55d60e21b60005260046000fd5b631e9acf1760e31b60005260046000fd5b346101aa5760203660031901126101aa576004356001600160401b0381116101aa57611495602091369060040161185b565b816114a9604051928381519384920161173a565b600590820190815281900382019020546040516001600160a01b039091168152f35b346101aa576101a86114dc366117ae565b91611a37565b346101aa5760403660031901126101aa576114fb611782565b60243561150781611cdf565b331515806115c1575b8061159d575b6115885781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a460009081526000805160206124668339815191526020526040902080546001600160a01b0319166001600160a01b03909216919091179055005b63a9fbf51f60e01b6000523360045260246000fd5b506115a7816118b2565b336000908152602091909152604090205460ff1615611516565b506001600160a01b038116331415611510565b346101aa5760203660031901126101aa57602061080e6004356115f681611cdf565b50600090815260008051602061246683398151915260205260409020546001600160a01b031690565b346101aa5760003660031901126101aa5760405160006000805160206124068339815191525461164e816118eb565b808452906001811690811561062357506001146116755761025583610241818503826117e8565b60008051602061240683398151915260009081526000805160206124c6833981519152939250905b8082106116b5575090915081016020016102416105a7565b91926001816020925483858801015201910190929161169d565b346101aa5760203660031901126101aa576004359063ffffffff60e01b82168092036101aa576020916380ac58cd60e01b8114908115611729575b8115611718575b5015158152f35b6301ffc9a760e01b14905083611711565b635b5e139f60e01b8114915061170a565b60005b83811061174d5750506000910152565b818101518382015260200161173d565b906020916117768151809281855285808601910161173a565b601f01601f1916010190565b600435906001600160a01b03821682036101aa57565b602435906001600160a01b03821682036101aa57565b60609060031901126101aa576004356001600160a01b03811681036101aa57906024356001600160a01b03811681036101aa579060443590565b90601f801991011681019081106001600160401b03821117610bda57604052565b6001600160401b038111610bda57601f01601f191660200190565b92919261183082611809565b9161183e60405193846117e8565b8294818452818301116101aa578281602093846000960137010152565b9080601f830112156101aa5781602061187693359101611824565b90565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020526040902090565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020526040902090565b90600182811c9216801561191b575b602083101461190557565b634e487b7160e01b600052602260045260246000fd5b91607f16916118fa565b60075460009291611935826118eb565b80825291600181169081156119985750600114611950575050565b600760009081529293509091906000805160206124468339815191525b83831061197e575060209250010190565b60018160209294939454838587010152019101919061196d565b9050602093945060ff929192191683830152151560051b010190565b600092918154916119c4836118eb565b8083529260018116908115611a1a57506001146119e057505050565b60009081526020812093945091925b838310611a00575060209250010190565b6001816020929493945483858701015201910191906119ef565b915050602093945060ff929192191683830152151560051b010190565b909291906001600160a01b0384168015611c0157600094611a5784612376565b9533151580611b55575b509184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611aa297989460018060a01b03861698899384611b1657611879565b805460010190558481527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793026020526040812080546001600160a01b0319168517905580a4506001600160a01b0316808303611afc57505050565b6364283d7b60e01b60005260045260245260445260646000fd5b60008781526000805160206124668339815191526020526040902080546001600160a01b0319169055611b4888611879565b8054600019019055611879565b80611b9e575b15611b665738611a61565b84906001600160a01b038816611b8857602491637e27328960e01b8252600452fd5b60449163177e802f60e01b825233600452602452fd5b506001600160a01b03871633148015611be4575b80611b5b5750600085815260008051602061246683398151915260205260409020546001600160a01b03163314611b5b565b50611bee876118b2565b338252602052604081205460ff16611bb2565b633250574960e11b600052600060045260246000fd5b3d15611c42573d90611c2882611809565b91611c3660405193846117e8565b82523d6000602084013e565b606090565b6001600160a01b039091168152604060208201819052611876929101906119b4565b6001600160a01b03168015611cc95760008051602061242683398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b611ce881612376565b906001600160a01b03821615611cfc575090565b637e27328960e01b60005260045260246000fd5b600080516020612426833981519152546001600160a01b03163303611d3157565b63118cdaa760e01b6000523360045260246000fd5b60001981146112ba5760010190565b60025460405160209291611d6984836117e8565b600082526001600160a01b038316928315611c0157611d8782612376565b6001600160a01b03811680151591908490879084611f67575b611da986611879565b8054600101905560008381527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793028b526040812080546001600160a01b031916841790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9080a450611f51573b611e58575b50507f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804060025492604051848152a2611e5281611d46565b60025590565b611e969184916040969496519384928392630a85bd0160e11b845233600485015260006024850152604484015260806064840152608483019061175d565b03816000885af18091600091611f0c575b5090611ed7575050611eb7611c17565b80519182611ed45783633250574960e11b60005260045260246000fd5b01fd5b9092906001600160e01b03191663757a42ff60e11b01611ef8573880611e1b565b633250574960e11b60005260045260246000fd5b8481813d8311611f4a575b611f2181836117e8565b81010312611f465751906001600160e01b031982168203611f43575038611ea7565b80fd5b5080fd5b503d611f17565b6339e3563760e11b600052600060045260246000fd5b60008381526000805160206124668339815191526020526040902080546001600160a01b0319169055611f9984611879565b8054600019019055611da0565b6001600160a01b0316600081815260066020526040902054611fc7906118eb565b15611fcf5750565b6040516060611fde81836117e8565b602482527f6162636465666768696a6b6c6d6e6f707172737475767778797a3031323334356020830152633637383960e01b604083015260409081519261202583856117e8565b600684526020840191601f19840136843760005b600681106121f457505050602061205a91835180938192875192839161173a565b81016005815203019020836bffffffffffffffffffffffff60a01b8254161790558260005260066020528060002082516001600160401b038111610bda576120a282546118eb565b601f81116121ac575b506020601f821160011461212157918161211194927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee69694600091612116575b508160011b916000199060031b1c19161790555b5191829160208352602083019061175d565b0390a2565b9050840151386120eb565b601f1982169083600052806000209160005b8181106121945750927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee69694926001928261211198961061217b575b5050811b0190556120ff565b86015160001960f88460031b161c19169055388061216f565b9192602060018192868b015181550194019201612133565b826000526020600020601f830160051c810191602084106121ea575b601f0160051c01905b8181106121de57506120ab565b600081556001016121d1565b90915081906121c8565b84516020810190428252448782015282848201528381526122166080826117e8565b51902090835191821561224c5761223660019360ff60f81b9206866123b0565b511660001a61224582896123b0565b5301612039565b634e487b7160e01b600052601260045260246000fd5b818102929181159184041417156112ba57565b823b612283575b5050505050565b604051630a85bd0160e11b81526001600160a01b0391821660048201529181166024830152604482019390935260806064820152911691602090829081906122cf90608483019061175d565b03816000865af18091600091612333575b509061231157506122ef611c17565b8051908161230c5782633250574960e11b60005260045260246000fd5b602001fd5b6001600160e01b03191663757a42ff60e11b01611ef85750388080808061227c565b6020813d60201161236e575b8161234c602093836117e8565b81010312611f465751906001600160e01b031982168203611f435750386122e0565b3d915061233f565b60009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b9081518110156123c1570160200190565b634e487b7160e01b600052603260045260246000fd5b60ff6000805160206124868339815191525460401c16156123f457565b631afcd79f60e31b60005260046000fdfe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793009016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68880bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079304f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930137c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf81a2646970667358221220431b73f291457cdaaa91d2d35460c99924b092646ad3f4526ccf4d6d05c6fba364736f6c634300081c0033",
1019
+ "bytecode": "0x608080604052346015576125a6908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a71461175a5750806306fdde03146116aa578063081812fc1461165f578063095ea7b31461156d57806323b872dd146115565780632655e840146114ee5780632e1a7d4d1461149057806342842e0e1461146057806343508b0514611407578063492cc769146111065780634a3b68cc146110c457806355f804b314610eef5780635f1e6f6d146108ab57806363311f491461082b5780636352211e146107fb5780636c0360eb146107d757806370a0823114610785578063715018a61461071b578063755edd17146106c757806384d8ad13146106a95780638da5cb5b1461067357806391b7f5ed1461065257806395d89b411461056b5780639b2c76d4146105275780639df375d71461048b578063a035b1fe1461046d578063a22cb465146103d1578063b0a2fc1b1461034a578063b88d4fde146102df578063c15edf5f146102c1578063c87b56dd14610208578063e985e9c5146101ba5763f2fde38b1461018a57600080fd5b346101b55760203660031901126101b5576101b36101a661180d565b6101ae611d9b565b611cf4565b005b600080fd5b346101b55760403660031901126101b5576101d361180d565b6101e46101de611823565b9161193d565b9060018060a01b0316600052602052602060ff604060002054166040519015158152f35b346101b55760203660031901126101b5576001600160a01b0361022c600435611d6a565b16156102645761026060405161024c81610245816119b0565b0382611873565b6040519182916020835260208301906117e8565b0390f35b60405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608490fd5b346101b55760003660031901126101b5576020600154604051908152f35b346101b55760803660031901126101b5576102f861180d565b610300611823565b90604435606435926001600160401b0384116101b557366023850112156101b5576103386101b39436906024816004013591016118af565b92610344838383611ac2565b33612300565b346101b55760003660031901126101b557336000526006602052610372604060002054611976565b6103a25761037f33612031565b33600052600660205261026061024561024c604060002060405192838092611a3f565b3360005260066020526103cd6040600020604051918291638541228760e01b83523360048401611cd2565b0390fd5b346101b55760403660031901126101b5576103ea61180d565b602435908115158092036101b5576001600160a01b0316908115610458576104113361193d565b82600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b50630b61174360e31b60005260045260246000fd5b346101b55760003660031901126101b5576020600054604051908152f35b346101b55760203660031901126101b5576104a461180d565b6104ac611d9b565b60018060a01b038116908160005260066020526104cd604060002054611976565b6104fc576104da90612031565b600052600660205261026061024561024c604060002060405192838092611a3f565b9060005260066020526040600020906103cd604051928392638541228760e01b845260048401611cd2565b346101b55760203660031901126101b5576001600160a01b0361054861180d565b16600052600660205261026061024561024c604060002060405192838092611a3f565b346101b55760003660031901126101b55760405160006000805160206125318339815191525461059a81611976565b808452906001811690811561062e57506001146105c2575b6102608361024c81850382611873565b60008051602061253183398151915260009081527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e939250905b8082106106145750909150810160200161024c6105b2565b9192600181602092548385880101520191019092916105fc565b60ff191660208086019190915291151560051b8401909101915061024c90506105b2565b346101b55760203660031901126101b55761066b611d9b565b600435600055005b346101b55760003660031901126101b5576000805160206124b1833981519152546040516001600160a01b039091168152602090f35b346101b55760003660031901126101b5576020600454604051908152f35b346101b55760203660031901126101b5576106e061180d565b6106e8611d9b565b6001600160a01b0381161561070a57806107046101b392611de0565b50612031565b634e46966960e11b60005260046000fd5b346101b55760003660031901126101b557610734611d9b565b6000805160206124b183398151915280546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101b55760203660031901126101b55761079e61180d565b6001600160a01b038116156107c1576107b8602091611904565b54604051908152f35b6322718ad960e21b600052600060045260246000fd5b346101b55760003660031901126101b55761026060405161024c81610245816119b0565b346101b55760203660031901126101b5576020610819600435611d6a565b6040516001600160a01b039091168152f35b346101b55760203660031901126101b557600435610847611d9b565b801580156108a1575b61088d5760407f624e69eaa446a6ee2f869d52cb1206e98cd8851850d0d84981da809ad702536f91600454908060045582519182526020820152a1005b6354ad071360e01b60005260045260246000fd5b50600a8111610850565b346101b55760803660031901126101b5576108c461180d565b6024356001600160401b0381116101b5576108e39036906004016118e6565b6044356001600160401b0381116101b5576109029036906004016118e6565b916064356001600160401b0381116101b5576109229036906004016118e6565b600080516020612511833981519152549260ff8460401c1615936001600160401b03811680159081610ee7575b6001149081610edd575b159081610ed4575b50610ec35767ffffffffffffffff1981166001176000805160206125118339815191525584610e96575b50610994612462565b61099c612462565b8051906001600160401b038211610c655781906109c760008051602061249183398151915254611976565b601f8111610e12575b50602090601f8311600114610d8457600092610d79575b50508160011b916000199060031b1c191617600080516020612491833981519152555b83516001600160401b038111610c6557610a3260008051602061253183398151915254611976565b601f8111610d07575b50602094601f8211600114610c8657948192939495600092610c7b575b50508160011b916000199060031b1c191617600080516020612531833981519152555b610a83612462565b610a8b612462565b610a9482611cf4565b610a9c611d9b565b610aa582611cf4565b66038d7ea4c680006000556014600155600480558051906001600160401b038211610c6557610ad5600754611976565b601f8111610bf8575b50602090601f8311600114610b8057610b1693929160009183610b75575b50508160011b916000199060031b1c191617600755612031565b610b1c57005b68ff0000000000000000196000805160206125118339815191525416600080516020612511833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508580610afc565b90601f1983169160076000526000805160206124d18339815191529260005b818110610be05750916001939185610b1697969410610bc7575b505050811b01600755612031565b015160001960f88460031b161c19169055858080610bb9565b92936020600181928786015181550195019301610b9f565b6007600052601f830160051c6000805160206124d1833981519152019060208410610c4f575b601f0160051c6000805160206124d183398151915201905b818110610c435750610ade565b60008155600101610c36565b6000805160206124d18339815191529150610c1e565b634e487b7160e01b600052604160045260246000fd5b015190508580610a58565b601f19821695600080516020612531833981519152600052806000209160005b888110610cef57508360019596979810610cd6575b505050811b0160008051602061253183398151915255610a7b565b015160001960f88460031b161c19169055858080610cbb565b91926020600181928685015181550194019201610ca6565b6000805160206125318339815191526000527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e601f830160051c81019160208410610d6f575b601f0160051c01905b818110610d635750610a3b565b60008155600101610d56565b9091508190610d4d565b0151905086806109e7565b60008051602061249183398151915260009081526000805160206125518339815191529350601f198516905b818110610dfa5750908460019594939210610de1575b505050811b0160008051602061249183398151915255610a0a565b015160001960f88460031b161c19169055868080610dc6565b92936020600181928786015181550195019301610db0565b909150600080516020612491833981519152600052601f830160051c600080516020612551833981519152019060208410610e80575b90601f8493920160051c60008051602061255183398151915201905b818110610e7157506109d0565b60008155849350600101610e64565b6000805160206125518339815191529150610e48565b68ffffffffffffffffff19166801000000000000000117600080516020612511833981519152558561098b565b63f92ee8a960e01b60005260046000fd5b90501587610961565b303b159150610959565b86915061094f565b346101b55760203660031901126101b5576004356001600160401b0381116101b557610f1f9036906004016118e6565b610f27611d9b565b80516001600160401b038111610c6557610f42600754611976565b601f8111611057575b506020601f8211600114610fc1579181610fb1927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf694600091610fb6575b508160011b916000199060031b1c1916176007556040519182916020835260208301906117e8565b0390a1005b905082015185610f89565b601f1982169060076000526000805160206124d18339815191529160005b81811061103f5750927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6949260019282610fb19610611026575b5050811b0160075561024c565b84015160001960f88460031b161c191690558580611019565b91926020600181928689015181550194019201610fdf565b6007600052601f820160051c6000805160206124d18339815191520190602083106110ae575b601f0160051c6000805160206124d183398151915201905b8181106110a25750610f4b565b60008155600101611095565b6000805160206124d1833981519152915061107d565b346101b55760203660031901126101b5576001600160a01b036110e561180d565b166000526003602052602060018060a01b0360406000205416604051908152f35b60203660031901126101b5576004356001600160401b0381116101b5576111319036906004016118e6565b6000548034036113ef575061114533611de0565b9061114f33612031565b602061116460405192838151938492016117c5565b60059082019081528190036020019020546001600160a01b0316801580156113e6575b6113d257336000908152600360205260409020546001600160a01b03161561137d575b5060646111b9600154346122ed565b0433600052600360205260018060a01b0360406000205416916000925b6001600160a01b03811680151580611372575b156101b3576000818152600360205260409020546001600160a01b0316908115801561135b575b156112965750506001600160a01b031691600080808084875af1611232611ca2565b501561127e576040805191825260208201949094523493810193909352606083015233917f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d90608090a3005b82633da906b960e01b60005260045260245260446000fd5b90915060019493945460640360648111611345576112b6606491876122ed565b049081860395861161134557600080808085855af16112d3611ca2565b501561132e57604080519283526020830186905234908301526060820184905261132892913391907f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d90608090a39392611dd1565b926111d6565b633da906b960e01b60005260045260245260446000fd5b634e487b7160e01b600052601160045260246000fd5b506004546000198101908111611345578614611210565b5060045485106111e9565b33600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790559091907f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a9080a3816111aa565b6316fb166f60e01b60005260045260246000fd5b50338114611187565b63ebbfb3bb60e01b6000523460045260245260446000fd5b346101b55760403660031901126101b55761142061180d565b60243561142b611d9b565b6001600160a01b0382161561070a5760005b81811061144d576101b383612031565b60019061145984611de0565b500161143d565b346101b5576101b361147136611839565b9060405192611481602085611873565b60008452610344838383611ac2565b346101b55760203660031901126101b5576004356114ac611d9b565b4781116114dd57600080808093335af16114c4611ca2565b50156114cc57005b63351dc55d60e21b60005260046000fd5b631e9acf1760e31b60005260046000fd5b346101b55760203660031901126101b5576004356001600160401b0381116101b55761152060209136906004016118e6565b8161153460405192838151938492016117c5565b600590820190815281900382019020546040516001600160a01b039091168152f35b346101b5576101b361156736611839565b91611ac2565b346101b55760403660031901126101b55761158661180d565b60243561159281611d6a565b3315158061164c575b80611628575b6116135781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a460009081526000805160206124f18339815191526020526040902080546001600160a01b0319166001600160a01b03909216919091179055005b63a9fbf51f60e01b6000523360045260246000fd5b506116328161193d565b336000908152602091909152604090205460ff16156115a1565b506001600160a01b03811633141561159b565b346101b55760203660031901126101b557602061081960043561168181611d6a565b5060009081526000805160206124f183398151915260205260409020546001600160a01b031690565b346101b55760003660031901126101b5576040516000600080516020612491833981519152546116d981611976565b808452906001811690811561062e5750600114611700576102608361024c81850382611873565b6000805160206124918339815191526000908152600080516020612551833981519152939250905b8082106117405750909150810160200161024c6105b2565b919260018160209254838588010152019101909291611728565b346101b55760203660031901126101b5576004359063ffffffff60e01b82168092036101b5576020916380ac58cd60e01b81149081156117b4575b81156117a3575b5015158152f35b6301ffc9a760e01b1490508361179c565b635b5e139f60e01b81149150611795565b60005b8381106117d85750506000910152565b81810151838201526020016117c8565b90602091611801815180928185528580860191016117c5565b601f01601f1916010190565b600435906001600160a01b03821682036101b557565b602435906001600160a01b03821682036101b557565b60609060031901126101b5576004356001600160a01b03811681036101b557906024356001600160a01b03811681036101b5579060443590565b90601f801991011681019081106001600160401b03821117610c6557604052565b6001600160401b038111610c6557601f01601f191660200190565b9291926118bb82611894565b916118c96040519384611873565b8294818452818301116101b5578281602093846000960137010152565b9080601f830112156101b557816020611901933591016118af565b90565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020526040902090565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020526040902090565b90600182811c921680156119a6575b602083101461199057565b634e487b7160e01b600052602260045260246000fd5b91607f1691611985565b600754600092916119c082611976565b8082529160018116908115611a2357506001146119db575050565b600760009081529293509091906000805160206124d18339815191525b838310611a09575060209250010190565b6001816020929493945483858701015201910191906119f8565b9050602093945060ff929192191683830152151560051b010190565b60009291815491611a4f83611976565b8083529260018116908115611aa55750600114611a6b57505050565b60009081526020812093945091925b838310611a8b575060209250010190565b600181602092949394548385870101520191019190611a7a565b915050602093945060ff929192191683830152151560051b010190565b909291906001600160a01b0384168015611c8c57600094611ae284612401565b9533151580611be0575b509184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611b2d97989460018060a01b03861698899384611ba157611904565b805460010190558481527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793026020526040812080546001600160a01b0319168517905580a4506001600160a01b0316808303611b8757505050565b6364283d7b60e01b60005260045260245260445260646000fd5b60008781526000805160206124f18339815191526020526040902080546001600160a01b0319169055611bd388611904565b8054600019019055611904565b80611c29575b15611bf15738611aec565b84906001600160a01b038816611c1357602491637e27328960e01b8252600452fd5b60449163177e802f60e01b825233600452602452fd5b506001600160a01b03871633148015611c6f575b80611be6575060008581526000805160206124f183398151915260205260409020546001600160a01b03163314611be6565b50611c798761193d565b338252602052604081205460ff16611c3d565b633250574960e11b600052600060045260246000fd5b3d15611ccd573d90611cb382611894565b91611cc16040519384611873565b82523d6000602084013e565b606090565b6001600160a01b03909116815260406020820181905261190192910190611a3f565b6001600160a01b03168015611d54576000805160206124b183398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b611d7381612401565b906001600160a01b03821615611d87575090565b637e27328960e01b60005260045260246000fd5b6000805160206124b1833981519152546001600160a01b03163303611dbc57565b63118cdaa760e01b6000523360045260246000fd5b60001981146113455760010190565b60025460405160209291611df48483611873565b600082526001600160a01b038316928315611c8c57611e1282612401565b6001600160a01b03811680151591908490879084611ff2575b611e3486611904565b8054600101905560008381527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793028b526040812080546001600160a01b031916841790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9080a450611fdc573b611ee3575b50507f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804060025492604051848152a2611edd81611dd1565b60025590565b611f219184916040969496519384928392630a85bd0160e11b84523360048501526000602485015260448401526080606484015260848301906117e8565b03816000885af18091600091611f97575b5090611f62575050611f42611ca2565b80519182611f5f5783633250574960e11b60005260045260246000fd5b01fd5b9092906001600160e01b03191663757a42ff60e11b01611f83573880611ea6565b633250574960e11b60005260045260246000fd5b8481813d8311611fd5575b611fac8183611873565b81010312611fd15751906001600160e01b031982168203611fce575038611f32565b80fd5b5080fd5b503d611fa2565b6339e3563760e11b600052600060045260246000fd5b60008381526000805160206124f18339815191526020526040902080546001600160a01b031916905561202484611904565b8054600019019055611e2b565b6001600160a01b031660008181526006602052604090205461205290611976565b1561205a5750565b60405160606120698183611873565b602482527f6162636465666768696a6b6c6d6e6f707172737475767778797a3031323334356020830152633637383960e01b60408301526040908151926120b08385611873565b600684526020840191601f19840136843760005b6006811061227f5750505060206120e59183518093819287519283916117c5565b81016005815203019020836bffffffffffffffffffffffff60a01b8254161790558260005260066020528060002082516001600160401b038111610c655761212d8254611976565b601f8111612237575b506020601f82116001146121ac57918161219c94927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee696946000916121a1575b508160011b916000199060031b1c19161790555b519182916020835260208301906117e8565b0390a2565b905084015138612176565b601f1982169083600052806000209160005b81811061221f5750927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee69694926001928261219c989610612206575b5050811b01905561218a565b86015160001960f88460031b161c1916905538806121fa565b9192602060018192868b0151815501940192016121be565b826000526020600020601f830160051c81019160208410612275575b601f0160051c01905b8181106122695750612136565b6000815560010161225c565b9091508190612253565b84516020810190428252448782015282848201528381526122a1608082611873565b5190209083519182156122d7576122c160019360ff60f81b92068661243b565b511660001a6122d0828961243b565b53016120c4565b634e487b7160e01b600052601260045260246000fd5b8181029291811591840414171561134557565b823b61230e575b5050505050565b604051630a85bd0160e11b81526001600160a01b03918216600482015291811660248301526044820193909352608060648201529116916020908290819061235a9060848301906117e8565b03816000865af180916000916123be575b509061239c575061237a611ca2565b805190816123975782633250574960e11b60005260045260246000fd5b602001fd5b6001600160e01b03191663757a42ff60e11b01611f8357503880808080612307565b6020813d6020116123f9575b816123d760209383611873565b81010312611fd15751906001600160e01b031982168203611fce57503861236b565b3d91506123ca565b60009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b90815181101561244c570160200190565b634e487b7160e01b600052603260045260246000fd5b60ff6000805160206125118339815191525460401c161561247f57565b631afcd79f60e31b60005260046000fdfe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793009016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68880bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079304f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930137c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf81a2646970667358221220f0bfccf1f2bff5fd7bf85916bac710652a1653ebbe8193889af2ab4bd1a7daf264736f6c634300081c0033",
1020
+ "deployedBytecode": "0x608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a71461175a5750806306fdde03146116aa578063081812fc1461165f578063095ea7b31461156d57806323b872dd146115565780632655e840146114ee5780632e1a7d4d1461149057806342842e0e1461146057806343508b0514611407578063492cc769146111065780634a3b68cc146110c457806355f804b314610eef5780635f1e6f6d146108ab57806363311f491461082b5780636352211e146107fb5780636c0360eb146107d757806370a0823114610785578063715018a61461071b578063755edd17146106c757806384d8ad13146106a95780638da5cb5b1461067357806391b7f5ed1461065257806395d89b411461056b5780639b2c76d4146105275780639df375d71461048b578063a035b1fe1461046d578063a22cb465146103d1578063b0a2fc1b1461034a578063b88d4fde146102df578063c15edf5f146102c1578063c87b56dd14610208578063e985e9c5146101ba5763f2fde38b1461018a57600080fd5b346101b55760203660031901126101b5576101b36101a661180d565b6101ae611d9b565b611cf4565b005b600080fd5b346101b55760403660031901126101b5576101d361180d565b6101e46101de611823565b9161193d565b9060018060a01b0316600052602052602060ff604060002054166040519015158152f35b346101b55760203660031901126101b5576001600160a01b0361022c600435611d6a565b16156102645761026060405161024c81610245816119b0565b0382611873565b6040519182916020835260208301906117e8565b0390f35b60405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608490fd5b346101b55760003660031901126101b5576020600154604051908152f35b346101b55760803660031901126101b5576102f861180d565b610300611823565b90604435606435926001600160401b0384116101b557366023850112156101b5576103386101b39436906024816004013591016118af565b92610344838383611ac2565b33612300565b346101b55760003660031901126101b557336000526006602052610372604060002054611976565b6103a25761037f33612031565b33600052600660205261026061024561024c604060002060405192838092611a3f565b3360005260066020526103cd6040600020604051918291638541228760e01b83523360048401611cd2565b0390fd5b346101b55760403660031901126101b5576103ea61180d565b602435908115158092036101b5576001600160a01b0316908115610458576104113361193d565b82600052602052604060002060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3005b50630b61174360e31b60005260045260246000fd5b346101b55760003660031901126101b5576020600054604051908152f35b346101b55760203660031901126101b5576104a461180d565b6104ac611d9b565b60018060a01b038116908160005260066020526104cd604060002054611976565b6104fc576104da90612031565b600052600660205261026061024561024c604060002060405192838092611a3f565b9060005260066020526040600020906103cd604051928392638541228760e01b845260048401611cd2565b346101b55760203660031901126101b5576001600160a01b0361054861180d565b16600052600660205261026061024561024c604060002060405192838092611a3f565b346101b55760003660031901126101b55760405160006000805160206125318339815191525461059a81611976565b808452906001811690811561062e57506001146105c2575b6102608361024c81850382611873565b60008051602061253183398151915260009081527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e939250905b8082106106145750909150810160200161024c6105b2565b9192600181602092548385880101520191019092916105fc565b60ff191660208086019190915291151560051b8401909101915061024c90506105b2565b346101b55760203660031901126101b55761066b611d9b565b600435600055005b346101b55760003660031901126101b5576000805160206124b1833981519152546040516001600160a01b039091168152602090f35b346101b55760003660031901126101b5576020600454604051908152f35b346101b55760203660031901126101b5576106e061180d565b6106e8611d9b565b6001600160a01b0381161561070a57806107046101b392611de0565b50612031565b634e46966960e11b60005260046000fd5b346101b55760003660031901126101b557610734611d9b565b6000805160206124b183398151915280546001600160a01b031981169091556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101b55760203660031901126101b55761079e61180d565b6001600160a01b038116156107c1576107b8602091611904565b54604051908152f35b6322718ad960e21b600052600060045260246000fd5b346101b55760003660031901126101b55761026060405161024c81610245816119b0565b346101b55760203660031901126101b5576020610819600435611d6a565b6040516001600160a01b039091168152f35b346101b55760203660031901126101b557600435610847611d9b565b801580156108a1575b61088d5760407f624e69eaa446a6ee2f869d52cb1206e98cd8851850d0d84981da809ad702536f91600454908060045582519182526020820152a1005b6354ad071360e01b60005260045260246000fd5b50600a8111610850565b346101b55760803660031901126101b5576108c461180d565b6024356001600160401b0381116101b5576108e39036906004016118e6565b6044356001600160401b0381116101b5576109029036906004016118e6565b916064356001600160401b0381116101b5576109229036906004016118e6565b600080516020612511833981519152549260ff8460401c1615936001600160401b03811680159081610ee7575b6001149081610edd575b159081610ed4575b50610ec35767ffffffffffffffff1981166001176000805160206125118339815191525584610e96575b50610994612462565b61099c612462565b8051906001600160401b038211610c655781906109c760008051602061249183398151915254611976565b601f8111610e12575b50602090601f8311600114610d8457600092610d79575b50508160011b916000199060031b1c191617600080516020612491833981519152555b83516001600160401b038111610c6557610a3260008051602061253183398151915254611976565b601f8111610d07575b50602094601f8211600114610c8657948192939495600092610c7b575b50508160011b916000199060031b1c191617600080516020612531833981519152555b610a83612462565b610a8b612462565b610a9482611cf4565b610a9c611d9b565b610aa582611cf4565b66038d7ea4c680006000556014600155600480558051906001600160401b038211610c6557610ad5600754611976565b601f8111610bf8575b50602090601f8311600114610b8057610b1693929160009183610b75575b50508160011b916000199060031b1c191617600755612031565b610b1c57005b68ff0000000000000000196000805160206125118339815191525416600080516020612511833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b015190508580610afc565b90601f1983169160076000526000805160206124d18339815191529260005b818110610be05750916001939185610b1697969410610bc7575b505050811b01600755612031565b015160001960f88460031b161c19169055858080610bb9565b92936020600181928786015181550195019301610b9f565b6007600052601f830160051c6000805160206124d1833981519152019060208410610c4f575b601f0160051c6000805160206124d183398151915201905b818110610c435750610ade565b60008155600101610c36565b6000805160206124d18339815191529150610c1e565b634e487b7160e01b600052604160045260246000fd5b015190508580610a58565b601f19821695600080516020612531833981519152600052806000209160005b888110610cef57508360019596979810610cd6575b505050811b0160008051602061253183398151915255610a7b565b015160001960f88460031b161c19169055858080610cbb565b91926020600181928685015181550194019201610ca6565b6000805160206125318339815191526000527ff4bad0a69248f59680a4f2b3000328cec71a413447c96781cfe5996daa8c456e601f830160051c81019160208410610d6f575b601f0160051c01905b818110610d635750610a3b565b60008155600101610d56565b9091508190610d4d565b0151905086806109e7565b60008051602061249183398151915260009081526000805160206125518339815191529350601f198516905b818110610dfa5750908460019594939210610de1575b505050811b0160008051602061249183398151915255610a0a565b015160001960f88460031b161c19169055868080610dc6565b92936020600181928786015181550195019301610db0565b909150600080516020612491833981519152600052601f830160051c600080516020612551833981519152019060208410610e80575b90601f8493920160051c60008051602061255183398151915201905b818110610e7157506109d0565b60008155849350600101610e64565b6000805160206125518339815191529150610e48565b68ffffffffffffffffff19166801000000000000000117600080516020612511833981519152558561098b565b63f92ee8a960e01b60005260046000fd5b90501587610961565b303b159150610959565b86915061094f565b346101b55760203660031901126101b5576004356001600160401b0381116101b557610f1f9036906004016118e6565b610f27611d9b565b80516001600160401b038111610c6557610f42600754611976565b601f8111611057575b506020601f8211600114610fc1579181610fb1927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf694600091610fb6575b508160011b916000199060031b1c1916176007556040519182916020835260208301906117e8565b0390a1005b905082015185610f89565b601f1982169060076000526000805160206124d18339815191529160005b81811061103f5750927f5411e8ebf1636d9e83d5fc4900bf80cbac82e8790da2a4c94db4895e889eedf6949260019282610fb19610611026575b5050811b0160075561024c565b84015160001960f88460031b161c191690558580611019565b91926020600181928689015181550194019201610fdf565b6007600052601f820160051c6000805160206124d18339815191520190602083106110ae575b601f0160051c6000805160206124d183398151915201905b8181106110a25750610f4b565b60008155600101611095565b6000805160206124d1833981519152915061107d565b346101b55760203660031901126101b5576001600160a01b036110e561180d565b166000526003602052602060018060a01b0360406000205416604051908152f35b60203660031901126101b5576004356001600160401b0381116101b5576111319036906004016118e6565b6000548034036113ef575061114533611de0565b9061114f33612031565b602061116460405192838151938492016117c5565b60059082019081528190036020019020546001600160a01b0316801580156113e6575b6113d257336000908152600360205260409020546001600160a01b03161561137d575b5060646111b9600154346122ed565b0433600052600360205260018060a01b0360406000205416916000925b6001600160a01b03811680151580611372575b156101b3576000818152600360205260409020546001600160a01b0316908115801561135b575b156112965750506001600160a01b031691600080808084875af1611232611ca2565b501561127e576040805191825260208201949094523493810193909352606083015233917f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d90608090a3005b82633da906b960e01b60005260045260245260446000fd5b90915060019493945460640360648111611345576112b6606491876122ed565b049081860395861161134557600080808085855af16112d3611ca2565b501561132e57604080519283526020830186905234908301526060820184905261132892913391907f0fc36a26617d5b8d843d9224f3b293803d8b0c812dc3a647e2a147563414640d90608090a39392611dd1565b926111d6565b633da906b960e01b60005260045260245260446000fd5b634e487b7160e01b600052601160045260246000fd5b506004546000198101908111611345578614611210565b5060045485106111e9565b33600081815260036020526040812080546001600160a01b0319166001600160a01b0385161790559091907f5f7165288eef601591cf549e15ff19ef9060b7f71b9c115be946fa1fe7ebf68a9080a3816111aa565b6316fb166f60e01b60005260045260246000fd5b50338114611187565b63ebbfb3bb60e01b6000523460045260245260446000fd5b346101b55760403660031901126101b55761142061180d565b60243561142b611d9b565b6001600160a01b0382161561070a5760005b81811061144d576101b383612031565b60019061145984611de0565b500161143d565b346101b5576101b361147136611839565b9060405192611481602085611873565b60008452610344838383611ac2565b346101b55760203660031901126101b5576004356114ac611d9b565b4781116114dd57600080808093335af16114c4611ca2565b50156114cc57005b63351dc55d60e21b60005260046000fd5b631e9acf1760e31b60005260046000fd5b346101b55760203660031901126101b5576004356001600160401b0381116101b55761152060209136906004016118e6565b8161153460405192838151938492016117c5565b600590820190815281900382019020546040516001600160a01b039091168152f35b346101b5576101b361156736611839565b91611ac2565b346101b55760403660031901126101b55761158661180d565b60243561159281611d6a565b3315158061164c575b80611628575b6116135781906001600160a01b0384811691167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600080a460009081526000805160206124f18339815191526020526040902080546001600160a01b0319166001600160a01b03909216919091179055005b63a9fbf51f60e01b6000523360045260246000fd5b506116328161193d565b336000908152602091909152604090205460ff16156115a1565b506001600160a01b03811633141561159b565b346101b55760203660031901126101b557602061081960043561168181611d6a565b5060009081526000805160206124f183398151915260205260409020546001600160a01b031690565b346101b55760003660031901126101b5576040516000600080516020612491833981519152546116d981611976565b808452906001811690811561062e5750600114611700576102608361024c81850382611873565b6000805160206124918339815191526000908152600080516020612551833981519152939250905b8082106117405750909150810160200161024c6105b2565b919260018160209254838588010152019101909291611728565b346101b55760203660031901126101b5576004359063ffffffff60e01b82168092036101b5576020916380ac58cd60e01b81149081156117b4575b81156117a3575b5015158152f35b6301ffc9a760e01b1490508361179c565b635b5e139f60e01b81149150611795565b60005b8381106117d85750506000910152565b81810151838201526020016117c8565b90602091611801815180928185528580860191016117c5565b601f01601f1916010190565b600435906001600160a01b03821682036101b557565b602435906001600160a01b03821682036101b557565b60609060031901126101b5576004356001600160a01b03811681036101b557906024356001600160a01b03811681036101b5579060443590565b90601f801991011681019081106001600160401b03821117610c6557604052565b6001600160401b038111610c6557601f01601f191660200190565b9291926118bb82611894565b916118c96040519384611873565b8294818452818301116101b5578281602093846000960137010152565b9080601f830112156101b557816020611901933591016118af565b90565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793036020526040902090565b6001600160a01b031660009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793056020526040902090565b90600182811c921680156119a6575b602083101461199057565b634e487b7160e01b600052602260045260246000fd5b91607f1691611985565b600754600092916119c082611976565b8082529160018116908115611a2357506001146119db575050565b600760009081529293509091906000805160206124d18339815191525b838310611a09575060209250010190565b6001816020929493945483858701015201910191906119f8565b9050602093945060ff929192191683830152151560051b010190565b60009291815491611a4f83611976565b8083529260018116908115611aa55750600114611a6b57505050565b60009081526020812093945091925b838310611a8b575060209250010190565b600181602092949394548385870101520191019190611a7a565b915050602093945060ff929192191683830152151560051b010190565b909291906001600160a01b0384168015611c8c57600094611ae284612401565b9533151580611be0575b509184917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611b2d97989460018060a01b03861698899384611ba157611904565b805460010190558481527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793026020526040812080546001600160a01b0319168517905580a4506001600160a01b0316808303611b8757505050565b6364283d7b60e01b60005260045260245260445260646000fd5b60008781526000805160206124f18339815191526020526040902080546001600160a01b0319169055611bd388611904565b8054600019019055611904565b80611c29575b15611bf15738611aec565b84906001600160a01b038816611c1357602491637e27328960e01b8252600452fd5b60449163177e802f60e01b825233600452602452fd5b506001600160a01b03871633148015611c6f575b80611be6575060008581526000805160206124f183398151915260205260409020546001600160a01b03163314611be6565b50611c798761193d565b338252602052604081205460ff16611c3d565b633250574960e11b600052600060045260246000fd5b3d15611ccd573d90611cb382611894565b91611cc16040519384611873565b82523d6000602084013e565b606090565b6001600160a01b03909116815260406020820181905261190192910190611a3f565b6001600160a01b03168015611d54576000805160206124b183398151915280546001600160a01b0319811683179091556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b631e4fbdf760e01b600052600060045260246000fd5b611d7381612401565b906001600160a01b03821615611d87575090565b637e27328960e01b60005260045260246000fd5b6000805160206124b1833981519152546001600160a01b03163303611dbc57565b63118cdaa760e01b6000523360045260246000fd5b60001981146113455760010190565b60025460405160209291611df48483611873565b600082526001600160a01b038316928315611c8c57611e1282612401565b6001600160a01b03811680151591908490879084611ff2575b611e3486611904565b8054600101905560008381527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793028b526040812080546001600160a01b031916841790557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9080a450611fdc573b611ee3575b50507f4cc0a9c4a99ddc700de1af2c9f916a7cbfdb71f14801ccff94061ad1ef8a804060025492604051848152a2611edd81611dd1565b60025590565b611f219184916040969496519384928392630a85bd0160e11b84523360048501526000602485015260448401526080606484015260848301906117e8565b03816000885af18091600091611f97575b5090611f62575050611f42611ca2565b80519182611f5f5783633250574960e11b60005260045260246000fd5b01fd5b9092906001600160e01b03191663757a42ff60e11b01611f83573880611ea6565b633250574960e11b60005260045260246000fd5b8481813d8311611fd5575b611fac8183611873565b81010312611fd15751906001600160e01b031982168203611fce575038611f32565b80fd5b5080fd5b503d611fa2565b6339e3563760e11b600052600060045260246000fd5b60008381526000805160206124f18339815191526020526040902080546001600160a01b031916905561202484611904565b8054600019019055611e2b565b6001600160a01b031660008181526006602052604090205461205290611976565b1561205a5750565b60405160606120698183611873565b602482527f6162636465666768696a6b6c6d6e6f707172737475767778797a3031323334356020830152633637383960e01b60408301526040908151926120b08385611873565b600684526020840191601f19840136843760005b6006811061227f5750505060206120e59183518093819287519283916117c5565b81016005815203019020836bffffffffffffffffffffffff60a01b8254161790558260005260066020528060002082516001600160401b038111610c655761212d8254611976565b601f8111612237575b506020601f82116001146121ac57918161219c94927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee696946000916121a1575b508160011b916000199060031b1c19161790555b519182916020835260208301906117e8565b0390a2565b905084015138612176565b601f1982169083600052806000209160005b81811061221f5750927fb9e788fc28e69f876035840c2b162474437d35622a8cfa689a88c04403bf7ee69694926001928261219c989610612206575b5050811b01905561218a565b86015160001960f88460031b161c1916905538806121fa565b9192602060018192868b0151815501940192016121be565b826000526020600020601f830160051c81019160208410612275575b601f0160051c01905b8181106122695750612136565b6000815560010161225c565b9091508190612253565b84516020810190428252448782015282848201528381526122a1608082611873565b5190209083519182156122d7576122c160019360ff60f81b92068661243b565b511660001a6122d0828961243b565b53016120c4565b634e487b7160e01b600052601260045260246000fd5b8181029291811591840414171561134557565b823b61230e575b5050505050565b604051630a85bd0160e11b81526001600160a01b03918216600482015291811660248301526044820193909352608060648201529116916020908290819061235a9060848301906117e8565b03816000865af180916000916123be575b509061239c575061237a611ca2565b805190816123975782633250574960e11b60005260045260246000fd5b602001fd5b6001600160e01b03191663757a42ff60e11b01611f8357503880808080612307565b6020813d6020116123f9575b816123d760209383611873565b81010312611fd15751906001600160e01b031982168203611fce57503861236b565b3d91506123ca565b60009081527f80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930260205260409020546001600160a01b031690565b90815181101561244c570160200190565b634e487b7160e01b600052603260045260246000fd5b60ff6000805160206125118339815191525460401c161561247f57565b631afcd79f60e31b60005260046000fdfe80bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab00793009016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68880bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab0079304f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080bb2b638cc20bc4d0a60d66940f3ab4a00c1d7b313497ca82fb0b4ab007930137c58c799b6609234b945e882912ee9ad34948a1dfaa20a97485e1a7752bbf81a2646970667358221220f0bfccf1f2bff5fd7bf85916bac710652a1653ebbe8193889af2ab4bd1a7daf264736f6c634300081c0033",
978
1021
  "linkReferences": {},
979
1022
  "deployedLinkReferences": {}
980
1023
  }
@@ -1,8 +1,8 @@
1
1
  import type { BaseContract, BigNumberish, BytesLike, FunctionFragment, Result, Interface, EventFragment, AddressLike, ContractRunner, ContractMethod, Listener } from "ethers";
2
2
  import type { TypedContractEvent, TypedDeferredTopicFilter, TypedEventLog, TypedLogDescription, TypedListener, TypedContractMethod } from "../../common";
3
3
  export interface NFTTicketInterface extends Interface {
4
- getFunction(nameOrSignature: "approve" | "balanceOf" | "baseURI" | "batchMint" | "buy" | "generateReferralCode" | "generateReferralCodeForUser" | "getApproved" | "initialize" | "isApprovedForAll" | "maxReferralLevels" | "mintTo" | "name" | "owner" | "ownerOf" | "price" | "referralCodes" | "referrers" | "renounceOwnership" | "safeTransferFrom(address,address,uint256)" | "safeTransferFrom(address,address,uint256,bytes)" | "setApprovalForAll" | "setBaseURI" | "setPrice" | "sharePercent" | "supportsInterface" | "symbol" | "tokenURI" | "transferFrom" | "transferOwnership" | "userReferralCodes" | "withdraw"): FunctionFragment;
5
- getEvent(nameOrSignatureOrTopic: "Approval" | "ApprovalForAll" | "BaseURIChanged" | "Initialized" | "NFTMinted" | "OwnershipTransferred" | "ReferralCodeSet" | "ReferralPaid" | "ReferrerSet" | "Transfer"): EventFragment;
4
+ getFunction(nameOrSignature: "approve" | "balanceOf" | "baseURI" | "batchMint" | "buy" | "generateReferralCode" | "generateReferralCodeForUser" | "getApproved" | "initialize" | "isApprovedForAll" | "maxReferralLevels" | "mintTo" | "name" | "owner" | "ownerOf" | "price" | "referralCodes" | "referrers" | "renounceOwnership" | "safeTransferFrom(address,address,uint256)" | "safeTransferFrom(address,address,uint256,bytes)" | "setApprovalForAll" | "setBaseURI" | "setMaxReferralLevels" | "setPrice" | "sharePercent" | "supportsInterface" | "symbol" | "tokenURI" | "transferFrom" | "transferOwnership" | "userReferralCodes" | "withdraw"): FunctionFragment;
5
+ getEvent(nameOrSignatureOrTopic: "Approval" | "ApprovalForAll" | "BaseURIChanged" | "Initialized" | "MaxReferralLevelsUpdated" | "NFTMinted" | "OwnershipTransferred" | "ReferralCodeSet" | "ReferralPaid" | "ReferrerSet" | "Transfer"): EventFragment;
6
6
  encodeFunctionData(functionFragment: "approve", values: [AddressLike, BigNumberish]): string;
7
7
  encodeFunctionData(functionFragment: "balanceOf", values: [AddressLike]): string;
8
8
  encodeFunctionData(functionFragment: "baseURI", values?: undefined): string;
@@ -26,6 +26,7 @@ export interface NFTTicketInterface extends Interface {
26
26
  encodeFunctionData(functionFragment: "safeTransferFrom(address,address,uint256,bytes)", values: [AddressLike, AddressLike, BigNumberish, BytesLike]): string;
27
27
  encodeFunctionData(functionFragment: "setApprovalForAll", values: [AddressLike, boolean]): string;
28
28
  encodeFunctionData(functionFragment: "setBaseURI", values: [string]): string;
29
+ encodeFunctionData(functionFragment: "setMaxReferralLevels", values: [BigNumberish]): string;
29
30
  encodeFunctionData(functionFragment: "setPrice", values: [BigNumberish]): string;
30
31
  encodeFunctionData(functionFragment: "sharePercent", values?: undefined): string;
31
32
  encodeFunctionData(functionFragment: "supportsInterface", values: [BytesLike]): string;
@@ -58,6 +59,7 @@ export interface NFTTicketInterface extends Interface {
58
59
  decodeFunctionResult(functionFragment: "safeTransferFrom(address,address,uint256,bytes)", data: BytesLike): Result;
59
60
  decodeFunctionResult(functionFragment: "setApprovalForAll", data: BytesLike): Result;
60
61
  decodeFunctionResult(functionFragment: "setBaseURI", data: BytesLike): Result;
62
+ decodeFunctionResult(functionFragment: "setMaxReferralLevels", data: BytesLike): Result;
61
63
  decodeFunctionResult(functionFragment: "setPrice", data: BytesLike): Result;
62
64
  decodeFunctionResult(functionFragment: "sharePercent", data: BytesLike): Result;
63
65
  decodeFunctionResult(functionFragment: "supportsInterface", data: BytesLike): Result;
@@ -128,6 +130,18 @@ export declare namespace InitializedEvent {
128
130
  type Log = TypedEventLog<Event>;
129
131
  type LogDescription = TypedLogDescription<Event>;
130
132
  }
133
+ export declare namespace MaxReferralLevelsUpdatedEvent {
134
+ type InputTuple = [oldValue: BigNumberish, newValue: BigNumberish];
135
+ type OutputTuple = [oldValue: bigint, newValue: bigint];
136
+ interface OutputObject {
137
+ oldValue: bigint;
138
+ newValue: bigint;
139
+ }
140
+ type Event = TypedContractEvent<InputTuple, OutputTuple, OutputObject>;
141
+ type Filter = TypedDeferredTopicFilter<Event>;
142
+ type Log = TypedEventLog<Event>;
143
+ type LogDescription = TypedLogDescription<Event>;
144
+ }
131
145
  export declare namespace NFTMintedEvent {
132
146
  type InputTuple = [owner: AddressLike, tokenId: BigNumberish];
133
147
  type OutputTuple = [owner: string, tokenId: bigint];
@@ -303,6 +317,11 @@ export interface NFTTicket extends BaseContract {
303
317
  void
304
318
  ], "nonpayable">;
305
319
  setBaseURI: TypedContractMethod<[_baseURI: string], [void], "nonpayable">;
320
+ setMaxReferralLevels: TypedContractMethod<[
321
+ _maxReferralLevels: BigNumberish
322
+ ], [
323
+ void
324
+ ], "nonpayable">;
306
325
  setPrice: TypedContractMethod<[_price: BigNumberish], [void], "nonpayable">;
307
326
  sharePercent: TypedContractMethod<[], [bigint], "view">;
308
327
  supportsInterface: TypedContractMethod<[
@@ -390,6 +409,11 @@ export interface NFTTicket extends BaseContract {
390
409
  void
391
410
  ], "nonpayable">;
392
411
  getFunction(nameOrSignature: "setBaseURI"): TypedContractMethod<[_baseURI: string], [void], "nonpayable">;
412
+ getFunction(nameOrSignature: "setMaxReferralLevels"): TypedContractMethod<[
413
+ _maxReferralLevels: BigNumberish
414
+ ], [
415
+ void
416
+ ], "nonpayable">;
393
417
  getFunction(nameOrSignature: "setPrice"): TypedContractMethod<[_price: BigNumberish], [void], "nonpayable">;
394
418
  getFunction(nameOrSignature: "sharePercent"): TypedContractMethod<[], [bigint], "view">;
395
419
  getFunction(nameOrSignature: "supportsInterface"): TypedContractMethod<[interfaceId: BytesLike], [boolean], "view">;
@@ -409,6 +433,7 @@ export interface NFTTicket extends BaseContract {
409
433
  getEvent(key: "ApprovalForAll"): TypedContractEvent<ApprovalForAllEvent.InputTuple, ApprovalForAllEvent.OutputTuple, ApprovalForAllEvent.OutputObject>;
410
434
  getEvent(key: "BaseURIChanged"): TypedContractEvent<BaseURIChangedEvent.InputTuple, BaseURIChangedEvent.OutputTuple, BaseURIChangedEvent.OutputObject>;
411
435
  getEvent(key: "Initialized"): TypedContractEvent<InitializedEvent.InputTuple, InitializedEvent.OutputTuple, InitializedEvent.OutputObject>;
436
+ getEvent(key: "MaxReferralLevelsUpdated"): TypedContractEvent<MaxReferralLevelsUpdatedEvent.InputTuple, MaxReferralLevelsUpdatedEvent.OutputTuple, MaxReferralLevelsUpdatedEvent.OutputObject>;
412
437
  getEvent(key: "NFTMinted"): TypedContractEvent<NFTMintedEvent.InputTuple, NFTMintedEvent.OutputTuple, NFTMintedEvent.OutputObject>;
413
438
  getEvent(key: "OwnershipTransferred"): TypedContractEvent<OwnershipTransferredEvent.InputTuple, OwnershipTransferredEvent.OutputTuple, OwnershipTransferredEvent.OutputObject>;
414
439
  getEvent(key: "ReferralCodeSet"): TypedContractEvent<ReferralCodeSetEvent.InputTuple, ReferralCodeSetEvent.OutputTuple, ReferralCodeSetEvent.OutputObject>;
@@ -424,6 +449,8 @@ export interface NFTTicket extends BaseContract {
424
449
  BaseURIChanged: TypedContractEvent<BaseURIChangedEvent.InputTuple, BaseURIChangedEvent.OutputTuple, BaseURIChangedEvent.OutputObject>;
425
450
  "Initialized(uint64)": TypedContractEvent<InitializedEvent.InputTuple, InitializedEvent.OutputTuple, InitializedEvent.OutputObject>;
426
451
  Initialized: TypedContractEvent<InitializedEvent.InputTuple, InitializedEvent.OutputTuple, InitializedEvent.OutputObject>;
452
+ "MaxReferralLevelsUpdated(uint256,uint256)": TypedContractEvent<MaxReferralLevelsUpdatedEvent.InputTuple, MaxReferralLevelsUpdatedEvent.OutputTuple, MaxReferralLevelsUpdatedEvent.OutputObject>;
453
+ MaxReferralLevelsUpdated: TypedContractEvent<MaxReferralLevelsUpdatedEvent.InputTuple, MaxReferralLevelsUpdatedEvent.OutputTuple, MaxReferralLevelsUpdatedEvent.OutputObject>;
427
454
  "NFTMinted(address,uint256)": TypedContractEvent<NFTMintedEvent.InputTuple, NFTMintedEvent.OutputTuple, NFTMintedEvent.OutputObject>;
428
455
  NFTMinted: TypedContractEvent<NFTMintedEvent.InputTuple, NFTMintedEvent.OutputTuple, NFTMintedEvent.OutputObject>;
429
456
  "OwnershipTransferred(address,address)": TypedContractEvent<OwnershipTransferredEvent.InputTuple, OwnershipTransferredEvent.OutputTuple, OwnershipTransferredEvent.OutputObject>;
@@ -40,7 +40,8 @@
40
40
  "MultiLevelReferralNFT-implemented": "0x8012522547Febe8daf9C23509A3BC97d8CCE8161",
41
41
  "MultiLevelReferralNFT-implemented-old": "0xBeb206dE71c26B51557a48665F53d8Ef08399Fe9",
42
42
  "NFTTicket": "0x3f1AC66384593AAF4d99B51776E1d7df00d2C271",
43
- "NFTTicket-implemented": "0xE0E34596512Fdc3ea128c01880852cdf4FB7aF12"
43
+ "NFTTicket-implemented": "0x1C0E68D39E481461dAFAB1d6Bb26693C5fa302F3",
44
+ "NFTTicket-implemented-old": "0xE0E34596512Fdc3ea128c01880852cdf4FB7aF12"
44
45
  },
45
46
  "base": {
46
47
  "SeedRoundFundraiser": "0x3e7b414cAd1011c757dBA1a58212Db561dc9feeB",
package/dist/types.d.ts CHANGED
@@ -62,6 +62,11 @@ export interface RawEventTypes {
62
62
  oldAmount: bigint;
63
63
  newAmount: bigint;
64
64
  };
65
+ Transfer: {
66
+ from: string;
67
+ to: string;
68
+ value: bigint;
69
+ };
65
70
  }
66
71
  export interface RawSeedRoundFundraiserEventTypes {
67
72
  TokenWhitelisted: {
@@ -192,6 +197,11 @@ export interface EventTypes {
192
197
  oldAmount: number;
193
198
  newAmount: number;
194
199
  };
200
+ Transfer: {
201
+ from: string;
202
+ to: string;
203
+ value: number;
204
+ };
195
205
  }
196
206
  export interface SeedRoundFundraiserEventTypes {
197
207
  TokenWhitelisted: {
@@ -384,6 +394,10 @@ export interface RawMultiLevelReferralNFTEventTypes {
384
394
  user: string;
385
395
  referralCode: string;
386
396
  };
397
+ MaxReferralLevelsUpdated: {
398
+ oldValue: bigint;
399
+ newValue: bigint;
400
+ };
387
401
  Transfer: {
388
402
  from: string;
389
403
  to: string;
@@ -411,6 +425,10 @@ export interface MultiLevelReferralNFTEventTypes {
411
425
  user: string;
412
426
  referralCode: string;
413
427
  };
428
+ MaxReferralLevelsUpdated: {
429
+ oldValue: number;
430
+ newValue: number;
431
+ };
414
432
  Transfer: {
415
433
  from: string;
416
434
  to: string;
package/dist/utils.d.ts CHANGED
@@ -71,8 +71,9 @@ export declare const getAllEvents: <TEventRaw extends BaseEventRaw, TContract ex
71
71
  * @param batchSize Number of blocks to process in each batch
72
72
  * @param sleepTime Time to wait between iterations when caught up
73
73
  * @param whitelistEvents Optional array of event names to filter (only these events will be retrieved)
74
+ * @param shouldContinue Optional function to check if stream should continue
74
75
  */
75
- export declare const streamEvents: <TRawEvent, TFormattedEvent>({ getProvider, getAllEvents, formatEvent, onEvent, saveLatestBlock, fromBlock, batchSize, sleepTime, whitelistEvents, }: {
76
+ export declare const streamEvents: <TRawEvent, TFormattedEvent>({ getProvider, getAllEvents, formatEvent, onEvent, saveLatestBlock, fromBlock, batchSize, sleepTime, whitelistEvents, shouldContinue, }: {
76
77
  getProvider: () => ethers.Provider;
77
78
  getAllEvents: (fromBlock: number, toBlock: number, whitelistEvents?: string[]) => Promise<TRawEvent[]>;
78
79
  formatEvent: (event: TRawEvent) => TFormattedEvent;
@@ -82,6 +83,7 @@ export declare const streamEvents: <TRawEvent, TFormattedEvent>({ getProvider, g
82
83
  batchSize?: number;
83
84
  sleepTime?: number;
84
85
  whitelistEvents?: string[];
86
+ shouldContinue?: () => Promise<boolean> | boolean;
85
87
  }) => Promise<void>;
86
88
  /**
87
89
  * Generic function to sign and send a transaction
package/dist/utils.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getNetworkFromRpc=exports.signAndSendTransaction=exports.streamEvents=exports.getAllEvents=exports.resolveContractAddress=exports.getRewardWeight=exports.buildApproveERC20Tx=exports.getTokenAllowance=exports.getTokenSymbol=exports.getTokenDecimals=exports.getTransactionStatus=exports.checkRpcHealth=exports.getRandomProvider=exports.processBatches=exports.chunks=exports.sleep=exports.LOG_PREFIXES=void 0;const e=require("ethers");exports.LOG_PREFIXES={INFO:"[STREAM-INFO]",BLOCK:"[STREAM-BLOCK]",EVENT:"[STREAM-EVENT]",ERROR:"[STREAM-ERROR]",SAVE:"[STREAM-SAVE]",DEBUG:"[STREAM-DEBUG]"};exports.sleep=async e=>new Promise((t=>setTimeout(t,e)));exports.chunks=(e,t)=>{const o=[];for(let r=0;r<e.length;r+=t)o.push(e.slice(r,r+t));return o};exports.processBatches=async(e,t,o=3,r=500)=>{let s=[];const n=(0,exports.chunks)(e,o);for(let e=0;e<n.length;e++){const o=await t(n[e]);s=[...s,...o],e<n.length-1&&await(0,exports.sleep)(r)}return s};exports.getRandomProvider=e=>e[Math.floor(Math.random()*e.length)];exports.checkRpcHealth=async(e,t=0)=>{try{const t=new Promise(((e,t)=>{setTimeout((()=>t(new Error("RPC request timeout"))),5e3)}));return await Promise.race([e.getBlockNumber(),t]),!0}catch(e){return console.error(`${exports.LOG_PREFIXES.ERROR} RPC health check failed:`,e,t),!1}};exports.getTransactionStatus=async(e,t,o=10)=>{let r=0,s=1e3;for(;r<o;)try{const n=await e.getTransactionReceipt(t);if(!n){if(r++,r===o)return{hash:t,status:null,confirmations:0,isCompleted:!1,attempts:r};await(0,exports.sleep)(s),s*=2;continue}const a=Number(await n.confirmations()||0);return{hash:n.hash,status:1===n.status,confirmations:a,isCompleted:!0,attempts:r+1}}catch(e){throw new Error(`Failed to get transaction status: ${e.message}`)}throw new Error("Failed to get transaction status after maximum retries")};exports.getTokenDecimals=async(t,o)=>{const r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],o);return Number(await r.decimals())};exports.getTokenSymbol=async(t,o)=>{const r=new e.ethers.Contract(t,["function symbol() view returns (string)"],o);return await r.symbol()};exports.getTokenAllowance=async(t,o,r,s)=>{if(t===e.ethers.ZeroAddress||t.toLowerCase()===e.ethers.ZeroAddress)return BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");const n=new e.ethers.Contract(t,["function allowance(address owner, address spender) view returns (uint256)"],s);return await n.allowance(o,r)};exports.buildApproveERC20Tx=async(t,o,r,s)=>{const n=new e.ethers.Contract(t,["function approve(address spender, uint256 amount) returns (bool)"],s);return await n.approve.populateTransaction(o,r)};exports.getRewardWeight=(e,t)=>{let o=0;const r=[...t].sort(((e,t)=>e.duration-t.duration));for(const t of r)e>=t.duration&&(o=t.weight);return o};exports.resolveContractAddress=(e,t,o,r)=>{if(r)return r;const s=(0,exports.getNetworkFromRpc)(e);return o?.[s]?.[t]};exports.getAllEvents=async(e,t,o,r,s,n)=>{let a=[];e.interface.forEachEvent((e=>{a.push(e.name)})),n&&n.length>0&&(a=a.filter((e=>n.includes(e))));const i=await(0,exports.processBatches)(a,(async t=>{const n=t.map((async t=>{const n=o(),a=n.filters[t]();return(await n.queryFilter(a,r,s)).map((o=>{const r=e.interface.parseLog({topics:o.topics,data:o.data});return{eventName:t,blockNumber:o.blockNumber,transactionHash:o.transactionHash,args:r?.args.toObject(),timestamp:null}}))}));return(await Promise.all(n)).flat()}));i.sort(((e,t)=>e.blockNumber-t.blockNumber));const c=[...new Set(i.map((e=>e.blockNumber)))],l=new Map;return await(0,exports.processBatches)(c,(async e=>{const o=e.map((e=>t().getBlock(e)));return(await Promise.all(o)).forEach((e=>{e&&l.set(e.number,e.timestamp)})),[]})),i.map((e=>({eventName:e.eventName,blockNumber:e.blockNumber,transactionHash:e.transactionHash,args:Object.fromEntries(Object.entries(e.args||{}).filter((([e])=>isNaN(Number(e))))),timestamp:l.get(e.blockNumber)??null})))};exports.streamEvents=async({getProvider:e,getAllEvents:t,formatEvent:o,onEvent:r,saveLatestBlock:s,fromBlock:n,batchSize:a=1e3,sleepTime:i=5e3,whitelistEvents:c})=>{const l="1"===process.env.DEBUG_STREAM_EVENTS;let p=n,m=0,f=Date.now();const u=()=>{m++;const e=Date.now();e-f>=1e4&&(console.log(`${exports.LOG_PREFIXES.INFO} RPC Requests in last 10s: ${m}`),m=0,f=e)},E=()=>{const t=e();if(!t.__requestTracking){if("send"in t){const e=t.send.bind(t);t.send=async(t,o)=>(u(),e(t,o))}else if("_send"in t){const e=t._send.bind(t);t._send=async(t,o)=>(u(),e(t,o))}else{const e=t.getBlockNumber.bind(t);t.getBlockNumber=async()=>(u(),e());const o=t.getBlock.bind(t);t.getBlock=async e=>(u(),o(e));const r=t.getTransactionReceipt.bind(t);t.getTransactionReceipt=async e=>(u(),r(e))}t.__requestTracking=!0}return t},g=async(e,o,r)=>(u(),await t(e,o,r));for(l&&(console.log(`${exports.LOG_PREFIXES.INFO} StreamEvents Debug Mode Enabled`),console.log(`${exports.LOG_PREFIXES.INFO} Initial fromBlock: ${p}`),console.log(`${exports.LOG_PREFIXES.INFO} Batch size: ${a}`),console.log(`${exports.LOG_PREFIXES.INFO} Sleep time: ${i}ms`),console.log(`${exports.LOG_PREFIXES.INFO} RPC request tracking enabled (10s intervals)`),c&&c.length>0&&console.log(`${exports.LOG_PREFIXES.INFO} Whitelist events: ${c.join(", ")}`));;)try{const e=await E().getBlockNumber();l&&console.log(`${exports.LOG_PREFIXES.BLOCK} Latest block: ${e}`);const t=Math.min(p+a,e);if(l&&console.log(`${exports.LOG_PREFIXES.BLOCK} Processing blocks from ${p} to ${t}`),p>=e){l&&console.log(`${exports.LOG_PREFIXES.DEBUG} Caught up to latest block, waiting ${i}ms...`),await(0,exports.sleep)(i);continue}const n=await g(p,t,c);if(l&&n.length>0){const e=n.reduce(((e,t)=>{const o=t.eventName||"Unknown";return e[o]=(e[o]||0)+1,e}),{});console.log(`${exports.LOG_PREFIXES.EVENT} Found ${n.length} events:`),Object.entries(e).forEach((([e,t])=>{console.log(`${exports.LOG_PREFIXES.EVENT} - ${e}: ${t}`)}))}for(const e of n)l&&console.log(`${exports.LOG_PREFIXES.EVENT} Processing: ${e.eventName||"Event"}`),await r(o(e));await s(t),l&&console.log(`${exports.LOG_PREFIXES.SAVE} Saved latest block: ${t}`),p=t+1}catch(e){l?(console.error(`${exports.LOG_PREFIXES.ERROR} Error in streamEvents:`,e),console.error(`${exports.LOG_PREFIXES.ERROR} Stack trace:`,e instanceof Error?e.stack:"")):console.error(`${exports.LOG_PREFIXES.ERROR} Error in streamEvents:`,e),await(0,exports.sleep)(1e3)}};exports.signAndSendTransaction=async(e,t,o,{onSubmit:r,onFinally:s,onError:n}={},a)=>{try{const n={...e};let a;if("object"==typeof t&&null!==t&&"sendTransaction"in t){const e=t.connect(o());a=(await e.sendTransaction(n)).hash}else a=await t(n);r&&await r(a);const i=await(0,exports.getTransactionStatus)(o(),a);if(null===i.status)throw new Error("Transaction may not be minted on-chain yet or has failed. Please check the blockchain explorer.");if(!1===i.status)throw new Error("Transaction failed. Please check the blockchain explorer for details.");return s&&await s({...i,txHash:a}),{transaction:{hash:a},status:i}}catch(e){if(a&&e)try{if("CALL_EXCEPTION"===e.code&&e.data){const t=e.data;for(const o of Object.values(a.interface.fragments).filter((e=>"error"===e.type)))if("name"in o){const r=a.interface.getError(o.name);if(r&&r.selector){if(r.selector===t){const t=o.name,r=e.errorArgs||[],s=new Error(`Transaction failed with custom error: ${t}(${r.join(", ")})`);throw Object.assign(s,e),n&&await n(s),s}}}console.log(`${exports.LOG_PREFIXES.DEBUG} Unknown custom error with selector: ${t}`)}}catch(e){console.error(`${exports.LOG_PREFIXES.ERROR} Error decoding transaction error:`,e)}throw n&&await n(e instanceof Error?e:new Error(String(e))),e}};exports.getNetworkFromRpc=e=>{const t=e.toLowerCase();let o=t;try{if(t.includes("://")){o=new URL(t).hostname}else t.includes("@")&&(o=t.split("@")[1].split("/")[0])}catch(e){console.warn(`${exports.LOG_PREFIXES.ERROR} Failed to parse RPC URL: ${t}`)}const r=[[/sepolia\.base|base-sepolia/,"base-sepolia"],[/goerli\.base|base-goerli/,"base-goerli"],[/base-mainnet/,"base"],[/polygon-mumbai|mumbai\.polygon/,"polygon-mumbai"],[/polygon-amoy|amoy\.polygon/,"polygon-amoy"],[/polygon-zkevm|zkevm|zkevm[-.]polygon/,"polygon-zkevm"],[/arbitrum.*sepolia|sepolia.*arbitrum/,"arbitrum-sepolia"],[/arbitrum.*goerli|goerli.*arbitrum/,"arbitrum-goerli"],[/arbitrum-nova|nova[-.]arbitrum/,"arbitrum-nova"],[/optimism-sepolia|sepolia[-.]optimism/,"optimism-sepolia"],[/optimism-goerli|goerli[-.]optimism/,"optimism-goerli"],[/avalanche-fuji|fuji[-.]avalanche|avax-test/,"avalanche-fuji"],[/bsc-testnet|testnet[-.]bsc|data-seed-prebsc/,"bsc-testnet"],[/base(?![-.]sepolia|[-.]goerli)/,"base"],[/polygon(?![-.]mumbai|[-.]amoy)/,"polygon"],[/arbitrum(?![-.]nova)/,"arbitrum"],[/optimism(?![-.]sepolia|[-.]goerli)/,"optimism"],[/avalanche|avax(?![-.]test|[-.]fuji)/,"avalanche"],[/bsc|binance(?![-.]testnet)/,"bsc"],[/eth-sepolia|sepolia(?![-.]base|[-.]arbitrum|[-.]optimism)/,"sepolia"],[/eth-goerli|goerli(?![-.]base|[-.]arbitrum|[-.]optimism)/,"goerli"],[/eth-mainnet|ethereum|eth\.rpc/,"ethereum"],[/mainnet/,"ethereum"]];for(const[e,o]of r)if(e.test(t))return o;for(const[e,t]of r)if(e.test(o))return t;throw new Error("Failed to get network from RPC URL")};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.getNetworkFromRpc=exports.signAndSendTransaction=exports.streamEvents=exports.getAllEvents=exports.resolveContractAddress=exports.getRewardWeight=exports.buildApproveERC20Tx=exports.getTokenAllowance=exports.getTokenSymbol=exports.getTokenDecimals=exports.getTransactionStatus=exports.checkRpcHealth=exports.getRandomProvider=exports.processBatches=exports.chunks=exports.sleep=exports.LOG_PREFIXES=void 0;const e=require("ethers");exports.LOG_PREFIXES={INFO:"[STREAM-INFO]",BLOCK:"[STREAM-BLOCK]",EVENT:"[STREAM-EVENT]",ERROR:"[STREAM-ERROR]",SAVE:"[STREAM-SAVE]",DEBUG:"[STREAM-DEBUG]"};exports.sleep=async e=>new Promise((t=>setTimeout(t,e)));exports.chunks=(e,t)=>{const o=[];for(let r=0;r<e.length;r+=t)o.push(e.slice(r,r+t));return o};exports.processBatches=async(e,t,o=3,r=500)=>{let s=[];const n=(0,exports.chunks)(e,o);for(let e=0;e<n.length;e++){const o=await t(n[e]);s=[...s,...o],e<n.length-1&&await(0,exports.sleep)(r)}return s};exports.getRandomProvider=e=>e[Math.floor(Math.random()*e.length)];exports.checkRpcHealth=async(e,t=0)=>{try{const t=new Promise(((e,t)=>{setTimeout((()=>t(new Error("RPC request timeout"))),5e3)}));return await Promise.race([e.getBlockNumber(),t]),!0}catch(e){return console.error(`${exports.LOG_PREFIXES.ERROR} RPC health check failed:`,e,t),!1}};exports.getTransactionStatus=async(e,t,o=10)=>{let r=0,s=1e3;for(;r<o;)try{const n=await e.getTransactionReceipt(t);if(!n){if(r++,r===o)return{hash:t,status:null,confirmations:0,isCompleted:!1,attempts:r};await(0,exports.sleep)(s),s*=2;continue}const a=Number(await n.confirmations()||0);return{hash:n.hash,status:1===n.status,confirmations:a,isCompleted:!0,attempts:r+1}}catch(e){throw new Error(`Failed to get transaction status: ${e.message}`)}throw new Error("Failed to get transaction status after maximum retries")};exports.getTokenDecimals=async(t,o)=>{const r=new e.ethers.Contract(t,["function decimals() view returns (uint8)"],o);return Number(await r.decimals())};exports.getTokenSymbol=async(t,o)=>{const r=new e.ethers.Contract(t,["function symbol() view returns (string)"],o);return await r.symbol()};exports.getTokenAllowance=async(t,o,r,s)=>{if(t===e.ethers.ZeroAddress||t.toLowerCase()===e.ethers.ZeroAddress)return BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");const n=new e.ethers.Contract(t,["function allowance(address owner, address spender) view returns (uint256)"],s);return await n.allowance(o,r)};exports.buildApproveERC20Tx=async(t,o,r,s)=>{const n=new e.ethers.Contract(t,["function approve(address spender, uint256 amount) returns (bool)"],s);return await n.approve.populateTransaction(o,r)};exports.getRewardWeight=(e,t)=>{let o=0;const r=[...t].sort(((e,t)=>e.duration-t.duration));for(const t of r)e>=t.duration&&(o=t.weight);return o};exports.resolveContractAddress=(e,t,o,r)=>{if(r)return r;const s=(0,exports.getNetworkFromRpc)(e);return o?.[s]?.[t]};exports.getAllEvents=async(e,t,o,r,s,n)=>{let a=[];e.interface.forEachEvent((e=>{a.push(e.name)})),n&&n.length>0&&(a=a.filter((e=>n.includes(e))));const i=await(0,exports.processBatches)(a,(async t=>{const n=t.map((async t=>{const n=o(),a=n.filters[t]();return(await n.queryFilter(a,r,s)).map((o=>{const r=e.interface.parseLog({topics:o.topics,data:o.data});return{eventName:t,blockNumber:o.blockNumber,transactionHash:o.transactionHash,args:r?.args.toObject(),timestamp:null}}))}));return(await Promise.all(n)).flat()}));i.sort(((e,t)=>e.blockNumber-t.blockNumber));const c=[...new Set(i.map((e=>e.blockNumber)))],l=new Map;return await(0,exports.processBatches)(c,(async e=>{const o=e.map((e=>t().getBlock(e)));return(await Promise.all(o)).forEach((e=>{e&&l.set(e.number,e.timestamp)})),[]})),i.map((e=>({eventName:e.eventName,blockNumber:e.blockNumber,transactionHash:e.transactionHash,args:Object.fromEntries(Object.entries(e.args||{}).filter((([e])=>isNaN(Number(e))))),timestamp:l.get(e.blockNumber)??null})))};exports.streamEvents=async({getProvider:e,getAllEvents:t,formatEvent:o,onEvent:r,saveLatestBlock:s,fromBlock:n,batchSize:a=1e3,sleepTime:i=5e3,whitelistEvents:c,shouldContinue:l})=>{const p="1"===process.env.DEBUG_STREAM_EVENTS;let m=n,f=0,u=Date.now();const E=()=>{f++;const e=Date.now();e-u>=1e4&&(console.log(`${exports.LOG_PREFIXES.INFO} RPC Requests in last 10s: ${f}`),f=0,u=e)},g=()=>{const t=e();if(!t.__requestTracking){if("send"in t){const e=t.send.bind(t);t.send=async(t,o)=>(E(),e(t,o))}else if("_send"in t){const e=t._send.bind(t);t._send=async(t,o)=>(E(),e(t,o))}else{const e=t.getBlockNumber.bind(t);t.getBlockNumber=async()=>(E(),e());const o=t.getBlock.bind(t);t.getBlock=async e=>(E(),o(e));const r=t.getTransactionReceipt.bind(t);t.getTransactionReceipt=async e=>(E(),r(e))}t.__requestTracking=!0}return t},h=async(e,o,r)=>(E(),await t(e,o,r));for(p&&(console.log(`${exports.LOG_PREFIXES.INFO} StreamEvents Debug Mode Enabled`),console.log(`${exports.LOG_PREFIXES.INFO} Initial fromBlock: ${m}`),console.log(`${exports.LOG_PREFIXES.INFO} Batch size: ${a}`),console.log(`${exports.LOG_PREFIXES.INFO} Sleep time: ${i}ms`),console.log(`${exports.LOG_PREFIXES.INFO} RPC request tracking enabled (10s intervals)`),c&&c.length>0&&console.log(`${exports.LOG_PREFIXES.INFO} Whitelist events: ${c.join(", ")}`),l&&console.log(`${exports.LOG_PREFIXES.INFO} Stream will check continuation condition`));;)try{if(l){if(!await Promise.resolve(l()))return void(p&&console.log(`${exports.LOG_PREFIXES.INFO} Stream stopped by shouldContinue function`))}const e=await g().getBlockNumber();p&&console.log(`${exports.LOG_PREFIXES.BLOCK} Latest block: ${e}`);const t=Math.min(m+a,e);if(p&&console.log(`${exports.LOG_PREFIXES.BLOCK} Processing blocks from ${m} to ${t}`),m>=e){p&&console.log(`${exports.LOG_PREFIXES.DEBUG} Caught up to latest block, waiting ${i}ms...`),await(0,exports.sleep)(i);continue}const n=await h(m,t,c);if(p&&n.length>0){const e=n.reduce(((e,t)=>{const o=t.eventName||"Unknown";return e[o]=(e[o]||0)+1,e}),{});console.log(`${exports.LOG_PREFIXES.EVENT} Found ${n.length} events:`),Object.entries(e).forEach((([e,t])=>{console.log(`${exports.LOG_PREFIXES.EVENT} - ${e}: ${t}`)}))}for(const e of n)p&&console.log(`${exports.LOG_PREFIXES.EVENT} Processing: ${e.eventName||"Event"}`),await r(o(e));await s(t),p&&console.log(`${exports.LOG_PREFIXES.SAVE} Saved latest block: ${t}`),m=t+1}catch(e){p?(console.error(`${exports.LOG_PREFIXES.ERROR} Error in streamEvents:`,e),console.error(`${exports.LOG_PREFIXES.ERROR} Stack trace:`,e instanceof Error?e.stack:"")):console.error(`${exports.LOG_PREFIXES.ERROR} Error in streamEvents:`,e),await(0,exports.sleep)(1e3)}};exports.signAndSendTransaction=async(e,t,o,{onSubmit:r,onFinally:s,onError:n}={},a)=>{try{const n={...e};let a;if("object"==typeof t&&null!==t&&"sendTransaction"in t){const e=t.connect(o());a=(await e.sendTransaction(n)).hash}else a=await t(n);r&&await r(a);const i=await(0,exports.getTransactionStatus)(o(),a);if(null===i.status)throw new Error("Transaction may not be minted on-chain yet or has failed. Please check the blockchain explorer.");if(!1===i.status)throw new Error("Transaction failed. Please check the blockchain explorer for details.");return s&&await s({...i,txHash:a}),{transaction:{hash:a},status:i}}catch(e){if(a&&e)try{if("CALL_EXCEPTION"===e.code&&e.data){const t=e.data;for(const o of Object.values(a.interface.fragments).filter((e=>"error"===e.type)))if("name"in o){const r=a.interface.getError(o.name);if(r&&r.selector){if(r.selector===t){const t=o.name,r=e.errorArgs||[],s=new Error(`Transaction failed with custom error: ${t}(${r.join(", ")})`);throw Object.assign(s,e),n&&await n(s),s}}}console.log(`${exports.LOG_PREFIXES.DEBUG} Unknown custom error with selector: ${t}`)}}catch(e){console.error(`${exports.LOG_PREFIXES.ERROR} Error decoding transaction error:`,e)}throw n&&await n(e instanceof Error?e:new Error(String(e))),e}};exports.getNetworkFromRpc=e=>{const t=e.toLowerCase();let o=t;try{if(t.includes("://")){o=new URL(t).hostname}else t.includes("@")&&(o=t.split("@")[1].split("/")[0])}catch(e){console.warn(`${exports.LOG_PREFIXES.ERROR} Failed to parse RPC URL: ${t}`)}const r=[[/sepolia\.base|base-sepolia/,"base-sepolia"],[/goerli\.base|base-goerli/,"base-goerli"],[/base-mainnet/,"base"],[/polygon-mumbai|mumbai\.polygon/,"polygon-mumbai"],[/polygon-amoy|amoy\.polygon/,"polygon-amoy"],[/polygon-zkevm|zkevm|zkevm[-.]polygon/,"polygon-zkevm"],[/arbitrum.*sepolia|sepolia.*arbitrum/,"arbitrum-sepolia"],[/arbitrum.*goerli|goerli.*arbitrum/,"arbitrum-goerli"],[/arbitrum-nova|nova[-.]arbitrum/,"arbitrum-nova"],[/optimism-sepolia|sepolia[-.]optimism/,"optimism-sepolia"],[/optimism-goerli|goerli[-.]optimism/,"optimism-goerli"],[/avalanche-fuji|fuji[-.]avalanche|avax-test/,"avalanche-fuji"],[/bsc-testnet|testnet[-.]bsc|data-seed-prebsc/,"bsc-testnet"],[/base(?![-.]sepolia|[-.]goerli)/,"base"],[/polygon(?![-.]mumbai|[-.]amoy)/,"polygon"],[/arbitrum(?![-.]nova)/,"arbitrum"],[/optimism(?![-.]sepolia|[-.]goerli)/,"optimism"],[/avalanche|avax(?![-.]test|[-.]fuji)/,"avalanche"],[/bsc|binance(?![-.]testnet)/,"bsc"],[/eth-sepolia|sepolia(?![-.]base|[-.]arbitrum|[-.]optimism)/,"sepolia"],[/eth-goerli|goerli(?![-.]base|[-.]arbitrum|[-.]optimism)/,"goerli"],[/eth-mainnet|ethereum|eth\.rpc/,"ethereum"],[/mainnet/,"ethereum"]];for(const[e,o]of r)if(e.test(t))return o;for(const[e,t]of r)if(e.test(o))return t;throw new Error("Failed to get network from RPC URL")};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aiia-vault-sdk",
3
- "version": "1.2.5",
3
+ "version": "1.2.7",
4
4
  "description": "SDK for AIIA Vault Contract",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",