Functions/Invoke-CoinbaseRequest.ps1

function Invoke-CoinbaseProRequest {

    Param (
    [Parameter()] $Request    
    )

    $EpochStart = Get-Date -Date "01/01/1970"
    $Now = Get-Date
    $Timestamp = (New-TimeSpan -Start $EpochStart -End $Now.ToUniversalTime()).TotalSeconds
    $Timestamp = ([math]::Round($Timestamp, 3)).ToString()
    $Prehash = $Timestamp + $request.method.ToUpper() + $request.url + $request.body
    $Signature_b64 = Get-HMAC -Message $prehash -Secret $request.secret
    $Header = @{
        "CB-ACCESS-KEY" = $request.key
        "CB-ACCESS-SIGN" = $signature_b64
        "CB-ACCESS-TIMESTAMP" = $Timestamp
        "CB-ACCESS-PASSPHRASE" = $request.passphrase
        "Content-Type" = 'application/json'
        "accept" = 'application/json'
    }
    $Uri = $request.endpoint + $request.url
    if ($request.method.ToUpper() -eq 'POST') {
        try {$response = Invoke-RestMethod -Method $request.method -Uri $uri -Headers $header -Body $request.body}
        catch {$Statuscode = $_.exception.message}
    } else {
        try {$response = Invoke-RestMethod -Method $request.method -Uri $uri -Headers $header}
        catch {$Statuscode = $_.exception.message}
    }
        
    if ($Statuscode) {
            $Errorcode = $Statuscode | Select-String -Pattern '\d{3,3}'
            $Errorcode = $Errorcode.Matches.Value
            
        Switch ($Errorcode) 
            {
            '400' {Write-Error "Bad Request. Invalid request format"}
            '401' {Write-Error "Unauthorized. Invalid API Key"}
            '403' {Write-Error "Forbidden. You do not have access to the requested resource"} 
            '404' {Write-Error "Not Found"}
            '500' {Write-Error "Internal Server Error"} 
            }
            
    }
    Return $response
}

function Get-HMAC {
    Param(
    [Parameter()] $Message,
    [Parameter()] $Secret    
    )

    $hmacsha = New-Object System.Security.Cryptography.HMACSHA256
    $hmacsha.key = [Convert]::FromBase64String($secret)
    $signature = $hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($message))
    $signature = [Convert]::ToBase64String($signature)
    return $signature
}

Function Get-BlankAPI {

    Param(
        [Parameter()] [switch] $SandboxAPI   
        )

    $api = @{
        "endpoint" = 'https://api.pro.coinbase.com'
        "url" = ''
        "method" = ''
        "body" = ''
        "key" = ''
        "secret" = ''
        "passphrase" = ''
    }

    if ($SandboxAPI) {
        $api.endpoint = "https://api-public.sandbox.pro.coinbase.com"
    }
    Return $api
}

Function Test-Product {

    Param(
        [Parameter(Position=0)] [string] $Product   
        )

    $ValidProducts = Import-Csv "$env:APPDATA/CoinbaseProPS-Products.csv"

    if ($ValidProducts.id.Contains($Product.ToUpper())) {
        Return $true
    } else {
        Throw "Invalid Product!"
        Return $false
    }

}

Function Test-Currency {

    Param(
        [Parameter(Position=0)] [string] $Currency   
        )

    $ValidCurrencies = Import-Csv "$env:APPDATA/CoinbaseProPS-currencies.csv"

    if ($ValidCurrencies.id.Contains($Currency.ToUpper())) {
        Return $true
    } else {
        Throw "Invalid Currency!"
        Return $false
    }
    
}