2019-05-15 01:48:48 +03:00
"use strict" ;
var _ _extends = ( this && this . _ _extends ) || ( function ( ) {
var extendStatics = function ( d , b ) {
extendStatics = Object . setPrototypeOf ||
( { _ _proto _ _ : [ ] } instanceof Array && function ( d , b ) { d . _ _proto _ _ = b ; } ) ||
function ( d , b ) { for ( var p in b ) if ( b . hasOwnProperty ( p ) ) d [ p ] = b [ p ] ; } ;
return extendStatics ( d , b ) ;
} ;
return function ( d , b ) {
extendStatics ( d , b ) ;
function _ _ ( ) { this . constructor = d ; }
d . prototype = b === null ? Object . create ( b ) : ( _ _ . prototype = b . prototype , new _ _ ( ) ) ;
} ;
} ) ( ) ;
2019-11-20 12:57:38 +03:00
var _ _awaiter = ( this && this . _ _awaiter ) || function ( thisArg , _arguments , P , generator ) {
function adopt ( value ) { return value instanceof P ? value : new P ( function ( resolve ) { resolve ( value ) ; } ) ; }
return new ( P || ( P = Promise ) ) ( function ( resolve , reject ) {
function fulfilled ( value ) { try { step ( generator . next ( value ) ) ; } catch ( e ) { reject ( e ) ; } }
function rejected ( value ) { try { step ( generator [ "throw" ] ( value ) ) ; } catch ( e ) { reject ( e ) ; } }
function step ( result ) { result . done ? resolve ( result . value ) : adopt ( result . value ) . then ( fulfilled , rejected ) ; }
step ( ( generator = generator . apply ( thisArg , _arguments || [ ] ) ) . next ( ) ) ;
} ) ;
} ;
var _ _generator = ( this && this . _ _generator ) || function ( thisArg , body ) {
var _ = { label : 0 , sent : function ( ) { if ( t [ 0 ] & 1 ) throw t [ 1 ] ; return t [ 1 ] ; } , trys : [ ] , ops : [ ] } , f , y , t , g ;
return g = { next : verb ( 0 ) , "throw" : verb ( 1 ) , "return" : verb ( 2 ) } , typeof Symbol === "function" && ( g [ Symbol . iterator ] = function ( ) { return this ; } ) , g ;
function verb ( n ) { return function ( v ) { return step ( [ n , v ] ) ; } ; }
function step ( op ) {
if ( f ) throw new TypeError ( "Generator is already executing." ) ;
while ( _ ) try {
if ( f = 1 , y && ( t = op [ 0 ] & 2 ? y [ "return" ] : op [ 0 ] ? y [ "throw" ] || ( ( t = y [ "return" ] ) && t . call ( y ) , 0 ) : y . next ) && ! ( t = t . call ( y , op [ 1 ] ) ) . done ) return t ;
if ( y = 0 , t ) op = [ op [ 0 ] & 2 , t . value ] ;
switch ( op [ 0 ] ) {
case 0 : case 1 : t = op ; break ;
case 4 : _ . label ++ ; return { value : op [ 1 ] , done : false } ;
case 5 : _ . label ++ ; y = op [ 1 ] ; op = [ 0 ] ; continue ;
case 7 : op = _ . ops . pop ( ) ; _ . trys . pop ( ) ; continue ;
default :
if ( ! ( t = _ . trys , t = t . length > 0 && t [ t . length - 1 ] ) && ( op [ 0 ] === 6 || op [ 0 ] === 2 ) ) { _ = 0 ; continue ; }
if ( op [ 0 ] === 3 && ( ! t || ( op [ 1 ] > t [ 0 ] && op [ 1 ] < t [ 3 ] ) ) ) { _ . label = op [ 1 ] ; break ; }
if ( op [ 0 ] === 6 && _ . label < t [ 1 ] ) { _ . label = t [ 1 ] ; t = op ; break ; }
if ( t && _ . label < t [ 2 ] ) { _ . label = t [ 2 ] ; _ . ops . push ( op ) ; break ; }
if ( t [ 2 ] ) _ . ops . pop ( ) ;
_ . trys . pop ( ) ; continue ;
}
op = body . call ( thisArg , _ ) ;
} catch ( e ) { op = [ 6 , e ] ; y = 0 ; } finally { f = t = 0 ; }
if ( op [ 0 ] & 5 ) throw op [ 1 ] ; return { value : op [ 0 ] ? op [ 1 ] : void 0 , done : true } ;
}
} ;
2019-05-15 01:48:48 +03:00
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
var abstract _provider _1 = require ( "@ethersproject/abstract-provider" ) ;
2020-09-04 08:37:14 +03:00
var basex _1 = require ( "@ethersproject/basex" ) ;
2019-05-15 01:48:48 +03:00
var bignumber _1 = require ( "@ethersproject/bignumber" ) ;
var bytes _1 = require ( "@ethersproject/bytes" ) ;
2020-09-04 08:37:14 +03:00
var constants _1 = require ( "@ethersproject/constants" ) ;
2019-05-15 01:48:48 +03:00
var hash _1 = require ( "@ethersproject/hash" ) ;
var networks _1 = require ( "@ethersproject/networks" ) ;
var properties _1 = require ( "@ethersproject/properties" ) ;
2020-09-04 08:37:14 +03:00
var sha2 _1 = require ( "@ethersproject/sha2" ) ;
2019-05-15 01:48:48 +03:00
var strings _1 = require ( "@ethersproject/strings" ) ;
var web _1 = require ( "@ethersproject/web" ) ;
2020-09-04 08:37:14 +03:00
var bech32 _1 = require ( "bech32" ) ;
2019-08-02 09:10:58 +03:00
var logger _1 = require ( "@ethersproject/logger" ) ;
var _version _1 = require ( "./_version" ) ;
var logger = new logger _1 . Logger ( _version _1 . version ) ;
2019-05-15 01:48:48 +03:00
var formatter _1 = require ( "./formatter" ) ;
//////////////////////////////
// Event Serializeing
function checkTopic ( topic ) {
if ( topic == null ) {
return "null" ;
}
if ( bytes _1 . hexDataLength ( topic ) !== 32 ) {
2019-08-02 09:10:58 +03:00
logger . throwArgumentError ( "invalid topic" , "topic" , topic ) ;
2019-05-15 01:48:48 +03:00
}
return topic . toLowerCase ( ) ;
}
function serializeTopics ( topics ) {
// Remove trailing null AND-topics; they are redundant
topics = topics . slice ( ) ;
2020-04-17 04:59:53 +03:00
while ( topics . length > 0 && topics [ topics . length - 1 ] == null ) {
2019-05-15 01:48:48 +03:00
topics . pop ( ) ;
}
return topics . map ( function ( topic ) {
if ( Array . isArray ( topic ) ) {
// Only track unique OR-topics
var unique _1 = { } ;
topic . forEach ( function ( topic ) {
unique _1 [ checkTopic ( topic ) ] = true ;
} ) ;
// The order of OR-topics does not matter
var sorted = Object . keys ( unique _1 ) ;
sorted . sort ( ) ;
return sorted . join ( "|" ) ;
}
else {
return checkTopic ( topic ) ;
}
} ) . join ( "&" ) ;
}
function deserializeTopics ( data ) {
2020-04-17 04:59:53 +03:00
if ( data === "" ) {
return [ ] ;
}
2019-05-15 01:48:48 +03:00
return data . split ( /&/g ) . map ( function ( topic ) {
2020-04-28 12:03:49 +03:00
if ( topic === "" ) {
return [ ] ;
}
var comps = topic . split ( "|" ) . map ( function ( topic ) {
2019-05-15 01:48:48 +03:00
return ( ( topic === "null" ) ? null : topic ) ;
} ) ;
2020-04-28 12:03:49 +03:00
return ( ( comps . length === 1 ) ? comps [ 0 ] : comps ) ;
2019-05-15 01:48:48 +03:00
} ) ;
}
function getEventTag ( eventName ) {
if ( typeof ( eventName ) === "string" ) {
eventName = eventName . toLowerCase ( ) ;
if ( bytes _1 . hexDataLength ( eventName ) === 32 ) {
return "tx:" + eventName ;
}
if ( eventName . indexOf ( ":" ) === - 1 ) {
return eventName ;
}
}
else if ( Array . isArray ( eventName ) ) {
return "filter:*:" + serializeTopics ( eventName ) ;
}
2019-06-12 00:57:04 +03:00
else if ( abstract _provider _1 . ForkEvent . isForkEvent ( eventName ) ) {
2019-08-02 09:10:58 +03:00
logger . warn ( "not implemented" ) ;
2019-05-15 01:48:48 +03:00
throw new Error ( "not implemented" ) ;
}
else if ( eventName && typeof ( eventName ) === "object" ) {
return "filter:" + ( eventName . address || "*" ) + ":" + serializeTopics ( eventName . topics || [ ] ) ;
}
throw new Error ( "invalid event - " + eventName ) ;
}
//////////////////////////////
// Helper Object
function getTime ( ) {
return ( new Date ( ) ) . getTime ( ) ;
}
2020-06-03 10:47:17 +03:00
function stall ( duration ) {
return new Promise ( function ( resolve ) {
setTimeout ( resolve , duration ) ;
} ) ;
}
2019-05-15 01:48:48 +03:00
//////////////////////////////
// Provider Object
/ * *
* EventType
* - "block"
2020-05-05 06:01:04 +03:00
* - "poll"
2020-06-03 10:47:17 +03:00
* - "didPoll"
2019-05-15 01:48:48 +03:00
* - "pending"
* - "error"
2020-06-03 10:47:17 +03:00
* - "network"
2019-05-15 01:48:48 +03:00
* - filter
* - topics array
* - transaction hash
* /
2020-06-03 10:47:17 +03:00
var PollableEvents = [ "block" , "network" , "pending" , "poll" ] ;
2019-05-15 01:48:48 +03:00
var Event = /** @class */ ( function ( ) {
function Event ( tag , listener , once ) {
properties _1 . defineReadOnly ( this , "tag" , tag ) ;
properties _1 . defineReadOnly ( this , "listener" , listener ) ;
properties _1 . defineReadOnly ( this , "once" , once ) ;
}
2020-04-16 01:28:04 +03:00
Object . defineProperty ( Event . prototype , "event" , {
get : function ( ) {
switch ( this . type ) {
case "tx" :
return this . hash ;
case "filter" :
return this . filter ;
}
return this . tag ;
} ,
enumerable : true ,
configurable : true
} ) ;
2020-03-12 21:14:50 +03:00
Object . defineProperty ( Event . prototype , "type" , {
get : function ( ) {
return this . tag . split ( ":" ) [ 0 ] ;
} ,
enumerable : true ,
configurable : true
} ) ;
Object . defineProperty ( Event . prototype , "hash" , {
get : function ( ) {
var comps = this . tag . split ( ":" ) ;
if ( comps [ 0 ] !== "tx" ) {
return null ;
}
return comps [ 1 ] ;
} ,
enumerable : true ,
configurable : true
} ) ;
Object . defineProperty ( Event . prototype , "filter" , {
get : function ( ) {
var comps = this . tag . split ( ":" ) ;
if ( comps [ 0 ] !== "filter" ) {
return null ;
}
2020-04-17 04:59:53 +03:00
var address = comps [ 1 ] ;
var topics = deserializeTopics ( comps [ 2 ] ) ;
var filter = { } ;
if ( topics . length > 0 ) {
filter . topics = topics ;
}
if ( address && address !== "*" ) {
filter . address = address ;
2020-03-12 21:14:50 +03:00
}
return filter ;
} ,
enumerable : true ,
configurable : true
} ) ;
2019-05-15 01:48:48 +03:00
Event . prototype . pollable = function ( ) {
2020-06-03 10:47:17 +03:00
return ( this . tag . indexOf ( ":" ) >= 0 || PollableEvents . indexOf ( this . tag ) >= 0 ) ;
2019-05-15 01:48:48 +03:00
} ;
return Event ;
} ( ) ) ;
2020-03-12 21:14:50 +03:00
exports . Event = Event ;
2020-09-04 08:37:14 +03:00
;
// https://github.com/satoshilabs/slips/blob/master/slip-0044.md
var coinInfos = {
"0" : { symbol : "btc" , p2pkh : 0x00 , p2sh : 0x05 , prefix : "bc" } ,
"2" : { symbol : "ltc" , p2pkh : 0x30 , p2sh : 0x32 , prefix : "ltc" } ,
"3" : { symbol : "doge" , p2pkh : 0x1e , p2sh : 0x16 } ,
"60" : { symbol : "eth" , ilk : "eth" } ,
"61" : { symbol : "etc" , ilk : "eth" } ,
"700" : { symbol : "xdai" , ilk : "eth" } ,
} ;
function bytes32ify ( value ) {
return bytes _1 . hexZeroPad ( bignumber _1 . BigNumber . from ( value ) . toHexString ( ) , 32 ) ;
}
// Compute the Base58Check encoded data (checksum is first 4 bytes of sha256d)
function base58Encode ( data ) {
return basex _1 . Base58 . encode ( bytes _1 . concat ( [ data , bytes _1 . hexDataSlice ( sha2 _1 . sha256 ( sha2 _1 . sha256 ( data ) ) , 0 , 4 ) ] ) ) ;
}
var Resolver = /** @class */ ( function ( ) {
function Resolver ( provider , address , name ) {
properties _1 . defineReadOnly ( this , "provider" , provider ) ;
properties _1 . defineReadOnly ( this , "name" , name ) ;
properties _1 . defineReadOnly ( this , "address" , provider . formatter . address ( address ) ) ;
}
Resolver . prototype . _fetchBytes = function ( selector , parameters ) {
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var transaction , result , offset , length ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
case 0 :
transaction = {
to : this . address ,
data : bytes _1 . hexConcat ( [ selector , hash _1 . namehash ( this . name ) , ( parameters || "0x" ) ] )
} ;
return [ 4 /*yield*/ , this . provider . call ( transaction ) ] ;
case 1 :
result = _a . sent ( ) ;
if ( result === "0x" ) {
return [ 2 /*return*/ , null ] ;
}
offset = bignumber _1 . BigNumber . from ( bytes _1 . hexDataSlice ( result , 0 , 32 ) ) . toNumber ( ) ;
length = bignumber _1 . BigNumber . from ( bytes _1 . hexDataSlice ( result , offset , offset + 32 ) ) . toNumber ( ) ;
return [ 2 /*return*/ , bytes _1 . hexDataSlice ( result , offset + 32 , offset + 32 + length ) ] ;
}
} ) ;
} ) ;
} ;
Resolver . prototype . _getAddress = function ( coinType , hexBytes ) {
var coinInfo = coinInfos [ String ( coinType ) ] ;
if ( coinInfo == null ) {
logger . throwError ( "unsupported coin type: " + coinType , logger _1 . Logger . errors . UNSUPPORTED _OPERATION , {
operation : "getAddress(" + coinType + ")"
} ) ;
}
if ( coinInfo . ilk === "eth" ) {
return this . provider . formatter . address ( hexBytes ) ;
}
var bytes = bytes _1 . arrayify ( hexBytes ) ;
// P2PKH: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
if ( coinInfo . p2pkh != null ) {
var p2pkh = hexBytes . match ( /^0x76a9([0-9a-f][0-9a-f])([0-9a-f]*)88ac$/ ) ;
if ( p2pkh ) {
var length _1 = parseInt ( p2pkh [ 1 ] , 16 ) ;
if ( p2pkh [ 2 ] . length === length _1 * 2 && length _1 >= 1 && length _1 <= 75 ) {
return base58Encode ( bytes _1 . concat ( [ [ coinInfo . p2pkh ] , ( "0x" + p2pkh [ 2 ] ) ] ) ) ;
}
}
}
// P2SH: OP_HASH160 <scriptHash> OP_EQUAL
if ( coinInfo . p2sh != null ) {
var p2sh = hexBytes . match ( /^0xa9([0-9a-f][0-9a-f])([0-9a-f]*)87$/ ) ;
if ( p2sh ) {
var length _2 = parseInt ( p2sh [ 1 ] , 16 ) ;
if ( p2sh [ 2 ] . length === length _2 * 2 && length _2 >= 1 && length _2 <= 75 ) {
return base58Encode ( bytes _1 . concat ( [ [ coinInfo . p2sh ] , ( "0x" + p2sh [ 2 ] ) ] ) ) ;
}
}
}
// Bech32
if ( coinInfo . prefix != null ) {
var length _3 = bytes [ 1 ] ;
// https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#witness-program
var version _1 = bytes [ 0 ] ;
if ( version _1 === 0x00 ) {
if ( length _3 !== 20 && length _3 !== 32 ) {
version _1 = - 1 ;
}
}
else {
version _1 = - 1 ;
}
if ( version _1 >= 0 && bytes . length === 2 + length _3 && length _3 >= 1 && length _3 <= 75 ) {
var words = bech32 _1 . toWords ( bytes . slice ( 2 ) ) ;
words . unshift ( version _1 ) ;
return bech32 _1 . encode ( coinInfo . prefix , words ) ;
}
}
return null ;
} ;
Resolver . prototype . getAddress = function ( coinType ) {
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var transaction , hexBytes _1 , hexBytes , address ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
case 0 :
if ( coinType == null ) {
coinType = 60 ;
}
if ( ! ( coinType === 60 ) ) return [ 3 /*break*/ , 2 ] ;
transaction = {
to : this . address ,
data : ( "0x3b3b57de" + hash _1 . namehash ( this . name ) . substring ( 2 ) )
} ;
return [ 4 /*yield*/ , this . provider . call ( transaction ) ] ;
case 1 :
hexBytes _1 = _a . sent ( ) ;
// No address
if ( hexBytes _1 === "0x" || hexBytes _1 === constants _1 . HashZero ) {
return [ 2 /*return*/ , null ] ;
}
return [ 2 /*return*/ , this . provider . formatter . callAddress ( hexBytes _1 ) ] ;
case 2 : return [ 4 /*yield*/ , this . _fetchBytes ( "0xf1cb7e06" , bytes32ify ( coinType ) ) ] ;
case 3 :
hexBytes = _a . sent ( ) ;
// No address
if ( hexBytes == null || hexBytes === "0x" ) {
return [ 2 /*return*/ , null ] ;
}
address = this . _getAddress ( coinType , hexBytes ) ;
if ( address == null ) {
logger . throwError ( "invalid or unsupported coin data" , logger _1 . Logger . errors . UNSUPPORTED _OPERATION , {
operation : "getAddress(" + coinType + ")" ,
coinType : coinType ,
data : hexBytes
} ) ;
}
return [ 2 /*return*/ , address ] ;
}
} ) ;
} ) ;
} ;
Resolver . prototype . getContentHash = function ( ) {
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var hexBytes , ipfs , length _4 , swarm ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
case 0 : return [ 4 /*yield*/ , this . _fetchBytes ( "0xbc1c58d1" ) ] ;
case 1 :
hexBytes = _a . sent ( ) ;
// No contenthash
if ( hexBytes == null || hexBytes === "0x" ) {
return [ 2 /*return*/ , null ] ;
}
ipfs = hexBytes . match ( /^0xe3010170(([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f]*))$/ ) ;
if ( ipfs ) {
length _4 = parseInt ( ipfs [ 3 ] , 16 ) ;
if ( ipfs [ 4 ] . length === length _4 * 2 ) {
return [ 2 /*return*/ , "ipfs:/\/" + basex _1 . Base58 . encode ( "0x" + ipfs [ 1 ] ) ] ;
}
}
swarm = hexBytes . match ( /^0xe40101fa011b20([0-9a-f]*)$/ ) ;
if ( swarm ) {
if ( swarm [ 1 ] . length === ( 32 * 2 ) ) {
return [ 2 /*return*/ , "bzz:/\/" + swarm [ 1 ] ] ;
}
}
return [ 2 /*return*/ , logger . throwError ( "invalid or unsupported content hash data" , logger _1 . Logger . errors . UNSUPPORTED _OPERATION , {
operation : "getContentHash()" ,
data : hexBytes
} ) ] ;
}
} ) ;
} ) ;
} ;
Resolver . prototype . getText = function ( key ) {
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var keyBytes , hexBytes ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
case 0 :
keyBytes = strings _1 . toUtf8Bytes ( key ) ;
// The nodehash consumes the first slot, so the string pointer targets
// offset 64, with the length at offset 64 and data starting at offset 96
keyBytes = bytes _1 . concat ( [ bytes32ify ( 64 ) , bytes32ify ( keyBytes . length ) , keyBytes ] ) ;
// Pad to word-size (32 bytes)
if ( ( keyBytes . length % 32 ) !== 0 ) {
keyBytes = bytes _1 . concat ( [ keyBytes , bytes _1 . hexZeroPad ( "0x" , 32 - ( key . length % 32 ) ) ] ) ;
}
return [ 4 /*yield*/ , this . _fetchBytes ( "0x59d1d43c" , bytes _1 . hexlify ( keyBytes ) ) ] ;
case 1 :
hexBytes = _a . sent ( ) ;
if ( hexBytes == null || hexBytes === "0x" ) {
return [ 2 /*return*/ , null ] ;
}
return [ 2 /*return*/ , strings _1 . toUtf8String ( hexBytes ) ] ;
}
} ) ;
} ) ;
} ;
return Resolver ;
} ( ) ) ;
exports . Resolver = Resolver ;
2019-05-15 01:48:48 +03:00
var defaultFormatter = null ;
var nextPollId = 1 ;
var BaseProvider = /** @class */ ( function ( _super ) {
_ _extends ( BaseProvider , _super ) ;
2020-05-04 00:53:58 +03:00
/ * *
* ready
*
* A Promise < Network > that resolves only once the provider is ready .
*
* Sub - classes that call the super with a network without a chainId
* MUST set this . Standard named networks have a known chainId .
*
* /
2019-05-15 01:48:48 +03:00
function BaseProvider ( network ) {
var _newTarget = this . constructor ;
var _this = this ;
2019-08-02 09:10:58 +03:00
logger . checkNew ( _newTarget , abstract _provider _1 . Provider ) ;
2019-05-15 01:48:48 +03:00
_this = _super . call ( this ) || this ;
2020-06-03 10:47:17 +03:00
// Events being listened to
_this . _events = [ ] ;
_this . _emitted = { block : - 2 } ;
2019-05-15 01:48:48 +03:00
_this . formatter = _newTarget . getFormatter ( ) ;
2020-06-03 10:47:17 +03:00
// If network is any, this Provider allows the underlying
// network to change dynamically, and we auto-detect the
// current network
properties _1 . defineReadOnly ( _this , "anyNetwork" , ( network === "any" ) ) ;
if ( _this . anyNetwork ) {
network = _this . detectNetwork ( ) ;
}
2019-05-15 01:48:48 +03:00
if ( network instanceof Promise ) {
2020-05-04 00:53:58 +03:00
_this . _networkPromise = network ;
2019-05-15 01:48:48 +03:00
// Squash any "unhandled promise" errors; that do not need to be handled
2020-05-04 00:53:58 +03:00
network . catch ( function ( error ) { } ) ;
2020-06-03 10:47:17 +03:00
// Trigger initial network setting (async)
2020-06-14 04:39:36 +03:00
_this . _ready ( ) . catch ( function ( error ) { } ) ;
2019-05-15 01:48:48 +03:00
}
else {
2019-07-02 23:13:03 +03:00
var knownNetwork = properties _1 . getStatic ( ( _newTarget ) , "getNetwork" ) ( network ) ;
2019-05-15 01:48:48 +03:00
if ( knownNetwork ) {
properties _1 . defineReadOnly ( _this , "_network" , knownNetwork ) ;
2020-06-03 10:47:17 +03:00
_this . emit ( "network" , knownNetwork , null ) ;
2019-05-15 01:48:48 +03:00
}
else {
2019-08-02 09:10:58 +03:00
logger . throwArgumentError ( "invalid network" , "network" , network ) ;
2019-05-15 01:48:48 +03:00
}
}
2019-11-20 12:57:38 +03:00
_this . _maxInternalBlockNumber = - 1024 ;
2019-05-15 01:48:48 +03:00
_this . _lastBlockNumber = - 2 ;
_this . _pollingInterval = 4000 ;
_this . _fastQueryDate = 0 ;
return _this ;
}
2020-05-04 00:53:58 +03:00
BaseProvider . prototype . _ready = function ( ) {
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var network , error _1 ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
case 0 :
if ( ! ( this . _network == null ) ) return [ 3 /*break*/ , 7 ] ;
network = null ;
if ( ! this . _networkPromise ) return [ 3 /*break*/ , 4 ] ;
_a . label = 1 ;
case 1 :
_a . trys . push ( [ 1 , 3 , , 4 ] ) ;
return [ 4 /*yield*/ , this . _networkPromise ] ;
case 2 :
network = _a . sent ( ) ;
return [ 3 /*break*/ , 4 ] ;
case 3 :
error _1 = _a . sent ( ) ;
return [ 3 /*break*/ , 4 ] ;
case 4 :
if ( ! ( network == null ) ) return [ 3 /*break*/ , 6 ] ;
return [ 4 /*yield*/ , this . detectNetwork ( ) ] ;
case 5 :
network = _a . sent ( ) ;
_a . label = 6 ;
case 6 :
// This should never happen; every Provider sub-class should have
2020-05-30 04:27:59 +03:00
// suggested a network by here (or have thrown).
2020-05-04 00:53:58 +03:00
if ( ! network ) {
logger . throwError ( "no network detected" , logger _1 . Logger . errors . UNKNOWN _ERROR , { } ) ;
}
2020-05-30 04:27:59 +03:00
// Possible this call stacked so do not call defineReadOnly again
if ( this . _network == null ) {
2020-06-03 10:47:17 +03:00
if ( this . anyNetwork ) {
this . _network = network ;
}
else {
properties _1 . defineReadOnly ( this , "_network" , network ) ;
}
this . emit ( "network" , network , null ) ;
2020-05-30 04:27:59 +03:00
}
2020-05-04 00:53:58 +03:00
_a . label = 7 ;
case 7 : return [ 2 /*return*/ , this . _network ] ;
}
} ) ;
} ) ;
} ;
Object . defineProperty ( BaseProvider . prototype , "ready" , {
2020-06-03 10:47:17 +03:00
// This will always return the most recently established network.
// For "any", this can change (a "network" event is emitted before
// any change is refelcted); otherwise this cannot change
2020-05-04 00:53:58 +03:00
get : function ( ) {
2020-06-14 04:39:36 +03:00
var _this = this ;
return web _1 . poll ( function ( ) {
return _this . _ready ( ) . then ( function ( network ) {
return network ;
} , function ( error ) {
// If the network isn't running yet, we will wait
if ( error . code === logger _1 . Logger . errors . NETWORK _ERROR && error . event === "noNetwork" ) {
return undefined ;
}
throw error ;
} ) ;
} ) ;
2020-05-04 00:53:58 +03:00
} ,
enumerable : true ,
configurable : true
} ) ;
2020-06-03 10:47:17 +03:00
// @TODO: Remove this and just create a singleton formatter
2019-05-15 01:48:48 +03:00
BaseProvider . getFormatter = function ( ) {
if ( defaultFormatter == null ) {
defaultFormatter = new formatter _1 . Formatter ( ) ;
}
return defaultFormatter ;
} ;
2020-06-03 10:47:17 +03:00
// @TODO: Remove this and just use getNetwork
2019-07-02 23:13:03 +03:00
BaseProvider . getNetwork = function ( network ) {
return networks _1 . getNetwork ( ( network == null ) ? "homestead" : network ) ;
} ;
2020-06-03 10:47:17 +03:00
// Fetches the blockNumber, but will reuse any result that is less
// than maxAge old or has been requested since the last request
2019-11-20 12:57:38 +03:00
BaseProvider . prototype . _getInternalBlockNumber = function ( maxAge ) {
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
2020-06-03 10:47:17 +03:00
var internalBlockNumber , result , reqTime , checkInternalBlockNumber ;
2019-11-20 12:57:38 +03:00
var _this = this ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
2020-06-14 04:39:36 +03:00
case 0 : return [ 4 /*yield*/ , this . _ready ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_a . sent ( ) ;
internalBlockNumber = this . _internalBlockNumber ;
if ( ! ( maxAge > 0 && this . _internalBlockNumber ) ) return [ 3 /*break*/ , 3 ] ;
return [ 4 /*yield*/ , internalBlockNumber ] ;
case 2 :
result = _a . sent ( ) ;
if ( ( getTime ( ) - result . respTime ) <= maxAge ) {
return [ 2 /*return*/ , result . blockNumber ] ;
2019-05-15 01:48:48 +03:00
}
2019-11-20 12:57:38 +03:00
_a . label = 3 ;
case 3 :
reqTime = getTime ( ) ;
2020-06-03 10:47:17 +03:00
checkInternalBlockNumber = properties _1 . resolveProperties ( {
blockNumber : this . perform ( "getBlockNumber" , { } ) ,
networkError : this . getNetwork ( ) . then ( function ( network ) { return ( null ) ; } , function ( error ) { return ( error ) ; } )
} ) . then ( function ( _a ) {
var blockNumber = _a . blockNumber , networkError = _a . networkError ;
if ( networkError ) {
// Unremember this bad internal block number
if ( _this . _internalBlockNumber === checkInternalBlockNumber ) {
_this . _internalBlockNumber = null ;
}
throw networkError ;
}
2019-11-20 12:57:38 +03:00
var respTime = getTime ( ) ;
blockNumber = bignumber _1 . BigNumber . from ( blockNumber ) . toNumber ( ) ;
if ( blockNumber < _this . _maxInternalBlockNumber ) {
blockNumber = _this . _maxInternalBlockNumber ;
2019-05-15 01:48:48 +03:00
}
2019-11-20 12:57:38 +03:00
_this . _maxInternalBlockNumber = blockNumber ;
_this . _setFastBlockNumber ( blockNumber ) ; // @TODO: Still need this?
return { blockNumber : blockNumber , reqTime : reqTime , respTime : respTime } ;
} ) ;
2020-06-03 10:47:17 +03:00
this . _internalBlockNumber = checkInternalBlockNumber ;
return [ 4 /*yield*/ , checkInternalBlockNumber ] ;
2019-11-20 12:57:38 +03:00
case 4 : return [ 2 /*return*/ , ( _a . sent ( ) ) . blockNumber ] ;
}
} ) ;
} ) ;
} ;
BaseProvider . prototype . poll = function ( ) {
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var pollId , runners , blockNumber , i ;
var _this = this ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
case 0 :
pollId = nextPollId ++ ;
runners = [ ] ;
return [ 4 /*yield*/ , this . _getInternalBlockNumber ( 100 + this . pollingInterval / 2 ) ] ;
case 1 :
blockNumber = _a . sent ( ) ;
this . _setFastBlockNumber ( blockNumber ) ;
2020-05-05 06:01:04 +03:00
// Emit a poll event after we have the latest (fast) block number
this . emit ( "poll" , pollId , blockNumber ) ;
2019-11-20 12:57:38 +03:00
// If the block has not changed, meh.
if ( blockNumber === this . _lastBlockNumber ) {
2020-05-05 06:01:04 +03:00
this . emit ( "didPoll" , pollId ) ;
2019-11-20 12:57:38 +03:00
return [ 2 /*return*/ ] ;
}
// First polling cycle, trigger a "block" events
if ( this . _emitted . block === - 2 ) {
this . _emitted . block = blockNumber - 1 ;
}
2020-06-03 10:47:17 +03:00
if ( Math . abs ( ( this . _emitted . block ) - blockNumber ) > 1000 ) {
logger . warn ( "network block skew detected; skipping block events" ) ;
this . emit ( "error" , logger . makeError ( "network block skew detected" , logger _1 . Logger . errors . NETWORK _ERROR , {
blockNumber : blockNumber ,
2020-06-14 04:39:36 +03:00
event : "blockSkew" ,
2020-06-03 10:47:17 +03:00
previousBlockNumber : this . _emitted . block
} ) ) ;
this . emit ( "block" , blockNumber ) ;
}
else {
// Notify all listener for each block that has passed
for ( i = this . _emitted . block + 1 ; i <= blockNumber ; i ++ ) {
this . emit ( "block" , i ) ;
}
2019-11-20 12:57:38 +03:00
}
// The emitted block was updated, check for obsolete events
if ( this . _emitted . block !== blockNumber ) {
this . _emitted . block = blockNumber ;
Object . keys ( this . _emitted ) . forEach ( function ( key ) {
// The block event does not expire
if ( key === "block" ) {
return ;
}
// The block we were at when we emitted this event
var eventBlockNumber = _this . _emitted [ key ] ;
// We cannot garbage collect pending transactions or blocks here
// They should be garbage collected by the Provider when setting
// "pending" events
if ( eventBlockNumber === "pending" ) {
return ;
}
// Evict any transaction hashes or block hashes over 12 blocks
// old, since they should not return null anyways
if ( blockNumber - eventBlockNumber > 12 ) {
delete _this . _emitted [ key ] ;
}
2019-05-15 01:48:48 +03:00
} ) ;
2019-11-20 12:57:38 +03:00
}
// First polling cycle
if ( this . _lastBlockNumber === - 2 ) {
this . _lastBlockNumber = blockNumber - 1 ;
}
// Find all transaction hashes we are waiting on
this . _events . forEach ( function ( event ) {
2020-03-12 21:14:50 +03:00
switch ( event . type ) {
2019-11-20 12:57:38 +03:00
case "tx" : {
2020-03-12 21:14:50 +03:00
var hash _2 = event . hash ;
2019-11-20 12:57:38 +03:00
var runner = _this . getTransactionReceipt ( hash _2 ) . then ( function ( receipt ) {
if ( ! receipt || receipt . blockNumber == null ) {
return null ;
}
_this . _emitted [ "t:" + hash _2 ] = receipt . blockNumber ;
_this . emit ( hash _2 , receipt ) ;
return null ;
} ) . catch ( function ( error ) { _this . emit ( "error" , error ) ; } ) ;
runners . push ( runner ) ;
break ;
}
case "filter" : {
2020-03-12 21:14:50 +03:00
var filter _1 = event . filter ;
filter _1 . fromBlock = _this . _lastBlockNumber + 1 ;
filter _1 . toBlock = blockNumber ;
2019-11-20 12:57:38 +03:00
var runner = _this . getLogs ( filter _1 ) . then ( function ( logs ) {
if ( logs . length === 0 ) {
return ;
}
logs . forEach ( function ( log ) {
_this . _emitted [ "b:" + log . blockHash ] = log . blockNumber ;
_this . _emitted [ "t:" + log . transactionHash ] = log . blockNumber ;
_this . emit ( filter _1 , log ) ;
} ) ;
} ) . catch ( function ( error ) { _this . emit ( "error" , error ) ; } ) ;
runners . push ( runner ) ;
break ;
}
}
} ) ;
this . _lastBlockNumber = blockNumber ;
2020-06-03 10:47:17 +03:00
// Once all events for this loop have been processed, emit "didPoll"
2019-11-20 12:57:38 +03:00
Promise . all ( runners ) . then ( function ( ) {
_this . emit ( "didPoll" , pollId ) ;
} ) ;
return [ 2 /*return*/ , null ] ;
2019-05-15 01:48:48 +03:00
}
} ) ;
} ) ;
} ;
2020-06-03 10:47:17 +03:00
// Deprecated; do not use this
2019-05-15 01:48:48 +03:00
BaseProvider . prototype . resetEventsBlock = function ( blockNumber ) {
this . _lastBlockNumber = blockNumber - 1 ;
if ( this . polling ) {
this . poll ( ) ;
}
} ;
Object . defineProperty ( BaseProvider . prototype , "network" , {
get : function ( ) {
return this . _network ;
} ,
enumerable : true ,
configurable : true
} ) ;
2020-06-03 10:47:17 +03:00
// This method should query the network if the underlying network
// can change, such as when connected to a JSON-RPC backend
BaseProvider . prototype . detectNetwork = function ( ) {
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
return _ _generator ( this , function ( _a ) {
return [ 2 /*return*/ , logger . throwError ( "provider does not support network detection" , logger _1 . Logger . errors . UNSUPPORTED _OPERATION , {
operation : "provider.detectNetwork"
} ) ] ;
} ) ;
} ) ;
} ;
2019-05-15 01:48:48 +03:00
BaseProvider . prototype . getNetwork = function ( ) {
2020-06-03 10:47:17 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var network , currentNetwork , error ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
2020-06-14 04:39:36 +03:00
case 0 : return [ 4 /*yield*/ , this . _ready ( ) ] ;
2020-06-03 10:47:17 +03:00
case 1 :
network = _a . sent ( ) ;
return [ 4 /*yield*/ , this . detectNetwork ( ) ] ;
case 2 :
currentNetwork = _a . sent ( ) ;
if ( ! ( network . chainId !== currentNetwork . chainId ) ) return [ 3 /*break*/ , 5 ] ;
if ( ! this . anyNetwork ) return [ 3 /*break*/ , 4 ] ;
this . _network = currentNetwork ;
// Reset all internal block number guards and caches
this . _lastBlockNumber = - 2 ;
this . _fastBlockNumber = null ;
this . _fastBlockNumberPromise = null ;
this . _fastQueryDate = 0 ;
this . _emitted . block = - 2 ;
this . _maxInternalBlockNumber = - 1024 ;
this . _internalBlockNumber = null ;
// The "network" event MUST happen before this method resolves
// so any events have a chance to unregister, so we stall an
// additional event loop before returning from /this/ call
this . emit ( "network" , currentNetwork , network ) ;
return [ 4 /*yield*/ , stall ( 0 ) ] ;
case 3 :
_a . sent ( ) ;
return [ 2 /*return*/ , this . _network ] ;
case 4 :
error = logger . makeError ( "underlying network changed" , logger _1 . Logger . errors . NETWORK _ERROR , {
event : "changed" ,
network : network ,
detectedNetwork : currentNetwork
} ) ;
this . emit ( "error" , error ) ;
throw error ;
case 5 : return [ 2 /*return*/ , network ] ;
}
} ) ;
} ) ;
2019-05-15 01:48:48 +03:00
} ;
Object . defineProperty ( BaseProvider . prototype , "blockNumber" , {
get : function ( ) {
2020-05-05 06:01:04 +03:00
var _this = this ;
this . _getInternalBlockNumber ( 100 + this . pollingInterval / 2 ) . then ( function ( blockNumber ) {
_this . _setFastBlockNumber ( blockNumber ) ;
} ) ;
return ( this . _fastBlockNumber != null ) ? this . _fastBlockNumber : - 1 ;
2019-05-15 01:48:48 +03:00
} ,
enumerable : true ,
configurable : true
} ) ;
Object . defineProperty ( BaseProvider . prototype , "polling" , {
get : function ( ) {
return ( this . _poller != null ) ;
} ,
set : function ( value ) {
var _this = this ;
2020-05-05 06:01:04 +03:00
if ( value && ! this . _poller ) {
this . _poller = setInterval ( this . poll . bind ( this ) , this . pollingInterval ) ;
if ( ! this . _bootstrapPoll ) {
this . _bootstrapPoll = setTimeout ( function ( ) {
_this . poll ( ) ;
// We block additional polls until the polling interval
// is done, to prevent overwhelming the poll function
_this . _bootstrapPoll = setTimeout ( function ( ) {
// If polling was disabled, something may require a poke
// since starting the bootstrap poll and it was disabled
if ( ! _this . _poller ) {
_this . poll ( ) ;
}
// Clear out the bootstrap so we can do another
_this . _bootstrapPoll = null ;
} , _this . pollingInterval ) ;
} , 0 ) ;
2019-05-15 01:48:48 +03:00
}
2020-05-05 06:01:04 +03:00
}
else if ( ! value && this . _poller ) {
clearInterval ( this . _poller ) ;
this . _poller = null ;
}
2019-05-15 01:48:48 +03:00
} ,
enumerable : true ,
configurable : true
} ) ;
Object . defineProperty ( BaseProvider . prototype , "pollingInterval" , {
get : function ( ) {
return this . _pollingInterval ;
} ,
set : function ( value ) {
var _this = this ;
if ( typeof ( value ) !== "number" || value <= 0 || parseInt ( String ( value ) ) != value ) {
throw new Error ( "invalid polling interval" ) ;
}
this . _pollingInterval = value ;
if ( this . _poller ) {
clearInterval ( this . _poller ) ;
this . _poller = setInterval ( function ( ) { _this . poll ( ) ; } , this . _pollingInterval ) ;
}
} ,
enumerable : true ,
configurable : true
} ) ;
BaseProvider . prototype . _getFastBlockNumber = function ( ) {
var _this = this ;
var now = getTime ( ) ;
// Stale block number, request a newer value
if ( ( now - this . _fastQueryDate ) > 2 * this . _pollingInterval ) {
this . _fastQueryDate = now ;
this . _fastBlockNumberPromise = this . getBlockNumber ( ) . then ( function ( blockNumber ) {
if ( _this . _fastBlockNumber == null || blockNumber > _this . _fastBlockNumber ) {
_this . _fastBlockNumber = blockNumber ;
}
return _this . _fastBlockNumber ;
} ) ;
}
return this . _fastBlockNumberPromise ;
} ;
BaseProvider . prototype . _setFastBlockNumber = function ( blockNumber ) {
// Older block, maybe a stale request
if ( this . _fastBlockNumber != null && blockNumber < this . _fastBlockNumber ) {
return ;
}
// Update the time we updated the blocknumber
this . _fastQueryDate = getTime ( ) ;
// Newer block number, use it
if ( this . _fastBlockNumber == null || blockNumber > this . _fastBlockNumber ) {
this . _fastBlockNumber = blockNumber ;
this . _fastBlockNumberPromise = Promise . resolve ( blockNumber ) ;
}
} ;
2020-02-04 09:06:47 +03:00
BaseProvider . prototype . waitForTransaction = function ( transactionHash , confirmations , timeout ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var receipt ;
var _this = this ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
case 0 :
if ( confirmations == null ) {
confirmations = 1 ;
}
return [ 4 /*yield*/ , this . getTransactionReceipt ( transactionHash ) ] ;
case 1 :
receipt = _a . sent ( ) ;
// Receipt is already good
2020-02-04 09:06:47 +03:00
if ( ( receipt ? receipt . confirmations : 0 ) >= confirmations ) {
2019-11-20 12:57:38 +03:00
return [ 2 /*return*/ , receipt ] ;
}
// Poll until the receipt is good...
2020-02-04 09:06:47 +03:00
return [ 2 /*return*/ , new Promise ( function ( resolve , reject ) {
var timer = null ;
var done = false ;
2019-11-20 12:57:38 +03:00
var handler = function ( receipt ) {
if ( receipt . confirmations < confirmations ) {
return ;
}
2020-02-04 09:06:47 +03:00
if ( timer ) {
clearTimeout ( timer ) ;
}
if ( done ) {
return ;
}
done = true ;
2019-11-20 12:57:38 +03:00
_this . removeListener ( transactionHash , handler ) ;
resolve ( receipt ) ;
} ;
_this . on ( transactionHash , handler ) ;
2020-02-04 09:06:47 +03:00
if ( typeof ( timeout ) === "number" && timeout > 0 ) {
timer = setTimeout ( function ( ) {
if ( done ) {
return ;
}
timer = null ;
done = true ;
_this . removeListener ( transactionHash , handler ) ;
reject ( logger . makeError ( "timeout exceeded" , logger _1 . Logger . errors . TIMEOUT , { timeout : timeout } ) ) ;
} , timeout ) ;
if ( timer . unref ) {
timer . unref ( ) ;
}
}
2019-11-20 12:57:38 +03:00
} ) ] ;
2019-05-15 01:48:48 +03:00
}
} ) ;
} ) ;
} ;
BaseProvider . prototype . getBlockNumber = function ( ) {
2020-06-03 10:47:17 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
return _ _generator ( this , function ( _a ) {
return [ 2 /*return*/ , this . _getInternalBlockNumber ( 0 ) ] ;
} ) ;
} ) ;
2019-05-15 01:48:48 +03:00
} ;
BaseProvider . prototype . getGasPrice = function ( ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var _a , _b ;
return _ _generator ( this , function ( _c ) {
switch ( _c . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_c . sent ( ) ;
_b = ( _a = bignumber _1 . BigNumber ) . from ;
return [ 4 /*yield*/ , this . perform ( "getGasPrice" , { } ) ] ;
case 2 : return [ 2 /*return*/ , _b . apply ( _a , [ _c . sent ( ) ] ) ] ;
}
} ) ;
2019-05-15 01:48:48 +03:00
} ) ;
} ;
BaseProvider . prototype . getBalance = function ( addressOrName , blockTag ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var params , _a , _b ;
return _ _generator ( this , function ( _c ) {
switch ( _c . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_c . sent ( ) ;
return [ 4 /*yield*/ , properties _1 . resolveProperties ( {
address : this . _getAddress ( addressOrName ) ,
blockTag : this . _getBlockTag ( blockTag )
} ) ] ;
case 2 :
params = _c . sent ( ) ;
_b = ( _a = bignumber _1 . BigNumber ) . from ;
return [ 4 /*yield*/ , this . perform ( "getBalance" , params ) ] ;
case 3 : return [ 2 /*return*/ , _b . apply ( _a , [ _c . sent ( ) ] ) ] ;
}
} ) ;
2019-05-15 01:48:48 +03:00
} ) ;
} ;
BaseProvider . prototype . getTransactionCount = function ( addressOrName , blockTag ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var params , _a , _b ;
return _ _generator ( this , function ( _c ) {
switch ( _c . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_c . sent ( ) ;
return [ 4 /*yield*/ , properties _1 . resolveProperties ( {
address : this . _getAddress ( addressOrName ) ,
blockTag : this . _getBlockTag ( blockTag )
} ) ] ;
case 2 :
params = _c . sent ( ) ;
_b = ( _a = bignumber _1 . BigNumber ) . from ;
return [ 4 /*yield*/ , this . perform ( "getTransactionCount" , params ) ] ;
case 3 : return [ 2 /*return*/ , _b . apply ( _a , [ _c . sent ( ) ] ) . toNumber ( ) ] ;
}
} ) ;
2019-05-15 01:48:48 +03:00
} ) ;
} ;
BaseProvider . prototype . getCode = function ( addressOrName , blockTag ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var params , _a ;
return _ _generator ( this , function ( _b ) {
switch ( _b . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_b . sent ( ) ;
return [ 4 /*yield*/ , properties _1 . resolveProperties ( {
address : this . _getAddress ( addressOrName ) ,
blockTag : this . _getBlockTag ( blockTag )
} ) ] ;
case 2 :
params = _b . sent ( ) ;
_a = bytes _1 . hexlify ;
return [ 4 /*yield*/ , this . perform ( "getCode" , params ) ] ;
case 3 : return [ 2 /*return*/ , _a . apply ( void 0 , [ _b . sent ( ) ] ) ] ;
}
} ) ;
2019-05-15 01:48:48 +03:00
} ) ;
} ;
BaseProvider . prototype . getStorageAt = function ( addressOrName , position , blockTag ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var params , _a ;
return _ _generator ( this , function ( _b ) {
switch ( _b . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_b . sent ( ) ;
return [ 4 /*yield*/ , properties _1 . resolveProperties ( {
address : this . _getAddress ( addressOrName ) ,
blockTag : this . _getBlockTag ( blockTag ) ,
position : Promise . resolve ( position ) . then ( function ( p ) { return bytes _1 . hexValue ( p ) ; } )
} ) ] ;
case 2 :
params = _b . sent ( ) ;
_a = bytes _1 . hexlify ;
return [ 4 /*yield*/ , this . perform ( "getStorageAt" , params ) ] ;
case 3 : return [ 2 /*return*/ , _a . apply ( void 0 , [ _b . sent ( ) ] ) ] ;
}
} ) ;
2019-05-15 01:48:48 +03:00
} ) ;
} ;
// This should be called by any subclass wrapping a TransactionResponse
BaseProvider . prototype . _wrapTransaction = function ( tx , hash ) {
var _this = this ;
if ( hash != null && bytes _1 . hexDataLength ( hash ) !== 32 ) {
throw new Error ( "invalid response - sendTransaction" ) ;
}
var result = tx ;
// Check the hash we expect is the same as the hash the server reported
if ( hash != null && tx . hash !== hash ) {
2019-08-02 09:10:58 +03:00
logger . throwError ( "Transaction hash mismatch from Provider.sendTransaction." , logger _1 . Logger . errors . UNKNOWN _ERROR , { expectedHash : tx . hash , returnedHash : hash } ) ;
2019-05-15 01:48:48 +03:00
}
// @TODO: (confirmations? number, timeout? number)
2019-11-20 12:57:38 +03:00
result . wait = function ( confirmations ) { return _ _awaiter ( _this , void 0 , void 0 , function ( ) {
var receipt ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
case 0 :
// We know this transaction *must* exist (whether it gets mined is
// another story), so setting an emitted value forces us to
// wait even if the node returns null for the receipt
if ( confirmations !== 0 ) {
this . _emitted [ "t:" + tx . hash ] = "pending" ;
}
return [ 4 /*yield*/ , this . waitForTransaction ( tx . hash , confirmations ) ] ;
case 1 :
receipt = _a . sent ( ) ;
if ( receipt == null && confirmations === 0 ) {
return [ 2 /*return*/ , null ] ;
}
// No longer pending, allow the polling loop to garbage collect this
this . _emitted [ "t:" + tx . hash ] = receipt . blockNumber ;
if ( receipt . status === 0 ) {
logger . throwError ( "transaction failed" , logger _1 . Logger . errors . CALL _EXCEPTION , {
transactionHash : tx . hash ,
transaction : tx ,
receipt : receipt
} ) ;
}
return [ 2 /*return*/ , receipt ] ;
2019-05-15 01:48:48 +03:00
}
} ) ;
2019-11-20 12:57:38 +03:00
} ) ; } ;
2019-05-15 01:48:48 +03:00
return result ;
} ;
BaseProvider . prototype . sendTransaction = function ( signedTransaction ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
2020-05-04 00:53:58 +03:00
var hexTx , tx , hash , error _2 ;
2019-11-20 12:57:38 +03:00
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_a . sent ( ) ;
return [ 4 /*yield*/ , Promise . resolve ( signedTransaction ) . then ( function ( t ) { return bytes _1 . hexlify ( t ) ; } ) ] ;
case 2 :
hexTx = _a . sent ( ) ;
tx = this . formatter . transaction ( signedTransaction ) ;
_a . label = 3 ;
case 3 :
_a . trys . push ( [ 3 , 5 , , 6 ] ) ;
return [ 4 /*yield*/ , this . perform ( "sendTransaction" , { signedTransaction : hexTx } ) ] ;
case 4 :
hash = _a . sent ( ) ;
return [ 2 /*return*/ , this . _wrapTransaction ( tx , hash ) ] ;
case 5 :
2020-05-04 00:53:58 +03:00
error _2 = _a . sent ( ) ;
error _2 . transaction = tx ;
error _2 . transactionHash = tx . hash ;
throw error _2 ;
2019-11-20 12:57:38 +03:00
case 6 : return [ 2 /*return*/ ] ;
}
} ) ;
2019-05-15 01:48:48 +03:00
} ) ;
} ;
BaseProvider . prototype . _getTransactionRequest = function ( transaction ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var values , tx , _a , _b ;
var _this = this ;
return _ _generator ( this , function ( _c ) {
switch ( _c . label ) {
case 0 : return [ 4 /*yield*/ , transaction ] ;
case 1 :
values = _c . sent ( ) ;
tx = { } ;
[ "from" , "to" ] . forEach ( function ( key ) {
if ( values [ key ] == null ) {
return ;
}
tx [ key ] = Promise . resolve ( values [ key ] ) . then ( function ( v ) { return ( v ? _this . _getAddress ( v ) : null ) ; } ) ;
} ) ;
[ "gasLimit" , "gasPrice" , "value" ] . forEach ( function ( key ) {
if ( values [ key ] == null ) {
return ;
}
tx [ key ] = Promise . resolve ( values [ key ] ) . then ( function ( v ) { return ( v ? bignumber _1 . BigNumber . from ( v ) : null ) ; } ) ;
} ) ;
[ "data" ] . forEach ( function ( key ) {
if ( values [ key ] == null ) {
return ;
}
tx [ key ] = Promise . resolve ( values [ key ] ) . then ( function ( v ) { return ( v ? bytes _1 . hexlify ( v ) : null ) ; } ) ;
} ) ;
_b = ( _a = this . formatter ) . transactionRequest ;
return [ 4 /*yield*/ , properties _1 . resolveProperties ( tx ) ] ;
case 2 : return [ 2 /*return*/ , _b . apply ( _a , [ _c . sent ( ) ] ) ] ;
2019-05-15 01:48:48 +03:00
}
} ) ;
} ) ;
} ;
BaseProvider . prototype . _getFilter = function ( filter ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var result , _a , _b ;
var _this = this ;
return _ _generator ( this , function ( _c ) {
switch ( _c . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , filter ] ;
2019-11-20 12:57:38 +03:00
case 1 :
filter = _c . sent ( ) ;
result = { } ;
if ( filter . address != null ) {
result . address = this . _getAddress ( filter . address ) ;
}
[ "blockHash" , "topics" ] . forEach ( function ( key ) {
if ( filter [ key ] == null ) {
return ;
}
result [ key ] = filter [ key ] ;
} ) ;
[ "fromBlock" , "toBlock" ] . forEach ( function ( key ) {
if ( filter [ key ] == null ) {
return ;
}
result [ key ] = _this . _getBlockTag ( filter [ key ] ) ;
} ) ;
_b = ( _a = this . formatter ) . filter ;
2020-04-24 06:35:39 +03:00
return [ 4 /*yield*/ , properties _1 . resolveProperties ( result ) ] ;
2020-06-03 10:47:17 +03:00
case 2 : return [ 2 /*return*/ , _b . apply ( _a , [ _c . sent ( ) ] ) ] ;
2019-05-15 01:48:48 +03:00
}
} ) ;
} ) ;
} ;
BaseProvider . prototype . call = function ( transaction , blockTag ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var params , _a ;
return _ _generator ( this , function ( _b ) {
switch ( _b . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_b . sent ( ) ;
return [ 4 /*yield*/ , properties _1 . resolveProperties ( {
transaction : this . _getTransactionRequest ( transaction ) ,
blockTag : this . _getBlockTag ( blockTag )
} ) ] ;
case 2 :
params = _b . sent ( ) ;
_a = bytes _1 . hexlify ;
return [ 4 /*yield*/ , this . perform ( "call" , params ) ] ;
case 3 : return [ 2 /*return*/ , _a . apply ( void 0 , [ _b . sent ( ) ] ) ] ;
}
} ) ;
2019-05-15 01:48:48 +03:00
} ) ;
} ;
BaseProvider . prototype . estimateGas = function ( transaction ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var params , _a , _b ;
return _ _generator ( this , function ( _c ) {
switch ( _c . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_c . sent ( ) ;
return [ 4 /*yield*/ , properties _1 . resolveProperties ( {
transaction : this . _getTransactionRequest ( transaction )
} ) ] ;
case 2 :
params = _c . sent ( ) ;
_b = ( _a = bignumber _1 . BigNumber ) . from ;
return [ 4 /*yield*/ , this . perform ( "estimateGas" , params ) ] ;
case 3 : return [ 2 /*return*/ , _b . apply ( _a , [ _c . sent ( ) ] ) ] ;
}
} ) ;
2019-05-15 01:48:48 +03:00
} ) ;
} ;
2019-05-24 02:13:44 +03:00
BaseProvider . prototype . _getAddress = function ( addressOrName ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var address ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
case 0 : return [ 4 /*yield*/ , this . resolveName ( addressOrName ) ] ;
case 1 :
address = _a . sent ( ) ;
if ( address == null ) {
logger . throwError ( "ENS name not configured" , logger _1 . Logger . errors . UNSUPPORTED _OPERATION , {
operation : "resolveName(" + JSON . stringify ( addressOrName ) + ")"
} ) ;
}
return [ 2 /*return*/ , address ] ;
}
} ) ;
2019-05-24 02:13:44 +03:00
} ) ;
} ;
2019-05-15 01:48:48 +03:00
BaseProvider . prototype . _getBlock = function ( blockHashOrBlockTag , includeTransactions ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
2020-05-04 00:53:58 +03:00
var blockNumber , params , _a , _b , _c , error _3 ;
2019-11-20 12:57:38 +03:00
var _this = this ;
return _ _generator ( this , function ( _d ) {
switch ( _d . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_d . sent ( ) ;
return [ 4 /*yield*/ , blockHashOrBlockTag ] ;
case 2 :
blockHashOrBlockTag = _d . sent ( ) ;
blockNumber = - 128 ;
params = {
includeTransactions : ! ! includeTransactions
} ;
2020-06-03 10:47:17 +03:00
if ( ! bytes _1 . isHexString ( blockHashOrBlockTag , 32 ) ) return [ 3 /*break*/ , 3 ] ;
2019-11-20 12:57:38 +03:00
params . blockHash = blockHashOrBlockTag ;
2020-06-03 10:47:17 +03:00
return [ 3 /*break*/ , 6 ] ;
case 3 :
_d . trys . push ( [ 3 , 5 , , 6 ] ) ;
2019-11-20 12:57:38 +03:00
_a = params ;
_c = ( _b = this . formatter ) . blockTag ;
return [ 4 /*yield*/ , this . _getBlockTag ( blockHashOrBlockTag ) ] ;
2020-06-03 10:47:17 +03:00
case 4 :
2019-11-20 12:57:38 +03:00
_a . blockTag = _c . apply ( _b , [ _d . sent ( ) ] ) ;
2019-05-15 01:48:48 +03:00
if ( bytes _1 . isHexString ( params . blockTag ) ) {
blockNumber = parseInt ( params . blockTag . substring ( 2 ) , 16 ) ;
}
2020-06-03 10:47:17 +03:00
return [ 3 /*break*/ , 6 ] ;
case 5 :
2020-05-04 00:53:58 +03:00
error _3 = _d . sent ( ) ;
2019-08-02 09:10:58 +03:00
logger . throwArgumentError ( "invalid block hash or block tag" , "blockHashOrBlockTag" , blockHashOrBlockTag ) ;
2020-06-03 10:47:17 +03:00
return [ 3 /*break*/ , 6 ] ;
case 6 : return [ 2 /*return*/ , web _1 . poll ( function ( ) { return _ _awaiter ( _this , void 0 , void 0 , function ( ) {
2020-01-19 05:48:12 +03:00
var block , blockNumber _1 , i , tx , confirmations ;
2019-11-20 12:57:38 +03:00
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
case 0 : return [ 4 /*yield*/ , this . perform ( "getBlock" , params ) ] ;
case 1 :
block = _a . sent ( ) ;
// Block was not found
if ( block == null ) {
// For blockhashes, if we didn't say it existed, that blockhash may
// not exist. If we did see it though, perhaps from a log, we know
// it exists, and this node is just not caught up yet.
if ( params . blockHash != null ) {
if ( this . _emitted [ "b:" + params . blockHash ] == null ) {
return [ 2 /*return*/ , null ] ;
}
}
// For block tags, if we are asking for a future block, we return null
if ( params . blockTag != null ) {
if ( blockNumber > this . _emitted . block ) {
return [ 2 /*return*/ , null ] ;
}
}
// Retry on the next block
return [ 2 /*return*/ , undefined ] ;
}
2020-01-19 05:48:12 +03:00
if ( ! includeTransactions ) return [ 3 /*break*/ , 8 ] ;
blockNumber _1 = null ;
i = 0 ;
_a . label = 2 ;
case 2 :
if ( ! ( i < block . transactions . length ) ) return [ 3 /*break*/ , 7 ] ;
tx = block . transactions [ i ] ;
if ( ! ( tx . blockNumber == null ) ) return [ 3 /*break*/ , 3 ] ;
tx . confirmations = 0 ;
return [ 3 /*break*/ , 6 ] ;
case 3 :
if ( ! ( tx . confirmations == null ) ) return [ 3 /*break*/ , 6 ] ;
if ( ! ( blockNumber _1 == null ) ) return [ 3 /*break*/ , 5 ] ;
return [ 4 /*yield*/ , this . _getInternalBlockNumber ( 100 + 2 * this . pollingInterval ) ] ;
case 4 :
blockNumber _1 = _a . sent ( ) ;
_a . label = 5 ;
case 5 :
confirmations = ( blockNumber _1 - tx . blockNumber ) + 1 ;
if ( confirmations <= 0 ) {
confirmations = 1 ;
2019-11-20 12:57:38 +03:00
}
2020-01-19 05:48:12 +03:00
tx . confirmations = confirmations ;
_a . label = 6 ;
case 6 :
i ++ ;
return [ 3 /*break*/ , 2 ] ;
case 7 : return [ 2 /*return*/ , this . formatter . blockWithTransactions ( block ) ] ;
case 8 : return [ 2 /*return*/ , this . formatter . block ( block ) ] ;
2019-05-15 01:48:48 +03:00
}
2019-11-20 12:57:38 +03:00
} ) ;
2020-05-30 04:27:59 +03:00
} ) ; } , { oncePoll : this } ) ] ;
2019-11-20 12:57:38 +03:00
}
2019-05-15 01:48:48 +03:00
} ) ;
} ) ;
} ;
BaseProvider . prototype . getBlock = function ( blockHashOrBlockTag ) {
return ( this . _getBlock ( blockHashOrBlockTag , false ) ) ;
} ;
BaseProvider . prototype . getBlockWithTransactions = function ( blockHashOrBlockTag ) {
return ( this . _getBlock ( blockHashOrBlockTag , true ) ) ;
} ;
BaseProvider . prototype . getTransaction = function ( transactionHash ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var params ;
var _this = this ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_a . sent ( ) ;
return [ 4 /*yield*/ , transactionHash ] ;
case 2 :
transactionHash = _a . sent ( ) ;
params = { transactionHash : this . formatter . hash ( transactionHash , true ) } ;
return [ 2 /*return*/ , web _1 . poll ( function ( ) { return _ _awaiter ( _this , void 0 , void 0 , function ( ) {
var result , tx , blockNumber , confirmations ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
case 0 : return [ 4 /*yield*/ , this . perform ( "getTransaction" , params ) ] ;
case 1 :
result = _a . sent ( ) ;
if ( result == null ) {
if ( this . _emitted [ "t:" + transactionHash ] == null ) {
return [ 2 /*return*/ , null ] ;
}
return [ 2 /*return*/ , undefined ] ;
}
tx = this . formatter . transactionResponse ( result ) ;
if ( ! ( tx . blockNumber == null ) ) return [ 3 /*break*/ , 2 ] ;
tx . confirmations = 0 ;
return [ 3 /*break*/ , 4 ] ;
case 2 :
if ( ! ( tx . confirmations == null ) ) return [ 3 /*break*/ , 4 ] ;
return [ 4 /*yield*/ , this . _getInternalBlockNumber ( 100 + 2 * this . pollingInterval ) ] ;
case 3 :
blockNumber = _a . sent ( ) ;
confirmations = ( blockNumber - tx . blockNumber ) + 1 ;
if ( confirmations <= 0 ) {
confirmations = 1 ;
}
tx . confirmations = confirmations ;
_a . label = 4 ;
case 4 : return [ 2 /*return*/ , this . _wrapTransaction ( tx ) ] ;
}
} ) ;
2020-05-30 04:27:59 +03:00
} ) ; } , { oncePoll : this } ) ] ;
2019-11-20 12:57:38 +03:00
}
2019-05-15 01:48:48 +03:00
} ) ;
} ) ;
} ;
BaseProvider . prototype . getTransactionReceipt = function ( transactionHash ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var params ;
var _this = this ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_a . sent ( ) ;
return [ 4 /*yield*/ , transactionHash ] ;
case 2 :
transactionHash = _a . sent ( ) ;
params = { transactionHash : this . formatter . hash ( transactionHash , true ) } ;
return [ 2 /*return*/ , web _1 . poll ( function ( ) { return _ _awaiter ( _this , void 0 , void 0 , function ( ) {
var result , receipt , blockNumber , confirmations ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
case 0 : return [ 4 /*yield*/ , this . perform ( "getTransactionReceipt" , params ) ] ;
case 1 :
result = _a . sent ( ) ;
if ( result == null ) {
if ( this . _emitted [ "t:" + transactionHash ] == null ) {
return [ 2 /*return*/ , null ] ;
}
return [ 2 /*return*/ , undefined ] ;
}
// "geth-etc" returns receipts before they are ready
if ( result . blockHash == null ) {
return [ 2 /*return*/ , undefined ] ;
}
receipt = this . formatter . receipt ( result ) ;
if ( ! ( receipt . blockNumber == null ) ) return [ 3 /*break*/ , 2 ] ;
receipt . confirmations = 0 ;
return [ 3 /*break*/ , 4 ] ;
case 2 :
if ( ! ( receipt . confirmations == null ) ) return [ 3 /*break*/ , 4 ] ;
return [ 4 /*yield*/ , this . _getInternalBlockNumber ( 100 + 2 * this . pollingInterval ) ] ;
case 3 :
blockNumber = _a . sent ( ) ;
confirmations = ( blockNumber - receipt . blockNumber ) + 1 ;
if ( confirmations <= 0 ) {
confirmations = 1 ;
}
receipt . confirmations = confirmations ;
_a . label = 4 ;
case 4 : return [ 2 /*return*/ , receipt ] ;
}
} ) ;
2020-05-30 04:27:59 +03:00
} ) ; } , { oncePoll : this } ) ] ;
2019-11-20 12:57:38 +03:00
}
2019-05-15 01:48:48 +03:00
} ) ;
} ) ;
} ;
BaseProvider . prototype . getLogs = function ( filter ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var params , logs ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_a . sent ( ) ;
return [ 4 /*yield*/ , properties _1 . resolveProperties ( { filter : this . _getFilter ( filter ) } ) ] ;
case 2 :
params = _a . sent ( ) ;
return [ 4 /*yield*/ , this . perform ( "getLogs" , params ) ] ;
case 3 :
logs = _a . sent ( ) ;
2020-01-19 05:48:12 +03:00
logs . forEach ( function ( log ) {
if ( log . removed == null ) {
log . removed = false ;
}
} ) ;
2019-11-20 12:57:38 +03:00
return [ 2 /*return*/ , formatter _1 . Formatter . arrayOf ( this . formatter . filterLog . bind ( this . formatter ) ) ( logs ) ] ;
}
} ) ;
2019-05-15 01:48:48 +03:00
} ) ;
} ;
BaseProvider . prototype . getEtherPrice = function ( ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
2019-11-20 12:57:38 +03:00
case 1 :
_a . sent ( ) ;
return [ 2 /*return*/ , this . perform ( "getEtherPrice" , { } ) ] ;
}
} ) ;
2019-05-15 01:48:48 +03:00
} ) ;
} ;
BaseProvider . prototype . _getBlockTag = function ( blockTag ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var blockNumber ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , blockTag ] ;
2019-11-20 12:57:38 +03:00
case 1 :
blockTag = _a . sent ( ) ;
2020-06-03 10:47:17 +03:00
if ( ! ( typeof ( blockTag ) === "number" && blockTag < 0 ) ) return [ 3 /*break*/ , 3 ] ;
2019-11-20 12:57:38 +03:00
if ( blockTag % 1 ) {
logger . throwArgumentError ( "invalid BlockTag" , "blockTag" , blockTag ) ;
}
return [ 4 /*yield*/ , this . _getInternalBlockNumber ( 100 + 2 * this . pollingInterval ) ] ;
2020-06-03 10:47:17 +03:00
case 2 :
2019-11-20 12:57:38 +03:00
blockNumber = _a . sent ( ) ;
blockNumber += blockTag ;
if ( blockNumber < 0 ) {
blockNumber = 0 ;
}
return [ 2 /*return*/ , this . formatter . blockTag ( blockNumber ) ] ;
2020-06-03 10:47:17 +03:00
case 3 : return [ 2 /*return*/ , this . formatter . blockTag ( blockTag ) ] ;
2019-05-15 01:48:48 +03:00
}
} ) ;
2019-11-20 12:57:38 +03:00
} ) ;
2019-05-15 01:48:48 +03:00
} ;
2020-09-04 08:37:14 +03:00
BaseProvider . prototype . getResolver = function ( name ) {
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var address ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
case 0 : return [ 4 /*yield*/ , this . _getResolver ( name ) ] ;
case 1 :
address = _a . sent ( ) ;
if ( address == null ) {
return [ 2 /*return*/ , null ] ;
}
return [ 2 /*return*/ , new Resolver ( this , address , name ) ] ;
}
} ) ;
} ) ;
} ;
2019-05-15 01:48:48 +03:00
BaseProvider . prototype . _getResolver = function ( name ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var network , transaction , _a , _b ;
return _ _generator ( this , function ( _c ) {
switch ( _c . label ) {
case 0 : return [ 4 /*yield*/ , this . getNetwork ( ) ] ;
case 1 :
network = _c . sent ( ) ;
// No ENS...
if ( ! network . ensAddress ) {
logger . throwError ( "network does not support ENS" , logger _1 . Logger . errors . UNSUPPORTED _OPERATION , { operation : "ENS" , network : network . name } ) ;
}
transaction = {
to : network . ensAddress ,
data : ( "0x0178b8bf" + hash _1 . namehash ( name ) . substring ( 2 ) )
} ;
_b = ( _a = this . formatter ) . callAddress ;
return [ 4 /*yield*/ , this . call ( transaction ) ] ;
case 2 : return [ 2 /*return*/ , _b . apply ( _a , [ _c . sent ( ) ] ) ] ;
}
2019-05-15 01:48:48 +03:00
} ) ;
} ) ;
} ;
BaseProvider . prototype . resolveName = function ( name ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
2020-09-04 08:37:14 +03:00
var resolver ;
return _ _generator ( this , function ( _a ) {
switch ( _a . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , name ] ;
2019-11-20 12:57:38 +03:00
case 1 :
2020-09-04 08:37:14 +03:00
name = _a . sent ( ) ;
2019-11-20 12:57:38 +03:00
// If it is already an address, nothing to resolve
try {
return [ 2 /*return*/ , Promise . resolve ( this . formatter . address ( name ) ) ] ;
}
2020-01-08 03:58:04 +03:00
catch ( error ) {
// If is is a hexstring, the address is bad (See #694)
if ( bytes _1 . isHexString ( name ) ) {
throw error ;
}
}
2020-04-04 05:13:06 +03:00
if ( typeof ( name ) !== "string" ) {
logger . throwArgumentError ( "invalid ENS name" , "name" , name ) ;
}
2020-09-04 08:37:14 +03:00
return [ 4 /*yield*/ , this . getResolver ( name ) ] ;
2020-06-03 10:47:17 +03:00
case 2 :
2020-09-04 08:37:14 +03:00
resolver = _a . sent ( ) ;
if ( ! resolver ) {
2019-11-20 12:57:38 +03:00
return [ 2 /*return*/ , null ] ;
}
2020-09-04 08:37:14 +03:00
return [ 4 /*yield*/ , resolver . getAddress ( ) ] ;
case 3 : return [ 2 /*return*/ , _a . sent ( ) ] ;
2019-11-20 12:57:38 +03:00
}
2019-05-15 01:48:48 +03:00
} ) ;
} ) ;
} ;
BaseProvider . prototype . lookupAddress = function ( address ) {
2019-11-20 12:57:38 +03:00
return _ _awaiter ( this , void 0 , void 0 , function ( ) {
var reverseName , resolverAddress , bytes , _a , length , name , addr ;
return _ _generator ( this , function ( _b ) {
switch ( _b . label ) {
2020-06-03 10:47:17 +03:00
case 0 : return [ 4 /*yield*/ , address ] ;
2019-11-20 12:57:38 +03:00
case 1 :
address = _b . sent ( ) ;
address = this . formatter . address ( address ) ;
reverseName = address . substring ( 2 ) . toLowerCase ( ) + ".addr.reverse" ;
return [ 4 /*yield*/ , this . _getResolver ( reverseName ) ] ;
2020-06-03 10:47:17 +03:00
case 2 :
2019-11-20 12:57:38 +03:00
resolverAddress = _b . sent ( ) ;
if ( ! resolverAddress ) {
return [ 2 /*return*/ , null ] ;
}
_a = bytes _1 . arrayify ;
return [ 4 /*yield*/ , this . call ( {
to : resolverAddress ,
data : ( "0x691f3431" + hash _1 . namehash ( reverseName ) . substring ( 2 ) )
} ) ] ;
2020-06-03 10:47:17 +03:00
case 3 :
2019-11-20 12:57:38 +03:00
bytes = _a . apply ( void 0 , [ _b . sent ( ) ] ) ;
// Strip off the dynamic string pointer (0x20)
if ( bytes . length < 32 || ! bignumber _1 . BigNumber . from ( bytes . slice ( 0 , 32 ) ) . eq ( 32 ) ) {
return [ 2 /*return*/ , null ] ;
}
bytes = bytes . slice ( 32 ) ;
// Not a length-prefixed string
if ( bytes . length < 32 ) {
return [ 2 /*return*/ , null ] ;
}
length = bignumber _1 . BigNumber . from ( bytes . slice ( 0 , 32 ) ) . toNumber ( ) ;
bytes = bytes . slice ( 32 ) ;
// Length longer than available data
if ( length > bytes . length ) {
return [ 2 /*return*/ , null ] ;
}
name = strings _1 . toUtf8String ( bytes . slice ( 0 , length ) ) ;
return [ 4 /*yield*/ , this . resolveName ( name ) ] ;
2020-06-03 10:47:17 +03:00
case 4 :
2019-11-20 12:57:38 +03:00
addr = _b . sent ( ) ;
if ( addr != address ) {
return [ 2 /*return*/ , null ] ;
}
return [ 2 /*return*/ , name ] ;
2019-05-15 01:48:48 +03:00
}
} ) ;
} ) ;
} ;
BaseProvider . prototype . perform = function ( method , params ) {
2019-08-02 09:10:58 +03:00
return logger . throwError ( method + " not implemented" , logger _1 . Logger . errors . NOT _IMPLEMENTED , { operation : method } ) ;
2019-05-15 01:48:48 +03:00
} ;
2020-03-12 21:14:50 +03:00
BaseProvider . prototype . _startEvent = function ( event ) {
this . polling = ( this . _events . filter ( function ( e ) { return e . pollable ( ) ; } ) . length > 0 ) ;
2019-05-15 01:48:48 +03:00
} ;
2020-03-12 21:14:50 +03:00
BaseProvider . prototype . _stopEvent = function ( event ) {
2019-05-15 01:48:48 +03:00
this . polling = ( this . _events . filter ( function ( e ) { return e . pollable ( ) ; } ) . length > 0 ) ;
} ;
BaseProvider . prototype . _addEventListener = function ( eventName , listener , once ) {
2020-03-12 21:14:50 +03:00
var event = new Event ( getEventTag ( eventName ) , listener , once ) ;
this . _events . push ( event ) ;
this . _startEvent ( event ) ;
2019-05-15 01:48:48 +03:00
return this ;
} ;
BaseProvider . prototype . on = function ( eventName , listener ) {
return this . _addEventListener ( eventName , listener , false ) ;
} ;
BaseProvider . prototype . once = function ( eventName , listener ) {
return this . _addEventListener ( eventName , listener , true ) ;
} ;
BaseProvider . prototype . emit = function ( eventName ) {
var _this = this ;
var args = [ ] ;
for ( var _i = 1 ; _i < arguments . length ; _i ++ ) {
args [ _i - 1 ] = arguments [ _i ] ;
}
var result = false ;
2020-03-12 21:14:50 +03:00
var stopped = [ ] ;
2019-05-15 01:48:48 +03:00
var eventTag = getEventTag ( eventName ) ;
this . _events = this . _events . filter ( function ( event ) {
if ( event . tag !== eventTag ) {
return true ;
}
setTimeout ( function ( ) {
event . listener . apply ( _this , args ) ;
} , 0 ) ;
result = true ;
2020-03-12 21:14:50 +03:00
if ( event . once ) {
stopped . push ( event ) ;
return false ;
}
return true ;
2019-05-15 01:48:48 +03:00
} ) ;
2020-03-12 21:14:50 +03:00
stopped . forEach ( function ( event ) { _this . _stopEvent ( event ) ; } ) ;
2019-05-15 01:48:48 +03:00
return result ;
} ;
BaseProvider . prototype . listenerCount = function ( eventName ) {
if ( ! eventName ) {
return this . _events . length ;
}
var eventTag = getEventTag ( eventName ) ;
return this . _events . filter ( function ( event ) {
return ( event . tag === eventTag ) ;
} ) . length ;
} ;
BaseProvider . prototype . listeners = function ( eventName ) {
if ( eventName == null ) {
return this . _events . map ( function ( event ) { return event . listener ; } ) ;
}
var eventTag = getEventTag ( eventName ) ;
return this . _events
. filter ( function ( event ) { return ( event . tag === eventTag ) ; } )
. map ( function ( event ) { return event . listener ; } ) ;
} ;
BaseProvider . prototype . off = function ( eventName , listener ) {
2020-03-12 21:14:50 +03:00
var _this = this ;
2019-05-15 01:48:48 +03:00
if ( listener == null ) {
return this . removeAllListeners ( eventName ) ;
}
2020-03-12 21:14:50 +03:00
var stopped = [ ] ;
2019-05-15 01:48:48 +03:00
var found = false ;
var eventTag = getEventTag ( eventName ) ;
this . _events = this . _events . filter ( function ( event ) {
if ( event . tag !== eventTag || event . listener != listener ) {
return true ;
}
if ( found ) {
return true ;
}
found = true ;
2020-03-12 21:14:50 +03:00
stopped . push ( event ) ;
2019-05-15 01:48:48 +03:00
return false ;
} ) ;
2020-03-12 21:14:50 +03:00
stopped . forEach ( function ( event ) { _this . _stopEvent ( event ) ; } ) ;
2019-05-15 01:48:48 +03:00
return this ;
} ;
BaseProvider . prototype . removeAllListeners = function ( eventName ) {
2020-03-12 21:14:50 +03:00
var _this = this ;
var stopped = [ ] ;
2019-05-15 01:48:48 +03:00
if ( eventName == null ) {
2020-03-12 21:14:50 +03:00
stopped = this . _events ;
2019-05-15 01:48:48 +03:00
this . _events = [ ] ;
}
else {
var eventTag _1 = getEventTag ( eventName ) ;
this . _events = this . _events . filter ( function ( event ) {
2020-03-12 21:14:50 +03:00
if ( event . tag !== eventTag _1 ) {
return true ;
}
stopped . push ( event ) ;
return false ;
2019-05-15 01:48:48 +03:00
} ) ;
}
2020-03-12 21:14:50 +03:00
stopped . forEach ( function ( event ) { _this . _stopEvent ( event ) ; } ) ;
2019-05-15 01:48:48 +03:00
return this ;
} ;
return BaseProvider ;
} ( abstract _provider _1 . Provider ) ) ;
exports . BaseProvider = BaseProvider ;
2020-07-13 15:03:56 +03:00
//# sourceMappingURL=base-provider.js.map